UserHero Docs
API Reference

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): void

Parameters:

NameTypeRequiredDescription
widgetIdstringNoWidget 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(): void

Example:

UserHero.close();

UserHero.setMetadata(data)

Attach custom metadata to all subsequent feedback submissions.

Signature:

setMetadata(data: Record<string, unknown> | null): boolean

Parameters:

NameTypeRequiredDescription
dataobject | nullYesKey-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 null to clear

UserHero.clearMetadata()

Remove all custom metadata.

Signature:

clearMetadata(): void

Example:

// Clear on logout
function handleLogout() {
  UserHero.clearMetadata();
  // ... rest of logout logic
}

UserHero.getMetadata()

Retrieve currently set metadata.

Signature:

getMetadata(): Record<string, unknown> | null

Returns: 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:

NameTypeRequiredDescription
widgetIdstringNoWidget ID for the screenshot.

Note: Widget should be open before capturing.

Example:

await UserHero.captureScreenshot();

Configuration

Script Attributes

AttributeRequiredDescription
data-keyYesYour public key
asyncRecommendedNon-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 null

Check browser console for debugging.


Browser Support

BrowserVersion
Chrome80+
Firefox75+
Safari13+
Edge80+
Mobile SafariiOS 13+
Mobile ChromeAndroid 80+

Next Steps

On this page