API reference
Groups
Groups, profiles, customizations and human backup
| Method | Path | Summary |
|---|---|---|
GET | /v1/account/groups | Groups the caller can see (group managers: their groups only), with their numbers, the version those numbers run and whether the human backup plan is complete |
POST | /v1/account/groups | Create a group with its first profile (and a matching sandbox CRM community) |
POST | /v1/account/groups/bulk-customization | Apply one customization to several groups' drafts (each group publishes its own, ADR 0131) |
GET | /v1/account/groups/overview | Groups against playbook blocks: customized cells, behind the latest version, needs review |
GET | /v1/account/groups/{groupId} | One group with its current profile |
PATCH | /v1/account/groups/{groupId} | Rename a group, change its type label or default playbook |
POST | /v1/account/groups/{groupId}/archive | Archive or restore a group (refused while it has active numbers) |
PUT | /v1/account/groups/{groupId}/closures | Save holidays and closures. They go live at once, without a publish (ADR 0131): calls, booking pages and number routing follow them |
POST | /v1/account/groups/{groupId}/copy | Copy one group's setup (profile, customizations, default playbook) to a new group |
GET | /v1/account/groups/{groupId}/customizations | The group's differences from one account playbook (live, or the draft's when source=draft and the draft changes them) |
PUT | /v1/account/groups/{groupId}/customizations | Save one playbook's customizations into the group's draft (locked items are refused; callers hear them after a publish) |
DELETE | /v1/account/groups/{groupId}/customizations/{customizationId} | Reset one customization in the group's draft: once published, the item follows the account playbook again |
GET | /v1/account/groups/{groupId}/draft | The group's unpublished changes, what differs from live, and what publishing would do (null when there are none) |
DELETE | /v1/account/groups/{groupId}/draft | Discard the group's unpublished changes |
POST | /v1/account/groups/{groupId}/draft/publish | Make the group's unpublished changes live and update its effective playbooks (content that breaks a publish rule is held for review; the last good version keeps running) |
GET | /v1/account/groups/{groupId}/effective-preview | What calls to this group would run: account version + customizations + profile |
GET | /v1/account/groups/{groupId}/human-backup | The group's human backup plan and what is missing (live, or the draft's) |
PUT | /v1/account/groups/{groupId}/human-backup | Save the human backup plan into the group's draft (a complete plan is required; it goes live when the draft is published) |
GET | /v1/account/groups/{groupId}/profile | The group's current profile |
PUT | /v1/account/groups/{groupId}/profile | Save the profile into the group's draft (callers hear it after POST /groups/{groupId}/draft/publish). Holidays and closures in the body are ignored: they go live through PUT /groups/{groupId}/closures |
POST | /v1/account/groups/{groupId}/profile/geocode-preview | Where the map would put an address, before the profile is saved (location distance spec, "Placing the pin"). Nothing is stored |
Groups the caller can see (group managers: their groups only), with their numbers, the version those numbers run and whether the human backup plan is complete#
GET /v1/account/groups
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 |
|---|---|---|---|
groups | array<GroupListItem> | Yes | — |
groups[].backupComplete | boolean | Yes | — |
groups[].backupIssues | array<object> | Yes | — |
groups[].backupIssues[].message | string | Yes | — |
groups[].backupIssues[].path | string | Yes | — |
groups[].createdAt | string (date-time) | Yes | — |
groups[].defaultPlaybookId | string (pb_… ID) | null | Yes | — |
groups[].id | string (grp_… ID) | Yes | ID (grp_…) |
groups[].isSample | boolean | Yes | — |
groups[].name | string | Yes | — |
groups[].needsReview | boolean | Yes | — |
groups[].numberCount | integer | Yes | — |
groups[].position | object | null | Yes | — |
groups[].position.lat | number | Yes | — |
groups[].position.lng | number | Yes | — |
groups[].reviewReason | string | null | Yes | — |
groups[].runningVersion | integer | null | Yes | — |
groups[].status | enum | Yes | One of: "active", "archived". |
groups[].timeZone | string | Yes | — |
groups[].typeLabel | string | null | Yes | — |
groups[].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/groups" \
-H "Authorization: Bearer $ACCESS_TOKEN"Create a group with its first profile (and a matching sandbox CRM community)#
POST /v1/account/groups
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
defaultPlaybookId | string (pb_… ID) | No | ID (pb_…) |
name | string | Yes | 1–120 characters. |
profile | map | No | — |
profile.{key} | any | No | Any key. |
timeZone | string | Yes | 1–64 characters. |
typeLabel | string | No | Up to 40 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
group | Group | Yes | — |
group.createdAt | string (date-time) | Yes | — |
group.defaultPlaybookId | string (pb_… ID) | null | Yes | — |
group.id | string (grp_… ID) | Yes | ID (grp_…) |
group.isSample | boolean | Yes | — |
group.name | string | Yes | — |
group.needsReview | boolean | Yes | — |
group.reviewReason | string | null | Yes | — |
group.status | enum | Yes | One of: "active", "archived". |
group.timeZone | string | Yes | — |
group.typeLabel | string | null | Yes | — |
group.updatedAt | string (date-time) | Yes | — |
profile | GroupProfileVersion | Yes | — |
profile.content | object | Yes | — |
profile.content.address | string | No | Up to 300 characters. |
profile.content.addressParts | object | No | — |
profile.content.addressParts.city | string | Yes | 1–80 characters. |
profile.content.addressParts.country | enum | Yes | One of: "US", "CA", "MX". Default: "US". |
profile.content.addressParts.line1 | string | Yes | 1–120 characters. |
profile.content.addressParts.line2 | string | No | Up to 120 characters. |
profile.content.addressParts.postalCode | string | Yes | 1–20 characters. |
profile.content.addressParts.region | string | Yes | 1–40 characters. |
profile.content.closures | array<object> | Yes | Up to 60 items. Default: []. |
profile.content.closures[].from | string (date) | Yes | — |
profile.content.closures[].hours | object | null | Yes | — |
profile.content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.closures[].name | string | Yes | 1–60 characters. |
profile.content.closures[].to | string (date) | Yes | — |
profile.content.crmLocationId | string | No | Up to 64 characters. |
profile.content.custom | map | Yes | Default: \{\}. |
profile.content.custom.{key} | string | No | Any key. Up to 1000 characters. |
profile.content.directions | object | Yes | Default: \{\}. |
profile.content.directions.accessibility | string | No | Up to 600 characters. |
profile.content.directions.entrance | string | No | Up to 600 characters. |
profile.content.directions.parking | string | No | Up to 600 characters. |
profile.content.displayName | string | No | Up to 160 characters. |
profile.content.geo | object | No | — |
profile.content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
profile.content.geo.at | string (date-time) | Yes | — |
profile.content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
profile.content.geo.lat | number | Yes | Between -90 and 90. |
profile.content.geo.lng | number | Yes | Between -180 and 180. |
profile.content.geo.source | enum | Yes | One of: "geocoder", "pin". |
profile.content.hours | string | No | Up to 300 characters. |
profile.content.humanBackup | object | Yes | — |
profile.content.humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
profile.content.humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
profile.content.humanBackup.missedCallFollowUp | boolean | No | — |
profile.content.humanBackup.notetaker | boolean | No | — |
profile.content.humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
profile.content.humanBackup.notifySms | array<string> | Yes | Default: []. |
profile.content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
profile.content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.staffedHours | array<object> | Yes | Default: []. |
profile.content.humanBackup.transferLine | string | No | Up to 300 characters. |
profile.content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
profile.content.meetingWindows | array<object> | Yes | Default: []. |
profile.content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
profile.content.meetingWindows[].end | string | constant | Yes | — |
profile.content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
profile.content.name | string | Yes | 1–120 characters. |
profile.content.nearbyGroupIds | array<string (grp_… ID)> | Yes | Up to 10 items. Default: []. |
profile.content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.preRingNotice | string | No | 1–300 characters. |
profile.content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
profile.content.replyToEmail | string (email) | No | — |
profile.content.repsBySpecialty | boolean | Yes | Default: false. |
profile.content.staff | array<object> | Yes | Default: []. |
profile.content.staff[].bio | string | No | Up to 800 characters. |
profile.content.staff[].crmUserId | string | No | Up to 64 characters. |
profile.content.staff[].email | string (email) | No | — |
profile.content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.staff[].isDefaultIntro | boolean | No | — |
profile.content.staff[].name | string | Yes | 1–120 characters. |
profile.content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
profile.content.staff[].role | string | Yes | 1–64 characters. |
profile.content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
profile.content.staff[].takesMeetings | constant | No | Always false. |
profile.content.staff[].title | string | No | Up to 120 characters. |
profile.content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
profile.content.staff[].video | object | No | — |
profile.content.surroundings | string | No | Up to 2000 characters. |
profile.content.talkingPoints | array<object> | Yes | Default: []. |
profile.content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.talkingPoints[].text | string | Yes | 1–1000 characters. |
profile.content.timeZone | string | Yes | — |
profile.createdAt | string (date-time) | Yes | — |
profile.createdBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
profile.fromDraft | boolean | Yes | — |
profile.groupId | string (grp_… ID) | Yes | ID (grp_…) |
profile.issues | array<object> | Yes | — |
profile.issues[].message | string | Yes | — |
profile.issues[].path | string | Yes | — |
profile.issues[].severity | enum | Yes | One of: "error", "warning". |
profile.note | string | null | Yes | — |
profile.placeholders | array<string> | Yes | — |
profile.version | integer | Yes | — |
sandbox | object | Yes | — |
sandbox.communityId | integer | No | — |
sandbox.linked | boolean | Yes | — |
sandbox.message | string | No | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/groups" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"timeZone": "string"
}'Apply one customization to several groups' drafts (each group publishes its own, ADR 0131)#
POST /v1/account/groups/bulk-customization
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
customization | any | Yes | — |
groupIds | array<string (grp_… ID)> | Yes | Up to 200 items. |
note | string | No | Up to 500 characters. |
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
results | array<object> | Yes | — |
results[].applied | boolean | Yes | — |
results[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
results[].message | string | No | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/groups/bulk-customization" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"playbookId": "pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"groupIds": [
"grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
],
"customization": {}
}'Groups against playbook blocks: customized cells, behind the latest version, needs review#
GET /v1/account/groups/overview
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | No | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
blocks | array<string> | Yes | — |
latestVersion | integer | null | Yes | — |
playbookId | string (pb_… ID) | null | Yes | — |
rows | array<object> | Yes | — |
rows[].behindLatest | boolean | Yes | — |
rows[].cells | array<object> | Yes | — |
rows[].cells[].block | string | Yes | — |
rows[].cells[].count | integer | Yes | — |
rows[].cells[].customizationIds | array<string> | Yes | — |
rows[].cells[].customized | boolean | Yes | — |
rows[].cells[].kinds | array<enum> | Yes | Items: "change", "off", "add". |
rows[].customizationCount | integer | Yes | — |
rows[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
rows[].name | string | Yes | — |
rows[].needsReview | boolean | Yes | — |
rows[].reviewReason | string | null | Yes | — |
rows[].runningVersion | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/groups/overview" \
-H "Authorization: Bearer $ACCESS_TOKEN"One group with its current profile#
GET /v1/account/groups/{groupId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
group | Group | Yes | — |
group.createdAt | string (date-time) | Yes | — |
group.defaultPlaybookId | string (pb_… ID) | null | Yes | — |
group.id | string (grp_… ID) | Yes | ID (grp_…) |
group.isSample | boolean | Yes | — |
group.name | string | Yes | — |
group.needsReview | boolean | Yes | — |
group.reviewReason | string | null | Yes | — |
group.status | enum | Yes | One of: "active", "archived". |
group.timeZone | string | Yes | — |
group.typeLabel | string | null | Yes | — |
group.updatedAt | string (date-time) | Yes | — |
profile | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Rename a group, change its type label or default playbook#
PATCH /v1/account/groups/{groupId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
defaultPlaybookId | string (pb_… ID) | null | No | — |
name | string | No | 1–120 characters. |
typeLabel | string | null | No | Up to 40 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
effective | array<object> | Yes | — |
effective[].issues | array<string> | Yes | — |
effective[].outcome | enum | Yes | One of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile". |
effective[].playbookId | string (pb_… ID) | No | ID (pb_…) |
effective[].versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
group | Group | Yes | — |
group.createdAt | string (date-time) | Yes | — |
group.defaultPlaybookId | string (pb_… ID) | null | Yes | — |
group.id | string (grp_… ID) | Yes | ID (grp_…) |
group.isSample | boolean | Yes | — |
group.name | string | Yes | — |
group.needsReview | boolean | Yes | — |
group.reviewReason | string | null | Yes | — |
group.status | enum | Yes | One of: "active", "archived". |
group.timeZone | string | Yes | — |
group.typeLabel | string | null | Yes | — |
group.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/groups/{groupId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"defaultPlaybookId": "pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"name": "string",
"typeLabel": "string"
}'Archive or restore a group (refused while it has active numbers)#
POST /v1/account/groups/{groupId}/archive
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
archived | boolean | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
createdAt | string (date-time) | Yes | — |
defaultPlaybookId | string (pb_… ID) | null | Yes | — |
id | string (grp_… ID) | Yes | ID (grp_…) |
isSample | boolean | Yes | — |
name | string | Yes | — |
needsReview | boolean | Yes | — |
reviewReason | string | null | Yes | — |
status | enum | Yes | One of: "active", "archived". |
timeZone | string | Yes | — |
typeLabel | string | null | 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/groups/{groupId}/archive" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"archived": true
}'Save holidays and closures. They go live at once, without a publish (ADR 0131): calls, booking pages and number routing follow them#
PUT /v1/account/groups/{groupId}/closures
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 |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
closures | array<object> | No | Up to 60 items. Default: []. |
closures[].from | string (date) | Yes | — |
closures[].hours | object | null | No | — |
closures[].hours.end | string | enum | Yes | — |
closures[].hours.start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
closures[].name | string | Yes | 1–60 characters. |
closures[].to | string (date) | Yes | — |
note | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
effective | array<object> | Yes | — |
effective[].issues | array<string> | Yes | — |
effective[].outcome | enum | Yes | One of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile". |
effective[].playbookId | string (pb_… ID) | No | ID (pb_…) |
effective[].versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
profile | GroupProfileVersion | Yes | — |
profile.content | object | Yes | — |
profile.content.address | string | No | Up to 300 characters. |
profile.content.addressParts | object | No | — |
profile.content.addressParts.city | string | Yes | 1–80 characters. |
profile.content.addressParts.country | enum | Yes | One of: "US", "CA", "MX". Default: "US". |
profile.content.addressParts.line1 | string | Yes | 1–120 characters. |
profile.content.addressParts.line2 | string | No | Up to 120 characters. |
profile.content.addressParts.postalCode | string | Yes | 1–20 characters. |
profile.content.addressParts.region | string | Yes | 1–40 characters. |
profile.content.closures | array<object> | Yes | Up to 60 items. Default: []. |
profile.content.closures[].from | string (date) | Yes | — |
profile.content.closures[].hours | object | null | Yes | — |
profile.content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.closures[].name | string | Yes | 1–60 characters. |
profile.content.closures[].to | string (date) | Yes | — |
profile.content.crmLocationId | string | No | Up to 64 characters. |
profile.content.custom | map | Yes | Default: \{\}. |
profile.content.custom.{key} | string | No | Any key. Up to 1000 characters. |
profile.content.directions | object | Yes | Default: \{\}. |
profile.content.directions.accessibility | string | No | Up to 600 characters. |
profile.content.directions.entrance | string | No | Up to 600 characters. |
profile.content.directions.parking | string | No | Up to 600 characters. |
profile.content.displayName | string | No | Up to 160 characters. |
profile.content.geo | object | No | — |
profile.content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
profile.content.geo.at | string (date-time) | Yes | — |
profile.content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
profile.content.geo.lat | number | Yes | Between -90 and 90. |
profile.content.geo.lng | number | Yes | Between -180 and 180. |
profile.content.geo.source | enum | Yes | One of: "geocoder", "pin". |
profile.content.hours | string | No | Up to 300 characters. |
profile.content.humanBackup | object | Yes | — |
profile.content.humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
profile.content.humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
profile.content.humanBackup.missedCallFollowUp | boolean | No | — |
profile.content.humanBackup.notetaker | boolean | No | — |
profile.content.humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
profile.content.humanBackup.notifySms | array<string> | Yes | Default: []. |
profile.content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
profile.content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.staffedHours | array<object> | Yes | Default: []. |
profile.content.humanBackup.transferLine | string | No | Up to 300 characters. |
profile.content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
profile.content.meetingWindows | array<object> | Yes | Default: []. |
profile.content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
profile.content.meetingWindows[].end | string | constant | Yes | — |
profile.content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
profile.content.name | string | Yes | 1–120 characters. |
profile.content.nearbyGroupIds | array<string (grp_… ID)> | Yes | Up to 10 items. Default: []. |
profile.content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.preRingNotice | string | No | 1–300 characters. |
profile.content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
profile.content.replyToEmail | string (email) | No | — |
profile.content.repsBySpecialty | boolean | Yes | Default: false. |
profile.content.staff | array<object> | Yes | Default: []. |
profile.content.staff[].bio | string | No | Up to 800 characters. |
profile.content.staff[].crmUserId | string | No | Up to 64 characters. |
profile.content.staff[].email | string (email) | No | — |
profile.content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.staff[].isDefaultIntro | boolean | No | — |
profile.content.staff[].name | string | Yes | 1–120 characters. |
profile.content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
profile.content.staff[].role | string | Yes | 1–64 characters. |
profile.content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
profile.content.staff[].takesMeetings | constant | No | Always false. |
profile.content.staff[].title | string | No | Up to 120 characters. |
profile.content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
profile.content.staff[].video | object | No | — |
profile.content.surroundings | string | No | Up to 2000 characters. |
profile.content.talkingPoints | array<object> | Yes | Default: []. |
profile.content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.talkingPoints[].text | string | Yes | 1–1000 characters. |
profile.content.timeZone | string | Yes | — |
profile.createdAt | string (date-time) | Yes | — |
profile.createdBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
profile.fromDraft | boolean | Yes | — |
profile.groupId | string (grp_… ID) | Yes | ID (grp_…) |
profile.issues | array<object> | Yes | — |
profile.issues[].message | string | Yes | — |
profile.issues[].path | string | Yes | — |
profile.issues[].severity | enum | Yes | One of: "error", "warning". |
profile.note | string | null | Yes | — |
profile.placeholders | array<string> | Yes | — |
profile.version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/closures" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"closures": [],
"note": "string"
}'Copy one group's setup (profile, customizations, default playbook) to a new group#
POST /v1/account/groups/{groupId}/copy
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 1–120 characters. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
customizationsCopied | integer | Yes | — |
group | Group | Yes | — |
group.createdAt | string (date-time) | Yes | — |
group.defaultPlaybookId | string (pb_… ID) | null | Yes | — |
group.id | string (grp_… ID) | Yes | ID (grp_…) |
group.isSample | boolean | Yes | — |
group.name | string | Yes | — |
group.needsReview | boolean | Yes | — |
group.reviewReason | string | null | Yes | — |
group.status | enum | Yes | One of: "active", "archived". |
group.timeZone | string | Yes | — |
group.typeLabel | string | null | Yes | — |
group.updatedAt | string (date-time) | Yes | — |
profile | GroupProfileVersion | Yes | — |
profile.content | object | Yes | — |
profile.content.address | string | No | Up to 300 characters. |
profile.content.addressParts | object | No | — |
profile.content.addressParts.city | string | Yes | 1–80 characters. |
profile.content.addressParts.country | enum | Yes | One of: "US", "CA", "MX". Default: "US". |
profile.content.addressParts.line1 | string | Yes | 1–120 characters. |
profile.content.addressParts.line2 | string | No | Up to 120 characters. |
profile.content.addressParts.postalCode | string | Yes | 1–20 characters. |
profile.content.addressParts.region | string | Yes | 1–40 characters. |
profile.content.closures | array<object> | Yes | Up to 60 items. Default: []. |
profile.content.closures[].from | string (date) | Yes | — |
profile.content.closures[].hours | object | null | Yes | — |
profile.content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.closures[].name | string | Yes | 1–60 characters. |
profile.content.closures[].to | string (date) | Yes | — |
profile.content.crmLocationId | string | No | Up to 64 characters. |
profile.content.custom | map | Yes | Default: \{\}. |
profile.content.custom.{key} | string | No | Any key. Up to 1000 characters. |
profile.content.directions | object | Yes | Default: \{\}. |
profile.content.directions.accessibility | string | No | Up to 600 characters. |
profile.content.directions.entrance | string | No | Up to 600 characters. |
profile.content.directions.parking | string | No | Up to 600 characters. |
profile.content.displayName | string | No | Up to 160 characters. |
profile.content.geo | object | No | — |
profile.content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
profile.content.geo.at | string (date-time) | Yes | — |
profile.content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
profile.content.geo.lat | number | Yes | Between -90 and 90. |
profile.content.geo.lng | number | Yes | Between -180 and 180. |
profile.content.geo.source | enum | Yes | One of: "geocoder", "pin". |
profile.content.hours | string | No | Up to 300 characters. |
profile.content.humanBackup | object | Yes | — |
profile.content.humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
profile.content.humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
profile.content.humanBackup.missedCallFollowUp | boolean | No | — |
profile.content.humanBackup.notetaker | boolean | No | — |
profile.content.humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
profile.content.humanBackup.notifySms | array<string> | Yes | Default: []. |
profile.content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
profile.content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.staffedHours | array<object> | Yes | Default: []. |
profile.content.humanBackup.transferLine | string | No | Up to 300 characters. |
profile.content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
profile.content.meetingWindows | array<object> | Yes | Default: []. |
profile.content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
profile.content.meetingWindows[].end | string | constant | Yes | — |
profile.content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
profile.content.name | string | Yes | 1–120 characters. |
profile.content.nearbyGroupIds | array<string (grp_… ID)> | Yes | Up to 10 items. Default: []. |
profile.content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.preRingNotice | string | No | 1–300 characters. |
profile.content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
profile.content.replyToEmail | string (email) | No | — |
profile.content.repsBySpecialty | boolean | Yes | Default: false. |
profile.content.staff | array<object> | Yes | Default: []. |
profile.content.staff[].bio | string | No | Up to 800 characters. |
profile.content.staff[].crmUserId | string | No | Up to 64 characters. |
profile.content.staff[].email | string (email) | No | — |
profile.content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.staff[].isDefaultIntro | boolean | No | — |
profile.content.staff[].name | string | Yes | 1–120 characters. |
profile.content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
profile.content.staff[].role | string | Yes | 1–64 characters. |
profile.content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
profile.content.staff[].takesMeetings | constant | No | Always false. |
profile.content.staff[].title | string | No | Up to 120 characters. |
profile.content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
profile.content.staff[].video | object | No | — |
profile.content.surroundings | string | No | Up to 2000 characters. |
profile.content.talkingPoints | array<object> | Yes | Default: []. |
profile.content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.talkingPoints[].text | string | Yes | 1–1000 characters. |
profile.content.timeZone | string | Yes | — |
profile.createdAt | string (date-time) | Yes | — |
profile.createdBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
profile.fromDraft | boolean | Yes | — |
profile.groupId | string (grp_… ID) | Yes | ID (grp_…) |
profile.issues | array<object> | Yes | — |
profile.issues[].message | string | Yes | — |
profile.issues[].path | string | Yes | — |
profile.issues[].severity | enum | Yes | One of: "error", "warning". |
profile.note | string | null | Yes | — |
profile.placeholders | array<string> | Yes | — |
profile.version | integer | Yes | — |
sandbox | object | Yes | — |
sandbox.communityId | integer | No | — |
sandbox.linked | boolean | Yes | — |
sandbox.message | string | No | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/copy" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string"
}'The group's differences from one account playbook (live, or the draft's when source=draft and the draft changes them)#
GET /v1/account/groups/{groupId}/customizations
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
source | enum | No | One of: "live", "draft". Default: "live". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
content | object | Yes | — |
content.items | array<object | object | object> | Yes | Default: []. |
content.items[].baseHash | string | No | (variant 1) Exactly 64 characters. |
content.items[].id | string | Yes | (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].kind | constant | Yes | (variant 1) Always "change". |
content.items[].note | string | No | (variant 1) Up to 500 characters. |
content.items[].target | object | object | Yes | (variant 1) |
content.items[].target.collection | enum | Yes | (variant 1) (variant 1) One of: "flows", "flows.fields", "flows.branch", "flows.disqualify", "flows.talkingPoints", "objections", "booking.rules", "knowledge.faq", "knowledge.documents", "guardrails.prohibitedClaims", "guardrails.declineTopics", "guardrails.neverSay", "guardrails.requiredDisclosures", "persona.exampleExchanges", "followUp.cards", "followUp.blocks", "tools.bindings", "visitActions.items", "objectives.fallbacks", "objectives.secondary", "persona.voice.pronunciations". |
content.items[].target.itemId | string | Yes | (variant 1) (variant 1) 1–64 characters. |
content.items[].target.parentId | string | No | (variant 1) (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].target.scalar | enum | Yes | (variant 1) (variant 2) One of: "brief", "defaultFlowId", "persona.agentName", "persona.companyName", "persona.tone", "persona.opening", "persona.openingNotRecorded", "persona.openingQuestion", "persona.returningCallerLine", "persona.voice", "escalation.transferLine", "escalation.unavailableLine", "guardrails.allowPriceDiscussion", "pricing.startingAtLine", "pricing.startingAtWithOptions", "pricing.feeLine", "pricing.onRequestLine", "pricing.notOfferedLine", "pricing.specialLine", "pricing.specialLineOpenEnded", "pricing.mentionSpecials", "pricing.otherLocations", "pricing.otherLocationsLine", "pricing.floorPlanLine", "guardrails.fallbackLine", "guardrails.redirectLines", "booking.allowUnqualified", "integrations.crm", "recording.enabled", "integrations.scheduler", "followUp.emails.initial_link", "followUp.emails.reminder", "followUp.emails.reschedule_confirmation", "followUp.emails.cancel_confirmation", "followUp.emails.after_visit". |
content.items[].value | any | Yes | (variant 1) |
content.items[].baseHash | string | No | (variant 2) Exactly 64 characters. |
content.items[].id | string | Yes | (variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].kind | constant | Yes | (variant 2) Always "off". |
content.items[].note | string | No | (variant 2) Up to 500 characters. |
content.items[].target | object | Yes | (variant 2) |
content.items[].target.collection | enum | Yes | (variant 2) One of: "flows", "flows.fields", "flows.branch", "flows.disqualify", "flows.talkingPoints", "objections", "booking.rules", "knowledge.faq", "knowledge.documents", "guardrails.prohibitedClaims", "guardrails.declineTopics", "guardrails.neverSay", "guardrails.requiredDisclosures", "persona.exampleExchanges", "followUp.cards", "followUp.blocks", "tools.bindings", "visitActions.items", "objectives.fallbacks", "objectives.secondary", "persona.voice.pronunciations". |
content.items[].target.itemId | string | Yes | (variant 2) 1–64 characters. |
content.items[].target.parentId | string | No | (variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].baseHash | string | No | (variant 3) Exactly 64 characters. |
content.items[].id | string | Yes | (variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].kind | constant | Yes | (variant 3) Always "add". |
content.items[].note | string | No | (variant 3) Up to 500 characters. |
content.items[].position | object | No | (variant 3) |
content.items[].position.after | string | No | (variant 3) |
content.items[].position.before | string | No | (variant 3) |
content.items[].target | object | Yes | (variant 3) |
content.items[].target.collection | enum | Yes | (variant 3) One of: "flows", "flows.fields", "flows.branch", "flows.disqualify", "flows.talkingPoints", "objections", "booking.rules", "knowledge.faq", "knowledge.documents", "guardrails.prohibitedClaims", "guardrails.declineTopics", "guardrails.neverSay", "guardrails.requiredDisclosures", "persona.exampleExchanges", "followUp.cards", "followUp.blocks", "tools.bindings", "visitActions.items", "objectives.fallbacks", "objectives.secondary", "persona.voice.pronunciations". |
content.items[].target.parentId | string | No | (variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].value | any | Yes | (variant 3) |
createdAt | string (date-time) | null | Yes | — |
fromDraft | boolean | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
issues | array<object> | Yes | — |
issues[].customizationId | string | No | — |
issues[].kind | enum | Yes | One of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing". |
issues[].message | string | Yes | — |
locks | array<string> | Yes | — |
needsReview | boolean | Yes | — |
note | string | null | Yes | — |
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
version | integer | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/customizations?playbookId=pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE" \
-H "Authorization: Bearer $ACCESS_TOKEN"Save one playbook's customizations into the group's draft (locked items are refused; callers hear them after a publish)#
PUT /v1/account/groups/{groupId}/customizations
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
baseHash | string | null | No | Up to 128 characters. |
content | object | Yes | — |
content.items | array<object | object | object> | No | Default: []. |
content.items[].baseHash | string | No | (variant 1) Exactly 64 characters. |
content.items[].id | string | Yes | (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].kind | enum | Yes | (variant 1) One of: "change". |
content.items[].note | string | No | (variant 1) Up to 500 characters. |
content.items[].target | object | object | Yes | (variant 1) |
content.items[].target.collection | enum | Yes | (variant 1) (variant 1) One of: "flows", "flows.fields", "flows.branch", "flows.disqualify", "flows.talkingPoints", "objections", "booking.rules", "knowledge.faq", "knowledge.documents", "guardrails.prohibitedClaims", "guardrails.declineTopics", "guardrails.neverSay", "guardrails.requiredDisclosures", "persona.exampleExchanges", "followUp.cards", "followUp.blocks", "tools.bindings", "visitActions.items", "objectives.fallbacks", "objectives.secondary", "persona.voice.pronunciations". |
content.items[].target.itemId | string | Yes | (variant 1) (variant 1) 1–64 characters. |
content.items[].target.parentId | string | No | (variant 1) (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].target.scalar | enum | Yes | (variant 1) (variant 2) One of: "brief", "defaultFlowId", "persona.agentName", "persona.companyName", "persona.tone", "persona.opening", "persona.openingNotRecorded", "persona.openingQuestion", "persona.returningCallerLine", "persona.voice", "escalation.transferLine", "escalation.unavailableLine", "guardrails.allowPriceDiscussion", "pricing.startingAtLine", "pricing.startingAtWithOptions", "pricing.feeLine", "pricing.onRequestLine", "pricing.notOfferedLine", "pricing.specialLine", "pricing.specialLineOpenEnded", "pricing.mentionSpecials", "pricing.otherLocations", "pricing.otherLocationsLine", "pricing.floorPlanLine", "guardrails.fallbackLine", "guardrails.redirectLines", "booking.allowUnqualified", "integrations.crm", "recording.enabled", "integrations.scheduler", "followUp.emails.initial_link", "followUp.emails.reminder", "followUp.emails.reschedule_confirmation", "followUp.emails.cancel_confirmation", "followUp.emails.after_visit". |
content.items[].value | any | Yes | (variant 1) |
content.items[].baseHash | string | No | (variant 2) Exactly 64 characters. |
content.items[].id | string | Yes | (variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].kind | enum | Yes | (variant 2) One of: "off". |
content.items[].note | string | No | (variant 2) Up to 500 characters. |
content.items[].target | object | Yes | (variant 2) |
content.items[].target.collection | enum | Yes | (variant 2) One of: "flows", "flows.fields", "flows.branch", "flows.disqualify", "flows.talkingPoints", "objections", "booking.rules", "knowledge.faq", "knowledge.documents", "guardrails.prohibitedClaims", "guardrails.declineTopics", "guardrails.neverSay", "guardrails.requiredDisclosures", "persona.exampleExchanges", "followUp.cards", "followUp.blocks", "tools.bindings", "visitActions.items", "objectives.fallbacks", "objectives.secondary", "persona.voice.pronunciations". |
content.items[].target.itemId | string | Yes | (variant 2) 1–64 characters. |
content.items[].target.parentId | string | No | (variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].baseHash | string | No | (variant 3) Exactly 64 characters. |
content.items[].id | string | Yes | (variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].kind | enum | Yes | (variant 3) One of: "add". |
content.items[].note | string | No | (variant 3) Up to 500 characters. |
content.items[].position | object | No | (variant 3) |
content.items[].position.after | string | No | (variant 3) |
content.items[].position.before | string | No | (variant 3) |
content.items[].target | object | Yes | (variant 3) |
content.items[].target.collection | enum | Yes | (variant 3) One of: "flows", "flows.fields", "flows.branch", "flows.disqualify", "flows.talkingPoints", "objections", "booking.rules", "knowledge.faq", "knowledge.documents", "guardrails.prohibitedClaims", "guardrails.declineTopics", "guardrails.neverSay", "guardrails.requiredDisclosures", "persona.exampleExchanges", "followUp.cards", "followUp.blocks", "tools.bindings", "visitActions.items", "objectives.fallbacks", "objectives.secondary", "persona.voice.pronunciations". |
content.items[].target.parentId | string | No | (variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.items[].value | any | Yes | (variant 3) |
note | string | No | Up to 500 characters. |
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
customizations | GroupCustomizationsVersion | Yes | — |
customizations.content | object | Yes | — |
customizations.content.items | array<object | object | object> | Yes | Default: []. |
customizations.content.items[].baseHash | string | No | (variant 1) Exactly 64 characters. |
customizations.content.items[].id | string | Yes | (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
customizations.content.items[].kind | constant | Yes | (variant 1) Always "change". |
customizations.content.items[].note | string | No | (variant 1) Up to 500 characters. |
customizations.content.items[].target | object | object | Yes | (variant 1) |
customizations.content.items[].value | any | Yes | (variant 1) |
customizations.content.items[].baseHash | string | No | (variant 2) Exactly 64 characters. |
customizations.content.items[].id | string | Yes | (variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
customizations.content.items[].kind | constant | Yes | (variant 2) Always "off". |
customizations.content.items[].note | string | No | (variant 2) Up to 500 characters. |
customizations.content.items[].target | object | Yes | (variant 2) |
customizations.content.items[].baseHash | string | No | (variant 3) Exactly 64 characters. |
customizations.content.items[].id | string | Yes | (variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
customizations.content.items[].kind | constant | Yes | (variant 3) Always "add". |
customizations.content.items[].note | string | No | (variant 3) Up to 500 characters. |
customizations.content.items[].position | object | No | (variant 3) |
customizations.content.items[].target | object | Yes | (variant 3) |
customizations.content.items[].value | any | Yes | (variant 3) |
customizations.createdAt | string (date-time) | null | Yes | — |
customizations.fromDraft | boolean | Yes | — |
customizations.groupId | string (grp_… ID) | Yes | ID (grp_…) |
customizations.issues | array<object> | Yes | — |
customizations.issues[].customizationId | string | No | — |
customizations.issues[].kind | enum | Yes | One of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing". |
customizations.issues[].message | string | Yes | — |
customizations.locks | array<string> | Yes | — |
customizations.needsReview | boolean | Yes | — |
customizations.note | string | null | Yes | — |
customizations.playbookId | string (pb_… ID) | Yes | ID (pb_…) |
customizations.version | integer | null | Yes | — |
draft | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/customizations" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"playbookId": "pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"content": {
"items": []
}
}'Reset one customization in the group's draft: once published, the item follows the account playbook again#
DELETE /v1/account/groups/{groupId}/customizations/{customizationId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
customizationId | string | Yes | 1–64 characters. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
baseHash | string | No | Up to 128 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
customizations | GroupCustomizationsVersion | Yes | — |
customizations.content | object | Yes | — |
customizations.content.items | array<object | object | object> | Yes | Default: []. |
customizations.content.items[].baseHash | string | No | (variant 1) Exactly 64 characters. |
customizations.content.items[].id | string | Yes | (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
customizations.content.items[].kind | constant | Yes | (variant 1) Always "change". |
customizations.content.items[].note | string | No | (variant 1) Up to 500 characters. |
customizations.content.items[].target | object | object | Yes | (variant 1) |
customizations.content.items[].value | any | Yes | (variant 1) |
customizations.content.items[].baseHash | string | No | (variant 2) Exactly 64 characters. |
customizations.content.items[].id | string | Yes | (variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
customizations.content.items[].kind | constant | Yes | (variant 2) Always "off". |
customizations.content.items[].note | string | No | (variant 2) Up to 500 characters. |
customizations.content.items[].target | object | Yes | (variant 2) |
customizations.content.items[].baseHash | string | No | (variant 3) Exactly 64 characters. |
customizations.content.items[].id | string | Yes | (variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
customizations.content.items[].kind | constant | Yes | (variant 3) Always "add". |
customizations.content.items[].note | string | No | (variant 3) Up to 500 characters. |
customizations.content.items[].position | object | No | (variant 3) |
customizations.content.items[].target | object | Yes | (variant 3) |
customizations.content.items[].value | any | Yes | (variant 3) |
customizations.createdAt | string (date-time) | null | Yes | — |
customizations.fromDraft | boolean | Yes | — |
customizations.groupId | string (grp_… ID) | Yes | ID (grp_…) |
customizations.issues | array<object> | Yes | — |
customizations.issues[].customizationId | string | No | — |
customizations.issues[].kind | enum | Yes | One of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing". |
customizations.issues[].message | string | Yes | — |
customizations.locks | array<string> | Yes | — |
customizations.needsReview | boolean | Yes | — |
customizations.note | string | null | Yes | — |
customizations.playbookId | string (pb_… ID) | Yes | ID (pb_…) |
customizations.version | integer | null | Yes | — |
draft | any | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/customizations/{customizationId}?playbookId=pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE" \
-H "Authorization: Bearer $ACCESS_TOKEN"The group's unpublished changes, what differs from live, and what publishing would do (null when there are none)#
GET /v1/account/groups/{groupId}/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 |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
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/groups/{groupId}/draft" \
-H "Authorization: Bearer $ACCESS_TOKEN"Discard the group's unpublished changes#
DELETE /v1/account/groups/{groupId}/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 |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
hash | string | No | Up to 128 characters. |
Response 204
No content.
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/draft" \
-H "Authorization: Bearer $ACCESS_TOKEN"Make the group's unpublished changes live and update its effective playbooks (content that breaks a publish rule is held for review; the last good version keeps running)#
POST /v1/account/groups/{groupId}/draft/publish
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 |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
hash | string | No | Up to 128 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
effective | array<object> | Yes | — |
effective[].issues | array<string> | Yes | — |
effective[].outcome | enum | Yes | One of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile". |
effective[].playbookId | string (pb_… ID) | No | ID (pb_…) |
effective[].versionId | string (pbv_… ID) | Yes | ID (pbv_…) |
profile | GroupProfileVersion | Yes | — |
profile.content | object | Yes | — |
profile.content.address | string | No | Up to 300 characters. |
profile.content.addressParts | object | No | — |
profile.content.addressParts.city | string | Yes | 1–80 characters. |
profile.content.addressParts.country | enum | Yes | One of: "US", "CA", "MX". Default: "US". |
profile.content.addressParts.line1 | string | Yes | 1–120 characters. |
profile.content.addressParts.line2 | string | No | Up to 120 characters. |
profile.content.addressParts.postalCode | string | Yes | 1–20 characters. |
profile.content.addressParts.region | string | Yes | 1–40 characters. |
profile.content.closures | array<object> | Yes | Up to 60 items. Default: []. |
profile.content.closures[].from | string (date) | Yes | — |
profile.content.closures[].hours | object | null | Yes | — |
profile.content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.closures[].name | string | Yes | 1–60 characters. |
profile.content.closures[].to | string (date) | Yes | — |
profile.content.crmLocationId | string | No | Up to 64 characters. |
profile.content.custom | map | Yes | Default: \{\}. |
profile.content.custom.{key} | string | No | Any key. Up to 1000 characters. |
profile.content.directions | object | Yes | Default: \{\}. |
profile.content.directions.accessibility | string | No | Up to 600 characters. |
profile.content.directions.entrance | string | No | Up to 600 characters. |
profile.content.directions.parking | string | No | Up to 600 characters. |
profile.content.displayName | string | No | Up to 160 characters. |
profile.content.geo | object | No | — |
profile.content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
profile.content.geo.at | string (date-time) | Yes | — |
profile.content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
profile.content.geo.lat | number | Yes | Between -90 and 90. |
profile.content.geo.lng | number | Yes | Between -180 and 180. |
profile.content.geo.source | enum | Yes | One of: "geocoder", "pin". |
profile.content.hours | string | No | Up to 300 characters. |
profile.content.humanBackup | object | Yes | — |
profile.content.humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
profile.content.humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
profile.content.humanBackup.missedCallFollowUp | boolean | No | — |
profile.content.humanBackup.notetaker | boolean | No | — |
profile.content.humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
profile.content.humanBackup.notifySms | array<string> | Yes | Default: []. |
profile.content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
profile.content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.staffedHours | array<object> | Yes | Default: []. |
profile.content.humanBackup.transferLine | string | No | Up to 300 characters. |
profile.content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
profile.content.meetingWindows | array<object> | Yes | Default: []. |
profile.content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
profile.content.meetingWindows[].end | string | constant | Yes | — |
profile.content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
profile.content.name | string | Yes | 1–120 characters. |
profile.content.nearbyGroupIds | array<string (grp_… ID)> | Yes | Up to 10 items. Default: []. |
profile.content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.preRingNotice | string | No | 1–300 characters. |
profile.content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
profile.content.replyToEmail | string (email) | No | — |
profile.content.repsBySpecialty | boolean | Yes | Default: false. |
profile.content.staff | array<object> | Yes | Default: []. |
profile.content.staff[].bio | string | No | Up to 800 characters. |
profile.content.staff[].crmUserId | string | No | Up to 64 characters. |
profile.content.staff[].email | string (email) | No | — |
profile.content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.staff[].isDefaultIntro | boolean | No | — |
profile.content.staff[].name | string | Yes | 1–120 characters. |
profile.content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
profile.content.staff[].role | string | Yes | 1–64 characters. |
profile.content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
profile.content.staff[].takesMeetings | constant | No | Always false. |
profile.content.staff[].title | string | No | Up to 120 characters. |
profile.content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
profile.content.staff[].video | object | No | — |
profile.content.surroundings | string | No | Up to 2000 characters. |
profile.content.talkingPoints | array<object> | Yes | Default: []. |
profile.content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.talkingPoints[].text | string | Yes | 1–1000 characters. |
profile.content.timeZone | string | Yes | — |
profile.createdAt | string (date-time) | Yes | — |
profile.createdBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
profile.fromDraft | boolean | Yes | — |
profile.groupId | string (grp_… ID) | Yes | ID (grp_…) |
profile.issues | array<object> | Yes | — |
profile.issues[].message | string | Yes | — |
profile.issues[].path | string | Yes | — |
profile.issues[].severity | enum | Yes | One of: "error", "warning". |
profile.note | string | null | Yes | — |
profile.placeholders | array<string> | Yes | — |
profile.version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/draft/publish" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"hash": "string"
}'What calls to this group would run: account version + customizations + profile#
GET /v1/account/groups/{groupId}/effective-preview
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
version | integer | enum | No | Default: "latest". |
groupDraft | enum | No | One of: "true", "false". Default: "false". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
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". |
customized | array<object> | Yes | — |
customized[].block | string | Yes | — |
customized[].collection | string | No | — |
customized[].customizationId | string | Yes | — |
customized[].itemId | string | No | — |
customized[].kind | enum | Yes | One of: "change", "off", "add". |
customized[].parentId | string | No | — |
customized[].scalar | string | No | — |
groupDraft | boolean | Yes | — |
hash | string | Yes | — |
issues | array<object> | Yes | — |
issues[].customizationId | string | No | — |
issues[].kind | enum | Yes | One of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing". |
issues[].message | string | Yes | — |
needsReview | boolean | Yes | — |
playbookId | string (pb_… ID) | Yes | ID (pb_…) |
priceLines | array<string> | null | Yes | — |
version | integer | Yes | — |
versionStatus | enum | Yes | One of: "draft", "published", "archived", "discarded". |
vocabulary | object | Yes | — |
vocabulary.contact | string | Yes | 1–40 characters. Default: "contact". |
vocabulary.contactPlural | string | Yes | 1–40 characters. Default: "contacts". |
vocabulary.group | string | Yes | 1–40 characters. Default: "location". |
vocabulary.groupPlural | string | Yes | 1–40 characters. Default: "locations". |
vocabulary.meeting | string | Yes | 1–40 characters. Default: "meeting". |
vocabulary.meetingPlural | string | Yes | 1–40 characters. Default: "meetings". |
vocabulary.service | string | Yes | 1–40 characters. Default: "service". |
vocabulary.servicePlural | string | Yes | 1–40 characters. Default: "services". |
vocabulary.special | string | Yes | 1–40 characters. Default: "special". |
vocabulary.specialPlural | string | Yes | 1–40 characters. Default: "specials". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/effective-preview?playbookId=pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE" \
-H "Authorization: Bearer $ACCESS_TOKEN"The group's human backup plan and what is missing (live, or the draft's)#
GET /v1/account/groups/{groupId}/human-backup
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
source | enum | No | One of: "live", "draft". Default: "live". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
fromDraft | boolean | Yes | — |
humanBackup | object | Yes | — |
humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
humanBackup.missedCallFollowUp | boolean | No | — |
humanBackup.notetaker | boolean | No | — |
humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
humanBackup.notifySms | array<string> | Yes | Default: []. |
humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
humanBackup.staffedHours | array<object> | Yes | Default: []. |
humanBackup.staffedHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
humanBackup.staffedHours[].end | string | enum | Yes | — |
humanBackup.staffedHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
humanBackup.transferLine | string | No | Up to 300 characters. |
humanBackup.unavailableLine | string | No | Up to 300 characters. |
issues | array<object> | Yes | — |
issues[].message | string | Yes | — |
issues[].path | string | Yes | — |
profileVersion | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/human-backup" \
-H "Authorization: Bearer $ACCESS_TOKEN"Save the human backup plan into the group's draft (a complete plan is required; it goes live when the draft is published)#
PUT /v1/account/groups/{groupId}/human-backup
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
baseHash | string | null | No | Up to 128 characters. |
humanBackup | object | Yes | — |
humanBackup.answerTimeoutSeconds | integer | No | Between 5 and 120. Default: 25. |
humanBackup.callbackTargetMinutes | integer | No | Between 5 and 10080. Default: 60. |
humanBackup.missedCallFollowUp | boolean | No | — |
humanBackup.notetaker | boolean | No | — |
humanBackup.notifyEmails | array<string (email)> | No | Default: []. |
humanBackup.notifySms | array<string> | No | Default: []. |
humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
humanBackup.staffedHours | array<object> | No | Default: []. |
humanBackup.staffedHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
humanBackup.staffedHours[].end | string | enum | Yes | — |
humanBackup.staffedHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
humanBackup.transferLine | string | No | Up to 300 characters. |
humanBackup.unavailableLine | string | No | Up to 300 characters. |
note | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
draft | any | null | Yes | — |
profile | GroupProfileVersion | Yes | — |
profile.content | object | Yes | — |
profile.content.address | string | No | Up to 300 characters. |
profile.content.addressParts | object | No | — |
profile.content.addressParts.city | string | Yes | 1–80 characters. |
profile.content.addressParts.country | enum | Yes | One of: "US", "CA", "MX". Default: "US". |
profile.content.addressParts.line1 | string | Yes | 1–120 characters. |
profile.content.addressParts.line2 | string | No | Up to 120 characters. |
profile.content.addressParts.postalCode | string | Yes | 1–20 characters. |
profile.content.addressParts.region | string | Yes | 1–40 characters. |
profile.content.closures | array<object> | Yes | Up to 60 items. Default: []. |
profile.content.closures[].from | string (date) | Yes | — |
profile.content.closures[].hours | object | null | Yes | — |
profile.content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.closures[].name | string | Yes | 1–60 characters. |
profile.content.closures[].to | string (date) | Yes | — |
profile.content.crmLocationId | string | No | Up to 64 characters. |
profile.content.custom | map | Yes | Default: \{\}. |
profile.content.custom.{key} | string | No | Any key. Up to 1000 characters. |
profile.content.directions | object | Yes | Default: \{\}. |
profile.content.directions.accessibility | string | No | Up to 600 characters. |
profile.content.directions.entrance | string | No | Up to 600 characters. |
profile.content.directions.parking | string | No | Up to 600 characters. |
profile.content.displayName | string | No | Up to 160 characters. |
profile.content.geo | object | No | — |
profile.content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
profile.content.geo.at | string (date-time) | Yes | — |
profile.content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
profile.content.geo.lat | number | Yes | Between -90 and 90. |
profile.content.geo.lng | number | Yes | Between -180 and 180. |
profile.content.geo.source | enum | Yes | One of: "geocoder", "pin". |
profile.content.hours | string | No | Up to 300 characters. |
profile.content.humanBackup | object | Yes | — |
profile.content.humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
profile.content.humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
profile.content.humanBackup.missedCallFollowUp | boolean | No | — |
profile.content.humanBackup.notetaker | boolean | No | — |
profile.content.humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
profile.content.humanBackup.notifySms | array<string> | Yes | Default: []. |
profile.content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
profile.content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.staffedHours | array<object> | Yes | Default: []. |
profile.content.humanBackup.transferLine | string | No | Up to 300 characters. |
profile.content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
profile.content.meetingWindows | array<object> | Yes | Default: []. |
profile.content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
profile.content.meetingWindows[].end | string | constant | Yes | — |
profile.content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
profile.content.name | string | Yes | 1–120 characters. |
profile.content.nearbyGroupIds | array<string (grp_… ID)> | Yes | Up to 10 items. Default: []. |
profile.content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.preRingNotice | string | No | 1–300 characters. |
profile.content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
profile.content.replyToEmail | string (email) | No | — |
profile.content.repsBySpecialty | boolean | Yes | Default: false. |
profile.content.staff | array<object> | Yes | Default: []. |
profile.content.staff[].bio | string | No | Up to 800 characters. |
profile.content.staff[].crmUserId | string | No | Up to 64 characters. |
profile.content.staff[].email | string (email) | No | — |
profile.content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.staff[].isDefaultIntro | boolean | No | — |
profile.content.staff[].name | string | Yes | 1–120 characters. |
profile.content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
profile.content.staff[].role | string | Yes | 1–64 characters. |
profile.content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
profile.content.staff[].takesMeetings | constant | No | Always false. |
profile.content.staff[].title | string | No | Up to 120 characters. |
profile.content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
profile.content.staff[].video | object | No | — |
profile.content.surroundings | string | No | Up to 2000 characters. |
profile.content.talkingPoints | array<object> | Yes | Default: []. |
profile.content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.talkingPoints[].text | string | Yes | 1–1000 characters. |
profile.content.timeZone | string | Yes | — |
profile.createdAt | string (date-time) | Yes | — |
profile.createdBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
profile.fromDraft | boolean | Yes | — |
profile.groupId | string (grp_… ID) | Yes | ID (grp_…) |
profile.issues | array<object> | Yes | — |
profile.issues[].message | string | Yes | — |
profile.issues[].path | string | Yes | — |
profile.issues[].severity | enum | Yes | One of: "error", "warning". |
profile.note | string | null | Yes | — |
profile.placeholders | array<string> | Yes | — |
profile.version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/human-backup" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"humanBackup": {
"answerTimeoutSeconds": 25,
"callbackTargetMinutes": 60,
"missedCallFollowUp": true,
"notetaker": true,
"notifyEmails": [],
"notifySms": [],
"primaryNumber": "string",
"primaryRepUserId": "usr_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"ringGroupId": "rgp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"secondaryNumber": "string",
"secondaryRepUserId": "usr_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"staffedHours": [],
"transferLine": "string",
"unavailableLine": "string"
}
}'The group's current profile#
GET /v1/account/groups/{groupId}/profile
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 |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
content | object | Yes | — |
content.address | string | No | Up to 300 characters. |
content.addressParts | object | No | — |
content.addressParts.city | string | Yes | 1–80 characters. |
content.addressParts.country | enum | Yes | One of: "US", "CA", "MX". Default: "US". |
content.addressParts.line1 | string | Yes | 1–120 characters. |
content.addressParts.line2 | string | No | Up to 120 characters. |
content.addressParts.postalCode | string | Yes | 1–20 characters. |
content.addressParts.region | string | Yes | 1–40 characters. |
content.closures | array<object> | Yes | Up to 60 items. Default: []. |
content.closures[].from | string (date) | Yes | — |
content.closures[].hours | object | null | Yes | — |
content.closures[].hours.end | string | constant | Yes | — |
content.closures[].hours.start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.closures[].name | string | Yes | 1–60 characters. |
content.closures[].to | string (date) | Yes | — |
content.crmLocationId | string | No | Up to 64 characters. |
content.custom | map | Yes | Default: \{\}. |
content.custom.{key} | string | No | Any key. Up to 1000 characters. |
content.directions | object | Yes | Default: \{\}. |
content.directions.accessibility | string | No | Up to 600 characters. |
content.directions.entrance | string | No | Up to 600 characters. |
content.directions.parking | string | No | Up to 600 characters. |
content.displayName | string | No | Up to 160 characters. |
content.geo | object | No | — |
content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
content.geo.at | string (date-time) | Yes | — |
content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
content.geo.lat | number | Yes | Between -90 and 90. |
content.geo.lng | number | Yes | Between -180 and 180. |
content.geo.source | enum | Yes | One of: "geocoder", "pin". |
content.hours | string | No | Up to 300 characters. |
content.humanBackup | object | Yes | — |
content.humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
content.humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
content.humanBackup.missedCallFollowUp | boolean | No | — |
content.humanBackup.notetaker | boolean | No | — |
content.humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
content.humanBackup.notifySms | array<string> | Yes | Default: []. |
content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
content.humanBackup.staffedHours | array<object> | Yes | Default: []. |
content.humanBackup.staffedHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
content.humanBackup.staffedHours[].end | string | constant | Yes | — |
content.humanBackup.staffedHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
content.humanBackup.transferLine | string | No | Up to 300 characters. |
content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
content.meetingWindows | array<object> | Yes | Default: []. |
content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
content.meetingWindows[].end | string | constant | Yes | — |
content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
content.name | string | Yes | 1–120 characters. |
content.nearbyGroupIds | array<string (grp_… ID)> | Yes | Up to 10 items. Default: []. |
content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
content.preRingNotice | string | No | 1–300 characters. |
content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
content.replyToEmail | string (email) | No | — |
content.repsBySpecialty | boolean | Yes | Default: false. |
content.staff | array<object> | Yes | Default: []. |
content.staff[].bio | string | No | Up to 800 characters. |
content.staff[].crmUserId | string | No | Up to 64 characters. |
content.staff[].email | string (email) | No | — |
content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.staff[].isDefaultIntro | boolean | No | — |
content.staff[].name | string | Yes | 1–120 characters. |
content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.staff[].role | string | Yes | 1–64 characters. |
content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
content.staff[].takesMeetings | constant | No | Always false. |
content.staff[].title | string | No | Up to 120 characters. |
content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
content.staff[].video | object | No | — |
content.staff[].video.captionsUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.staff[].video.kind | enum | Yes | One of: "upload", "youtube", "vimeo", "loom". |
content.staff[].video.url | string (uri) | string (uri) | Yes | A https:// link to an uploaded file |
content.surroundings | string | No | Up to 2000 characters. |
content.talkingPoints | array<object> | Yes | Default: []. |
content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.talkingPoints[].text | string | Yes | 1–1000 characters. |
content.timeZone | string | Yes | — |
createdAt | string (date-time) | Yes | — |
createdBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
fromDraft | boolean | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
issues | array<object> | Yes | — |
issues[].message | string | Yes | — |
issues[].path | string | Yes | — |
issues[].severity | enum | Yes | One of: "error", "warning". |
note | string | null | Yes | — |
placeholders | array<string> | 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/groups/{groupId}/profile" \
-H "Authorization: Bearer $ACCESS_TOKEN"Save the profile into the group's draft (callers hear it after POST /groups/{groupId}/draft/publish). Holidays and closures in the body are ignored: they go live through PUT /groups/{groupId}/closures#
PUT /v1/account/groups/{groupId}/profile
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 |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
baseHash | string | null | No | Up to 128 characters. |
content | object | Yes | — |
content.address | string | No | Up to 300 characters. |
content.addressParts | object | No | — |
content.addressParts.city | string | Yes | 1–80 characters. |
content.addressParts.country | enum | No | One of: "US", "CA", "MX". Default: "US". |
content.addressParts.line1 | string | Yes | 1–120 characters. |
content.addressParts.line2 | string | No | Up to 120 characters. |
content.addressParts.postalCode | string | Yes | 1–20 characters. |
content.addressParts.region | string | Yes | 1–40 characters. |
content.closures | array<object> | No | Up to 60 items. Default: []. |
content.closures[].from | string (date) | Yes | — |
content.closures[].hours | object | null | No | — |
content.closures[].hours.end | string | enum | Yes | — |
content.closures[].hours.start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.closures[].name | string | Yes | 1–60 characters. |
content.closures[].to | string (date) | Yes | — |
content.crmLocationId | string | No | Up to 64 characters. |
content.custom | map | No | Default: \{\}. |
content.custom.{key} | string | No | Any key. Up to 1000 characters. |
content.directions | object | No | Default: \{\}. |
content.directions.accessibility | string | No | Up to 600 characters. |
content.directions.entrance | string | No | Up to 600 characters. |
content.directions.parking | string | No | Up to 600 characters. |
content.displayName | string | No | Up to 160 characters. |
content.geo | object | No | — |
content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
content.geo.at | string (date-time) | Yes | — |
content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
content.geo.lat | number | Yes | Between -90 and 90. |
content.geo.lng | number | Yes | Between -180 and 180. |
content.geo.source | enum | Yes | One of: "geocoder", "pin". |
content.hours | string | No | Up to 300 characters. |
content.humanBackup | object | Yes | — |
content.humanBackup.answerTimeoutSeconds | integer | No | Between 5 and 120. Default: 25. |
content.humanBackup.callbackTargetMinutes | integer | No | Between 5 and 10080. Default: 60. |
content.humanBackup.missedCallFollowUp | boolean | No | — |
content.humanBackup.notetaker | boolean | No | — |
content.humanBackup.notifyEmails | array<string (email)> | No | Default: []. |
content.humanBackup.notifySms | array<string> | No | Default: []. |
content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
content.humanBackup.staffedHours | array<object> | No | Default: []. |
content.humanBackup.staffedHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
content.humanBackup.staffedHours[].end | string | enum | Yes | — |
content.humanBackup.staffedHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
content.humanBackup.transferLine | string | No | Up to 300 characters. |
content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
content.meetingWindows | array<object> | No | Default: []. |
content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
content.meetingWindows[].end | string | enum | Yes | — |
content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
content.name | string | Yes | 1–120 characters. |
content.nearbyGroupIds | array<string (grp_… ID)> | No | Up to 10 items. Default: []. |
content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
content.preRingNotice | string | No | 1–300 characters. |
content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
content.replyToEmail | string (email) | No | — |
content.repsBySpecialty | boolean | No | Default: false. |
content.staff | array<object> | No | Default: []. |
content.staff[].bio | string | No | Up to 800 characters. |
content.staff[].crmUserId | string | No | Up to 64 characters. |
content.staff[].email | string (email) | No | — |
content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.staff[].isDefaultIntro | boolean | No | — |
content.staff[].name | string | Yes | 1–120 characters. |
content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.staff[].role | string | Yes | 1–64 characters. |
content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
content.staff[].takesMeetings | enum | No | One of: false. |
content.staff[].title | string | No | Up to 120 characters. |
content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
content.staff[].video | object | No | — |
content.staff[].video.captionsUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
content.staff[].video.kind | enum | Yes | One of: "upload", "youtube", "vimeo", "loom". |
content.staff[].video.url | string (uri) | string (uri) | Yes | A https:// link to an uploaded file |
content.surroundings | string | No | Up to 2000 characters. |
content.talkingPoints | array<object> | No | Default: []. |
content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
content.talkingPoints[].text | string | Yes | 1–1000 characters. |
content.timeZone | string | Yes | — |
expectedVersion | integer | No | Minimum 1. |
note | string | No | Up to 500 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
draft | any | null | Yes | — |
profile | GroupProfileVersion | Yes | — |
profile.content | object | Yes | — |
profile.content.address | string | No | Up to 300 characters. |
profile.content.addressParts | object | No | — |
profile.content.addressParts.city | string | Yes | 1–80 characters. |
profile.content.addressParts.country | enum | Yes | One of: "US", "CA", "MX". Default: "US". |
profile.content.addressParts.line1 | string | Yes | 1–120 characters. |
profile.content.addressParts.line2 | string | No | Up to 120 characters. |
profile.content.addressParts.postalCode | string | Yes | 1–20 characters. |
profile.content.addressParts.region | string | Yes | 1–40 characters. |
profile.content.closures | array<object> | Yes | Up to 60 items. Default: []. |
profile.content.closures[].from | string (date) | Yes | — |
profile.content.closures[].hours | object | null | Yes | — |
profile.content.closures[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.closures[].name | string | Yes | 1–60 characters. |
profile.content.closures[].to | string (date) | Yes | — |
profile.content.crmLocationId | string | No | Up to 64 characters. |
profile.content.custom | map | Yes | Default: \{\}. |
profile.content.custom.{key} | string | No | Any key. Up to 1000 characters. |
profile.content.directions | object | Yes | Default: \{\}. |
profile.content.directions.accessibility | string | No | Up to 600 characters. |
profile.content.directions.entrance | string | No | Up to 600 characters. |
profile.content.directions.parking | string | No | Up to 600 characters. |
profile.content.displayName | string | No | Up to 160 characters. |
profile.content.geo | object | No | — |
profile.content.geo.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
profile.content.geo.at | string (date-time) | Yes | — |
profile.content.geo.from | string | Yes | Pattern: ^[0-9a-f]\{16\}$. |
profile.content.geo.lat | number | Yes | Between -90 and 90. |
profile.content.geo.lng | number | Yes | Between -180 and 180. |
profile.content.geo.source | enum | Yes | One of: "geocoder", "pin". |
profile.content.hours | string | No | Up to 300 characters. |
profile.content.humanBackup | object | Yes | — |
profile.content.humanBackup.answerTimeoutSeconds | integer | Yes | Between 5 and 120. Default: 25. |
profile.content.humanBackup.callbackTargetMinutes | integer | Yes | Between 5 and 10080. Default: 60. |
profile.content.humanBackup.missedCallFollowUp | boolean | No | — |
profile.content.humanBackup.notetaker | boolean | No | — |
profile.content.humanBackup.notifyEmails | array<string (email)> | Yes | Default: []. |
profile.content.humanBackup.notifySms | array<string> | Yes | Default: []. |
profile.content.humanBackup.primaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.primaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.ringGroupId | string (rgp_… ID) | No | ID (rgp_…) |
profile.content.humanBackup.secondaryNumber | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.humanBackup.secondaryRepUserId | string (usr_… ID) | No | ID (usr_…) |
profile.content.humanBackup.staffedHours | array<object> | Yes | Default: []. |
profile.content.humanBackup.transferLine | string | No | Up to 300 characters. |
profile.content.humanBackup.unavailableLine | string | No | Up to 300 characters. |
profile.content.meetingWindows | array<object> | Yes | Default: []. |
profile.content.meetingWindows[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
profile.content.meetingWindows[].end | string | constant | Yes | — |
profile.content.meetingWindows[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
profile.content.name | string | Yes | 1–120 characters. |
profile.content.nearbyGroupIds | array<string (grp_… ID)> | Yes | Up to 10 items. Default: []. |
profile.content.phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
profile.content.preRingNotice | string | No | 1–300 characters. |
profile.content.pricePoints | array<any> | No | Retired (ADR 0129). Ignored; prices are in the price book. |
profile.content.replyToEmail | string (email) | No | — |
profile.content.repsBySpecialty | boolean | Yes | Default: false. |
profile.content.staff | array<object> | Yes | Default: []. |
profile.content.staff[].bio | string | No | Up to 800 characters. |
profile.content.staff[].crmUserId | string | No | Up to 64 characters. |
profile.content.staff[].email | string (email) | No | — |
profile.content.staff[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.staff[].isDefaultIntro | boolean | No | — |
profile.content.staff[].name | string | Yes | 1–120 characters. |
profile.content.staff[].photoUrl | string (uri) | string (uri) | No | A https:// link to an uploaded file |
profile.content.staff[].role | string | Yes | 1–64 characters. |
profile.content.staff[].services | array<string (srv_… ID)> | No | Up to 50 items. |
profile.content.staff[].takesMeetings | constant | No | Always false. |
profile.content.staff[].title | string | No | Up to 120 characters. |
profile.content.staff[].userId | string (usr_… ID) | No | ID (usr_…) |
profile.content.staff[].video | object | No | — |
profile.content.surroundings | string | No | Up to 2000 characters. |
profile.content.talkingPoints | array<object> | Yes | Default: []. |
profile.content.talkingPoints[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
profile.content.talkingPoints[].text | string | Yes | 1–1000 characters. |
profile.content.timeZone | string | Yes | — |
profile.createdAt | string (date-time) | Yes | — |
profile.createdBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
profile.fromDraft | boolean | Yes | — |
profile.groupId | string (grp_… ID) | Yes | ID (grp_…) |
profile.issues | array<object> | Yes | — |
profile.issues[].message | string | Yes | — |
profile.issues[].path | string | Yes | — |
profile.issues[].severity | enum | Yes | One of: "error", "warning". |
profile.note | string | null | Yes | — |
profile.placeholders | array<string> | Yes | — |
profile.version | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/profile" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"content": {
"name": "string",
"timeZone": "string",
"humanBackup": {
"answerTimeoutSeconds": 25,
"callbackTargetMinutes": 60,
"missedCallFollowUp": true,
"notetaker": true,
"notifyEmails": [],
"notifySms": [],
"primaryNumber": "string",
"primaryRepUserId": "usr_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"ringGroupId": "rgp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"secondaryNumber": "string",
"secondaryRepUserId": "usr_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
"staffedHours": [],
"transferLine": "string",
"unavailableLine": "string"
}
}
}'Where the map would put an address, before the profile is saved (location distance spec, "Placing the pin"). Nothing is stored#
POST /v1/account/groups/{groupId}/profile/geocode-preview
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 |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
address | string | No | Up to 300 characters. |
addressParts | object | No | — |
addressParts.city | string | Yes | 1–80 characters. |
addressParts.country | enum | No | One of: "US", "CA", "MX". Default: "US". |
addressParts.line1 | string | Yes | 1–120 characters. |
addressParts.line2 | string | No | Up to 120 characters. |
addressParts.postalCode | string | Yes | 1–20 characters. |
addressParts.region | string | Yes | 1–40 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
from | string | null | Yes | — |
result | object | null | Yes | — |
result.accuracy | enum | Yes | One of: "rooftop", "street", "postal", "city". |
result.lat | number | Yes | — |
result.lng | number | Yes | — |
status | enum | Yes | One of: "found", "not_found", "unavailable", "no_address". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/profile/geocode-preview" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address": "string",
"addressParts": {
"line1": "string",
"city": "string",
"region": "string",
"postalCode": "string"
}
}'