cfg field reference
Every widget setting on one page, with its default, in the shape the public /config endpoint returns.
brand
{
"accent_color": "#6366f1",
"theme": "auto",
"logo_url": null,
"accent_gradient": null,
"launcher_icon_url": null,
"launcher_icon_only": false,
"launcher_icon_transparent_bg": false,
"language": "auto",
"logo_shape": "rounded",
"logo_transparent_bg": false,
"header_title": "Support",
"project_name": "",
"header_subtitle": null,
"position": "right",
"border_radius": 16,
"display_mode": "widget",
"show_branding": true,
"cover_image_url": null,
"about_description": null,
"background": { "type": "solid", "value": null },
"icon_pack_url": null,
"emoji_pack_id": null,
"team_avatars": []
}accent_gradient, when set, is { "from_color": "#6366f1", "to_color": "#8b5cf6", "angle": 225 }.
language is the Widget language: "auto", "ru" or "en". With auto, the widget picks the language taking computed.locales into account (see below and Brand and header).
welcome
{
"title": "Hi there 👋",
"subtitle": "How can we help?",
"message": null,
"button_text": "Send a message",
"response_time": "We usually reply in 5 minutes",
"auto_open_delay": null,
"auto_open_in_telegram": true,
"auto_open_where": "all",
"auto_open_target": null,
"schedule": null,
"bot_menu": [],
"pinned_banner": {
"enabled": false,
"text": null,
"image_url": null,
"dismissable": true,
"show_on": ["home", "chat"]
},
"quick_replies": [],
"open_in_conversation": false,
"home_news": { "enabled": true, "count": 2 },
"home_articles": { "enabled": true, "layout": "tiles", "count": 4 }
}home_news and home_articles are the blocks at the bottom of Home: news (count 1 to 3) and knowledge base articles with search (layout is "tiles" or "list", count 2 to 6). More in Home tab and greeting.
tabs
{
"help_enabled": true,
"news_enabled": true,
"miniapp_enabled": false,
"help_external_channel_url": null
}forms
{
"require_name": false,
"require_email": false,
"require_phone": false,
"pre_chat_message": null,
"topics": [],
"prechat_style": "chat"
}A topic is { id, name, custom_fields }. The options of a select field are { value, label }: value goes into the ticket, label is the option’s caption (the value itself if it’s missing). Plain-string options from older configs are read as { value, label } with the same text.
conversation
{
"show_operator_name": true,
"show_operator_avatar": true,
"show_history": true,
"history_label": "Past conversations",
"history_max_count": 10,
"rating": { "enabled": false, "prompt": "How did we do?" },
"privacy": {
"typing_enabled": true,
"read_receipts_enabled": true,
"operator_seen_enabled": true
},
"inline_keyboard_enabled": true,
"reactions_enabled": true
}hours
{
"show_work_hours": false,
"offline_message": "We're offline. We'll reply in the morning",
"outside_hours_message": "We're outside of working hours right now",
"delayed_response_seconds": null,
"close_button_text": "Close ticket",
"working_hours": [],
"away_segments": [],
"greeting_segments": [],
"timezone": "",
"exceptions": []
}working_hours, timezone and exceptions (holidays and special working days: { date, is_working, start, end }) in the /config response come from the project’s schedule (Settings → Work Hours), not from the widget config.
system_messages
{
"ticket_confirmation_text": "Ticket created",
"assigned": { "enabled": true, "text": "{operator} is with you" },
"department_transfer": { "enabled": true, "text": "Handing over to {department}" },
"operator_transfer_text": "Handing over to another operator",
"snoozed": { "enabled": true, "text": "Snoozed until {time}" },
"resumed": { "enabled": true, "text": "Picking your question back up" },
"reopened": { "enabled": true, "text": "Ticket reopened" },
"ticket_closed": {
"enabled": true,
"text": {
"ru": "…",
"en": "🔒 Conversation closed by {operator}"
}
},
"blocked_reply": { "enabled": false, "text": null }
}email_bridge
{
"enabled": false,
"label": "Email for reply",
"hint": "We'll email you the reply",
"bridge_channel_id": null,
"auto_ack": { "enabled": false, "subject": null, "body": null }
}auto_ack.enabled decides whether the acknowledgement email is sent; its text is the Acknowledgement template in Email Templates. subject and body are used once, to fill that template if it doesn’t exist yet.
advanced
{
"cookie_domain": null,
"sound": { "enabled": false, "url": null },
"custom_css": null,
"slow_mode": { "enabled": false, "seconds_per_message": 3, "anonymous_only": true },
"banned_patterns": [],
"slash_commands": [],
"feature_flags": {}
}miniapp, stories, security
{
"miniapp": {
"url": null,
"title": "App",
"height_px": 480
},
"stories": {
"enabled": false,
"max_visible": 6
},
"security": {
"allowed_origins": []
}
}visitor_notifications
{
"enabled": false,
"show_preview": false,
"sw_path": "/supporthub-sw.js"
}Telling a visitor who isn't in the chat that the operator replied — see Visitor notifications.
What /config adds on top
The sections above, under their keys, make up the default config (DEFAULT_WIDGET_CONFIG on the backend, minus the admin-only _meta, which visitors never get). The /config response adds computed fields:
{
"i18n": {},
"i18n_by_locale": { "ru": {}, "en": {} },
"enabled": true,
"workspace_name": "Project name",
"message_rating_enabled": false,
"computed": {
"is_outside_hours": false,
"active_announcements_count": 0,
"work_hours_now": true,
"help_visible": false,
"news_visible": false,
"miniapp_visible": false,
"email_collect_required": false,
"locales": { "default": "ru", "supported": ["ru", "en"] }
}
}i18n holds your texts from Interface Texts (widget keys only): with ?locale=ru or ?locale=en, that language’s; without the parameter and with ?locale=all, the Russian ones. i18n_by_locale comes with ?locale=all when the texts are set per language: it has each language’s edits, and the widget takes the ones for its own language (a language with no edits gets the standard texts). Older edits that aren’t split by language come only in i18n and apply to every language.
computed.miniapp_visible says whether to show the mini app tab: the tabs.miniapp_enabled toggle is on and miniapp.url is set.
computed.locales lists the languages the project’s texts exist in (supported) and the project’s main language (default). The widget uses them to pick its language with brand.language: "auto". The default texts exist in both languages, hence ["ru", "en"] above; a project that typed its texts in Russian only gets { "default": "ru", "supported": ["ru"] }.

