---
title: "Website widget and demo pages"
description: "Design the website widget and branded demo links."
---

> **For AI agents:** the complete documentation index is at [llms.txt](https://docs.trillet.ai/llms.txt). Append `.md` to any page URL for its markdown version.

{/* Generated by packages/mcp/scripts/gen-tool-reference.mjs from @trillet-ai/mcp v0.10.0. Do not edit by hand. */}

Design the website widget and branded demo links. 6 tools.

## `trillet_get_website_widget`

**Get website widget design**

Read a call flow's website widget design (the &lt;trillet-widget&gt; embed: voice, chat or type-or-talk) plus the embed snippet to paste on a site. `saved: false` means defaults are in use. Visitors can only start conversations when publicAccess is on.

Flags: `read-only`

### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `flow_id` | string | yes |  |
| `workspace_id` | string | no | Run this call in another workspace: its id or its name (see trillet_list_workspaces). Omit to use the default (TRILLET_WORKSPACE_ID, the workspace picked when the connector was approved, or the one set with trillet_switch_workspace). |

## `trillet_set_website_widget`

**Design the website widget**

Create or update a call flow's website widget design: voice/chat/type-or-talk mode, colours, logo, copy, suggested prompts, terms, feedback. Only the fields you pass change (the stored design is read and merged; null clears a field). Applies to live embeds immediately (not staged in a draft; existing embeds pick it up within about a minute). Attributes written on a site's &lt;trillet-widget&gt; tag override the saved design. Returns the embed snippet. Set public_access true unless the flow already allows public calls, or visitors get 403.

Flags: `writes` `idempotent` `open-world`

### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `flow_id` | string | yes |  |
| `mode` | "voice" \| "text" \| "both" | no | "voice" = call button (default), "text" = chat, "both" = type-or-talk (one session the visitor can type or speak in) |
| `placement` | "bottom-right" \| "bottom-left" \| "top-right" \| "top-left" | no |  |
| `variant` | "compact" \| "expanded" | no |  |
| `theme` | "light" \| "dark" | no |  |
| `avatarStyle` | "orb" \| "image" \| "initials" | no | "image" uses `avatar` |
| `brandColor` | string | no | Main button colour |
| `orbColor1` | any | no | Orb gradient start (avatarStyle orb) |
| `orbColor2` | any | no | Orb gradient end |
| `backgroundColor` | any | no | Card/panel background; null follows the theme |
| `textColor` | any | no |  |
| `buttonTextColor` | any | no |  |
| `brandName` | string | no |  |
| `brandLogo` | string | no | https image URL (rendered on the customer's site, so it must be public) |
| `avatar` | any | no | https image URL for avatarStyle image |
| `title` | string | no | Header title (defaults to the agent name) |
| `launcherText` | string | no | Text on the collapsed launcher |
| `greeting` | string | no | Line shown above the input before a conversation |
| `chatWelcome` | string | no | First agent message in chats (text/both). Replaces the flow's phone greeting for chats only |
| `inputPlaceholder` | string | no |  |
| `startCallText` | string | no |  |
| `messageText` | string | no |  |
| `suggestedPrompts` | string[] | no | Up to 4 quick-start chips |
| `termsText` | string | no | Markdown the visitor must accept before their first conversation |
| `feedback` | "none" \| "end" | no | "end" asks for thumbs up/down after a conversation |
| `reset` | boolean | no | Start from defaults instead of the stored design Default: `false`. |
| `public_access` | boolean | no | Also set settings.security.publicAccess (required for website visitors) |
| `workspace_id` | string | no | Run this call in another workspace: its id or its name (see trillet_list_workspaces). Omit to use the default (TRILLET_WORKSPACE_ID, the workspace picked when the connector was approved, or the one set with trillet_switch_workspace). |

## `trillet_list_demo_links`

**List demo links**

List a call flow's shareable demo links (max 5 per flow) with their URL, limits, and custom page design. URLs use app.trillet.ai. A whitelabel (agency) workspace shares the same path on its custom domain: https://&lt;customDomain&gt;/call-flows/demo/&lt;hash&gt;. GOTCHA: while the flow has an active draft, this read shows the draft's copy of the links, which can be stale; has_active_draft flags it.

Flags: `read-only`

### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `flow_id` | string | yes |  |
| `workspace_id` | string | no | Run this call in another workspace: its id or its name (see trillet_list_workspaces). Omit to use the default (TRILLET_WORKSPACE_ID, the workspace picked when the connector was approved, or the one set with trillet_switch_workspace). |

## `trillet_create_demo_link`

**Create demo link**

Create a shareable demo link for a call flow (anyone with the URL can talk to the agent in the browser). Saved to production immediately and turns publicAccess on. Max 5 links per flow. Optional usage caps protect the wallet: per_visitor_minutes and total_minutes. Style the page afterwards with trillet_set_demo_page_design and trillet_upload_demo_page_logo. URLs use app.trillet.ai. A whitelabel (agency) workspace shares the same path on its custom domain: https://&lt;customDomain&gt;/call-flows/demo/&lt;hash&gt;.

Flags: `writes` `open-world`

### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `flow_id` | string | yes |  |
| `name` | string | no | Internal label, shown in the dashboard Default: `"New Demo Link"`. |
| `expires_in_days` | integer | no |  |
| `per_visitor_minutes` | integer | no | Cap per visitor (by IP); omit for no cap |
| `total_minutes` | integer | no | Cap across all visitors; omit for no cap |
| `show_countdown_timer` | boolean | no | Show the remaining-minutes countdown on the page Default: `false`. |
| `dynamic_variables` | object[] | no | \{\{variables\}\} the flow uses, filled per link |
| `draft_id` | string | no | Pin the link to a draft so it tests unpublished changes |
| `workspace_id` | string | no | Run this call in another workspace: its id or its name (see trillet_list_workspaces). Omit to use the default (TRILLET_WORKSPACE_ID, the workspace picked when the connector was approved, or the one set with trillet_switch_workspace). |

## `trillet_set_demo_page_design`

**Design a demo link's page**

Brand one demo link's page: template custom, colours, font, corner radius, copy, CTA button, which features show (live transcript, timer, post-call summary and chosen post-call answers, call again, mute, Powered by), and which sites may iframe it and receive results. Only the fields you pass change (the stored design is read and merged). Live immediately. Set template "custom" or nothing shows. Upload the logo or tab icon with trillet_upload_demo_page_logo. Returns the page URL and an iframe snippet (?embed=1 = transparent background + trillet-demo:* postMessage events).

Flags: `writes` `idempotent` `open-world`

### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `flow_id` | string | yes |  |
| `link_id` | string | yes | link_id from trillet_list_demo_links / trillet_create_demo_link |
| `template` | "classic" \| "custom" | no | "custom" turns on the branded page; "classic" (default) is the original page and ignores every design field |
| `brand` | object | no | Logo and tab icon are NOT set here: use trillet_upload_demo_page_logo |
| `content` | object | no |  |
| `features` | object | no |  |
| `embed` | object | no |  |
| `clear_logo` | boolean | no |  |
| `clear_favicon` | boolean | no |  |
| `reset` | boolean | no | Start from defaults instead of the stored design (keeps the uploaded logo unless clear_logo) Default: `false`. |
| `workspace_id` | string | no | Run this call in another workspace: its id or its name (see trillet_list_workspaces). Omit to use the default (TRILLET_WORKSPACE_ID, the workspace picked when the connector was approved, or the one set with trillet_switch_workspace). |

## `trillet_upload_demo_page_logo`

**Upload demo page logo or tab icon**

Upload the logo (or, with kind favicon, the browser-tab icon) for one demo link's custom page. PNG, JPG or WebP under 2MB; SVG is rejected. Pass a local file_path or an https image_url (downloaded here, then uploaded). Live immediately. The returned logo url is a public https image, so it can also be reused as the website widget's brandLogo.

Flags: `writes` `idempotent` `open-world`

### Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `flow_id` | string | yes |  |
| `link_id` | string | yes |  |
| `file_path` | string | no | Absolute path to a local PNG/JPG/WebP |
| `image_url` | string | no | https URL of the image, e.g. from the client's website |
| `kind` | "logo" \| "favicon" | no | Default: `"logo"`. |
| `workspace_id` | string | no | Run this call in another workspace: its id or its name (see trillet_list_workspaces). Omit to use the default (TRILLET_WORKSPACE_ID, the workspace picked when the connector was approved, or the one set with trillet_switch_workspace). |
