Overview
When the widget boots it fetches appearance configuration from:
GET /api/agents/{slug}/appearance/You configure this through the dashboard under Characters → [your character] → Widget Appearance. The widget merges your overrides onto the defaults shown in the tables below.
Full example
{
"name": "Nova",
"subtitle": "Your AI assistant",
"logo_url": "https://cdn.yoursite.com/nova-avatar.png",
"fab_label": "Ask Nova",
"fab_sublabel": "AI assistant",
"start_button_text": "Start conversation",
"powered_by_text": "Powered by Oshara",
"powered_by_url": "https://oshara.ai",
"theme": {
"primary_color": "#6366F1",
"accent_color": "#22D3EE",
"background_color": "#FFFFFF",
"text_color": "#0F172A",
"user_bubble_color": "#6366F1",
"user_bubble_text_color": "#FFFFFF",
"agent_bubble_color": "#F1F5F9",
"agent_bubble_text_color": "#0F172A"
},
"dimensions": {
"fab_size": 64,
"panel_width": 380,
"panel_height": 620,
"border_radius": 24
},
"layout": {
"position": "bottom-right",
"font_family": "Inter, sans-serif"
},
"labels": {
"idle": "Idle",
"connecting": "Connecting…",
"listening": "Listening",
"speaking": "Speaking…",
"muted": "Microphone muted",
"call_ended": "Call ended",
"transcript_placeholder": "Your conversation will appear here",
"language_label": "Language"
},
"languages": [
{ "code": "en", "label": "English", "native_label": "English" },
{ "code": "ne", "label": "Nepali", "native_label": "नेपाली" }
],
"default_language": "en",
"max_call_seconds": 0,
"terms_url": "https://yoursite.com/terms",
"terms_label": "Terms & Conditions",
"consent_text": "By starting the call you agree to our",
"show_audio_settings": true,
"forms": []
}Top-level fields
| Field | Type | Default | Description |
|---|---|---|---|
name | string | "Voice Assistant" | Display name shown in the panel header. |
subtitle | string | "" | Subtitle line below the name. |
logo_url | string | "" | URL for the agent avatar / logo image. |
fab_label | string | "" | Text on the floating action button. Empty = icon only. |
fab_sublabel | string | "" | Secondary text below the FAB label. |
start_button_text | string | "Start Call" | Label on the call-start button. |
powered_by_text | string | "Powered by Oshara" | Attribution text shown at the bottom of the panel. |
powered_by_url | string | "https://oshara.ai" | Link target for the attribution text. |
max_call_seconds | number | 0 | Hard call time limit in seconds. 0 = no limit. |
terms_url | string | "" | URL to your Terms & Conditions page. Empty = consent step skipped. |
terms_label | string | "Terms & Conditions" | Link text for the T&C URL. |
consent_text | string | "By starting the call you agree to our" | Text shown before the T&C link. |
show_audio_settings | boolean | true | Show the mic/speaker/noise-cancel settings drawer. |
default_language | string | "en" | Language pre-selected in the language picker. |
theme object
| Field | Type | Default | Description |
|---|---|---|---|
primary_color | hex string | "#6366F1" | Primary brand color — buttons, FAB background, accents. |
accent_color | hex string | "#22D3EE" | Secondary accent color — loading rings, highlights. |
background_color | hex string | "#FFFFFF" | Panel background. |
text_color | hex string | "#0F172A" | Primary text color. |
user_bubble_color | hex string | "#6366F1" | Background of the user’s transcript bubbles. |
user_bubble_text_color | hex string | "#FFFFFF" | Text color inside user bubbles. |
agent_bubble_color | hex string | "#F1F5F9" | Background of agent transcript bubbles. |
agent_bubble_text_color | hex string | "#0F172A" | Text color inside agent bubbles. |
dimensions object
| Field | Type | Default | Description |
|---|---|---|---|
fab_size | number (px) | 64 | Diameter of the floating action button. |
panel_width | number (px) | 380 | Width of the voice panel. |
panel_height | number (px) | 620 | Height of the voice panel. |
border_radius | number (px) | 24 | Corner radius applied to the panel and FAB. |
layout object
| Field | Type | Default | Description |
|---|---|---|---|
position | "bottom-right" | "bottom-left" | "top-right" | "top-left" | "bottom-right" | Screen corner where the FAB and panel are anchored. |
font_family | string | "" | CSS font-family stack applied to the panel (e.g. "Inter, sans-serif"). Empty = inherit page font. |
labels object
All labels are optional. Any omitted field falls back to its English default.
| Field | Default |
|---|---|
idle | "Idle" |
connecting | "Connecting…" |
listening | "Listening" |
speaking | "Speaking…" |
muted | "Microphone muted" |
call_ended | "Call ended" |
transcript_placeholder | "Your conversation will appear here" |
language_label | "Language" |
languages array
Populates the language picker shown in the panel. Each entry:
{ "code": "en", "label": "English", "native_label": "English" }| Field | Description |
|---|---|
code | BCP-47 language code passed to STT/TTS (e.g. "en", "ne", "es"). |
label | English name displayed to developers / admins. |
native_label | Name in the language’s own script — shown in the picker. |
forms array
See Forms for the full schema. Forms defined here are automatically offered to the agent as callable tools — the agent can open, pre-fill, and submit them during the call.
Dark mode example
{
"theme": {
"primary_color": "#818CF8",
"accent_color": "#22D3EE",
"background_color": "#0F172A",
"text_color": "#F1F5F9",
"user_bubble_color": "#4F46E5",
"user_bubble_text_color": "#FFFFFF",
"agent_bubble_color": "#1E293B",
"agent_bubble_text_color": "#E2E8F0"
}
}Last updated on