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>;
// Audio recording (Pro / Pro Max)
startAudioRecording(widgetId?: string): Promise<void>;
stopAudioRecording(): void;
removeAudio(): void;
// Video recording (Pro / Pro Max)
startVideoRecording(widgetId?: string, source?: 'screen' | 'webcam'): Promise<void>;
stopVideoRecording(): void;
removeVideo(): 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();UserHero.startAudioRecording(widgetId?)
Requires Pro or Pro Max plan with audio recording enabled on the widget.
Start recording audio from the user's microphone.
Signature:
startAudioRecording(widgetId?: string): Promise<void>Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
widgetId | string | No | Widget ID. Uses first available if omitted. |
Example:
await UserHero.startAudioRecording();
// Recording starts... user speaks
UserHero.stopAudioRecording();
// Audio preview appears in widgetUserHero.stopAudioRecording()
Stop the current audio recording and show the playback preview.
Signature:
stopAudioRecording(): voidUserHero.removeAudio()
Remove the recorded or uploaded audio from the current feedback.
Signature:
removeAudio(): voidUserHero.startVideoRecording(widgetId?, source?)
Requires Pro or Pro Max plan with video recording enabled on the widget.
Start recording video from screen share or webcam.
Signature:
startVideoRecording(widgetId?: string, source?: 'screen' | 'webcam'): Promise<void>Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
widgetId | string | No | Widget ID. Uses first available if omitted. |
source | 'screen' | 'webcam' | No | Recording source. If omitted, shows a source picker. |
Example:
// Screen recording
await UserHero.startVideoRecording(undefined, 'screen');
// Webcam recording
await UserHero.startVideoRecording(undefined, 'webcam');
// Let user choose
await UserHero.startVideoRecording();UserHero.stopVideoRecording()
Stop the current video recording and show the preview.
Signature:
stopVideoRecording(): voidUserHero.removeVideo()
Remove the recorded or uploaded video from the current feedback.
Signature:
removeVideo(): voidConfiguration
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>;
startAudioRecording(widgetId?: string): Promise<void>;
stopAudioRecording(): void;
removeAudio(): void;
startVideoRecording(widgetId?: string, source?: 'screen' | 'webcam'): Promise<void>;
stopVideoRecording(): void;
removeVideo(): void;
};
UserHeroLoaded?: boolean;
UserHeroConfig?: {
publicKey?: string;
apiBase?: string;
};
}
}
interface UserHeroSubmitEvent extends CustomEvent {
detail: {
feedbackId: string;
category?: string;
rating?: number;
hasScreenshot: boolean;
hasAudio: boolean;
hasVideo: 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+ |