API reference
Playbooks
Playbooks, drafts, versions and publishing
| Method | Path | Summary |
|---|---|---|
GET | /v1/account/ai-models | The language and speech recognition models a playbook can choose, and the recommended one of each |
GET | /v1/account/playbooks | Account playbooks |
POST | /v1/account/playbooks | Create a playbook from the defaults or by cloning a version |
GET | /v1/account/playbooks/{playbookId} | A playbook with its latest published version and its draft |
PATCH | /v1/account/playbooks/{playbookId} | Rename a playbook or change its description |
POST | /v1/account/playbooks/{playbookId}/archive | Archive or restore a playbook (refused while numbers or groups use it) |
GET | /v1/account/playbooks/{playbookId}/changes | Change history: who changed what and when, newest first |
GET | /v1/account/playbooks/{playbookId}/diff | What changed between two versions, in words (defaults: latest published to draft) |
GET | /v1/account/playbooks/{playbookId}/draft | The draft, or the latest published content to start one from |
PUT | /v1/account/playbooks/{playbookId}/draft | Autosave the draft; records the change in words |
DELETE | /v1/account/playbooks/{playbookId}/draft | Discard the draft (only when a published version exists). A draft that ran test calls is kept, hidden, so those calls still show what ran |
PUT | /v1/account/playbooks/{playbookId}/kill-switch | Route this playbook's calls to a person or voicemail at once, without a deploy |
POST | /v1/account/playbooks/{playbookId}/publish | Publish the draft as the next version and update every group that follows it |
GET | /v1/account/playbooks/{playbookId}/question-map/layout | How the question map is arranged: the account's arrangement, and a group's own when groupId is given |
PUT | /v1/account/playbooks/{playbookId}/question-map/layout | Save where the cards sit on the question map (the account’s, or a group’s own) |
DELETE | /v1/account/playbooks/{playbookId}/question-map/layout | Tidy up: drop the saved arrangement so the map arranges itself again |
GET | /v1/account/playbooks/{playbookId}/question-map/traffic | How many calls took each arrow of the question map in the last days days (test calls left out) |
POST | /v1/account/playbooks/{playbookId}/rollback | Restore an old version by publishing it again as a new version (history is never rewritten) |
POST | /v1/account/playbooks/{playbookId}/validate | Run the publish checklist on the draft: rules, voice and connection health |
GET | /v1/account/playbooks/{playbookId}/versions | Version history, newest first |
GET | /v1/account/playbooks/{playbookId}/versions/{version} | One version with its content |
GET | /v1/account/voices | The stock voices a playbook can use, all of them or one voice company |
The language and speech recognition models a playbook can choose, and the recommended one of each#
GET /v1/account/ai-models
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
{key} | object | No | Any key. |
{key}.models | array<AiModelOption> | Yes | — |
{key}.models[].description | string | null | Yes | — |
{key}.models[].label | string | Yes | — |
{key}.models[].model | string | Yes | — |
{key}.recommended | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/ai-models" \
-H "Authorization: Bearer $ACCESS_TOKEN"Account playbooks#
GET /v1/account/playbooks
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
includeArchived | enum | No | One of: "true", "false". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
playbooks | array<PlaybookSummary> | Yes | — |
playbooks[].archived | boolean | Yes | — |
playbooks[].createdAt | string (date-time) | Yes | — |
playbooks[].description | string | null | Yes | — |
playbooks[].draft | object | null | Yes | — |
playbooks[].draft.updatedAt | string (date-time) | Yes | — |
playbooks[].draft.version | integer | Yes | — |
playbooks[].draft.versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
playbooks[].id | string (pb_… ID) | Yes | ID (pb_…) |
playbooks[].isSample | boolean | Yes | — |
playbooks[].killSwitch | boolean | Yes | — |
playbooks[].killSwitchMode | enum | Yes | One of: "human", "voicemail". |
playbooks[].latestPublishedVersion | integer | null | Yes | — |
playbooks[].name | string | Yes | — |
playbooks[].updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks" \
-H "Authorization: Bearer $ACCESS_TOKEN"Create a playbook from the defaults or by cloning a version#
POST /v1/account/playbooks
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
description | string | No | Up to 1000 characters. |
fromVersionId | string (pbv_… ID) | No | ID (pbv_…) |
name | string | Yes | 1–120 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
description | string | null | Yes | — |
draft | object | null | Yes | — |
draft.updatedAt | string (date-time) | Yes | — |
draft.version | integer | Yes | — |
draft.versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
draftVersion | any | null | Yes | — |
id | string (pb_… ID) | Yes | ID (pb_…) |
isSample | boolean | Yes | — |
killSwitch | boolean | Yes | — |
killSwitchMode | enum | Yes | One of: "human", "voicemail". |
latest | any | null | Yes | — |
latestPublishedVersion | integer | null | Yes | — |
name | string | Yes | — |
updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/playbooks" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string"
}'A playbook with its latest published version and its draft#
GET /v1/account/playbooks/{playbookId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
description | string | null | Yes | — |
draft | object | null | Yes | — |
draft.updatedAt | string (date-time) | Yes | — |
draft.version | integer | Yes | — |
draft.versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
draftVersion | any | null | Yes | — |
id | string (pb_… ID) | Yes | ID (pb_…) |
isSample | boolean | Yes | — |
killSwitch | boolean | Yes | — |
killSwitchMode | enum | Yes | One of: "human", "voicemail". |
latest | any | null | Yes | — |
latestPublishedVersion | integer | null | Yes | — |
name | string | Yes | — |
updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Rename a playbook or change its description#
PATCH /v1/account/playbooks/{playbookId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
description | string | null | No | Up to 1000 characters. |
name | string | No | 1–120 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
description | string | null | Yes | — |
draft | object | null | Yes | — |
draft.updatedAt | string (date-time) | Yes | — |
draft.version | integer | Yes | — |
draft.versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
id | string (pb_… ID) | Yes | ID (pb_…) |
isSample | boolean | Yes | — |
killSwitch | boolean | Yes | — |
killSwitchMode | enum | Yes | One of: "human", "voicemail". |
latestPublishedVersion | integer | null | Yes | — |
name | string | Yes | — |
updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PATCH "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"description": "string",
"name": "string"
}'Archive or restore a playbook (refused while numbers or groups use it)#
POST /v1/account/playbooks/{playbookId}/archive
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
description | string | null | Yes | — |
draft | object | null | Yes | — |
draft.updatedAt | string (date-time) | Yes | — |
draft.version | integer | Yes | — |
draft.versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
id | string (pb_… ID) | Yes | ID (pb_…) |
isSample | boolean | Yes | — |
killSwitch | boolean | Yes | — |
killSwitchMode | enum | Yes | One of: "human", "voicemail". |
latestPublishedVersion | integer | null | Yes | — |
name | string | Yes | — |
updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/archive" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"archived": true
}'Change history: who changed what and when, newest first#
GET /v1/account/playbooks/{playbookId}/changes
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Between 1 and 100. Default: 50. |
cursor | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
changes | array<object> | Yes | — |
changes[].changes | array<PlaybookChange> | Yes | — |
changes[].changes[].after | any | No | — |
changes[].changes[].before | any | No | — |
changes[].changes[].kind | enum | Yes | One of: "added", "removed", "changed". |
changes[].changes[].path | string | Yes | — |
changes[].changes[].summary | string | Yes | — |
changes[].createdAt | string (date-time) | Yes | — |
changes[].id | string (pbc_… ID) | Yes | ID (pbc_…) |
changes[].note | string | null | Yes | — |
changes[].publishedVersion | integer | null | Yes | — |
changes[].userId | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
changes[].versionId | string (pbv_… ID) | null | Yes | — |
nextCursor | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/changes" \
-H "Authorization: Bearer $ACCESS_TOKEN"What changed between two versions, in words (defaults: latest published to draft)#
GET /v1/account/playbooks/{playbookId}/diff
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | integer | enum | No | Default: "latest". |
to | integer | enum | No | Default: "draft". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
changes | array<PlaybookChange> | Yes | — |
changes[].after | any | No | — |
changes[].before | any | No | — |
changes[].kind | enum | Yes | One of: "added", "removed", "changed". |
changes[].path | string | Yes | — |
changes[].summary | string | Yes | — |
from | integer | Yes | — |
to | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/diff" \
-H "Authorization: Bearer $ACCESS_TOKEN"The draft, or the latest published content to start one from#
GET /v1/account/playbooks/{playbookId}/draft
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
baseVersion | integer | null | Yes | — |
content | PlaybookContent | Yes | — |
content.booking | object | Yes | — |
content.booking.allowUnqualified | boolean | No | Default: false. |
content.booking.maxBookingsPerCall | integer | No | Between 1 and 2. Default: 2. |
content.booking.minNoticeMinutes | integer | No | Between 0 and 10080. Default: 60. |
content.booking.offerSlots | integer | No | Between 1 and 4. Default: 2. |
content.booking.rules | array<object> | Yes | — |
content.booking.rules[].enabled | boolean | No | Default: true. |
content.booking.rules[].name | string | No | Up to 120 characters. |
content.booking.rules[].then | object | object | object | object | object | object | object | Yes | — |
content.booking.rules[].when | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.brief | string | Yes | 1–12000 characters. |
content.defaultFlowId | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.escalation | object | Yes | — |
content.escalation.afterFailedAnswers | integer | No | Between 1 and 5. Default: 2. |
content.escalation.onFrustration | boolean | No | Default: true. |
content.escalation.onGuardrailHit | boolean | No | Default: true. |
content.escalation.transferLine | string | Yes | 1–300 characters. |
content.escalation.transferMode | enum | No | One of: "cold", "warm". Default: "cold". |
content.escalation.unavailableLine | string | Yes | 1–300 characters. |
content.flows | array<object> | Yes | — |
content.flows[].branch | array<object> | No | Default: []. |
content.flows[].branch[].goto | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.flows[].branch[].if | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.flows[].disqualify | array<object> | No | Default: []. |
content.flows[].disqualify[].action | enum | Yes | One of: "offer_nurture", "offer_referral", "end_politely". |
content.flows[].disqualify[].if | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.flows[].disqualify[].line | string | No | Up to 500 characters. |
content.flows[].enterWhen | string | Yes | 1–500 characters. |
content.flows[].fields | array<object> | Yes | — |
content.flows[].fields[].alwaysConfirm | boolean | No | — |
content.flows[].fields[].ask | string | Yes | 1–500 characters. |
content.flows[].fields[].askWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.flows[].fields[].hearAs | array<string> | No | Up to 20 items. |
content.flows[].fields[].hint | string | No | Up to 500 characters. |
content.flows[].fields[].key | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.flows[].fields[].label | string | No | 1–120 characters. |
content.flows[].fields[].options | array<object> | No | — |
content.flows[].fields[].optionsFrom | enum | string (oset_… ID) | No | — |
content.flows[].fields[].required | boolean | No | Default: false. |
content.flows[].fields[].sensitivity | enum | No | One of: "standard", "sensitive". Default: "standard". |
content.flows[].fields[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
content.flows[].goal | string | Yes | 1–500 characters. |
content.flows[].maxQuestionsBeforeValue | integer | No | Between 1 and 10. Default: 2. |
content.flows[].name | string | Yes | 1–120 characters. |
content.flows[].talkingPoints | array<object | object> | No | Default: []. |
content.flows[].talkingPoints[].say | string | Yes | (variant 1) 1–500 characters. |
content.flows[].talkingPoints[].when | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.flows[].talkingPoints[].talkAbout | string | Yes | (variant 2) 1–500 characters. |
content.flows[].talkingPoints[].when | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.followUp | object | No | — |
content.followUp.blocks | array<object> | No | Up to 20 items. Default: []. |
content.followUp.blocks[].body | string | No | Up to 2000 characters. |
content.followUp.blocks[].button | object | No | — |
content.followUp.blocks[].heading | string | No | Up to 120 characters. |
content.followUp.blocks[].image | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.blocks[].video | object | No | — |
content.followUp.cards | array<object> | No | Up to 30 items. Default: []. |
content.followUp.cards[].body | string | Yes | 1–2000 characters. |
content.followUp.cards[].button | object | No | — |
content.followUp.cards[].enabled | boolean | No | Default: true. |
content.followUp.cards[].image | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.cards[].showWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.cards[].title | string | Yes | 1–120 characters. |
content.followUp.chat | object | No | Default: \{"callContext":true,"enabled":false\}. |
content.followUp.chat.callContext | boolean | No | Default: true. |
content.followUp.chat.enabled | boolean | No | Default: false. |
content.followUp.consentQuestion | string | No | 1–480 characters. Default: "Can I text you a link with your \{\{vocab.meeting\}\} details and a recap of our call? Message and data rates may apply, and you can reply STOP anytime.". |
content.followUp.emails | object | No | — |
content.followUp.emails.after_visit | object | null | No | — |
content.followUp.emails.cancel_confirmation | object | null | No | — |
content.followUp.emails.initial_link | object | null | No | — |
content.followUp.emails.reminder | object | null | No | — |
content.followUp.emails.reschedule_confirmation | object | null | No | — |
content.followUp.enabled | boolean | No | Default: false. |
content.followUp.form | object | No | Default: \{"fields":[]\}. |
content.followUp.form.fields | array<object> | No | Up to 8 items. Default: []. |
content.followUp.form.intro | string | No | Up to 480 characters. |
content.followUp.leads | object | No | Default: \{\}. |
content.followUp.leads.afterVisit | string | No | Up to 480 characters. |
content.followUp.leads.cancelled | string | No | Up to 480 characters. |
content.followUp.leads.noBooking | string | No | Up to 480 characters. |
content.followUp.linkExpiryDays | integer | No | Between 7 and 365. Default: 60. |
content.followUp.messages | object | No | Default: \{"afterVisit":\{"enabled":false\},"initialSms":"Hi \{\{caller.firstName\}\}, it's \{\{group.name\}\}. Here are your \{\{vocab.meeting\}\} details and a recap of our call: \{\{link\}\} Reply STOP to opt out.","reminders":[\{"before":"24h"\},\{"before":"2h"\}]\}. |
content.followUp.messages.afterVisit | object | No | Default: \{"enabled":false\}. |
content.followUp.messages.initialSms | string | Yes | 1–480 characters. |
content.followUp.messages.reminders | array<object> | No | Up to 4 items. Default: [\{"before":"24h"\},\{"before":"2h"\}]. |
content.followUp.modules | array<object> | No | Default: [\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\}]. |
content.followUp.modules[].blockId | string | No | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.followUp.modules[].heading | string | No | Up to 120 characters. |
content.followUp.modules[].showWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.modules[].states | array<enum> | No | Items: "upcoming", "day_of", "after_visit", "no_booking", "cancelled", "expired", "revoked". |
content.followUp.prep | object | No | Default: \{"checklist":[]\}. |
content.followUp.prep.body | string | No | Up to 2000 characters. |
content.followUp.prep.checklist | array<object> | No | Up to 12 items. Default: []. |
content.followUp.resources | array<object> | No | Up to 20 items. Default: []. |
content.followUp.resources[].description | string | No | Up to 300 characters. |
content.followUp.resources[].label | string | Yes | 1–120 characters. |
content.followUp.resources[].url | string (uri) | Yes | A https:// link Up to 2000 characters. |
content.followUp.reviews | array<object> | No | Up to 12 items. Default: []. |
content.followUp.reviews[].attribution | string | No | Up to 120 characters. |
content.followUp.reviews[].quote | string | Yes | 1–600 characters. |
content.followUp.sendWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.sendWhen.all | array<object | object | object | object | object | object | object | object | object | object> | Yes | (variant 1) |
content.followUp.sendWhen.any | array<object | object | object | object | object | object | object | object | object | object> | Yes | (variant 2) |
content.followUp.sendWhen.not | object | object | object | object | object | object | object | object | object | object | Yes | (variant 3) |
content.followUp.sendWhen.always | enum | Yes | (variant 4) One of: true. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 1) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.is | string | number | boolean | Yes | (variant 5) (variant 1) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 2) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.in | array<string | number | boolean> | Yes | (variant 5) (variant 2) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 3) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.gt | number | Yes | (variant 5) (variant 3) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 4) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.lt | number | Yes | (variant 5) (variant 4) |
content.followUp.sendWhen.between | array | Yes | (variant 5) (variant 5) Up to 2 items. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 5) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 6) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.missing | boolean | Yes | (variant 5) (variant 6) |
content.followUp.theme | object | No | Default: \{"accent":"#B4512E","background":"#F7F3EC","font":"system","primary":"#24473D"\}. |
content.followUp.theme.accent | string | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
content.followUp.theme.background | string | No | Pattern: ^#[0-9a-f]\{6\}$. Default: "#F7F3EC". |
content.followUp.theme.font | enum | No | One of: "system", "serif_warm", "sans_modern". Default: "system". |
content.followUp.theme.logo | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.theme.primary | string | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
content.guardrails | object | Yes | — |
content.guardrails.allowPriceDiscussion | boolean | No | Default: true. |
content.guardrails.declineTopics | array<object> | No | Default: []. |
content.guardrails.declineTopics[].text | string | Yes | 1–1000 characters. |
content.guardrails.emergencyLine | string | Yes | 1–300 characters. |
content.guardrails.fallbackLine | string | Yes | 1–300 characters. |
content.guardrails.neverSay | array<object> | No | Default: []. |
content.guardrails.neverSay[].text | string | Yes | 1–1000 characters. |
content.guardrails.prohibitedClaims | array<object> | No | Default: []. |
content.guardrails.prohibitedClaims[].text | string | Yes | 1–1000 characters. |
content.guardrails.redirectLines | object | Yes | — |
content.guardrails.redirectLines.existing_customer | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.job_seeker | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.resident_family | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.vendor | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.wrong_number | string | Yes | 1–500 characters. |
content.guardrails.requiredDisclosures | array<object> | No | Default: []. |
content.guardrails.requiredDisclosures[].text | string | Yes | 1–1000 characters. |
content.integrations | object | No | Default: \{\}. |
content.integrations.crm | object | No | — |
content.integrations.crm.connectionId | string (conn_… ID) | Yes | ID (conn_…) |
content.integrations.crm.connector | string | Yes | 1–64 characters. |
content.integrations.crm.createContacts | boolean | No | Default: true. |
content.integrations.crm.fieldMap | map | No | Default: \{\}. |
content.integrations.crm.historyLookbackDays | integer | No | Between 0 and 3650. Default: 180. |
content.integrations.crm.logCalls | boolean | No | Default: true. |
content.integrations.crm.options | map | No | Default: \{\}. |
content.integrations.scheduler | object | No | — |
content.integrations.scheduler.activityType | string | Yes | 1–64 characters. |
content.integrations.scheduler.connectionId | string (conn_… ID) | Yes | ID (conn_…) |
content.integrations.scheduler.connector | string | Yes | 1–64 characters. |
content.integrations.scheduler.options | map | No | Default: \{\}. |
content.knowledge | object | No | Default: \{"documents":[],"faq":[]\}. |
content.knowledge.documents | array<object> | No | Default: []. |
content.knowledge.documents[].title | string | Yes | 1–200 characters. |
content.knowledge.faq | array<object> | No | Default: []. |
content.knowledge.faq[].answer | string | Yes | 1–2000 characters. |
content.knowledge.faq[].question | string | Yes | 1–300 characters. |
content.lexicon | object | No | Default: \{"account":[],"packs":[],"platform":1\}. |
content.lexicon.account | array<object> | No | Up to 200 items. Default: []. |
content.lexicon.account[].concept | string | Yes | Up to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$. |
content.lexicon.account[].never | array<string> | No | Up to 50 items. Default: []. |
content.lexicon.account[].phrases | array<string> | No | Up to 50 items. Default: []. |
content.lexicon.packs | array<object> | No | Up to 10 items. Default: []. |
content.lexicon.packs[].version | integer | Yes | Minimum 1. |
content.lexicon.platform | integer | No | Minimum 1. Default: 1. |
content.locks | array<string> | No | — |
content.models | object | No | Default: \{"keyterms":[]\}. |
content.models.keyterms | array<string> | No | Default: []. |
content.models.llm | string | No | Up to 200 characters. |
content.models.stt | string | No | Up to 200 characters. |
content.objections | array<object> | No | Default: []. |
content.objections[].guidance | string | Yes | 1–1000 characters. |
content.objections[].trigger | string | Yes | 1–200 characters. |
content.objectives | object | No | Default: \{"channels":\{\},"fallbacks":[],"primary":\{"label":"Book a meeting","meetingTypes":[],"qualifiedOnly":false,"type":"book_meeting"\},"secondary":[]\}. |
content.objectives.channels | object | No | Default: \{\}. |
content.objectives.channels.page_chat | object | No | — |
content.objectives.channels.site_chat | object | No | — |
content.objectives.fallbacks | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 3 items. Default: []. |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.fallbacks[].label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.fallbacks[].meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.fallbacks[].qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.fallbacks[].type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.fallbacks[].label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.fallbacks[].reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.fallbacks[].type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.fallbacks[].label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.fallbacks[].requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.fallbacks[].type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.fallbacks[].fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.fallbacks[].label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.fallbacks[].fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.fallbacks[].flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.fallbacks[].label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.fallbacks[].label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.fallbacks[].label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.fallbacks[].kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.fallbacks[].label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.fallbacks[].label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.fallbacks[].bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.fallbacks[].label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.fallbacks[].label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.fallbacks[].label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.fallbacks[].when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.fallbacks[].label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.fallbacks[].rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 13) One of: "custom_judged". |
content.objectives.primary | object | object | object | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.primary.label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.primary.meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.primary.qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.primary.type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.primary.label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.primary.reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.primary.type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.primary.label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.primary.requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.primary.type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.primary.fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.primary.label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.primary.fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.primary.flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.primary.label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.primary.label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.primary.label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.primary.kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.primary.label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.primary.label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.primary.bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.primary.label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.primary.label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.primary.label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.primary.when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.primary.label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.primary.rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.primary.type | enum | Yes | (variant 13) One of: "custom_judged". |
content.objectives.secondary | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 5 items. Default: []. |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.secondary[].label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.secondary[].meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.secondary[].qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.secondary[].type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.secondary[].label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.secondary[].reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.secondary[].type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.secondary[].label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.secondary[].requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.secondary[].type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.secondary[].fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.secondary[].label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.secondary[].fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.secondary[].flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.secondary[].label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.secondary[].label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.secondary[].label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.secondary[].kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.secondary[].label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.secondary[].label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.secondary[].bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.secondary[].label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.secondary[].label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.secondary[].label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.secondary[].when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.secondary[].label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.secondary[].rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 13) One of: "custom_judged". |
content.persona | object | Yes | — |
content.persona.agentName | string | Yes | 1–60 characters. |
content.persona.companyName | string | Yes | 1–120 characters. |
content.persona.exampleExchanges | array<object> | No | Default: []. |
content.persona.exampleExchanges[].agent | string | Yes | 1–500 characters. |
content.persona.exampleExchanges[].caller | string | Yes | 1–500 characters. |
content.persona.opening | string | Yes | 1–600 characters. |
content.persona.openingAfterRing | string | No | 1–600 characters. |
content.persona.openingNotRecorded | string | No | 1–600 characters. |
content.persona.openingQuestion | string | Yes | 1–300 characters. |
content.persona.preRingNotice | string | No | 1–300 characters. |
content.persona.returningCallerLine | string | No | Up to 300 characters. |
content.persona.tone | string | Yes | 1–300 characters. |
content.persona.voice | object | Yes | — |
content.persona.voice.ambience | boolean | No | Default: false. |
content.persona.voice.expressive | boolean | No | Default: false. |
content.persona.voice.mode | enum | No | One of: "cascaded". Default: "cascaded". |
content.persona.voice.model | string | No | Up to 200 characters. |
content.persona.voice.pronunciations | array<object> | No | Default: []. |
content.persona.voice.provider | enum | Yes | One of: "cartesia", "elevenlabs", "deepgram", "fishaudio", "gradium", "inworld", "rime", "xai", "openai", "google". |
content.persona.voice.thinkingSounds | boolean | No | Default: true. |
content.persona.voice.tuning | map | No | Default: \{\}. |
content.persona.voice.voiceId | string | Yes | 1–200 characters. |
content.pricing | object | No | Default: \{"feeLine":"The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.","floorPlanLine":"\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.","mentionSpecials":"when_price_comes_up","notOfferedLine":"\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.","onRequestLine":"Our team will go over pricing for \{\{price.service\}\} with you.","otherLocations":"off","otherLocationsLine":"\{\{price.service\}\} is offered at \{\{price.locations\}\}.","specialLine":"\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.","specialLineOpenEnded":"\{\{price.specialWording\}\}.","startingAtLine":"\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.","startingAtWithOptions":"\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}."\}. |
content.pricing.feeLine | string | No | 1–300 characters. Default: "The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.". |
content.pricing.floorPlanLine | string | No | 1–300 characters. Default: "\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.". |
content.pricing.mentionSpecials | enum | No | One of: "when_price_comes_up", "once_after_discovery", "only_when_asked". Default: "when_price_comes_up". |
content.pricing.notOfferedLine | string | No | 1–300 characters. Default: "\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.". |
content.pricing.onRequestLine | string | No | 1–300 characters. Default: "Our team will go over pricing for \{\{price.service\}\} with you.". |
content.pricing.otherLocations | enum | No | One of: "off", "mention", "mention_and_connect". Default: "off". |
content.pricing.otherLocationsLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} is offered at \{\{price.locations\}\}.". |
content.pricing.specialLine | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.". |
content.pricing.specialLineOpenEnded | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}.". |
content.pricing.startingAtLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
content.pricing.startingAtWithOptions | string | No | 1–300 characters. Default: "\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
content.recording | object | No | Default: \{"enabled":true\}. |
content.recording.enabled | boolean | No | Default: true. |
content.retention | object | No | Default: \{"recordingDays":90,"transcriptDays":90\}. |
content.retention.recordingDays | integer | No | Between 1 and 3650. Default: 90. |
content.retention.transcriptDays | integer | No | Between 1 and 3650. Default: 90. |
content.schemaVersion | enum | No | One of: 1. Default: 1. |
content.tools | object | No | Default: \{"bindings":[]\}. |
content.tools.bindings | array<object> | No | Up to 20 items. Default: []. |
content.tools.bindings[].allowCallerInput | boolean | No | Default: true. |
content.tools.bindings[].args | map | No | Default: \{\}. |
content.tools.bindings[].as | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.tools.bindings[].channels | array<enum> | No | Items: "phone", "web_voice", "web_chat". Default: ["phone","web_voice","web_chat"]. |
content.tools.bindings[].confirmWithCaller | boolean | No | Default: false. |
content.tools.bindings[].enabled | boolean | No | Default: true. |
content.tools.bindings[].holdingLine | string | No | 1–200 characters. |
content.tools.bindings[].inputs | map | No | Default: \{\}. |
content.tools.bindings[].label | string | Yes | 1–80 characters. |
content.tools.bindings[].maxCalls | integer | No | Between 1 and 3. Default: 3. |
content.tools.bindings[].onFailure | enum | No | One of: "say_will_follow_up", "continue_silently", "offer_callback", "transfer". Default: "say_will_follow_up". |
content.tools.bindings[].result | object | Yes | — |
content.tools.bindings[].tool | object | Yes | — |
content.tools.bindings[].trigger | object | object | Yes | — |
content.tools.bindings[].when | object | object | object | object | object | object | object | object | object | object | No | — |
content.visitActions | object | No | — |
content.visitActions.allowCustom | boolean | No | Default: true. |
content.visitActions.items | array<object> | No | Up to 30 items. |
content.visitActions.items[].crmTask | boolean | No | Default: false. |
content.visitActions.items[].dueDays | integer | No | Between 0 and 30. Default: 1. |
content.visitActions.items[].key | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.visitActions.items[].label | string | Yes | 1–240 characters. |
content.visitActions.items[].owner | enum | No | One of: "rep", "backup". Default: "rep". |
content.visitActions.typedCrmTask | boolean | No | Default: false. |
content.webWidget | object | No | Default: \{"continuationDisclosure":"Hi again — this is the AI assistant you spoke with on the phone.","continuationGreeting":"I have the notes from your call, so we can pick up right where we left off. What else can I help with?","copy":\{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\},"disclosure":"Hi — I am an AI assistant, and I can answer questions or book you a time to visit.","enabled":false,"greeting":"What would you like to know?","launcher":\{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\},"limits":\{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\},"panel":\{"height":620,"presentation":"panel","width":400\},"showMedia":false,"surfaces":\{"chat":true,"voice":false\},"theme":\{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}\}. |
content.webWidget.continuationDisclosure | string | No | 1–320 characters. Default: "Hi again — this is the AI assistant you spoke with on the phone.". |
content.webWidget.continuationGreeting | string | No | 1–320 characters. Default: "I have the notes from your call, so we can pick up right where we left off. What else can I help with?". |
content.webWidget.copy | object | No | Default: \{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\}. |
content.webWidget.copy.agentLabel | string | No | 1–80 characters. Default: "AI assistant". |
content.webWidget.copy.choicesLabel | string | No | 1–80 characters. Default: "Tap an answer, or type your own". |
content.webWidget.copy.closeLabel | string | No | 1–80 characters. Default: "Close the chat". |
content.webWidget.copy.composerDisabledNote | string | No | 1–320 characters. Default: "Messaging is not switched on here yet.". |
content.webWidget.copy.continuingNote | string | No | 1–80 characters. Default: "Continuing from your call on \{date\}". |
content.webWidget.copy.endedNote | string | No | 1–320 characters. Default: "This conversation has ended.". |
content.webWidget.copy.errorBody | string | No | 1–320 characters. Default: "Please try again in a moment, or call us and we will help.". |
content.webWidget.copy.errorTitle | string | No | 1–80 characters. Default: "We could not load the chat". |
content.webWidget.copy.inputPlaceholder | string | No | 1–80 characters. Default: "Type your question". |
content.webWidget.copy.loadingLabel | string | No | 1–80 characters. Default: "Loading the chat". |
content.webWidget.copy.newChatLabel | string | No | 1–80 characters. Default: "Start a new chat". |
content.webWidget.copy.notAllowedBody | string | No | 1–320 characters. Default: "If you run this website, add it to the allowed list in your admin settings.". |
content.webWidget.copy.notAllowedTitle | string | No | 1–80 characters. Default: "This chat is not available on this site". |
content.webWidget.copy.openLabel | string | No | 1–80 characters. Default: "Open the chat". |
content.webWidget.copy.retryLabel | string | No | 1–80 characters. Default: "Try again". |
content.webWidget.copy.sendFailed | string | No | 1–320 characters. Default: "That message did not send. Please try again.". |
content.webWidget.copy.sendLabel | string | No | 1–80 characters. Default: "Send". |
content.webWidget.copy.subtitle | string | No | 1–80 characters. Default: "Answers in a moment". |
content.webWidget.copy.typingLabel | string | No | 1–80 characters. Default: "Writing a reply". |
content.webWidget.copy.visitorLabel | string | No | 1–80 characters. Default: "You". |
content.webWidget.disclosure | string | No | 1–320 characters. Default: "Hi — I am an AI assistant, and I can answer questions or book you a time to visit.". |
content.webWidget.enabled | boolean | No | Default: false. |
content.webWidget.greeting | string | No | 1–320 characters. Default: "What would you like to know?". |
content.webWidget.launcher | object | No | Default: \{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\}. |
content.webWidget.launcher.icon | enum | No | One of: "chat", "message", "question", "sparkle", "phone", "headset". Default: "chat". |
content.webWidget.launcher.iconUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.launcher.label | string | No | 1–80 characters. Default: "Chat with us". |
content.webWidget.launcher.offset | object | No | Default: \{"x":20,"y":20\}. |
content.webWidget.launcher.position | enum | No | One of: "bottom-right", "bottom-left". Default: "bottom-right". |
content.webWidget.launcher.shape | enum | No | One of: "circle", "rounded". Default: "circle". |
content.webWidget.launcher.showLabel | boolean | No | Default: false. |
content.webWidget.launcher.size | enum | No | One of: "medium", "large". Default: "medium". |
content.webWidget.limits | object | No | Default: \{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\}. |
content.webWidget.limits.charactersPerMessage | integer | No | Between 200 and 8000. Default: 2000. |
content.webWidget.limits.messagesPerConversation | integer | No | Between 1 and 2000. Default: 200. |
content.webWidget.limits.messagesPerHour | integer | No | Between 1 and 500. Default: 30. |
content.webWidget.panel | object | No | Default: \{"height":620,"presentation":"panel","width":400\}. |
content.webWidget.panel.heading | string | No | 1–80 characters. |
content.webWidget.panel.height | integer | No | Between 420 and 800. Default: 620. |
content.webWidget.panel.presentation | enum | No | One of: "panel", "sheet", "fullscreen". Default: "panel". |
content.webWidget.panel.width | integer | No | Between 320 and 560. Default: 400. |
content.webWidget.showMedia | boolean | No | Default: false. |
content.webWidget.surfaces | object | No | Default: \{"chat":true,"voice":false\}. |
content.webWidget.surfaces.chat | boolean | No | Default: true. |
content.webWidget.surfaces.voice | boolean | No | Default: false. |
content.webWidget.theme | object | No | Default: \{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}. |
content.webWidget.theme.avatar | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.theme.dark | object | No | Default: \{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\}. |
content.webWidget.theme.font | enum | No | One of: "system", "serif_warm", "sans_modern". Default: "system". |
content.webWidget.theme.light | object | No | Default: \{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\}. |
content.webWidget.theme.logo | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.theme.radius | object | No | Default: \{"bubble":14,"launcher":28,"panel":16\}. |
content.webWidget.theme.scheme | enum | No | One of: "auto", "light", "dark". Default: "auto". |
contentHash | string | Yes | — |
draft | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/draft" \
-H "Authorization: Bearer $ACCESS_TOKEN"Autosave the draft; records the change in words#
PUT /v1/account/playbooks/{playbookId}/draft
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
baseHash | string | No | Exactly 64 characters. |
content | PlaybookContent | Yes | — |
content.booking | object | Yes | — |
content.booking.allowUnqualified | boolean | No | Default: false. |
content.booking.maxBookingsPerCall | integer | No | Between 1 and 2. Default: 2. |
content.booking.minNoticeMinutes | integer | No | Between 0 and 10080. Default: 60. |
content.booking.offerSlots | integer | No | Between 1 and 4. Default: 2. |
content.booking.rules | array<object> | Yes | — |
content.booking.rules[].enabled | boolean | No | Default: true. |
content.booking.rules[].name | string | No | Up to 120 characters. |
content.booking.rules[].then | object | object | object | object | object | object | object | Yes | — |
content.booking.rules[].when | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.brief | string | Yes | 1–12000 characters. |
content.defaultFlowId | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.escalation | object | Yes | — |
content.escalation.afterFailedAnswers | integer | No | Between 1 and 5. Default: 2. |
content.escalation.onFrustration | boolean | No | Default: true. |
content.escalation.onGuardrailHit | boolean | No | Default: true. |
content.escalation.transferLine | string | Yes | 1–300 characters. |
content.escalation.transferMode | enum | No | One of: "cold", "warm". Default: "cold". |
content.escalation.unavailableLine | string | Yes | 1–300 characters. |
content.flows | array<object> | Yes | — |
content.flows[].branch | array<object> | No | Default: []. |
content.flows[].branch[].goto | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.flows[].branch[].if | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.flows[].disqualify | array<object> | No | Default: []. |
content.flows[].disqualify[].action | enum | Yes | One of: "offer_nurture", "offer_referral", "end_politely". |
content.flows[].disqualify[].if | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.flows[].disqualify[].line | string | No | Up to 500 characters. |
content.flows[].enterWhen | string | Yes | 1–500 characters. |
content.flows[].fields | array<object> | Yes | — |
content.flows[].fields[].alwaysConfirm | boolean | No | — |
content.flows[].fields[].ask | string | Yes | 1–500 characters. |
content.flows[].fields[].askWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.flows[].fields[].hearAs | array<string> | No | Up to 20 items. |
content.flows[].fields[].hint | string | No | Up to 500 characters. |
content.flows[].fields[].key | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.flows[].fields[].label | string | No | 1–120 characters. |
content.flows[].fields[].options | array<object> | No | — |
content.flows[].fields[].optionsFrom | enum | string (oset_… ID) | No | — |
content.flows[].fields[].required | boolean | No | Default: false. |
content.flows[].fields[].sensitivity | enum | No | One of: "standard", "sensitive". Default: "standard". |
content.flows[].fields[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
content.flows[].goal | string | Yes | 1–500 characters. |
content.flows[].maxQuestionsBeforeValue | integer | No | Between 1 and 10. Default: 2. |
content.flows[].name | string | Yes | 1–120 characters. |
content.flows[].talkingPoints | array<object | object> | No | Default: []. |
content.flows[].talkingPoints[].say | string | Yes | (variant 1) 1–500 characters. |
content.flows[].talkingPoints[].when | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.flows[].talkingPoints[].talkAbout | string | Yes | (variant 2) 1–500 characters. |
content.flows[].talkingPoints[].when | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.followUp | object | No | — |
content.followUp.blocks | array<object> | No | Up to 20 items. Default: []. |
content.followUp.blocks[].body | string | No | Up to 2000 characters. |
content.followUp.blocks[].button | object | No | — |
content.followUp.blocks[].heading | string | No | Up to 120 characters. |
content.followUp.blocks[].image | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.blocks[].video | object | No | — |
content.followUp.cards | array<object> | No | Up to 30 items. Default: []. |
content.followUp.cards[].body | string | Yes | 1–2000 characters. |
content.followUp.cards[].button | object | No | — |
content.followUp.cards[].enabled | boolean | No | Default: true. |
content.followUp.cards[].image | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.cards[].showWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.cards[].title | string | Yes | 1–120 characters. |
content.followUp.chat | object | No | Default: \{"callContext":true,"enabled":false\}. |
content.followUp.chat.callContext | boolean | No | Default: true. |
content.followUp.chat.enabled | boolean | No | Default: false. |
content.followUp.consentQuestion | string | No | 1–480 characters. Default: "Can I text you a link with your \{\{vocab.meeting\}\} details and a recap of our call? Message and data rates may apply, and you can reply STOP anytime.". |
content.followUp.emails | object | No | — |
content.followUp.emails.after_visit | object | null | No | — |
content.followUp.emails.cancel_confirmation | object | null | No | — |
content.followUp.emails.initial_link | object | null | No | — |
content.followUp.emails.reminder | object | null | No | — |
content.followUp.emails.reschedule_confirmation | object | null | No | — |
content.followUp.enabled | boolean | No | Default: false. |
content.followUp.form | object | No | Default: \{"fields":[]\}. |
content.followUp.form.fields | array<object> | No | Up to 8 items. Default: []. |
content.followUp.form.intro | string | No | Up to 480 characters. |
content.followUp.leads | object | No | Default: \{\}. |
content.followUp.leads.afterVisit | string | No | Up to 480 characters. |
content.followUp.leads.cancelled | string | No | Up to 480 characters. |
content.followUp.leads.noBooking | string | No | Up to 480 characters. |
content.followUp.linkExpiryDays | integer | No | Between 7 and 365. Default: 60. |
content.followUp.messages | object | No | Default: \{"afterVisit":\{"enabled":false\},"initialSms":"Hi \{\{caller.firstName\}\}, it's \{\{group.name\}\}. Here are your \{\{vocab.meeting\}\} details and a recap of our call: \{\{link\}\} Reply STOP to opt out.","reminders":[\{"before":"24h"\},\{"before":"2h"\}]\}. |
content.followUp.messages.afterVisit | object | No | Default: \{"enabled":false\}. |
content.followUp.messages.initialSms | string | Yes | 1–480 characters. |
content.followUp.messages.reminders | array<object> | No | Up to 4 items. Default: [\{"before":"24h"\},\{"before":"2h"\}]. |
content.followUp.modules | array<object> | No | Default: [\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\}]. |
content.followUp.modules[].blockId | string | No | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.followUp.modules[].heading | string | No | Up to 120 characters. |
content.followUp.modules[].showWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.modules[].states | array<enum> | No | Items: "upcoming", "day_of", "after_visit", "no_booking", "cancelled", "expired", "revoked". |
content.followUp.prep | object | No | Default: \{"checklist":[]\}. |
content.followUp.prep.body | string | No | Up to 2000 characters. |
content.followUp.prep.checklist | array<object> | No | Up to 12 items. Default: []. |
content.followUp.resources | array<object> | No | Up to 20 items. Default: []. |
content.followUp.resources[].description | string | No | Up to 300 characters. |
content.followUp.resources[].label | string | Yes | 1–120 characters. |
content.followUp.resources[].url | string (uri) | Yes | A https:// link Up to 2000 characters. |
content.followUp.reviews | array<object> | No | Up to 12 items. Default: []. |
content.followUp.reviews[].attribution | string | No | Up to 120 characters. |
content.followUp.reviews[].quote | string | Yes | 1–600 characters. |
content.followUp.sendWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.sendWhen.all | array<object | object | object | object | object | object | object | object | object | object> | Yes | (variant 1) |
content.followUp.sendWhen.any | array<object | object | object | object | object | object | object | object | object | object> | Yes | (variant 2) |
content.followUp.sendWhen.not | object | object | object | object | object | object | object | object | object | object | Yes | (variant 3) |
content.followUp.sendWhen.always | enum | Yes | (variant 4) One of: true. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 1) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.is | string | number | boolean | Yes | (variant 5) (variant 1) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 2) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.in | array<string | number | boolean> | Yes | (variant 5) (variant 2) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 3) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.gt | number | Yes | (variant 5) (variant 3) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 4) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.lt | number | Yes | (variant 5) (variant 4) |
content.followUp.sendWhen.between | array | Yes | (variant 5) (variant 5) Up to 2 items. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 5) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 6) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.missing | boolean | Yes | (variant 5) (variant 6) |
content.followUp.theme | object | No | Default: \{"accent":"#B4512E","background":"#F7F3EC","font":"system","primary":"#24473D"\}. |
content.followUp.theme.accent | string | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
content.followUp.theme.background | string | No | Pattern: ^#[0-9a-f]\{6\}$. Default: "#F7F3EC". |
content.followUp.theme.font | enum | No | One of: "system", "serif_warm", "sans_modern". Default: "system". |
content.followUp.theme.logo | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.theme.primary | string | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
content.guardrails | object | Yes | — |
content.guardrails.allowPriceDiscussion | boolean | No | Default: true. |
content.guardrails.declineTopics | array<object> | No | Default: []. |
content.guardrails.declineTopics[].text | string | Yes | 1–1000 characters. |
content.guardrails.emergencyLine | string | Yes | 1–300 characters. |
content.guardrails.fallbackLine | string | Yes | 1–300 characters. |
content.guardrails.neverSay | array<object> | No | Default: []. |
content.guardrails.neverSay[].text | string | Yes | 1–1000 characters. |
content.guardrails.prohibitedClaims | array<object> | No | Default: []. |
content.guardrails.prohibitedClaims[].text | string | Yes | 1–1000 characters. |
content.guardrails.redirectLines | object | Yes | — |
content.guardrails.redirectLines.existing_customer | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.job_seeker | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.resident_family | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.vendor | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.wrong_number | string | Yes | 1–500 characters. |
content.guardrails.requiredDisclosures | array<object> | No | Default: []. |
content.guardrails.requiredDisclosures[].text | string | Yes | 1–1000 characters. |
content.integrations | object | No | Default: \{\}. |
content.integrations.crm | object | No | — |
content.integrations.crm.connectionId | string (conn_… ID) | Yes | ID (conn_…) |
content.integrations.crm.connector | string | Yes | 1–64 characters. |
content.integrations.crm.createContacts | boolean | No | Default: true. |
content.integrations.crm.fieldMap | map | No | Default: \{\}. |
content.integrations.crm.historyLookbackDays | integer | No | Between 0 and 3650. Default: 180. |
content.integrations.crm.logCalls | boolean | No | Default: true. |
content.integrations.crm.options | map | No | Default: \{\}. |
content.integrations.scheduler | object | No | — |
content.integrations.scheduler.activityType | string | Yes | 1–64 characters. |
content.integrations.scheduler.connectionId | string (conn_… ID) | Yes | ID (conn_…) |
content.integrations.scheduler.connector | string | Yes | 1–64 characters. |
content.integrations.scheduler.options | map | No | Default: \{\}. |
content.knowledge | object | No | Default: \{"documents":[],"faq":[]\}. |
content.knowledge.documents | array<object> | No | Default: []. |
content.knowledge.documents[].title | string | Yes | 1–200 characters. |
content.knowledge.faq | array<object> | No | Default: []. |
content.knowledge.faq[].answer | string | Yes | 1–2000 characters. |
content.knowledge.faq[].question | string | Yes | 1–300 characters. |
content.lexicon | object | No | Default: \{"account":[],"packs":[],"platform":1\}. |
content.lexicon.account | array<object> | No | Up to 200 items. Default: []. |
content.lexicon.account[].concept | string | Yes | Up to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$. |
content.lexicon.account[].never | array<string> | No | Up to 50 items. Default: []. |
content.lexicon.account[].phrases | array<string> | No | Up to 50 items. Default: []. |
content.lexicon.packs | array<object> | No | Up to 10 items. Default: []. |
content.lexicon.packs[].version | integer | Yes | Minimum 1. |
content.lexicon.platform | integer | No | Minimum 1. Default: 1. |
content.locks | array<string> | No | — |
content.models | object | No | Default: \{"keyterms":[]\}. |
content.models.keyterms | array<string> | No | Default: []. |
content.models.llm | string | No | Up to 200 characters. |
content.models.stt | string | No | Up to 200 characters. |
content.objections | array<object> | No | Default: []. |
content.objections[].guidance | string | Yes | 1–1000 characters. |
content.objections[].trigger | string | Yes | 1–200 characters. |
content.objectives | object | No | Default: \{"channels":\{\},"fallbacks":[],"primary":\{"label":"Book a meeting","meetingTypes":[],"qualifiedOnly":false,"type":"book_meeting"\},"secondary":[]\}. |
content.objectives.channels | object | No | Default: \{\}. |
content.objectives.channels.page_chat | object | No | — |
content.objectives.channels.site_chat | object | No | — |
content.objectives.fallbacks | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 3 items. Default: []. |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.fallbacks[].label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.fallbacks[].meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.fallbacks[].qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.fallbacks[].type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.fallbacks[].label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.fallbacks[].reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.fallbacks[].type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.fallbacks[].label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.fallbacks[].requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.fallbacks[].type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.fallbacks[].fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.fallbacks[].label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.fallbacks[].fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.fallbacks[].flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.fallbacks[].label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.fallbacks[].label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.fallbacks[].label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.fallbacks[].kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.fallbacks[].label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.fallbacks[].label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.fallbacks[].bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.fallbacks[].label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.fallbacks[].label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.fallbacks[].label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.fallbacks[].when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.fallbacks[].label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.fallbacks[].rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 13) One of: "custom_judged". |
content.objectives.primary | object | object | object | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.primary.label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.primary.meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.primary.qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.primary.type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.primary.label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.primary.reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.primary.type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.primary.label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.primary.requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.primary.type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.primary.fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.primary.label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.primary.fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.primary.flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.primary.label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.primary.label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.primary.label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.primary.kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.primary.label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.primary.label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.primary.bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.primary.label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.primary.label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.primary.label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.primary.when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.primary.label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.primary.rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.primary.type | enum | Yes | (variant 13) One of: "custom_judged". |
content.objectives.secondary | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 5 items. Default: []. |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.secondary[].label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.secondary[].meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.secondary[].qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.secondary[].type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.secondary[].label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.secondary[].reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.secondary[].type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.secondary[].label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.secondary[].requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.secondary[].type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.secondary[].fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.secondary[].label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.secondary[].fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.secondary[].flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.secondary[].label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.secondary[].label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.secondary[].label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.secondary[].kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.secondary[].label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.secondary[].label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.secondary[].bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.secondary[].label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.secondary[].label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.secondary[].label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.secondary[].when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.secondary[].label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.secondary[].rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 13) One of: "custom_judged". |
content.persona | object | Yes | — |
content.persona.agentName | string | Yes | 1–60 characters. |
content.persona.companyName | string | Yes | 1–120 characters. |
content.persona.exampleExchanges | array<object> | No | Default: []. |
content.persona.exampleExchanges[].agent | string | Yes | 1–500 characters. |
content.persona.exampleExchanges[].caller | string | Yes | 1–500 characters. |
content.persona.opening | string | Yes | 1–600 characters. |
content.persona.openingAfterRing | string | No | 1–600 characters. |
content.persona.openingNotRecorded | string | No | 1–600 characters. |
content.persona.openingQuestion | string | Yes | 1–300 characters. |
content.persona.preRingNotice | string | No | 1–300 characters. |
content.persona.returningCallerLine | string | No | Up to 300 characters. |
content.persona.tone | string | Yes | 1–300 characters. |
content.persona.voice | object | Yes | — |
content.persona.voice.ambience | boolean | No | Default: false. |
content.persona.voice.expressive | boolean | No | Default: false. |
content.persona.voice.mode | enum | No | One of: "cascaded". Default: "cascaded". |
content.persona.voice.model | string | No | Up to 200 characters. |
content.persona.voice.pronunciations | array<object> | No | Default: []. |
content.persona.voice.provider | enum | Yes | One of: "cartesia", "elevenlabs", "deepgram", "fishaudio", "gradium", "inworld", "rime", "xai", "openai", "google". |
content.persona.voice.thinkingSounds | boolean | No | Default: true. |
content.persona.voice.tuning | map | No | Default: \{\}. |
content.persona.voice.voiceId | string | Yes | 1–200 characters. |
content.pricing | object | No | Default: \{"feeLine":"The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.","floorPlanLine":"\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.","mentionSpecials":"when_price_comes_up","notOfferedLine":"\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.","onRequestLine":"Our team will go over pricing for \{\{price.service\}\} with you.","otherLocations":"off","otherLocationsLine":"\{\{price.service\}\} is offered at \{\{price.locations\}\}.","specialLine":"\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.","specialLineOpenEnded":"\{\{price.specialWording\}\}.","startingAtLine":"\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.","startingAtWithOptions":"\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}."\}. |
content.pricing.feeLine | string | No | 1–300 characters. Default: "The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.". |
content.pricing.floorPlanLine | string | No | 1–300 characters. Default: "\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.". |
content.pricing.mentionSpecials | enum | No | One of: "when_price_comes_up", "once_after_discovery", "only_when_asked". Default: "when_price_comes_up". |
content.pricing.notOfferedLine | string | No | 1–300 characters. Default: "\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.". |
content.pricing.onRequestLine | string | No | 1–300 characters. Default: "Our team will go over pricing for \{\{price.service\}\} with you.". |
content.pricing.otherLocations | enum | No | One of: "off", "mention", "mention_and_connect". Default: "off". |
content.pricing.otherLocationsLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} is offered at \{\{price.locations\}\}.". |
content.pricing.specialLine | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.". |
content.pricing.specialLineOpenEnded | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}.". |
content.pricing.startingAtLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
content.pricing.startingAtWithOptions | string | No | 1–300 characters. Default: "\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
content.recording | object | No | Default: \{"enabled":true\}. |
content.recording.enabled | boolean | No | Default: true. |
content.retention | object | No | Default: \{"recordingDays":90,"transcriptDays":90\}. |
content.retention.recordingDays | integer | No | Between 1 and 3650. Default: 90. |
content.retention.transcriptDays | integer | No | Between 1 and 3650. Default: 90. |
content.schemaVersion | enum | No | One of: 1. Default: 1. |
content.tools | object | No | Default: \{"bindings":[]\}. |
content.tools.bindings | array<object> | No | Up to 20 items. Default: []. |
content.tools.bindings[].allowCallerInput | boolean | No | Default: true. |
content.tools.bindings[].args | map | No | Default: \{\}. |
content.tools.bindings[].as | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.tools.bindings[].channels | array<enum> | No | Items: "phone", "web_voice", "web_chat". Default: ["phone","web_voice","web_chat"]. |
content.tools.bindings[].confirmWithCaller | boolean | No | Default: false. |
content.tools.bindings[].enabled | boolean | No | Default: true. |
content.tools.bindings[].holdingLine | string | No | 1–200 characters. |
content.tools.bindings[].inputs | map | No | Default: \{\}. |
content.tools.bindings[].label | string | Yes | 1–80 characters. |
content.tools.bindings[].maxCalls | integer | No | Between 1 and 3. Default: 3. |
content.tools.bindings[].onFailure | enum | No | One of: "say_will_follow_up", "continue_silently", "offer_callback", "transfer". Default: "say_will_follow_up". |
content.tools.bindings[].result | object | Yes | — |
content.tools.bindings[].tool | object | Yes | — |
content.tools.bindings[].trigger | object | object | Yes | — |
content.tools.bindings[].when | object | object | object | object | object | object | object | object | object | object | No | — |
content.visitActions | object | No | — |
content.visitActions.allowCustom | boolean | No | Default: true. |
content.visitActions.items | array<object> | No | Up to 30 items. |
content.visitActions.items[].crmTask | boolean | No | Default: false. |
content.visitActions.items[].dueDays | integer | No | Between 0 and 30. Default: 1. |
content.visitActions.items[].key | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.visitActions.items[].label | string | Yes | 1–240 characters. |
content.visitActions.items[].owner | enum | No | One of: "rep", "backup". Default: "rep". |
content.visitActions.typedCrmTask | boolean | No | Default: false. |
content.webWidget | object | No | Default: \{"continuationDisclosure":"Hi again — this is the AI assistant you spoke with on the phone.","continuationGreeting":"I have the notes from your call, so we can pick up right where we left off. What else can I help with?","copy":\{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\},"disclosure":"Hi — I am an AI assistant, and I can answer questions or book you a time to visit.","enabled":false,"greeting":"What would you like to know?","launcher":\{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\},"limits":\{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\},"panel":\{"height":620,"presentation":"panel","width":400\},"showMedia":false,"surfaces":\{"chat":true,"voice":false\},"theme":\{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}\}. |
content.webWidget.continuationDisclosure | string | No | 1–320 characters. Default: "Hi again — this is the AI assistant you spoke with on the phone.". |
content.webWidget.continuationGreeting | string | No | 1–320 characters. Default: "I have the notes from your call, so we can pick up right where we left off. What else can I help with?". |
content.webWidget.copy | object | No | Default: \{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\}. |
content.webWidget.copy.agentLabel | string | No | 1–80 characters. Default: "AI assistant". |
content.webWidget.copy.choicesLabel | string | No | 1–80 characters. Default: "Tap an answer, or type your own". |
content.webWidget.copy.closeLabel | string | No | 1–80 characters. Default: "Close the chat". |
content.webWidget.copy.composerDisabledNote | string | No | 1–320 characters. Default: "Messaging is not switched on here yet.". |
content.webWidget.copy.continuingNote | string | No | 1–80 characters. Default: "Continuing from your call on \{date\}". |
content.webWidget.copy.endedNote | string | No | 1–320 characters. Default: "This conversation has ended.". |
content.webWidget.copy.errorBody | string | No | 1–320 characters. Default: "Please try again in a moment, or call us and we will help.". |
content.webWidget.copy.errorTitle | string | No | 1–80 characters. Default: "We could not load the chat". |
content.webWidget.copy.inputPlaceholder | string | No | 1–80 characters. Default: "Type your question". |
content.webWidget.copy.loadingLabel | string | No | 1–80 characters. Default: "Loading the chat". |
content.webWidget.copy.newChatLabel | string | No | 1–80 characters. Default: "Start a new chat". |
content.webWidget.copy.notAllowedBody | string | No | 1–320 characters. Default: "If you run this website, add it to the allowed list in your admin settings.". |
content.webWidget.copy.notAllowedTitle | string | No | 1–80 characters. Default: "This chat is not available on this site". |
content.webWidget.copy.openLabel | string | No | 1–80 characters. Default: "Open the chat". |
content.webWidget.copy.retryLabel | string | No | 1–80 characters. Default: "Try again". |
content.webWidget.copy.sendFailed | string | No | 1–320 characters. Default: "That message did not send. Please try again.". |
content.webWidget.copy.sendLabel | string | No | 1–80 characters. Default: "Send". |
content.webWidget.copy.subtitle | string | No | 1–80 characters. Default: "Answers in a moment". |
content.webWidget.copy.typingLabel | string | No | 1–80 characters. Default: "Writing a reply". |
content.webWidget.copy.visitorLabel | string | No | 1–80 characters. Default: "You". |
content.webWidget.disclosure | string | No | 1–320 characters. Default: "Hi — I am an AI assistant, and I can answer questions or book you a time to visit.". |
content.webWidget.enabled | boolean | No | Default: false. |
content.webWidget.greeting | string | No | 1–320 characters. Default: "What would you like to know?". |
content.webWidget.launcher | object | No | Default: \{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\}. |
content.webWidget.launcher.icon | enum | No | One of: "chat", "message", "question", "sparkle", "phone", "headset". Default: "chat". |
content.webWidget.launcher.iconUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.launcher.label | string | No | 1–80 characters. Default: "Chat with us". |
content.webWidget.launcher.offset | object | No | Default: \{"x":20,"y":20\}. |
content.webWidget.launcher.position | enum | No | One of: "bottom-right", "bottom-left". Default: "bottom-right". |
content.webWidget.launcher.shape | enum | No | One of: "circle", "rounded". Default: "circle". |
content.webWidget.launcher.showLabel | boolean | No | Default: false. |
content.webWidget.launcher.size | enum | No | One of: "medium", "large". Default: "medium". |
content.webWidget.limits | object | No | Default: \{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\}. |
content.webWidget.limits.charactersPerMessage | integer | No | Between 200 and 8000. Default: 2000. |
content.webWidget.limits.messagesPerConversation | integer | No | Between 1 and 2000. Default: 200. |
content.webWidget.limits.messagesPerHour | integer | No | Between 1 and 500. Default: 30. |
content.webWidget.panel | object | No | Default: \{"height":620,"presentation":"panel","width":400\}. |
content.webWidget.panel.heading | string | No | 1–80 characters. |
content.webWidget.panel.height | integer | No | Between 420 and 800. Default: 620. |
content.webWidget.panel.presentation | enum | No | One of: "panel", "sheet", "fullscreen". Default: "panel". |
content.webWidget.panel.width | integer | No | Between 320 and 560. Default: 400. |
content.webWidget.showMedia | boolean | No | Default: false. |
content.webWidget.surfaces | object | No | Default: \{"chat":true,"voice":false\}. |
content.webWidget.surfaces.chat | boolean | No | Default: true. |
content.webWidget.surfaces.voice | boolean | No | Default: false. |
content.webWidget.theme | object | No | Default: \{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}. |
content.webWidget.theme.avatar | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.theme.dark | object | No | Default: \{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\}. |
content.webWidget.theme.font | enum | No | One of: "system", "serif_warm", "sans_modern". Default: "system". |
content.webWidget.theme.light | object | No | Default: \{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\}. |
content.webWidget.theme.logo | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.theme.radius | object | No | Default: \{"bubble":14,"launcher":28,"panel":16\}. |
content.webWidget.theme.scheme | enum | No | One of: "auto", "light", "dark". Default: "auto". |
note | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
changes | array<PlaybookChange> | Yes | — |
changes[].after | any | No | — |
changes[].before | any | No | — |
changes[].kind | enum | Yes | One of: "added", "removed", "changed". |
changes[].path | string | Yes | — |
changes[].summary | string | Yes | — |
checklist | array<ValidationMessage> | Yes | — |
checklist[].message | string | Yes | — |
checklist[].path | string | Yes | — |
checklist[].severity | enum | Yes | One of: "error", "warning". |
draft | PlaybookVersion | Yes | — |
draft.authorId | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
draft.changeNote | string | null | Yes | — |
draft.content | PlaybookContent | Yes | The full playbook content. |
draft.content.booking | object | Yes | — |
draft.content.booking.allowUnqualified | boolean | No | Default: false. |
draft.content.booking.maxBookingsPerCall | integer | No | Between 1 and 2. Default: 2. |
draft.content.booking.minNoticeMinutes | integer | No | Between 0 and 10080. Default: 60. |
draft.content.booking.offerSlots | integer | No | Between 1 and 4. Default: 2. |
draft.content.booking.rules | array<object> | Yes | — |
draft.content.brief | string | Yes | 1–12000 characters. |
draft.content.defaultFlowId | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
draft.content.escalation | object | Yes | — |
draft.content.escalation.afterFailedAnswers | integer | No | Between 1 and 5. Default: 2. |
draft.content.escalation.onFrustration | boolean | No | Default: true. |
draft.content.escalation.onGuardrailHit | boolean | No | Default: true. |
draft.content.escalation.transferLine | string | Yes | 1–300 characters. |
draft.content.escalation.transferMode | enum | No | One of: "cold", "warm". Default: "cold". |
draft.content.escalation.unavailableLine | string | Yes | 1–300 characters. |
draft.content.flows | array<object> | Yes | — |
draft.content.flows[].branch | array<object> | No | Default: []. |
draft.content.flows[].disqualify | array<object> | No | Default: []. |
draft.content.flows[].enterWhen | string | Yes | 1–500 characters. |
draft.content.flows[].fields | array<object> | Yes | — |
draft.content.flows[].goal | string | Yes | 1–500 characters. |
draft.content.flows[].maxQuestionsBeforeValue | integer | No | Between 1 and 10. Default: 2. |
draft.content.flows[].name | string | Yes | 1–120 characters. |
draft.content.flows[].talkingPoints | array<object | object> | No | Default: []. |
draft.content.followUp | object | No | — |
draft.content.followUp.blocks | array<object> | No | Up to 20 items. Default: []. |
draft.content.followUp.cards | array<object> | No | Up to 30 items. Default: []. |
draft.content.followUp.chat | object | No | Default: \{"callContext":true,"enabled":false\}. |
draft.content.followUp.consentQuestion | string | No | 1–480 characters. Default: "Can I text you a link with your \{\{vocab.meeting\}\} details and a recap of our call? Message and data rates may apply, and you can reply STOP anytime.". |
draft.content.followUp.emails | object | No | — |
draft.content.followUp.enabled | boolean | No | Default: false. |
draft.content.followUp.form | object | No | Default: \{"fields":[]\}. |
draft.content.followUp.leads | object | No | Default: \{\}. |
draft.content.followUp.linkExpiryDays | integer | No | Between 7 and 365. Default: 60. |
draft.content.followUp.messages | object | No | Default: \{"afterVisit":\{"enabled":false\},"initialSms":"Hi \{\{caller.firstName\}\}, it's \{\{group.name\}\}. Here are your \{\{vocab.meeting\}\} details and a recap of our call: \{\{link\}\} Reply STOP to opt out.","reminders":[\{"before":"24h"\},\{"before":"2h"\}]\}. |
draft.content.followUp.modules | array<object> | No | Default: [\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\}]. |
draft.content.followUp.prep | object | No | Default: \{"checklist":[]\}. |
draft.content.followUp.resources | array<object> | No | Up to 20 items. Default: []. |
draft.content.followUp.reviews | array<object> | No | Up to 12 items. Default: []. |
draft.content.followUp.sendWhen | object | object | object | object | object | object | object | object | object | object | No | — |
draft.content.followUp.theme | object | No | Default: \{"accent":"#B4512E","background":"#F7F3EC","font":"system","primary":"#24473D"\}. |
draft.content.guardrails | object | Yes | — |
draft.content.guardrails.allowPriceDiscussion | boolean | No | Default: true. |
draft.content.guardrails.declineTopics | array<object> | No | Default: []. |
draft.content.guardrails.emergencyLine | string | Yes | 1–300 characters. |
draft.content.guardrails.fallbackLine | string | Yes | 1–300 characters. |
draft.content.guardrails.neverSay | array<object> | No | Default: []. |
draft.content.guardrails.prohibitedClaims | array<object> | No | Default: []. |
draft.content.guardrails.redirectLines | object | Yes | — |
draft.content.guardrails.requiredDisclosures | array<object> | No | Default: []. |
draft.content.integrations | object | No | Default: \{\}. |
draft.content.integrations.crm | object | No | — |
draft.content.integrations.scheduler | object | No | — |
draft.content.knowledge | object | No | Default: \{"documents":[],"faq":[]\}. |
draft.content.knowledge.documents | array<object> | No | Default: []. |
draft.content.knowledge.faq | array<object> | No | Default: []. |
draft.content.lexicon | object | No | Default: \{"account":[],"packs":[],"platform":1\}. |
draft.content.lexicon.account | array<object> | No | Up to 200 items. Default: []. |
draft.content.lexicon.packs | array<object> | No | Up to 10 items. Default: []. |
draft.content.lexicon.platform | integer | No | Minimum 1. Default: 1. |
draft.content.locks | array<string> | No | — |
draft.content.models | object | No | Default: \{"keyterms":[]\}. |
draft.content.models.keyterms | array<string> | No | Default: []. |
draft.content.models.llm | string | No | Up to 200 characters. |
draft.content.models.stt | string | No | Up to 200 characters. |
draft.content.objections | array<object> | No | Default: []. |
draft.content.objections[].guidance | string | Yes | 1–1000 characters. |
draft.content.objections[].trigger | string | Yes | 1–200 characters. |
draft.content.objectives | object | No | Default: \{"channels":\{\},"fallbacks":[],"primary":\{"label":"Book a meeting","meetingTypes":[],"qualifiedOnly":false,"type":"book_meeting"\},"secondary":[]\}. |
draft.content.objectives.channels | object | No | Default: \{\}. |
draft.content.objectives.fallbacks | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 3 items. Default: []. |
draft.content.objectives.primary | object | object | object | object | object | object | object | object | object | object | object | object | object | Yes | — |
draft.content.objectives.secondary | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 5 items. Default: []. |
draft.content.persona | object | Yes | — |
draft.content.persona.agentName | string | Yes | 1–60 characters. |
draft.content.persona.companyName | string | Yes | 1–120 characters. |
draft.content.persona.exampleExchanges | array<object> | No | Default: []. |
draft.content.persona.opening | string | Yes | 1–600 characters. |
draft.content.persona.openingAfterRing | string | No | 1–600 characters. |
draft.content.persona.openingNotRecorded | string | No | 1–600 characters. |
draft.content.persona.openingQuestion | string | Yes | 1–300 characters. |
draft.content.persona.preRingNotice | string | No | 1–300 characters. |
draft.content.persona.returningCallerLine | string | No | Up to 300 characters. |
draft.content.persona.tone | string | Yes | 1–300 characters. |
draft.content.persona.voice | object | Yes | — |
draft.content.pricing | object | No | Default: \{"feeLine":"The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.","floorPlanLine":"\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.","mentionSpecials":"when_price_comes_up","notOfferedLine":"\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.","onRequestLine":"Our team will go over pricing for \{\{price.service\}\} with you.","otherLocations":"off","otherLocationsLine":"\{\{price.service\}\} is offered at \{\{price.locations\}\}.","specialLine":"\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.","specialLineOpenEnded":"\{\{price.specialWording\}\}.","startingAtLine":"\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.","startingAtWithOptions":"\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}."\}. |
draft.content.pricing.feeLine | string | No | 1–300 characters. Default: "The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.". |
draft.content.pricing.floorPlanLine | string | No | 1–300 characters. Default: "\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.". |
draft.content.pricing.mentionSpecials | enum | No | One of: "when_price_comes_up", "once_after_discovery", "only_when_asked". Default: "when_price_comes_up". |
draft.content.pricing.notOfferedLine | string | No | 1–300 characters. Default: "\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.". |
draft.content.pricing.onRequestLine | string | No | 1–300 characters. Default: "Our team will go over pricing for \{\{price.service\}\} with you.". |
draft.content.pricing.otherLocations | enum | No | One of: "off", "mention", "mention_and_connect". Default: "off". |
draft.content.pricing.otherLocationsLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} is offered at \{\{price.locations\}\}.". |
draft.content.pricing.specialLine | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.". |
draft.content.pricing.specialLineOpenEnded | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}.". |
draft.content.pricing.startingAtLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
draft.content.pricing.startingAtWithOptions | string | No | 1–300 characters. Default: "\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
draft.content.recording | object | No | Default: \{"enabled":true\}. |
draft.content.recording.enabled | boolean | No | Default: true. |
draft.content.retention | object | No | Default: \{"recordingDays":90,"transcriptDays":90\}. |
draft.content.retention.recordingDays | integer | No | Between 1 and 3650. Default: 90. |
draft.content.retention.transcriptDays | integer | No | Between 1 and 3650. Default: 90. |
draft.content.schemaVersion | enum | No | One of: 1. Default: 1. |
draft.content.tools | object | No | Default: \{"bindings":[]\}. |
draft.content.tools.bindings | array<object> | No | Up to 20 items. Default: []. |
draft.content.visitActions | object | No | — |
draft.content.visitActions.allowCustom | boolean | No | Default: true. |
draft.content.visitActions.items | array<object> | No | Up to 30 items. |
draft.content.visitActions.typedCrmTask | boolean | No | Default: false. |
draft.content.webWidget | object | No | Default: \{"continuationDisclosure":"Hi again — this is the AI assistant you spoke with on the phone.","continuationGreeting":"I have the notes from your call, so we can pick up right where we left off. What else can I help with?","copy":\{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\},"disclosure":"Hi — I am an AI assistant, and I can answer questions or book you a time to visit.","enabled":false,"greeting":"What would you like to know?","launcher":\{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\},"limits":\{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\},"panel":\{"height":620,"presentation":"panel","width":400\},"showMedia":false,"surfaces":\{"chat":true,"voice":false\},"theme":\{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}\}. |
draft.content.webWidget.continuationDisclosure | string | No | 1–320 characters. Default: "Hi again — this is the AI assistant you spoke with on the phone.". |
draft.content.webWidget.continuationGreeting | string | No | 1–320 characters. Default: "I have the notes from your call, so we can pick up right where we left off. What else can I help with?". |
draft.content.webWidget.copy | object | No | Default: \{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\}. |
draft.content.webWidget.disclosure | string | No | 1–320 characters. Default: "Hi — I am an AI assistant, and I can answer questions or book you a time to visit.". |
draft.content.webWidget.enabled | boolean | No | Default: false. |
draft.content.webWidget.greeting | string | No | 1–320 characters. Default: "What would you like to know?". |
draft.content.webWidget.launcher | object | No | Default: \{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\}. |
draft.content.webWidget.limits | object | No | Default: \{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\}. |
draft.content.webWidget.panel | object | No | Default: \{"height":620,"presentation":"panel","width":400\}. |
draft.content.webWidget.showMedia | boolean | No | Default: false. |
draft.content.webWidget.surfaces | object | No | Default: \{"chat":true,"voice":false\}. |
draft.content.webWidget.theme | object | No | Default: \{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}. |
draft.contentHash | string | Yes | — |
draft.createdAt | string (date-time) | Yes | — |
draft.id | string (pbv_… ID) | Yes | ID (pbv_…) |
draft.publishedAt | string (date-time) | null | Yes | — |
draft.publishedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
draft.status | enum | Yes | One of: "draft", "published", "archived", "discarded". |
draft.updatedAt | string (date-time) | Yes | — |
draft.version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/draft" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"content": {
"persona": {
"agentName": "string",
"companyName": "string",
"tone": "string",
"opening": "string",
"openingQuestion": "string",
"voice": {
"provider": "cartesia",
"voiceId": "string"
}
},
"brief": "string",
"flows": [
{
"name": "string",
"goal": "string",
"enterWhen": "string",
"fields": [
{
"key": "string",
"ask": "string",
"type": "text"
}
]
}
],
"defaultFlowId": "string",
"booking": {
"rules": [
{
"when": {},
"then": {}
}
]
},
"escalation": {
"transferLine": "string",
"unavailableLine": "string"
},
"guardrails": {
"fallbackLine": "string",
"emergencyLine": "string",
"redirectLines": {
"wrong_number": "string",
"existing_customer": "string",
"vendor": "string",
"job_seeker": "string",
"resident_family": "string"
}
}
}
}'Discard the draft (only when a published version exists). A draft that ran test calls is kept, hidden, so those calls still show what ran#
DELETE /v1/account/playbooks/{playbookId}/draft
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
discarded | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/draft" \
-H "Authorization: Bearer $ACCESS_TOKEN"Route this playbook's calls to a person or voicemail at once, without a deploy#
PUT /v1/account/playbooks/{playbookId}/kill-switch
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | Yes | — |
mode | enum | No | One of: "human", "voicemail". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
description | string | null | Yes | — |
draft | object | null | Yes | — |
draft.updatedAt | string (date-time) | Yes | — |
draft.version | integer | Yes | — |
draft.versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
id | string (pb_… ID) | Yes | ID (pb_…) |
isSample | boolean | Yes | — |
killSwitch | boolean | Yes | — |
killSwitchMode | enum | Yes | One of: "human", "voicemail". |
latestPublishedVersion | integer | null | Yes | — |
name | string | Yes | — |
updatedAt | string (date-time) | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/kill-switch" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": true
}'Publish the draft as the next version and update every group that follows it#
POST /v1/account/playbooks/{playbookId}/publish
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
expectedHash | string | No | Exactly 64 characters. |
note | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
changes | array<PlaybookChange> | Yes | — |
changes[].after | any | No | — |
changes[].before | any | No | — |
changes[].kind | enum | Yes | One of: "added", "removed", "changed". |
changes[].path | string | Yes | — |
changes[].summary | string | Yes | — |
groups | array<object> | Yes | — |
groups[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
groups[].groupName | string | Yes | — |
groups[].issues | array<string> | Yes | — |
groups[].outcome | enum | Yes | One of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile". |
version | PlaybookVersion | Yes | — |
version.authorId | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
version.changeNote | string | null | Yes | — |
version.content | PlaybookContent | Yes | The full playbook content. |
version.content.booking | object | Yes | — |
version.content.booking.allowUnqualified | boolean | No | Default: false. |
version.content.booking.maxBookingsPerCall | integer | No | Between 1 and 2. Default: 2. |
version.content.booking.minNoticeMinutes | integer | No | Between 0 and 10080. Default: 60. |
version.content.booking.offerSlots | integer | No | Between 1 and 4. Default: 2. |
version.content.booking.rules | array<object> | Yes | — |
version.content.brief | string | Yes | 1–12000 characters. |
version.content.defaultFlowId | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
version.content.escalation | object | Yes | — |
version.content.escalation.afterFailedAnswers | integer | No | Between 1 and 5. Default: 2. |
version.content.escalation.onFrustration | boolean | No | Default: true. |
version.content.escalation.onGuardrailHit | boolean | No | Default: true. |
version.content.escalation.transferLine | string | Yes | 1–300 characters. |
version.content.escalation.transferMode | enum | No | One of: "cold", "warm". Default: "cold". |
version.content.escalation.unavailableLine | string | Yes | 1–300 characters. |
version.content.flows | array<object> | Yes | — |
version.content.flows[].branch | array<object> | No | Default: []. |
version.content.flows[].disqualify | array<object> | No | Default: []. |
version.content.flows[].enterWhen | string | Yes | 1–500 characters. |
version.content.flows[].fields | array<object> | Yes | — |
version.content.flows[].goal | string | Yes | 1–500 characters. |
version.content.flows[].maxQuestionsBeforeValue | integer | No | Between 1 and 10. Default: 2. |
version.content.flows[].name | string | Yes | 1–120 characters. |
version.content.flows[].talkingPoints | array<object | object> | No | Default: []. |
version.content.followUp | object | No | — |
version.content.followUp.blocks | array<object> | No | Up to 20 items. Default: []. |
version.content.followUp.cards | array<object> | No | Up to 30 items. Default: []. |
version.content.followUp.chat | object | No | Default: \{"callContext":true,"enabled":false\}. |
version.content.followUp.consentQuestion | string | No | 1–480 characters. Default: "Can I text you a link with your \{\{vocab.meeting\}\} details and a recap of our call? Message and data rates may apply, and you can reply STOP anytime.". |
version.content.followUp.emails | object | No | — |
version.content.followUp.enabled | boolean | No | Default: false. |
version.content.followUp.form | object | No | Default: \{"fields":[]\}. |
version.content.followUp.leads | object | No | Default: \{\}. |
version.content.followUp.linkExpiryDays | integer | No | Between 7 and 365. Default: 60. |
version.content.followUp.messages | object | No | Default: \{"afterVisit":\{"enabled":false\},"initialSms":"Hi \{\{caller.firstName\}\}, it's \{\{group.name\}\}. Here are your \{\{vocab.meeting\}\} details and a recap of our call: \{\{link\}\} Reply STOP to opt out.","reminders":[\{"before":"24h"\},\{"before":"2h"\}]\}. |
version.content.followUp.modules | array<object> | No | Default: [\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\}]. |
version.content.followUp.prep | object | No | Default: \{"checklist":[]\}. |
version.content.followUp.resources | array<object> | No | Up to 20 items. Default: []. |
version.content.followUp.reviews | array<object> | No | Up to 12 items. Default: []. |
version.content.followUp.sendWhen | object | object | object | object | object | object | object | object | object | object | No | — |
version.content.followUp.theme | object | No | Default: \{"accent":"#B4512E","background":"#F7F3EC","font":"system","primary":"#24473D"\}. |
version.content.guardrails | object | Yes | — |
version.content.guardrails.allowPriceDiscussion | boolean | No | Default: true. |
version.content.guardrails.declineTopics | array<object> | No | Default: []. |
version.content.guardrails.emergencyLine | string | Yes | 1–300 characters. |
version.content.guardrails.fallbackLine | string | Yes | 1–300 characters. |
version.content.guardrails.neverSay | array<object> | No | Default: []. |
version.content.guardrails.prohibitedClaims | array<object> | No | Default: []. |
version.content.guardrails.redirectLines | object | Yes | — |
version.content.guardrails.requiredDisclosures | array<object> | No | Default: []. |
version.content.integrations | object | No | Default: \{\}. |
version.content.integrations.crm | object | No | — |
version.content.integrations.scheduler | object | No | — |
version.content.knowledge | object | No | Default: \{"documents":[],"faq":[]\}. |
version.content.knowledge.documents | array<object> | No | Default: []. |
version.content.knowledge.faq | array<object> | No | Default: []. |
version.content.lexicon | object | No | Default: \{"account":[],"packs":[],"platform":1\}. |
version.content.lexicon.account | array<object> | No | Up to 200 items. Default: []. |
version.content.lexicon.packs | array<object> | No | Up to 10 items. Default: []. |
version.content.lexicon.platform | integer | No | Minimum 1. Default: 1. |
version.content.locks | array<string> | No | — |
version.content.models | object | No | Default: \{"keyterms":[]\}. |
version.content.models.keyterms | array<string> | No | Default: []. |
version.content.models.llm | string | No | Up to 200 characters. |
version.content.models.stt | string | No | Up to 200 characters. |
version.content.objections | array<object> | No | Default: []. |
version.content.objections[].guidance | string | Yes | 1–1000 characters. |
version.content.objections[].trigger | string | Yes | 1–200 characters. |
version.content.objectives | object | No | Default: \{"channels":\{\},"fallbacks":[],"primary":\{"label":"Book a meeting","meetingTypes":[],"qualifiedOnly":false,"type":"book_meeting"\},"secondary":[]\}. |
version.content.objectives.channels | object | No | Default: \{\}. |
version.content.objectives.fallbacks | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 3 items. Default: []. |
version.content.objectives.primary | object | object | object | object | object | object | object | object | object | object | object | object | object | Yes | — |
version.content.objectives.secondary | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 5 items. Default: []. |
version.content.persona | object | Yes | — |
version.content.persona.agentName | string | Yes | 1–60 characters. |
version.content.persona.companyName | string | Yes | 1–120 characters. |
version.content.persona.exampleExchanges | array<object> | No | Default: []. |
version.content.persona.opening | string | Yes | 1–600 characters. |
version.content.persona.openingAfterRing | string | No | 1–600 characters. |
version.content.persona.openingNotRecorded | string | No | 1–600 characters. |
version.content.persona.openingQuestion | string | Yes | 1–300 characters. |
version.content.persona.preRingNotice | string | No | 1–300 characters. |
version.content.persona.returningCallerLine | string | No | Up to 300 characters. |
version.content.persona.tone | string | Yes | 1–300 characters. |
version.content.persona.voice | object | Yes | — |
version.content.pricing | object | No | Default: \{"feeLine":"The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.","floorPlanLine":"\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.","mentionSpecials":"when_price_comes_up","notOfferedLine":"\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.","onRequestLine":"Our team will go over pricing for \{\{price.service\}\} with you.","otherLocations":"off","otherLocationsLine":"\{\{price.service\}\} is offered at \{\{price.locations\}\}.","specialLine":"\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.","specialLineOpenEnded":"\{\{price.specialWording\}\}.","startingAtLine":"\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.","startingAtWithOptions":"\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}."\}. |
version.content.pricing.feeLine | string | No | 1–300 characters. Default: "The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.". |
version.content.pricing.floorPlanLine | string | No | 1–300 characters. Default: "\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.". |
version.content.pricing.mentionSpecials | enum | No | One of: "when_price_comes_up", "once_after_discovery", "only_when_asked". Default: "when_price_comes_up". |
version.content.pricing.notOfferedLine | string | No | 1–300 characters. Default: "\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.". |
version.content.pricing.onRequestLine | string | No | 1–300 characters. Default: "Our team will go over pricing for \{\{price.service\}\} with you.". |
version.content.pricing.otherLocations | enum | No | One of: "off", "mention", "mention_and_connect". Default: "off". |
version.content.pricing.otherLocationsLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} is offered at \{\{price.locations\}\}.". |
version.content.pricing.specialLine | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.". |
version.content.pricing.specialLineOpenEnded | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}.". |
version.content.pricing.startingAtLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
version.content.pricing.startingAtWithOptions | string | No | 1–300 characters. Default: "\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
version.content.recording | object | No | Default: \{"enabled":true\}. |
version.content.recording.enabled | boolean | No | Default: true. |
version.content.retention | object | No | Default: \{"recordingDays":90,"transcriptDays":90\}. |
version.content.retention.recordingDays | integer | No | Between 1 and 3650. Default: 90. |
version.content.retention.transcriptDays | integer | No | Between 1 and 3650. Default: 90. |
version.content.schemaVersion | enum | No | One of: 1. Default: 1. |
version.content.tools | object | No | Default: \{"bindings":[]\}. |
version.content.tools.bindings | array<object> | No | Up to 20 items. Default: []. |
version.content.visitActions | object | No | — |
version.content.visitActions.allowCustom | boolean | No | Default: true. |
version.content.visitActions.items | array<object> | No | Up to 30 items. |
version.content.visitActions.typedCrmTask | boolean | No | Default: false. |
version.content.webWidget | object | No | Default: \{"continuationDisclosure":"Hi again — this is the AI assistant you spoke with on the phone.","continuationGreeting":"I have the notes from your call, so we can pick up right where we left off. What else can I help with?","copy":\{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\},"disclosure":"Hi — I am an AI assistant, and I can answer questions or book you a time to visit.","enabled":false,"greeting":"What would you like to know?","launcher":\{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\},"limits":\{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\},"panel":\{"height":620,"presentation":"panel","width":400\},"showMedia":false,"surfaces":\{"chat":true,"voice":false\},"theme":\{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}\}. |
version.content.webWidget.continuationDisclosure | string | No | 1–320 characters. Default: "Hi again — this is the AI assistant you spoke with on the phone.". |
version.content.webWidget.continuationGreeting | string | No | 1–320 characters. Default: "I have the notes from your call, so we can pick up right where we left off. What else can I help with?". |
version.content.webWidget.copy | object | No | Default: \{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\}. |
version.content.webWidget.disclosure | string | No | 1–320 characters. Default: "Hi — I am an AI assistant, and I can answer questions or book you a time to visit.". |
version.content.webWidget.enabled | boolean | No | Default: false. |
version.content.webWidget.greeting | string | No | 1–320 characters. Default: "What would you like to know?". |
version.content.webWidget.launcher | object | No | Default: \{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\}. |
version.content.webWidget.limits | object | No | Default: \{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\}. |
version.content.webWidget.panel | object | No | Default: \{"height":620,"presentation":"panel","width":400\}. |
version.content.webWidget.showMedia | boolean | No | Default: false. |
version.content.webWidget.surfaces | object | No | Default: \{"chat":true,"voice":false\}. |
version.content.webWidget.theme | object | No | Default: \{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}. |
version.contentHash | string | Yes | — |
version.createdAt | string (date-time) | Yes | — |
version.id | string (pbv_… ID) | Yes | ID (pbv_…) |
version.publishedAt | string (date-time) | null | Yes | — |
version.publishedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
version.status | enum | Yes | One of: "draft", "published", "archived", "discarded". |
version.updatedAt | string (date-time) | Yes | — |
version.version | integer | Yes | — |
warnings | array<ValidationMessage> | Yes | — |
warnings[].message | string | Yes | — |
warnings[].path | string | Yes | — |
warnings[].severity | enum | Yes | One of: "error", "warning". |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/publish" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"expectedHash": "string",
"note": "string"
}'How the question map is arranged: the account's arrangement, and a group's own when groupId is given#
GET /v1/account/playbooks/{playbookId}/question-map/layout
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
account | any | null | Yes | — |
group | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/question-map/layout" \
-H "Authorization: Bearer $ACCESS_TOKEN"Save where the cards sit on the question map (the account’s, or a group’s own)#
PUT /v1/account/playbooks/{playbookId}/question-map/layout
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
positions | map | Yes | — |
positions.{key} | object | No | Any key. |
positions.{key}.x | number | Yes | — |
positions.{key}.y | number | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | null | Yes | — |
positions | map | Yes | — |
positions.{key} | object | No | Any key. |
positions.{key}.x | number | Yes | — |
positions.{key}.y | number | Yes | — |
updatedAt | string (date-time) | Yes | — |
updatedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/question-map/layout" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"positions": {}
}'Tidy up: drop the saved arrangement so the map arranges itself again#
DELETE /v1/account/playbooks/{playbookId}/question-map/layout
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
reset | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/question-map/layout" \
-H "Authorization: Bearer $ACCESS_TOKEN"How many calls took each arrow of the question map in the last days days (test calls left out)#
GET /v1/account/playbooks/{playbookId}/question-map/traffic
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
days | integer | No | Between 1 and 365. Default: 30. |
groupId | string (grp_… ID) | No | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
arrows | map | Yes | — |
arrows.{key} | integer | No | Any key. |
calls | integer | Yes | — |
days | integer | Yes | — |
stoppedOn | array<object> | Yes | — |
stoppedOn[].calls | integer | null | Yes | — |
stoppedOn[].flowId | string | Yes | — |
stoppedOn[].question | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/question-map/traffic" \
-H "Authorization: Bearer $ACCESS_TOKEN"Restore an old version by publishing it again as a new version (history is never rewritten)#
POST /v1/account/playbooks/{playbookId}/rollback
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
discardDraft | boolean | No | Default: false. |
note | string | No | Up to 500 characters. |
version | integer | Yes | Minimum 1. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
changes | array<PlaybookChange> | Yes | — |
changes[].after | any | No | — |
changes[].before | any | No | — |
changes[].kind | enum | Yes | One of: "added", "removed", "changed". |
changes[].path | string | Yes | — |
changes[].summary | string | Yes | — |
groups | array<object> | Yes | — |
groups[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
groups[].groupName | string | Yes | — |
groups[].issues | array<string> | Yes | — |
groups[].outcome | enum | Yes | One of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile". |
version | PlaybookVersion | Yes | — |
version.authorId | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
version.changeNote | string | null | Yes | — |
version.content | PlaybookContent | Yes | The full playbook content. |
version.content.booking | object | Yes | — |
version.content.booking.allowUnqualified | boolean | No | Default: false. |
version.content.booking.maxBookingsPerCall | integer | No | Between 1 and 2. Default: 2. |
version.content.booking.minNoticeMinutes | integer | No | Between 0 and 10080. Default: 60. |
version.content.booking.offerSlots | integer | No | Between 1 and 4. Default: 2. |
version.content.booking.rules | array<object> | Yes | — |
version.content.brief | string | Yes | 1–12000 characters. |
version.content.defaultFlowId | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
version.content.escalation | object | Yes | — |
version.content.escalation.afterFailedAnswers | integer | No | Between 1 and 5. Default: 2. |
version.content.escalation.onFrustration | boolean | No | Default: true. |
version.content.escalation.onGuardrailHit | boolean | No | Default: true. |
version.content.escalation.transferLine | string | Yes | 1–300 characters. |
version.content.escalation.transferMode | enum | No | One of: "cold", "warm". Default: "cold". |
version.content.escalation.unavailableLine | string | Yes | 1–300 characters. |
version.content.flows | array<object> | Yes | — |
version.content.flows[].branch | array<object> | No | Default: []. |
version.content.flows[].disqualify | array<object> | No | Default: []. |
version.content.flows[].enterWhen | string | Yes | 1–500 characters. |
version.content.flows[].fields | array<object> | Yes | — |
version.content.flows[].goal | string | Yes | 1–500 characters. |
version.content.flows[].maxQuestionsBeforeValue | integer | No | Between 1 and 10. Default: 2. |
version.content.flows[].name | string | Yes | 1–120 characters. |
version.content.flows[].talkingPoints | array<object | object> | No | Default: []. |
version.content.followUp | object | No | — |
version.content.followUp.blocks | array<object> | No | Up to 20 items. Default: []. |
version.content.followUp.cards | array<object> | No | Up to 30 items. Default: []. |
version.content.followUp.chat | object | No | Default: \{"callContext":true,"enabled":false\}. |
version.content.followUp.consentQuestion | string | No | 1–480 characters. Default: "Can I text you a link with your \{\{vocab.meeting\}\} details and a recap of our call? Message and data rates may apply, and you can reply STOP anytime.". |
version.content.followUp.emails | object | No | — |
version.content.followUp.enabled | boolean | No | Default: false. |
version.content.followUp.form | object | No | Default: \{"fields":[]\}. |
version.content.followUp.leads | object | No | Default: \{\}. |
version.content.followUp.linkExpiryDays | integer | No | Between 7 and 365. Default: 60. |
version.content.followUp.messages | object | No | Default: \{"afterVisit":\{"enabled":false\},"initialSms":"Hi \{\{caller.firstName\}\}, it's \{\{group.name\}\}. Here are your \{\{vocab.meeting\}\} details and a recap of our call: \{\{link\}\} Reply STOP to opt out.","reminders":[\{"before":"24h"\},\{"before":"2h"\}]\}. |
version.content.followUp.modules | array<object> | No | Default: [\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\}]. |
version.content.followUp.prep | object | No | Default: \{"checklist":[]\}. |
version.content.followUp.resources | array<object> | No | Up to 20 items. Default: []. |
version.content.followUp.reviews | array<object> | No | Up to 12 items. Default: []. |
version.content.followUp.sendWhen | object | object | object | object | object | object | object | object | object | object | No | — |
version.content.followUp.theme | object | No | Default: \{"accent":"#B4512E","background":"#F7F3EC","font":"system","primary":"#24473D"\}. |
version.content.guardrails | object | Yes | — |
version.content.guardrails.allowPriceDiscussion | boolean | No | Default: true. |
version.content.guardrails.declineTopics | array<object> | No | Default: []. |
version.content.guardrails.emergencyLine | string | Yes | 1–300 characters. |
version.content.guardrails.fallbackLine | string | Yes | 1–300 characters. |
version.content.guardrails.neverSay | array<object> | No | Default: []. |
version.content.guardrails.prohibitedClaims | array<object> | No | Default: []. |
version.content.guardrails.redirectLines | object | Yes | — |
version.content.guardrails.requiredDisclosures | array<object> | No | Default: []. |
version.content.integrations | object | No | Default: \{\}. |
version.content.integrations.crm | object | No | — |
version.content.integrations.scheduler | object | No | — |
version.content.knowledge | object | No | Default: \{"documents":[],"faq":[]\}. |
version.content.knowledge.documents | array<object> | No | Default: []. |
version.content.knowledge.faq | array<object> | No | Default: []. |
version.content.lexicon | object | No | Default: \{"account":[],"packs":[],"platform":1\}. |
version.content.lexicon.account | array<object> | No | Up to 200 items. Default: []. |
version.content.lexicon.packs | array<object> | No | Up to 10 items. Default: []. |
version.content.lexicon.platform | integer | No | Minimum 1. Default: 1. |
version.content.locks | array<string> | No | — |
version.content.models | object | No | Default: \{"keyterms":[]\}. |
version.content.models.keyterms | array<string> | No | Default: []. |
version.content.models.llm | string | No | Up to 200 characters. |
version.content.models.stt | string | No | Up to 200 characters. |
version.content.objections | array<object> | No | Default: []. |
version.content.objections[].guidance | string | Yes | 1–1000 characters. |
version.content.objections[].trigger | string | Yes | 1–200 characters. |
version.content.objectives | object | No | Default: \{"channels":\{\},"fallbacks":[],"primary":\{"label":"Book a meeting","meetingTypes":[],"qualifiedOnly":false,"type":"book_meeting"\},"secondary":[]\}. |
version.content.objectives.channels | object | No | Default: \{\}. |
version.content.objectives.fallbacks | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 3 items. Default: []. |
version.content.objectives.primary | object | object | object | object | object | object | object | object | object | object | object | object | object | Yes | — |
version.content.objectives.secondary | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 5 items. Default: []. |
version.content.persona | object | Yes | — |
version.content.persona.agentName | string | Yes | 1–60 characters. |
version.content.persona.companyName | string | Yes | 1–120 characters. |
version.content.persona.exampleExchanges | array<object> | No | Default: []. |
version.content.persona.opening | string | Yes | 1–600 characters. |
version.content.persona.openingAfterRing | string | No | 1–600 characters. |
version.content.persona.openingNotRecorded | string | No | 1–600 characters. |
version.content.persona.openingQuestion | string | Yes | 1–300 characters. |
version.content.persona.preRingNotice | string | No | 1–300 characters. |
version.content.persona.returningCallerLine | string | No | Up to 300 characters. |
version.content.persona.tone | string | Yes | 1–300 characters. |
version.content.persona.voice | object | Yes | — |
version.content.pricing | object | No | Default: \{"feeLine":"The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.","floorPlanLine":"\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.","mentionSpecials":"when_price_comes_up","notOfferedLine":"\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.","onRequestLine":"Our team will go over pricing for \{\{price.service\}\} with you.","otherLocations":"off","otherLocationsLine":"\{\{price.service\}\} is offered at \{\{price.locations\}\}.","specialLine":"\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.","specialLineOpenEnded":"\{\{price.specialWording\}\}.","startingAtLine":"\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.","startingAtWithOptions":"\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}."\}. |
version.content.pricing.feeLine | string | No | 1–300 characters. Default: "The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.". |
version.content.pricing.floorPlanLine | string | No | 1–300 characters. Default: "\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.". |
version.content.pricing.mentionSpecials | enum | No | One of: "when_price_comes_up", "once_after_discovery", "only_when_asked". Default: "when_price_comes_up". |
version.content.pricing.notOfferedLine | string | No | 1–300 characters. Default: "\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.". |
version.content.pricing.onRequestLine | string | No | 1–300 characters. Default: "Our team will go over pricing for \{\{price.service\}\} with you.". |
version.content.pricing.otherLocations | enum | No | One of: "off", "mention", "mention_and_connect". Default: "off". |
version.content.pricing.otherLocationsLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} is offered at \{\{price.locations\}\}.". |
version.content.pricing.specialLine | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.". |
version.content.pricing.specialLineOpenEnded | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}.". |
version.content.pricing.startingAtLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
version.content.pricing.startingAtWithOptions | string | No | 1–300 characters. Default: "\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
version.content.recording | object | No | Default: \{"enabled":true\}. |
version.content.recording.enabled | boolean | No | Default: true. |
version.content.retention | object | No | Default: \{"recordingDays":90,"transcriptDays":90\}. |
version.content.retention.recordingDays | integer | No | Between 1 and 3650. Default: 90. |
version.content.retention.transcriptDays | integer | No | Between 1 and 3650. Default: 90. |
version.content.schemaVersion | enum | No | One of: 1. Default: 1. |
version.content.tools | object | No | Default: \{"bindings":[]\}. |
version.content.tools.bindings | array<object> | No | Up to 20 items. Default: []. |
version.content.visitActions | object | No | — |
version.content.visitActions.allowCustom | boolean | No | Default: true. |
version.content.visitActions.items | array<object> | No | Up to 30 items. |
version.content.visitActions.typedCrmTask | boolean | No | Default: false. |
version.content.webWidget | object | No | Default: \{"continuationDisclosure":"Hi again — this is the AI assistant you spoke with on the phone.","continuationGreeting":"I have the notes from your call, so we can pick up right where we left off. What else can I help with?","copy":\{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\},"disclosure":"Hi — I am an AI assistant, and I can answer questions or book you a time to visit.","enabled":false,"greeting":"What would you like to know?","launcher":\{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\},"limits":\{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\},"panel":\{"height":620,"presentation":"panel","width":400\},"showMedia":false,"surfaces":\{"chat":true,"voice":false\},"theme":\{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}\}. |
version.content.webWidget.continuationDisclosure | string | No | 1–320 characters. Default: "Hi again — this is the AI assistant you spoke with on the phone.". |
version.content.webWidget.continuationGreeting | string | No | 1–320 characters. Default: "I have the notes from your call, so we can pick up right where we left off. What else can I help with?". |
version.content.webWidget.copy | object | No | Default: \{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\}. |
version.content.webWidget.disclosure | string | No | 1–320 characters. Default: "Hi — I am an AI assistant, and I can answer questions or book you a time to visit.". |
version.content.webWidget.enabled | boolean | No | Default: false. |
version.content.webWidget.greeting | string | No | 1–320 characters. Default: "What would you like to know?". |
version.content.webWidget.launcher | object | No | Default: \{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\}. |
version.content.webWidget.limits | object | No | Default: \{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\}. |
version.content.webWidget.panel | object | No | Default: \{"height":620,"presentation":"panel","width":400\}. |
version.content.webWidget.showMedia | boolean | No | Default: false. |
version.content.webWidget.surfaces | object | No | Default: \{"chat":true,"voice":false\}. |
version.content.webWidget.theme | object | No | Default: \{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}. |
version.contentHash | string | Yes | — |
version.createdAt | string (date-time) | Yes | — |
version.id | string (pbv_… ID) | Yes | ID (pbv_…) |
version.publishedAt | string (date-time) | null | Yes | — |
version.publishedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
version.status | enum | Yes | One of: "draft", "published", "archived", "discarded". |
version.updatedAt | string (date-time) | Yes | — |
version.version | integer | Yes | — |
warnings | array<ValidationMessage> | Yes | — |
warnings[].message | string | Yes | — |
warnings[].path | string | Yes | — |
warnings[].severity | enum | Yes | One of: "error", "warning". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/rollback" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"version": 1
}'Run the publish checklist on the draft: rules, voice and connection health#
POST /v1/account/playbooks/{playbookId}/validate
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
errors | array<ValidationMessage> | Yes | — |
errors[].message | string | Yes | — |
errors[].path | string | Yes | — |
errors[].severity | enum | Yes | One of: "error", "warning". |
ok | boolean | Yes | — |
warnings | array<ValidationMessage> | Yes | — |
warnings[].message | string | Yes | — |
warnings[].path | string | Yes | — |
warnings[].severity | enum | Yes | One of: "error", "warning". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/validate" \
-H "Authorization: Bearer $ACCESS_TOKEN"Version history, newest first#
GET /v1/account/playbooks/{playbookId}/versions
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
versions | array<PlaybookVersionSummary> | Yes | — |
versions[].authorId | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
versions[].changeNote | string | null | Yes | — |
versions[].contentHash | string | Yes | — |
versions[].createdAt | string (date-time) | Yes | — |
versions[].id | string (pbv_… ID) | Yes | ID (pbv_…) |
versions[].publishedAt | string (date-time) | null | Yes | — |
versions[].publishedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
versions[].status | enum | Yes | One of: "draft", "published", "archived", "discarded". |
versions[].updatedAt | string (date-time) | Yes | — |
versions[].version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/versions" \
-H "Authorization: Bearer $ACCESS_TOKEN"One version with its content#
GET /v1/account/playbooks/{playbookId}/versions/{version}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
version | integer | Yes | Minimum 1. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
authorId | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
changeNote | string | null | Yes | — |
content | PlaybookContent | Yes | The full playbook content. |
content.booking | object | Yes | — |
content.booking.allowUnqualified | boolean | No | Default: false. |
content.booking.maxBookingsPerCall | integer | No | Between 1 and 2. Default: 2. |
content.booking.minNoticeMinutes | integer | No | Between 0 and 10080. Default: 60. |
content.booking.offerSlots | integer | No | Between 1 and 4. Default: 2. |
content.booking.rules | array<object> | Yes | — |
content.booking.rules[].enabled | boolean | No | Default: true. |
content.booking.rules[].name | string | No | Up to 120 characters. |
content.booking.rules[].then | object | object | object | object | object | object | object | Yes | — |
content.booking.rules[].when | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.brief | string | Yes | 1–12000 characters. |
content.defaultFlowId | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.escalation | object | Yes | — |
content.escalation.afterFailedAnswers | integer | No | Between 1 and 5. Default: 2. |
content.escalation.onFrustration | boolean | No | Default: true. |
content.escalation.onGuardrailHit | boolean | No | Default: true. |
content.escalation.transferLine | string | Yes | 1–300 characters. |
content.escalation.transferMode | enum | No | One of: "cold", "warm". Default: "cold". |
content.escalation.unavailableLine | string | Yes | 1–300 characters. |
content.flows | array<object> | Yes | — |
content.flows[].branch | array<object> | No | Default: []. |
content.flows[].branch[].goto | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.flows[].branch[].if | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.flows[].disqualify | array<object> | No | Default: []. |
content.flows[].disqualify[].action | enum | Yes | One of: "offer_nurture", "offer_referral", "end_politely". |
content.flows[].disqualify[].if | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.flows[].disqualify[].line | string | No | Up to 500 characters. |
content.flows[].enterWhen | string | Yes | 1–500 characters. |
content.flows[].fields | array<object> | Yes | — |
content.flows[].fields[].alwaysConfirm | boolean | No | — |
content.flows[].fields[].ask | string | Yes | 1–500 characters. |
content.flows[].fields[].askWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.flows[].fields[].hearAs | array<string> | No | Up to 20 items. |
content.flows[].fields[].hint | string | No | Up to 500 characters. |
content.flows[].fields[].key | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.flows[].fields[].label | string | No | 1–120 characters. |
content.flows[].fields[].options | array<object> | No | — |
content.flows[].fields[].optionsFrom | enum | string (oset_… ID) | No | — |
content.flows[].fields[].required | boolean | No | Default: false. |
content.flows[].fields[].sensitivity | enum | No | One of: "standard", "sensitive". Default: "standard". |
content.flows[].fields[].type | enum | Yes | One of: "text", "number", "enum", "boolean", "date", "phone", "email". |
content.flows[].goal | string | Yes | 1–500 characters. |
content.flows[].maxQuestionsBeforeValue | integer | No | Between 1 and 10. Default: 2. |
content.flows[].name | string | Yes | 1–120 characters. |
content.flows[].talkingPoints | array<object | object> | No | Default: []. |
content.flows[].talkingPoints[].say | string | Yes | (variant 1) 1–500 characters. |
content.flows[].talkingPoints[].when | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.flows[].talkingPoints[].talkAbout | string | Yes | (variant 2) 1–500 characters. |
content.flows[].talkingPoints[].when | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.followUp | object | No | — |
content.followUp.blocks | array<object> | No | Up to 20 items. Default: []. |
content.followUp.blocks[].body | string | No | Up to 2000 characters. |
content.followUp.blocks[].button | object | No | — |
content.followUp.blocks[].heading | string | No | Up to 120 characters. |
content.followUp.blocks[].image | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.blocks[].video | object | No | — |
content.followUp.cards | array<object> | No | Up to 30 items. Default: []. |
content.followUp.cards[].body | string | Yes | 1–2000 characters. |
content.followUp.cards[].button | object | No | — |
content.followUp.cards[].enabled | boolean | No | Default: true. |
content.followUp.cards[].image | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.cards[].showWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.cards[].title | string | Yes | 1–120 characters. |
content.followUp.chat | object | No | Default: \{"callContext":true,"enabled":false\}. |
content.followUp.chat.callContext | boolean | No | Default: true. |
content.followUp.chat.enabled | boolean | No | Default: false. |
content.followUp.consentQuestion | string | No | 1–480 characters. Default: "Can I text you a link with your \{\{vocab.meeting\}\} details and a recap of our call? Message and data rates may apply, and you can reply STOP anytime.". |
content.followUp.emails | object | No | — |
content.followUp.emails.after_visit | object | null | No | — |
content.followUp.emails.cancel_confirmation | object | null | No | — |
content.followUp.emails.initial_link | object | null | No | — |
content.followUp.emails.reminder | object | null | No | — |
content.followUp.emails.reschedule_confirmation | object | null | No | — |
content.followUp.enabled | boolean | No | Default: false. |
content.followUp.form | object | No | Default: \{"fields":[]\}. |
content.followUp.form.fields | array<object> | No | Up to 8 items. Default: []. |
content.followUp.form.intro | string | No | Up to 480 characters. |
content.followUp.leads | object | No | Default: \{\}. |
content.followUp.leads.afterVisit | string | No | Up to 480 characters. |
content.followUp.leads.cancelled | string | No | Up to 480 characters. |
content.followUp.leads.noBooking | string | No | Up to 480 characters. |
content.followUp.linkExpiryDays | integer | No | Between 7 and 365. Default: 60. |
content.followUp.messages | object | No | Default: \{"afterVisit":\{"enabled":false\},"initialSms":"Hi \{\{caller.firstName\}\}, it's \{\{group.name\}\}. Here are your \{\{vocab.meeting\}\} details and a recap of our call: \{\{link\}\} Reply STOP to opt out.","reminders":[\{"before":"24h"\},\{"before":"2h"\}]\}. |
content.followUp.messages.afterVisit | object | No | Default: \{"enabled":false\}. |
content.followUp.messages.initialSms | string | Yes | 1–480 characters. |
content.followUp.messages.reminders | array<object> | No | Up to 4 items. Default: [\{"before":"24h"\},\{"before":"2h"\}]. |
content.followUp.modules | array<object> | No | Default: [\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\}]. |
content.followUp.modules[].blockId | string | No | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.followUp.modules[].heading | string | No | Up to 120 characters. |
content.followUp.modules[].showWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.modules[].states | array<enum> | No | Items: "upcoming", "day_of", "after_visit", "no_booking", "cancelled", "expired", "revoked". |
content.followUp.prep | object | No | Default: \{"checklist":[]\}. |
content.followUp.prep.body | string | No | Up to 2000 characters. |
content.followUp.prep.checklist | array<object> | No | Up to 12 items. Default: []. |
content.followUp.resources | array<object> | No | Up to 20 items. Default: []. |
content.followUp.resources[].description | string | No | Up to 300 characters. |
content.followUp.resources[].label | string | Yes | 1–120 characters. |
content.followUp.resources[].url | string (uri) | Yes | A https:// link Up to 2000 characters. |
content.followUp.reviews | array<object> | No | Up to 12 items. Default: []. |
content.followUp.reviews[].attribution | string | No | Up to 120 characters. |
content.followUp.reviews[].quote | string | Yes | 1–600 characters. |
content.followUp.sendWhen | object | object | object | object | object | object | object | object | object | object | No | — |
content.followUp.sendWhen.all | array<object | object | object | object | object | object | object | object | object | object> | Yes | (variant 1) |
content.followUp.sendWhen.any | array<object | object | object | object | object | object | object | object | object | object> | Yes | (variant 2) |
content.followUp.sendWhen.not | object | object | object | object | object | object | object | object | object | object | Yes | (variant 3) |
content.followUp.sendWhen.always | enum | Yes | (variant 4) One of: true. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 1) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.is | string | number | boolean | Yes | (variant 5) (variant 1) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 2) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.in | array<string | number | boolean> | Yes | (variant 5) (variant 2) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 3) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.gt | number | Yes | (variant 5) (variant 3) |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 4) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.lt | number | Yes | (variant 5) (variant 4) |
content.followUp.sendWhen.between | array | Yes | (variant 5) (variant 5) Up to 2 items. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 5) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.fact | string | Yes | (variant 5) (variant 6) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.followUp.sendWhen.missing | boolean | Yes | (variant 5) (variant 6) |
content.followUp.theme | object | No | Default: \{"accent":"#B4512E","background":"#F7F3EC","font":"system","primary":"#24473D"\}. |
content.followUp.theme.accent | string | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
content.followUp.theme.background | string | No | Pattern: ^#[0-9a-f]\{6\}$. Default: "#F7F3EC". |
content.followUp.theme.font | enum | No | One of: "system", "serif_warm", "sans_modern". Default: "system". |
content.followUp.theme.logo | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.followUp.theme.primary | string | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
content.guardrails | object | Yes | — |
content.guardrails.allowPriceDiscussion | boolean | No | Default: true. |
content.guardrails.declineTopics | array<object> | No | Default: []. |
content.guardrails.declineTopics[].text | string | Yes | 1–1000 characters. |
content.guardrails.emergencyLine | string | Yes | 1–300 characters. |
content.guardrails.fallbackLine | string | Yes | 1–300 characters. |
content.guardrails.neverSay | array<object> | No | Default: []. |
content.guardrails.neverSay[].text | string | Yes | 1–1000 characters. |
content.guardrails.prohibitedClaims | array<object> | No | Default: []. |
content.guardrails.prohibitedClaims[].text | string | Yes | 1–1000 characters. |
content.guardrails.redirectLines | object | Yes | — |
content.guardrails.redirectLines.existing_customer | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.job_seeker | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.resident_family | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.vendor | string | Yes | 1–500 characters. |
content.guardrails.redirectLines.wrong_number | string | Yes | 1–500 characters. |
content.guardrails.requiredDisclosures | array<object> | No | Default: []. |
content.guardrails.requiredDisclosures[].text | string | Yes | 1–1000 characters. |
content.integrations | object | No | Default: \{\}. |
content.integrations.crm | object | No | — |
content.integrations.crm.connectionId | string (conn_… ID) | Yes | ID (conn_…) |
content.integrations.crm.connector | string | Yes | 1–64 characters. |
content.integrations.crm.createContacts | boolean | No | Default: true. |
content.integrations.crm.fieldMap | map | No | Default: \{\}. |
content.integrations.crm.historyLookbackDays | integer | No | Between 0 and 3650. Default: 180. |
content.integrations.crm.logCalls | boolean | No | Default: true. |
content.integrations.crm.options | map | No | Default: \{\}. |
content.integrations.scheduler | object | No | — |
content.integrations.scheduler.activityType | string | Yes | 1–64 characters. |
content.integrations.scheduler.connectionId | string (conn_… ID) | Yes | ID (conn_…) |
content.integrations.scheduler.connector | string | Yes | 1–64 characters. |
content.integrations.scheduler.options | map | No | Default: \{\}. |
content.knowledge | object | No | Default: \{"documents":[],"faq":[]\}. |
content.knowledge.documents | array<object> | No | Default: []. |
content.knowledge.documents[].title | string | Yes | 1–200 characters. |
content.knowledge.faq | array<object> | No | Default: []. |
content.knowledge.faq[].answer | string | Yes | 1–2000 characters. |
content.knowledge.faq[].question | string | Yes | 1–300 characters. |
content.lexicon | object | No | Default: \{"account":[],"packs":[],"platform":1\}. |
content.lexicon.account | array<object> | No | Up to 200 items. Default: []. |
content.lexicon.account[].concept | string | Yes | Up to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$. |
content.lexicon.account[].never | array<string> | No | Up to 50 items. Default: []. |
content.lexicon.account[].phrases | array<string> | No | Up to 50 items. Default: []. |
content.lexicon.packs | array<object> | No | Up to 10 items. Default: []. |
content.lexicon.packs[].version | integer | Yes | Minimum 1. |
content.lexicon.platform | integer | No | Minimum 1. Default: 1. |
content.locks | array<string> | No | — |
content.models | object | No | Default: \{"keyterms":[]\}. |
content.models.keyterms | array<string> | No | Default: []. |
content.models.llm | string | No | Up to 200 characters. |
content.models.stt | string | No | Up to 200 characters. |
content.objections | array<object> | No | Default: []. |
content.objections[].guidance | string | Yes | 1–1000 characters. |
content.objections[].trigger | string | Yes | 1–200 characters. |
content.objectives | object | No | Default: \{"channels":\{\},"fallbacks":[],"primary":\{"label":"Book a meeting","meetingTypes":[],"qualifiedOnly":false,"type":"book_meeting"\},"secondary":[]\}. |
content.objectives.channels | object | No | Default: \{\}. |
content.objectives.channels.page_chat | object | No | — |
content.objectives.channels.site_chat | object | No | — |
content.objectives.fallbacks | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 3 items. Default: []. |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.fallbacks[].label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.fallbacks[].meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.fallbacks[].qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.fallbacks[].type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.fallbacks[].label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.fallbacks[].reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.fallbacks[].type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.fallbacks[].label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.fallbacks[].requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.fallbacks[].type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.fallbacks[].fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.fallbacks[].label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.fallbacks[].fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.fallbacks[].flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.fallbacks[].label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.fallbacks[].label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.fallbacks[].label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.fallbacks[].kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.fallbacks[].label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.fallbacks[].label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.fallbacks[].bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.fallbacks[].label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.fallbacks[].label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.fallbacks[].label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.fallbacks[].when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.fallbacks[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.fallbacks[].label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.fallbacks[].rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.fallbacks[].type | enum | Yes | (variant 13) One of: "custom_judged". |
content.objectives.primary | object | object | object | object | object | object | object | object | object | object | object | object | object | Yes | — |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.primary.label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.primary.meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.primary.qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.primary.type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.primary.label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.primary.reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.primary.type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.primary.label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.primary.requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.primary.type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.primary.fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.primary.label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.primary.fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.primary.flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.primary.label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.primary.label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.primary.label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.primary.kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.primary.label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.primary.label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.primary.bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.primary.label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.primary.label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.primary.label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.primary.type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.primary.when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.primary.appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.primary.label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.primary.rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.primary.type | enum | Yes | (variant 13) One of: "custom_judged". |
content.objectives.secondary | array<object | object | object | object | object | object | object | object | object | object | object | object | object> | No | Up to 5 items. Default: []. |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 1) |
content.objectives.secondary[].label | string | Yes | (variant 1) 1–80 characters. |
content.objectives.secondary[].meetingTypes | array<string> | No | (variant 1) Up to 10 items. Default: []. |
content.objectives.secondary[].qualifiedOnly | boolean | No | (variant 1) Default: false. |
content.objectives.secondary[].type | enum | Yes | (variant 1) One of: "book_meeting". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 2) |
content.objectives.secondary[].label | string | Yes | (variant 2) 1–80 characters. |
content.objectives.secondary[].reasons | array<enum> | No | (variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: []. |
content.objectives.secondary[].type | enum | Yes | (variant 2) One of: "live_transfer". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 3) |
content.objectives.secondary[].label | string | Yes | (variant 3) 1–80 characters. |
content.objectives.secondary[].requireReason | boolean | No | (variant 3) Default: false. |
content.objectives.secondary[].type | enum | Yes | (variant 3) One of: "capture_callback". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 4) |
content.objectives.secondary[].fields | array<string> | Yes | (variant 4) Up to 10 items. |
content.objectives.secondary[].label | string | Yes | (variant 4) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 4) One of: "capture_contact". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 5) |
content.objectives.secondary[].fields | array<string> | No | (variant 5) Up to 30 items. Default: []. |
content.objectives.secondary[].flowId | string | No | (variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.secondary[].label | string | Yes | (variant 5) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 5) One of: "qualify". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 6) |
content.objectives.secondary[].label | string | Yes | (variant 6) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 6) One of: "text_follow_up". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 7) |
content.objectives.secondary[].label | string | Yes | (variant 7) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 7) One of: "manage_booking". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 8) |
content.objectives.secondary[].kinds | array<enum> | No | (variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: []. |
content.objectives.secondary[].label | string | Yes | (variant 8) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 8) One of: "route_correctly". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 9) |
content.objectives.secondary[].label | string | Yes | (variant 9) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 9) One of: "nurture". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 10) |
content.objectives.secondary[].bindingId | string | Yes | (variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.objectives.secondary[].label | string | Yes | (variant 10) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 10) One of: "run_tool". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 11) |
content.objectives.secondary[].label | string | Yes | (variant 11) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 11) One of: "answer_questions". |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 12) |
content.objectives.secondary[].label | string | Yes | (variant 12) 1–80 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 12) One of: "custom_condition". |
content.objectives.secondary[].when | object | object | object | object | object | object | object | object | object | object | Yes | (variant 12) |
content.objectives.secondary[].appliesWhen | object | object | object | object | object | object | object | object | object | object | No | (variant 13) |
content.objectives.secondary[].label | string | Yes | (variant 13) 1–80 characters. |
content.objectives.secondary[].rubric | string | Yes | (variant 13) 1–500 characters. |
content.objectives.secondary[].type | enum | Yes | (variant 13) One of: "custom_judged". |
content.persona | object | Yes | — |
content.persona.agentName | string | Yes | 1–60 characters. |
content.persona.companyName | string | Yes | 1–120 characters. |
content.persona.exampleExchanges | array<object> | No | Default: []. |
content.persona.exampleExchanges[].agent | string | Yes | 1–500 characters. |
content.persona.exampleExchanges[].caller | string | Yes | 1–500 characters. |
content.persona.opening | string | Yes | 1–600 characters. |
content.persona.openingAfterRing | string | No | 1–600 characters. |
content.persona.openingNotRecorded | string | No | 1–600 characters. |
content.persona.openingQuestion | string | Yes | 1–300 characters. |
content.persona.preRingNotice | string | No | 1–300 characters. |
content.persona.returningCallerLine | string | No | Up to 300 characters. |
content.persona.tone | string | Yes | 1–300 characters. |
content.persona.voice | object | Yes | — |
content.persona.voice.ambience | boolean | No | Default: false. |
content.persona.voice.expressive | boolean | No | Default: false. |
content.persona.voice.mode | enum | No | One of: "cascaded". Default: "cascaded". |
content.persona.voice.model | string | No | Up to 200 characters. |
content.persona.voice.pronunciations | array<object> | No | Default: []. |
content.persona.voice.provider | enum | Yes | One of: "cartesia", "elevenlabs", "deepgram", "fishaudio", "gradium", "inworld", "rime", "xai", "openai", "google". |
content.persona.voice.thinkingSounds | boolean | No | Default: true. |
content.persona.voice.tuning | map | No | Default: \{\}. |
content.persona.voice.voiceId | string | Yes | 1–200 characters. |
content.pricing | object | No | Default: \{"feeLine":"The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.","floorPlanLine":"\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.","mentionSpecials":"when_price_comes_up","notOfferedLine":"\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.","onRequestLine":"Our team will go over pricing for \{\{price.service\}\} with you.","otherLocations":"off","otherLocationsLine":"\{\{price.service\}\} is offered at \{\{price.locations\}\}.","specialLine":"\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.","specialLineOpenEnded":"\{\{price.specialWording\}\}.","startingAtLine":"\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.","startingAtWithOptions":"\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}."\}. |
content.pricing.feeLine | string | No | 1–300 characters. Default: "The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.". |
content.pricing.floorPlanLine | string | No | 1–300 characters. Default: "\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.". |
content.pricing.mentionSpecials | enum | No | One of: "when_price_comes_up", "once_after_discovery", "only_when_asked". Default: "when_price_comes_up". |
content.pricing.notOfferedLine | string | No | 1–300 characters. Default: "\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.". |
content.pricing.onRequestLine | string | No | 1–300 characters. Default: "Our team will go over pricing for \{\{price.service\}\} with you.". |
content.pricing.otherLocations | enum | No | One of: "off", "mention", "mention_and_connect". Default: "off". |
content.pricing.otherLocationsLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} is offered at \{\{price.locations\}\}.". |
content.pricing.specialLine | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.". |
content.pricing.specialLineOpenEnded | string | No | 1–300 characters. Default: "\{\{price.specialWording\}\}.". |
content.pricing.startingAtLine | string | No | 1–300 characters. Default: "\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
content.pricing.startingAtWithOptions | string | No | 1–300 characters. Default: "\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}.". |
content.recording | object | No | Default: \{"enabled":true\}. |
content.recording.enabled | boolean | No | Default: true. |
content.retention | object | No | Default: \{"recordingDays":90,"transcriptDays":90\}. |
content.retention.recordingDays | integer | No | Between 1 and 3650. Default: 90. |
content.retention.transcriptDays | integer | No | Between 1 and 3650. Default: 90. |
content.schemaVersion | enum | No | One of: 1. Default: 1. |
content.tools | object | No | Default: \{"bindings":[]\}. |
content.tools.bindings | array<object> | No | Up to 20 items. Default: []. |
content.tools.bindings[].allowCallerInput | boolean | No | Default: true. |
content.tools.bindings[].args | map | No | Default: \{\}. |
content.tools.bindings[].as | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.tools.bindings[].channels | array<enum> | No | Items: "phone", "web_voice", "web_chat". Default: ["phone","web_voice","web_chat"]. |
content.tools.bindings[].confirmWithCaller | boolean | No | Default: false. |
content.tools.bindings[].enabled | boolean | No | Default: true. |
content.tools.bindings[].holdingLine | string | No | 1–200 characters. |
content.tools.bindings[].inputs | map | No | Default: \{\}. |
content.tools.bindings[].label | string | Yes | 1–80 characters. |
content.tools.bindings[].maxCalls | integer | No | Between 1 and 3. Default: 3. |
content.tools.bindings[].onFailure | enum | No | One of: "say_will_follow_up", "continue_silently", "offer_callback", "transfer". Default: "say_will_follow_up". |
content.tools.bindings[].result | object | Yes | — |
content.tools.bindings[].tool | object | Yes | — |
content.tools.bindings[].trigger | object | object | Yes | — |
content.tools.bindings[].when | object | object | object | object | object | object | object | object | object | object | No | — |
content.visitActions | object | No | — |
content.visitActions.allowCustom | boolean | No | Default: true. |
content.visitActions.items | array<object> | No | Up to 30 items. |
content.visitActions.items[].crmTask | boolean | No | Default: false. |
content.visitActions.items[].dueDays | integer | No | Between 0 and 30. Default: 1. |
content.visitActions.items[].key | string | Yes | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
content.visitActions.items[].label | string | Yes | 1–240 characters. |
content.visitActions.items[].owner | enum | No | One of: "rep", "backup". Default: "rep". |
content.visitActions.typedCrmTask | boolean | No | Default: false. |
content.webWidget | object | No | Default: \{"continuationDisclosure":"Hi again — this is the AI assistant you spoke with on the phone.","continuationGreeting":"I have the notes from your call, so we can pick up right where we left off. What else can I help with?","copy":\{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\},"disclosure":"Hi — I am an AI assistant, and I can answer questions or book you a time to visit.","enabled":false,"greeting":"What would you like to know?","launcher":\{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\},"limits":\{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\},"panel":\{"height":620,"presentation":"panel","width":400\},"showMedia":false,"surfaces":\{"chat":true,"voice":false\},"theme":\{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}\}. |
content.webWidget.continuationDisclosure | string | No | 1–320 characters. Default: "Hi again — this is the AI assistant you spoke with on the phone.". |
content.webWidget.continuationGreeting | string | No | 1–320 characters. Default: "I have the notes from your call, so we can pick up right where we left off. What else can I help with?". |
content.webWidget.copy | object | No | Default: \{"agentLabel":"AI assistant","choicesLabel":"Tap an answer, or type your own","closeLabel":"Close the chat","composerDisabledNote":"Messaging is not switched on here yet.","continuingNote":"Continuing from your call on \{date\}","endedNote":"This conversation has ended.","errorBody":"Please try again in a moment, or call us and we will help.","errorTitle":"We could not load the chat","inputPlaceholder":"Type your question","loadingLabel":"Loading the chat","newChatLabel":"Start a new chat","notAllowedBody":"If you run this website, add it to the allowed list in your admin settings.","notAllowedTitle":"This chat is not available on this site","openLabel":"Open the chat","retryLabel":"Try again","sendFailed":"That message did not send. Please try again.","sendLabel":"Send","subtitle":"Answers in a moment","typingLabel":"Writing a reply","visitorLabel":"You"\}. |
content.webWidget.copy.agentLabel | string | No | 1–80 characters. Default: "AI assistant". |
content.webWidget.copy.choicesLabel | string | No | 1–80 characters. Default: "Tap an answer, or type your own". |
content.webWidget.copy.closeLabel | string | No | 1–80 characters. Default: "Close the chat". |
content.webWidget.copy.composerDisabledNote | string | No | 1–320 characters. Default: "Messaging is not switched on here yet.". |
content.webWidget.copy.continuingNote | string | No | 1–80 characters. Default: "Continuing from your call on \{date\}". |
content.webWidget.copy.endedNote | string | No | 1–320 characters. Default: "This conversation has ended.". |
content.webWidget.copy.errorBody | string | No | 1–320 characters. Default: "Please try again in a moment, or call us and we will help.". |
content.webWidget.copy.errorTitle | string | No | 1–80 characters. Default: "We could not load the chat". |
content.webWidget.copy.inputPlaceholder | string | No | 1–80 characters. Default: "Type your question". |
content.webWidget.copy.loadingLabel | string | No | 1–80 characters. Default: "Loading the chat". |
content.webWidget.copy.newChatLabel | string | No | 1–80 characters. Default: "Start a new chat". |
content.webWidget.copy.notAllowedBody | string | No | 1–320 characters. Default: "If you run this website, add it to the allowed list in your admin settings.". |
content.webWidget.copy.notAllowedTitle | string | No | 1–80 characters. Default: "This chat is not available on this site". |
content.webWidget.copy.openLabel | string | No | 1–80 characters. Default: "Open the chat". |
content.webWidget.copy.retryLabel | string | No | 1–80 characters. Default: "Try again". |
content.webWidget.copy.sendFailed | string | No | 1–320 characters. Default: "That message did not send. Please try again.". |
content.webWidget.copy.sendLabel | string | No | 1–80 characters. Default: "Send". |
content.webWidget.copy.subtitle | string | No | 1–80 characters. Default: "Answers in a moment". |
content.webWidget.copy.typingLabel | string | No | 1–80 characters. Default: "Writing a reply". |
content.webWidget.copy.visitorLabel | string | No | 1–80 characters. Default: "You". |
content.webWidget.disclosure | string | No | 1–320 characters. Default: "Hi — I am an AI assistant, and I can answer questions or book you a time to visit.". |
content.webWidget.enabled | boolean | No | Default: false. |
content.webWidget.greeting | string | No | 1–320 characters. Default: "What would you like to know?". |
content.webWidget.launcher | object | No | Default: \{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\}. |
content.webWidget.launcher.icon | enum | No | One of: "chat", "message", "question", "sparkle", "phone", "headset". Default: "chat". |
content.webWidget.launcher.iconUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.launcher.label | string | No | 1–80 characters. Default: "Chat with us". |
content.webWidget.launcher.offset | object | No | Default: \{"x":20,"y":20\}. |
content.webWidget.launcher.position | enum | No | One of: "bottom-right", "bottom-left". Default: "bottom-right". |
content.webWidget.launcher.shape | enum | No | One of: "circle", "rounded". Default: "circle". |
content.webWidget.launcher.showLabel | boolean | No | Default: false. |
content.webWidget.launcher.size | enum | No | One of: "medium", "large". Default: "medium". |
content.webWidget.limits | object | No | Default: \{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\}. |
content.webWidget.limits.charactersPerMessage | integer | No | Between 200 and 8000. Default: 2000. |
content.webWidget.limits.messagesPerConversation | integer | No | Between 1 and 2000. Default: 200. |
content.webWidget.limits.messagesPerHour | integer | No | Between 1 and 500. Default: 30. |
content.webWidget.panel | object | No | Default: \{"height":620,"presentation":"panel","width":400\}. |
content.webWidget.panel.heading | string | No | 1–80 characters. |
content.webWidget.panel.height | integer | No | Between 420 and 800. Default: 620. |
content.webWidget.panel.presentation | enum | No | One of: "panel", "sheet", "fullscreen". Default: "panel". |
content.webWidget.panel.width | integer | No | Between 320 and 560. Default: 400. |
content.webWidget.showMedia | boolean | No | Default: false. |
content.webWidget.surfaces | object | No | Default: \{"chat":true,"voice":false\}. |
content.webWidget.surfaces.chat | boolean | No | Default: true. |
content.webWidget.surfaces.voice | boolean | No | Default: false. |
content.webWidget.theme | object | No | Default: \{"dark":\{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\},"font":"system","light":\{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\},"radius":\{"bubble":14,"launcher":28,"panel":16\},"scheme":"auto"\}. |
content.webWidget.theme.avatar | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.theme.dark | object | No | Default: \{"agentBubble":"#1E2724","agentBubbleText":"#ECF1EF","border":"#7E8C87","brand":"#8FC9B5","brandContrast":"#10201B","danger":"#F2A7A1","focusRing":"#8FBEF5","surface":"#141A18","surfaceMuted":"#1E2724","text":"#ECF1EF","textMuted":"#A7B3AF","visitorBubble":"#2C544A","visitorBubbleText":"#F4F9F7"\}. |
content.webWidget.theme.font | enum | No | One of: "system", "serif_warm", "sans_modern". Default: "system". |
content.webWidget.theme.light | object | No | Default: \{"agentBubble":"#F1EFEA","agentBubbleText":"#1E2A26","border":"#77837E","brand":"#24473D","brandContrast":"#FFFFFF","danger":"#A3241C","focusRing":"#0B5FA5","surface":"#FFFFFF","surfaceMuted":"#F1EFEA","text":"#1E2A26","textMuted":"#5A6763","visitorBubble":"#24473D","visitorBubbleText":"#FFFFFF"\}. |
content.webWidget.theme.logo | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.webWidget.theme.radius | object | No | Default: \{"bubble":14,"launcher":28,"panel":16\}. |
content.webWidget.theme.scheme | enum | No | One of: "auto", "light", "dark". Default: "auto". |
contentHash | string | Yes | — |
createdAt | string (date-time) | Yes | — |
id | string (pbv_… ID) | Yes | ID (pbv_…) |
publishedAt | string (date-time) | null | Yes | — |
publishedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
status | enum | Yes | One of: "draft", "published", "archived", "discarded". |
updatedAt | string (date-time) | Yes | — |
version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/playbooks/{playbookId}/versions/{version}" \
-H "Authorization: Bearer $ACCESS_TOKEN"The stock voices a playbook can use, all of them or one voice company#
GET /v1/account/voices
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
provider | string | No | Up to 40 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
voices | array<Voice> | Yes | — |
voices[].accent | string | No | — |
voices[].description | string | No | — |
voices[].gender | enum | No | One of: "female", "male", "neutral". |
voices[].models | array<string> | No | — |
voices[].name | string | Yes | — |
voices[].previewUrl | string | No | — |
voices[].provider | string | Yes | — |
voices[].voiceId | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/voices" \
-H "Authorization: Bearer $ACCESS_TOKEN"