Widget SDK Reference
Complete JavaScript SDK API reference
Widget SDK Reference
Complete reference for the UserHero JavaScript SDK (window.UserHero).
Installation
<script
async
src="https://userhero.co/widget.js"
data-key="pk_live_your_public_key">
</script>Global Object
After loading, the SDK exposes window.UserHero:
interface UserHero {
// Widget control
open(widgetId?: string): void;
close(): void;
// Feedback submission
submit(): Promise<void>;
// Metadata
setMetadata(data: object | null): boolean;
clearMetadata(): void;
getMetadata(): object | null;
// Screenshot
captureScreenshot(widgetId?: string): Promise<void>;
}Methods
UserHero.open(widgetId?)
Opens the feedback widget modal.
Signature:
open(widgetId?: string): voidParameters:
| Name | Type | Required | Description |
|---|---|---|---|
widgetId | string | No | Widget ID to open. If omitted, opens first available widget. |
Example:
// Open default widget
UserHero.open();
// Open specific widget
UserHero.open('w_abc123');UserHero.close()
Closes the currently open widget modal.
Signature:
close(): voidExample:
UserHero.close();UserHero.setMetadata(data)
Attach custom metadata to all subsequent feedback submissions.
Signature:
setMetadata(data: Record<string, unknown> | null): booleanParameters:
| Name | Type | Required | Description |
|---|---|---|---|
data | object | null | Yes | Key-value pairs. Max 5KB serialized. |
Returns: boolean - true if successful, false if validation failed.
Example:
const success = UserHero.setMetadata({
userId: 'user_123',
plan: 'pro',
company: 'Acme Inc',
features: {
beta: true,
darkMode: true,
},
});
if (!success) {
console.error('Failed to set metadata');
}Constraints:
- Maximum payload: 5KB when JSON-serialized
- Must be a plain object (not array)
- Nested objects allowed
- Pass
nullto clear
UserHero.clearMetadata()
Remove all custom metadata.
Signature:
clearMetadata(): voidExample:
// Clear on logout
function handleLogout() {
UserHero.clearMetadata();
// ... rest of logout logic
}UserHero.getMetadata()
Retrieve currently set metadata.
Signature:
getMetadata(): Record<string, unknown> | nullReturns: Current metadata object or null if not set.
Example:
const metadata = UserHero.getMetadata();
console.log(metadata);
// { userId: 'user_123', plan: 'pro', ... }UserHero.captureScreenshot(widgetId?)
Programmatically trigger screenshot capture.
Signature:
captureScreenshot(widgetId?: string): Promise<void>Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
widgetId | string | No | Widget ID for the screenshot. |
Note: Widget should be open before capturing.
Example:
await UserHero.captureScreenshot();Configuration
Script Attributes
| Attribute | Required | Description |
|---|---|---|
data-key | Yes | Your public key |
async | Recommended | Non-blocking load |
Global Config
window.UserHeroConfig = {
publicKey: 'pk_live_xxx', // Alternative to data-key
apiBase: 'https://userhero.co', // Custom API endpoint
};Events
userhero:ready
SDK fully initialized.
window.addEventListener('userhero:ready', () => {
console.log('SDK ready');
});userhero:open
Widget opened.
window.addEventListener('userhero:open', (event) => {
console.log('Opened widget:', event.detail.widgetId);
});userhero:close
Widget closed.
window.addEventListener('userhero:close', () => {
console.log('Widget closed');
});userhero:submit
Feedback submitted successfully.
window.addEventListener('userhero:submit', (event) => {
console.log('Submitted:', event.detail);
analytics.track('Feedback Submitted', event.detail);
});TypeScript Declarations
declare global {
interface Window {
UserHero?: {
open(widgetId?: string): void;
close(): void;
submit(): Promise<void>;
setMetadata(data: Record<string, unknown> | null): boolean;
clearMetadata(): void;
getMetadata(): Record<string, unknown> | null;
captureScreenshot(widgetId?: string): Promise<void>;
};
UserHeroLoaded?: boolean;
UserHeroConfig?: {
publicKey?: string;
apiBase?: string;
};
}
}
interface UserHeroSubmitEvent extends CustomEvent {
detail: {
feedbackId: string;
category?: string;
rating?: number;
hasScreenshot: boolean;
};
}Error Handling
The SDK logs warnings to console for common issues:
[UserHero] Missing data-key attribute on script tag
[UserHero] Custom metadata exceeds 5KB limit. Data not set.
[UserHero] setMetadata expects an object or nullCheck browser console for debugging.
Browser Support
| Browser | Version |
|---|---|
| Chrome | 80+ |
| Firefox | 75+ |
| Safari | 13+ |
| Edge | 80+ |
| Mobile Safari | iOS 13+ |
| Mobile Chrome | Android 80+ |