API reference

Groups

Groups, profiles, customizations and human backup

MethodPathSummary
GET/v1/account/groupsGroups 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/groupsCreate a group with its first profile (and a matching sandbox CRM community)
POST/v1/account/groups/bulk-customizationApply one customization to several groups' drafts (each group publishes its own, ADR 0131)
GET/v1/account/groups/overviewGroups 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}/archiveArchive or restore a group (refused while it has active numbers)
PUT/v1/account/groups/{groupId}/closuresSave 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}/copyCopy one group's setup (profile, customizations, default playbook) to a new group
GET/v1/account/groups/{groupId}/customizationsThe 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}/customizationsSave 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}/draftThe group's unpublished changes, what differs from live, and what publishing would do (null when there are none)
DELETE/v1/account/groups/{groupId}/draftDiscard the group's unpublished changes
POST/v1/account/groups/{groupId}/draft/publishMake 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-previewWhat calls to this group would run: account version + customizations + profile
GET/v1/account/groups/{groupId}/human-backupThe group's human backup plan and what is missing (live, or the draft's)
PUT/v1/account/groups/{groupId}/human-backupSave 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}/profileThe group's current profile
PUT/v1/account/groups/{groupId}/profileSave 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-previewWhere 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

NameTypeRequiredDescription
includeArchivedenumNoOne of: "true", "false".

Response 200

FieldTypeRequiredDescription
groupsarray<GroupListItem>Yes—
groups[].backupCompletebooleanYes—
groups[].backupIssuesarray<object>Yes—
groups[].backupIssues[].messagestringYes—
groups[].backupIssues[].pathstringYes—
groups[].createdAtstring (date-time)Yes—
groups[].defaultPlaybookIdstring (pb_… ID) | nullYes—
groups[].idstring (grp_… ID)YesID (grp_…)
groups[].isSamplebooleanYes—
groups[].namestringYes—
groups[].needsReviewbooleanYes—
groups[].numberCountintegerYes—
groups[].positionobject | nullYes—
groups[].position.latnumberYes—
groups[].position.lngnumberYes—
groups[].reviewReasonstring | nullYes—
groups[].runningVersioninteger | nullYes—
groups[].statusenumYesOne of: "active", "archived".
groups[].timeZonestringYes—
groups[].typeLabelstring | nullYes—
groups[].updatedAtstring (date-time)Yes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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.

FieldTypeRequiredDescription
defaultPlaybookIdstring (pb_… ID)NoID (pb_…)
namestringYes1–120 characters.
profilemapNo—
profile.{key}anyNoAny key.
timeZonestringYes1–64 characters.
typeLabelstringNoUp to 40 characters.

Response 201

FieldTypeRequiredDescription
groupGroupYes—
group.createdAtstring (date-time)Yes—
group.defaultPlaybookIdstring (pb_… ID) | nullYes—
group.idstring (grp_… ID)YesID (grp_…)
group.isSamplebooleanYes—
group.namestringYes—
group.needsReviewbooleanYes—
group.reviewReasonstring | nullYes—
group.statusenumYesOne of: "active", "archived".
group.timeZonestringYes—
group.typeLabelstring | nullYes—
group.updatedAtstring (date-time)Yes—
profileGroupProfileVersionYes—
profile.contentobjectYes—
profile.content.addressstringNoUp to 300 characters.
profile.content.addressPartsobjectNo—
profile.content.addressParts.citystringYes1–80 characters.
profile.content.addressParts.countryenumYesOne of: "US", "CA", "MX". Default: "US".
profile.content.addressParts.line1stringYes1–120 characters.
profile.content.addressParts.line2stringNoUp to 120 characters.
profile.content.addressParts.postalCodestringYes1–20 characters.
profile.content.addressParts.regionstringYes1–40 characters.
profile.content.closuresarray<object>YesUp to 60 items. Default: [].
profile.content.closures[].fromstring (date)Yes—
profile.content.closures[].hoursobject | nullYes—
profile.content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.closures[].namestringYes1–60 characters.
profile.content.closures[].tostring (date)Yes—
profile.content.crmLocationIdstringNoUp to 64 characters.
profile.content.custommapYesDefault: \{\}.
profile.content.custom.{key}stringNoAny key. Up to 1000 characters.
profile.content.directionsobjectYesDefault: \{\}.
profile.content.directions.accessibilitystringNoUp to 600 characters.
profile.content.directions.entrancestringNoUp to 600 characters.
profile.content.directions.parkingstringNoUp to 600 characters.
profile.content.displayNamestringNoUp to 160 characters.
profile.content.geoobjectNo—
profile.content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
profile.content.geo.atstring (date-time)Yes—
profile.content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
profile.content.geo.latnumberYesBetween -90 and 90.
profile.content.geo.lngnumberYesBetween -180 and 180.
profile.content.geo.sourceenumYesOne of: "geocoder", "pin".
profile.content.hoursstringNoUp to 300 characters.
profile.content.humanBackupobjectYes—
profile.content.humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
profile.content.humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
profile.content.humanBackup.missedCallFollowUpbooleanNo—
profile.content.humanBackup.notetakerbooleanNo—
profile.content.humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
profile.content.humanBackup.notifySmsarray<string>YesDefault: [].
profile.content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
profile.content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.staffedHoursarray<object>YesDefault: [].
profile.content.humanBackup.transferLinestringNoUp to 300 characters.
profile.content.humanBackup.unavailableLinestringNoUp to 300 characters.
profile.content.meetingWindowsarray<object>YesDefault: [].
profile.content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
profile.content.meetingWindows[].endstring | constantYes—
profile.content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
profile.content.namestringYes1–120 characters.
profile.content.nearbyGroupIdsarray<string (grp_… ID)>YesUp to 10 items. Default: [].
profile.content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.preRingNoticestringNo1–300 characters.
profile.content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
profile.content.replyToEmailstring (email)No—
profile.content.repsBySpecialtybooleanYesDefault: false.
profile.content.staffarray<object>YesDefault: [].
profile.content.staff[].biostringNoUp to 800 characters.
profile.content.staff[].crmUserIdstringNoUp to 64 characters.
profile.content.staff[].emailstring (email)No—
profile.content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.staff[].isDefaultIntrobooleanNo—
profile.content.staff[].namestringYes1–120 characters.
profile.content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
profile.content.staff[].rolestringYes1–64 characters.
profile.content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
profile.content.staff[].takesMeetingsconstantNoAlways false.
profile.content.staff[].titlestringNoUp to 120 characters.
profile.content.staff[].userIdstring (usr_… ID)NoID (usr_…)
profile.content.staff[].videoobjectNo—
profile.content.surroundingsstringNoUp to 2000 characters.
profile.content.talkingPointsarray<object>YesDefault: [].
profile.content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.talkingPoints[].textstringYes1–1000 characters.
profile.content.timeZonestringYes—
profile.createdAtstring (date-time)Yes—
profile.createdBystring (usr_… ID) | string (svc_… ID) | nullYes—
profile.fromDraftbooleanYes—
profile.groupIdstring (grp_… ID)YesID (grp_…)
profile.issuesarray<object>Yes—
profile.issues[].messagestringYes—
profile.issues[].pathstringYes—
profile.issues[].severityenumYesOne of: "error", "warning".
profile.notestring | nullYes—
profile.placeholdersarray<string>Yes—
profile.versionintegerYes—
sandboxobjectYes—
sandbox.communityIdintegerNo—
sandbox.linkedbooleanYes—
sandbox.messagestringNo—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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.

FieldTypeRequiredDescription
customizationanyYes—
groupIdsarray<string (grp_… ID)>YesUp to 200 items.
notestringNoUp to 500 characters.
playbookIdstring (pb_… ID)YesID (pb_…)

Response 200

FieldTypeRequiredDescription
resultsarray<object>Yes—
results[].appliedbooleanYes—
results[].groupIdstring (grp_… ID)YesID (grp_…)
results[].messagestringNo—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
playbookIdstring (pb_… ID)NoID (pb_…)

Response 200

FieldTypeRequiredDescription
blocksarray<string>Yes—
latestVersioninteger | nullYes—
playbookIdstring (pb_… ID) | nullYes—
rowsarray<object>Yes—
rows[].behindLatestbooleanYes—
rows[].cellsarray<object>Yes—
rows[].cells[].blockstringYes—
rows[].cells[].countintegerYes—
rows[].cells[].customizationIdsarray<string>Yes—
rows[].cells[].customizedbooleanYes—
rows[].cells[].kindsarray<enum>YesItems: "change", "off", "add".
rows[].customizationCountintegerYes—
rows[].groupIdstring (grp_… ID)YesID (grp_…)
rows[].namestringYes—
rows[].needsReviewbooleanYes—
rows[].reviewReasonstring | nullYes—
rows[].runningVersioninteger | nullYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Response 200

FieldTypeRequiredDescription
groupGroupYes—
group.createdAtstring (date-time)Yes—
group.defaultPlaybookIdstring (pb_… ID) | nullYes—
group.idstring (grp_… ID)YesID (grp_…)
group.isSamplebooleanYes—
group.namestringYes—
group.needsReviewbooleanYes—
group.reviewReasonstring | nullYes—
group.statusenumYesOne of: "active", "archived".
group.timeZonestringYes—
group.typeLabelstring | nullYes—
group.updatedAtstring (date-time)Yes—
profileany | nullYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
defaultPlaybookIdstring (pb_… ID) | nullNo—
namestringNo1–120 characters.
typeLabelstring | nullNoUp to 40 characters.

Response 200

FieldTypeRequiredDescription
effectivearray<object>Yes—
effective[].issuesarray<string>Yes—
effective[].outcomeenumYesOne of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile".
effective[].playbookIdstring (pb_… ID)NoID (pb_…)
effective[].versionIdstring (pbv_… ID)YesID (pbv_…)
groupGroupYes—
group.createdAtstring (date-time)Yes—
group.defaultPlaybookIdstring (pb_… ID) | nullYes—
group.idstring (grp_… ID)YesID (grp_…)
group.isSamplebooleanYes—
group.namestringYes—
group.needsReviewbooleanYes—
group.reviewReasonstring | nullYes—
group.statusenumYesOne of: "active", "archived".
group.timeZonestringYes—
group.typeLabelstring | nullYes—
group.updatedAtstring (date-time)Yes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
archivedbooleanYes—

Response 200

FieldTypeRequiredDescription
createdAtstring (date-time)Yes—
defaultPlaybookIdstring (pb_… ID) | nullYes—
idstring (grp_… ID)YesID (grp_…)
isSamplebooleanYes—
namestringYes—
needsReviewbooleanYes—
reviewReasonstring | nullYes—
statusenumYesOne of: "active", "archived".
timeZonestringYes—
typeLabelstring | nullYes—
updatedAtstring (date-time)Yes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
closuresarray<object>NoUp to 60 items. Default: [].
closures[].fromstring (date)Yes—
closures[].hoursobject | nullNo—
closures[].hours.endstring | enumYes—
closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
closures[].namestringYes1–60 characters.
closures[].tostring (date)Yes—
notestringNoUp to 500 characters.

Response 200

FieldTypeRequiredDescription
effectivearray<object>Yes—
effective[].issuesarray<string>Yes—
effective[].outcomeenumYesOne of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile".
effective[].playbookIdstring (pb_… ID)NoID (pb_…)
effective[].versionIdstring (pbv_… ID)YesID (pbv_…)
profileGroupProfileVersionYes—
profile.contentobjectYes—
profile.content.addressstringNoUp to 300 characters.
profile.content.addressPartsobjectNo—
profile.content.addressParts.citystringYes1–80 characters.
profile.content.addressParts.countryenumYesOne of: "US", "CA", "MX". Default: "US".
profile.content.addressParts.line1stringYes1–120 characters.
profile.content.addressParts.line2stringNoUp to 120 characters.
profile.content.addressParts.postalCodestringYes1–20 characters.
profile.content.addressParts.regionstringYes1–40 characters.
profile.content.closuresarray<object>YesUp to 60 items. Default: [].
profile.content.closures[].fromstring (date)Yes—
profile.content.closures[].hoursobject | nullYes—
profile.content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.closures[].namestringYes1–60 characters.
profile.content.closures[].tostring (date)Yes—
profile.content.crmLocationIdstringNoUp to 64 characters.
profile.content.custommapYesDefault: \{\}.
profile.content.custom.{key}stringNoAny key. Up to 1000 characters.
profile.content.directionsobjectYesDefault: \{\}.
profile.content.directions.accessibilitystringNoUp to 600 characters.
profile.content.directions.entrancestringNoUp to 600 characters.
profile.content.directions.parkingstringNoUp to 600 characters.
profile.content.displayNamestringNoUp to 160 characters.
profile.content.geoobjectNo—
profile.content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
profile.content.geo.atstring (date-time)Yes—
profile.content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
profile.content.geo.latnumberYesBetween -90 and 90.
profile.content.geo.lngnumberYesBetween -180 and 180.
profile.content.geo.sourceenumYesOne of: "geocoder", "pin".
profile.content.hoursstringNoUp to 300 characters.
profile.content.humanBackupobjectYes—
profile.content.humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
profile.content.humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
profile.content.humanBackup.missedCallFollowUpbooleanNo—
profile.content.humanBackup.notetakerbooleanNo—
profile.content.humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
profile.content.humanBackup.notifySmsarray<string>YesDefault: [].
profile.content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
profile.content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.staffedHoursarray<object>YesDefault: [].
profile.content.humanBackup.transferLinestringNoUp to 300 characters.
profile.content.humanBackup.unavailableLinestringNoUp to 300 characters.
profile.content.meetingWindowsarray<object>YesDefault: [].
profile.content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
profile.content.meetingWindows[].endstring | constantYes—
profile.content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
profile.content.namestringYes1–120 characters.
profile.content.nearbyGroupIdsarray<string (grp_… ID)>YesUp to 10 items. Default: [].
profile.content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.preRingNoticestringNo1–300 characters.
profile.content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
profile.content.replyToEmailstring (email)No—
profile.content.repsBySpecialtybooleanYesDefault: false.
profile.content.staffarray<object>YesDefault: [].
profile.content.staff[].biostringNoUp to 800 characters.
profile.content.staff[].crmUserIdstringNoUp to 64 characters.
profile.content.staff[].emailstring (email)No—
profile.content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.staff[].isDefaultIntrobooleanNo—
profile.content.staff[].namestringYes1–120 characters.
profile.content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
profile.content.staff[].rolestringYes1–64 characters.
profile.content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
profile.content.staff[].takesMeetingsconstantNoAlways false.
profile.content.staff[].titlestringNoUp to 120 characters.
profile.content.staff[].userIdstring (usr_… ID)NoID (usr_…)
profile.content.staff[].videoobjectNo—
profile.content.surroundingsstringNoUp to 2000 characters.
profile.content.talkingPointsarray<object>YesDefault: [].
profile.content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.talkingPoints[].textstringYes1–1000 characters.
profile.content.timeZonestringYes—
profile.createdAtstring (date-time)Yes—
profile.createdBystring (usr_… ID) | string (svc_… ID) | nullYes—
profile.fromDraftbooleanYes—
profile.groupIdstring (grp_… ID)YesID (grp_…)
profile.issuesarray<object>Yes—
profile.issues[].messagestringYes—
profile.issues[].pathstringYes—
profile.issues[].severityenumYesOne of: "error", "warning".
profile.notestring | nullYes—
profile.placeholdersarray<string>Yes—
profile.versionintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
namestringYes1–120 characters.

Response 201

FieldTypeRequiredDescription
customizationsCopiedintegerYes—
groupGroupYes—
group.createdAtstring (date-time)Yes—
group.defaultPlaybookIdstring (pb_… ID) | nullYes—
group.idstring (grp_… ID)YesID (grp_…)
group.isSamplebooleanYes—
group.namestringYes—
group.needsReviewbooleanYes—
group.reviewReasonstring | nullYes—
group.statusenumYesOne of: "active", "archived".
group.timeZonestringYes—
group.typeLabelstring | nullYes—
group.updatedAtstring (date-time)Yes—
profileGroupProfileVersionYes—
profile.contentobjectYes—
profile.content.addressstringNoUp to 300 characters.
profile.content.addressPartsobjectNo—
profile.content.addressParts.citystringYes1–80 characters.
profile.content.addressParts.countryenumYesOne of: "US", "CA", "MX". Default: "US".
profile.content.addressParts.line1stringYes1–120 characters.
profile.content.addressParts.line2stringNoUp to 120 characters.
profile.content.addressParts.postalCodestringYes1–20 characters.
profile.content.addressParts.regionstringYes1–40 characters.
profile.content.closuresarray<object>YesUp to 60 items. Default: [].
profile.content.closures[].fromstring (date)Yes—
profile.content.closures[].hoursobject | nullYes—
profile.content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.closures[].namestringYes1–60 characters.
profile.content.closures[].tostring (date)Yes—
profile.content.crmLocationIdstringNoUp to 64 characters.
profile.content.custommapYesDefault: \{\}.
profile.content.custom.{key}stringNoAny key. Up to 1000 characters.
profile.content.directionsobjectYesDefault: \{\}.
profile.content.directions.accessibilitystringNoUp to 600 characters.
profile.content.directions.entrancestringNoUp to 600 characters.
profile.content.directions.parkingstringNoUp to 600 characters.
profile.content.displayNamestringNoUp to 160 characters.
profile.content.geoobjectNo—
profile.content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
profile.content.geo.atstring (date-time)Yes—
profile.content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
profile.content.geo.latnumberYesBetween -90 and 90.
profile.content.geo.lngnumberYesBetween -180 and 180.
profile.content.geo.sourceenumYesOne of: "geocoder", "pin".
profile.content.hoursstringNoUp to 300 characters.
profile.content.humanBackupobjectYes—
profile.content.humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
profile.content.humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
profile.content.humanBackup.missedCallFollowUpbooleanNo—
profile.content.humanBackup.notetakerbooleanNo—
profile.content.humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
profile.content.humanBackup.notifySmsarray<string>YesDefault: [].
profile.content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
profile.content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.staffedHoursarray<object>YesDefault: [].
profile.content.humanBackup.transferLinestringNoUp to 300 characters.
profile.content.humanBackup.unavailableLinestringNoUp to 300 characters.
profile.content.meetingWindowsarray<object>YesDefault: [].
profile.content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
profile.content.meetingWindows[].endstring | constantYes—
profile.content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
profile.content.namestringYes1–120 characters.
profile.content.nearbyGroupIdsarray<string (grp_… ID)>YesUp to 10 items. Default: [].
profile.content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.preRingNoticestringNo1–300 characters.
profile.content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
profile.content.replyToEmailstring (email)No—
profile.content.repsBySpecialtybooleanYesDefault: false.
profile.content.staffarray<object>YesDefault: [].
profile.content.staff[].biostringNoUp to 800 characters.
profile.content.staff[].crmUserIdstringNoUp to 64 characters.
profile.content.staff[].emailstring (email)No—
profile.content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.staff[].isDefaultIntrobooleanNo—
profile.content.staff[].namestringYes1–120 characters.
profile.content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
profile.content.staff[].rolestringYes1–64 characters.
profile.content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
profile.content.staff[].takesMeetingsconstantNoAlways false.
profile.content.staff[].titlestringNoUp to 120 characters.
profile.content.staff[].userIdstring (usr_… ID)NoID (usr_…)
profile.content.staff[].videoobjectNo—
profile.content.surroundingsstringNoUp to 2000 characters.
profile.content.talkingPointsarray<object>YesDefault: [].
profile.content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.talkingPoints[].textstringYes1–1000 characters.
profile.content.timeZonestringYes—
profile.createdAtstring (date-time)Yes—
profile.createdBystring (usr_… ID) | string (svc_… ID) | nullYes—
profile.fromDraftbooleanYes—
profile.groupIdstring (grp_… ID)YesID (grp_…)
profile.issuesarray<object>Yes—
profile.issues[].messagestringYes—
profile.issues[].pathstringYes—
profile.issues[].severityenumYesOne of: "error", "warning".
profile.notestring | nullYes—
profile.placeholdersarray<string>Yes—
profile.versionintegerYes—
sandboxobjectYes—
sandbox.communityIdintegerNo—
sandbox.linkedbooleanYes—
sandbox.messagestringNo—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Query parameters

NameTypeRequiredDescription
playbookIdstring (pb_… ID)YesID (pb_…)
sourceenumNoOne of: "live", "draft". Default: "live".

Response 200

FieldTypeRequiredDescription
contentobjectYes—
content.itemsarray<object | object | object>YesDefault: [].
content.items[].baseHashstringNo(variant 1) Exactly 64 characters.
content.items[].idstringYes(variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].kindconstantYes(variant 1) Always "change".
content.items[].notestringNo(variant 1) Up to 500 characters.
content.items[].targetobject | objectYes(variant 1)
content.items[].target.collectionenumYes(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.itemIdstringYes(variant 1) (variant 1) 1–64 characters.
content.items[].target.parentIdstringNo(variant 1) (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].target.scalarenumYes(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[].valueanyYes(variant 1)
content.items[].baseHashstringNo(variant 2) Exactly 64 characters.
content.items[].idstringYes(variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].kindconstantYes(variant 2) Always "off".
content.items[].notestringNo(variant 2) Up to 500 characters.
content.items[].targetobjectYes(variant 2)
content.items[].target.collectionenumYes(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.itemIdstringYes(variant 2) 1–64 characters.
content.items[].target.parentIdstringNo(variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].baseHashstringNo(variant 3) Exactly 64 characters.
content.items[].idstringYes(variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].kindconstantYes(variant 3) Always "add".
content.items[].notestringNo(variant 3) Up to 500 characters.
content.items[].positionobjectNo(variant 3)
content.items[].position.afterstringNo(variant 3)
content.items[].position.beforestringNo(variant 3)
content.items[].targetobjectYes(variant 3)
content.items[].target.collectionenumYes(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.parentIdstringNo(variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].valueanyYes(variant 3)
createdAtstring (date-time) | nullYes—
fromDraftbooleanYes—
groupIdstring (grp_… ID)YesID (grp_…)
issuesarray<object>Yes—
issues[].customizationIdstringNo—
issues[].kindenumYesOne of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing".
issues[].messagestringYes—
locksarray<string>Yes—
needsReviewbooleanYes—
notestring | nullYes—
playbookIdstring (pb_… ID)YesID (pb_…)
versioninteger | nullYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
baseHashstring | nullNoUp to 128 characters.
contentobjectYes—
content.itemsarray<object | object | object>NoDefault: [].
content.items[].baseHashstringNo(variant 1) Exactly 64 characters.
content.items[].idstringYes(variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].kindenumYes(variant 1) One of: "change".
content.items[].notestringNo(variant 1) Up to 500 characters.
content.items[].targetobject | objectYes(variant 1)
content.items[].target.collectionenumYes(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.itemIdstringYes(variant 1) (variant 1) 1–64 characters.
content.items[].target.parentIdstringNo(variant 1) (variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].target.scalarenumYes(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[].valueanyYes(variant 1)
content.items[].baseHashstringNo(variant 2) Exactly 64 characters.
content.items[].idstringYes(variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].kindenumYes(variant 2) One of: "off".
content.items[].notestringNo(variant 2) Up to 500 characters.
content.items[].targetobjectYes(variant 2)
content.items[].target.collectionenumYes(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.itemIdstringYes(variant 2) 1–64 characters.
content.items[].target.parentIdstringNo(variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].baseHashstringNo(variant 3) Exactly 64 characters.
content.items[].idstringYes(variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].kindenumYes(variant 3) One of: "add".
content.items[].notestringNo(variant 3) Up to 500 characters.
content.items[].positionobjectNo(variant 3)
content.items[].position.afterstringNo(variant 3)
content.items[].position.beforestringNo(variant 3)
content.items[].targetobjectYes(variant 3)
content.items[].target.collectionenumYes(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.parentIdstringNo(variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.items[].valueanyYes(variant 3)
notestringNoUp to 500 characters.
playbookIdstring (pb_… ID)YesID (pb_…)

Response 200

FieldTypeRequiredDescription
customizationsGroupCustomizationsVersionYes—
customizations.contentobjectYes—
customizations.content.itemsarray<object | object | object>YesDefault: [].
customizations.content.items[].baseHashstringNo(variant 1) Exactly 64 characters.
customizations.content.items[].idstringYes(variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
customizations.content.items[].kindconstantYes(variant 1) Always "change".
customizations.content.items[].notestringNo(variant 1) Up to 500 characters.
customizations.content.items[].targetobject | objectYes(variant 1)
customizations.content.items[].valueanyYes(variant 1)
customizations.content.items[].baseHashstringNo(variant 2) Exactly 64 characters.
customizations.content.items[].idstringYes(variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
customizations.content.items[].kindconstantYes(variant 2) Always "off".
customizations.content.items[].notestringNo(variant 2) Up to 500 characters.
customizations.content.items[].targetobjectYes(variant 2)
customizations.content.items[].baseHashstringNo(variant 3) Exactly 64 characters.
customizations.content.items[].idstringYes(variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
customizations.content.items[].kindconstantYes(variant 3) Always "add".
customizations.content.items[].notestringNo(variant 3) Up to 500 characters.
customizations.content.items[].positionobjectNo(variant 3)
customizations.content.items[].targetobjectYes(variant 3)
customizations.content.items[].valueanyYes(variant 3)
customizations.createdAtstring (date-time) | nullYes—
customizations.fromDraftbooleanYes—
customizations.groupIdstring (grp_… ID)YesID (grp_…)
customizations.issuesarray<object>Yes—
customizations.issues[].customizationIdstringNo—
customizations.issues[].kindenumYesOne of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing".
customizations.issues[].messagestringYes—
customizations.locksarray<string>Yes—
customizations.needsReviewbooleanYes—
customizations.notestring | nullYes—
customizations.playbookIdstring (pb_… ID)YesID (pb_…)
customizations.versioninteger | nullYes—
draftany | nullYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)
customizationIdstringYes1–64 characters.

Query parameters

NameTypeRequiredDescription
playbookIdstring (pb_… ID)YesID (pb_…)
baseHashstringNoUp to 128 characters.

Response 200

FieldTypeRequiredDescription
customizationsGroupCustomizationsVersionYes—
customizations.contentobjectYes—
customizations.content.itemsarray<object | object | object>YesDefault: [].
customizations.content.items[].baseHashstringNo(variant 1) Exactly 64 characters.
customizations.content.items[].idstringYes(variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
customizations.content.items[].kindconstantYes(variant 1) Always "change".
customizations.content.items[].notestringNo(variant 1) Up to 500 characters.
customizations.content.items[].targetobject | objectYes(variant 1)
customizations.content.items[].valueanyYes(variant 1)
customizations.content.items[].baseHashstringNo(variant 2) Exactly 64 characters.
customizations.content.items[].idstringYes(variant 2) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
customizations.content.items[].kindconstantYes(variant 2) Always "off".
customizations.content.items[].notestringNo(variant 2) Up to 500 characters.
customizations.content.items[].targetobjectYes(variant 2)
customizations.content.items[].baseHashstringNo(variant 3) Exactly 64 characters.
customizations.content.items[].idstringYes(variant 3) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
customizations.content.items[].kindconstantYes(variant 3) Always "add".
customizations.content.items[].notestringNo(variant 3) Up to 500 characters.
customizations.content.items[].positionobjectNo(variant 3)
customizations.content.items[].targetobjectYes(variant 3)
customizations.content.items[].valueanyYes(variant 3)
customizations.createdAtstring (date-time) | nullYes—
customizations.fromDraftbooleanYes—
customizations.groupIdstring (grp_… ID)YesID (grp_…)
customizations.issuesarray<object>Yes—
customizations.issues[].customizationIdstringNo—
customizations.issues[].kindenumYesOne of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing".
customizations.issues[].messagestringYes—
customizations.locksarray<string>Yes—
customizations.needsReviewbooleanYes—
customizations.notestring | nullYes—
customizations.playbookIdstring (pb_… ID)YesID (pb_…)
customizations.versioninteger | nullYes—
draftany | nullYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Response 200

FieldTypeRequiredDescription
draftany | nullYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Query parameters

NameTypeRequiredDescription
hashstringNoUp to 128 characters.

Response 204

No content.

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
hashstringNoUp to 128 characters.

Response 200

FieldTypeRequiredDescription
effectivearray<object>Yes—
effective[].issuesarray<string>Yes—
effective[].outcomeenumYesOne of: "updated", "needs_review", "blocked_no_backup", "blocked_opening", "no_profile".
effective[].playbookIdstring (pb_… ID)NoID (pb_…)
effective[].versionIdstring (pbv_… ID)YesID (pbv_…)
profileGroupProfileVersionYes—
profile.contentobjectYes—
profile.content.addressstringNoUp to 300 characters.
profile.content.addressPartsobjectNo—
profile.content.addressParts.citystringYes1–80 characters.
profile.content.addressParts.countryenumYesOne of: "US", "CA", "MX". Default: "US".
profile.content.addressParts.line1stringYes1–120 characters.
profile.content.addressParts.line2stringNoUp to 120 characters.
profile.content.addressParts.postalCodestringYes1–20 characters.
profile.content.addressParts.regionstringYes1–40 characters.
profile.content.closuresarray<object>YesUp to 60 items. Default: [].
profile.content.closures[].fromstring (date)Yes—
profile.content.closures[].hoursobject | nullYes—
profile.content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.closures[].namestringYes1–60 characters.
profile.content.closures[].tostring (date)Yes—
profile.content.crmLocationIdstringNoUp to 64 characters.
profile.content.custommapYesDefault: \{\}.
profile.content.custom.{key}stringNoAny key. Up to 1000 characters.
profile.content.directionsobjectYesDefault: \{\}.
profile.content.directions.accessibilitystringNoUp to 600 characters.
profile.content.directions.entrancestringNoUp to 600 characters.
profile.content.directions.parkingstringNoUp to 600 characters.
profile.content.displayNamestringNoUp to 160 characters.
profile.content.geoobjectNo—
profile.content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
profile.content.geo.atstring (date-time)Yes—
profile.content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
profile.content.geo.latnumberYesBetween -90 and 90.
profile.content.geo.lngnumberYesBetween -180 and 180.
profile.content.geo.sourceenumYesOne of: "geocoder", "pin".
profile.content.hoursstringNoUp to 300 characters.
profile.content.humanBackupobjectYes—
profile.content.humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
profile.content.humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
profile.content.humanBackup.missedCallFollowUpbooleanNo—
profile.content.humanBackup.notetakerbooleanNo—
profile.content.humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
profile.content.humanBackup.notifySmsarray<string>YesDefault: [].
profile.content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
profile.content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.staffedHoursarray<object>YesDefault: [].
profile.content.humanBackup.transferLinestringNoUp to 300 characters.
profile.content.humanBackup.unavailableLinestringNoUp to 300 characters.
profile.content.meetingWindowsarray<object>YesDefault: [].
profile.content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
profile.content.meetingWindows[].endstring | constantYes—
profile.content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
profile.content.namestringYes1–120 characters.
profile.content.nearbyGroupIdsarray<string (grp_… ID)>YesUp to 10 items. Default: [].
profile.content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.preRingNoticestringNo1–300 characters.
profile.content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
profile.content.replyToEmailstring (email)No—
profile.content.repsBySpecialtybooleanYesDefault: false.
profile.content.staffarray<object>YesDefault: [].
profile.content.staff[].biostringNoUp to 800 characters.
profile.content.staff[].crmUserIdstringNoUp to 64 characters.
profile.content.staff[].emailstring (email)No—
profile.content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.staff[].isDefaultIntrobooleanNo—
profile.content.staff[].namestringYes1–120 characters.
profile.content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
profile.content.staff[].rolestringYes1–64 characters.
profile.content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
profile.content.staff[].takesMeetingsconstantNoAlways false.
profile.content.staff[].titlestringNoUp to 120 characters.
profile.content.staff[].userIdstring (usr_… ID)NoID (usr_…)
profile.content.staff[].videoobjectNo—
profile.content.surroundingsstringNoUp to 2000 characters.
profile.content.talkingPointsarray<object>YesDefault: [].
profile.content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.talkingPoints[].textstringYes1–1000 characters.
profile.content.timeZonestringYes—
profile.createdAtstring (date-time)Yes—
profile.createdBystring (usr_… ID) | string (svc_… ID) | nullYes—
profile.fromDraftbooleanYes—
profile.groupIdstring (grp_… ID)YesID (grp_…)
profile.issuesarray<object>Yes—
profile.issues[].messagestringYes—
profile.issues[].pathstringYes—
profile.issues[].severityenumYesOne of: "error", "warning".
profile.notestring | nullYes—
profile.placeholdersarray<string>Yes—
profile.versionintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Query parameters

NameTypeRequiredDescription
playbookIdstring (pb_… ID)YesID (pb_…)
versioninteger | enumNoDefault: "latest".
groupDraftenumNoOne of: "true", "false". Default: "false".

Response 200

FieldTypeRequiredDescription
contentPlaybookContentYes—
content.bookingobjectYes—
content.booking.allowUnqualifiedbooleanNoDefault: false.
content.booking.maxBookingsPerCallintegerNoBetween 1 and 2. Default: 2.
content.booking.minNoticeMinutesintegerNoBetween 0 and 10080. Default: 60.
content.booking.offerSlotsintegerNoBetween 1 and 4. Default: 2.
content.booking.rulesarray<object>Yes—
content.booking.rules[].enabledbooleanNoDefault: true.
content.booking.rules[].namestringNoUp to 120 characters.
content.booking.rules[].thenobject | object | object | object | object | object | objectYes—
content.booking.rules[].whenobject | object | object | object | object | object | object | object | object | objectYes—
content.briefstringYes1–12000 characters.
content.defaultFlowIdstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.escalationobjectYes—
content.escalation.afterFailedAnswersintegerNoBetween 1 and 5. Default: 2.
content.escalation.onFrustrationbooleanNoDefault: true.
content.escalation.onGuardrailHitbooleanNoDefault: true.
content.escalation.transferLinestringYes1–300 characters.
content.escalation.transferModeenumNoOne of: "cold", "warm". Default: "cold".
content.escalation.unavailableLinestringYes1–300 characters.
content.flowsarray<object>Yes—
content.flows[].brancharray<object>NoDefault: [].
content.flows[].branch[].gotostringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.flows[].branch[].ifobject | object | object | object | object | object | object | object | object | objectYes—
content.flows[].disqualifyarray<object>NoDefault: [].
content.flows[].disqualify[].actionenumYesOne of: "offer_nurture", "offer_referral", "end_politely".
content.flows[].disqualify[].ifobject | object | object | object | object | object | object | object | object | objectYes—
content.flows[].disqualify[].linestringNoUp to 500 characters.
content.flows[].enterWhenstringYes1–500 characters.
content.flows[].fieldsarray<object>Yes—
content.flows[].fields[].alwaysConfirmbooleanNo—
content.flows[].fields[].askstringYes1–500 characters.
content.flows[].fields[].askWhenobject | object | object | object | object | object | object | object | object | objectNo—
content.flows[].fields[].hearAsarray<string>NoUp to 20 items.
content.flows[].fields[].hintstringNoUp to 500 characters.
content.flows[].fields[].keystringYes1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.flows[].fields[].labelstringNo1–120 characters.
content.flows[].fields[].optionsarray<object>No—
content.flows[].fields[].optionsFromenum | string (oset_… ID)No—
content.flows[].fields[].requiredbooleanNoDefault: false.
content.flows[].fields[].sensitivityenumNoOne of: "standard", "sensitive". Default: "standard".
content.flows[].fields[].typeenumYesOne of: "text", "number", "enum", "boolean", "date", "phone", "email".
content.flows[].goalstringYes1–500 characters.
content.flows[].maxQuestionsBeforeValueintegerNoBetween 1 and 10. Default: 2.
content.flows[].namestringYes1–120 characters.
content.flows[].talkingPointsarray<object | object>NoDefault: [].
content.flows[].talkingPoints[].saystringYes(variant 1) 1–500 characters.
content.flows[].talkingPoints[].whenobject | object | object | object | object | object | object | object | object | objectNo(variant 1)
content.flows[].talkingPoints[].talkAboutstringYes(variant 2) 1–500 characters.
content.flows[].talkingPoints[].whenobject | object | object | object | object | object | object | object | object | objectNo(variant 2)
content.followUpobjectNo—
content.followUp.blocksarray<object>NoUp to 20 items. Default: [].
content.followUp.blocks[].bodystringNoUp to 2000 characters.
content.followUp.blocks[].buttonobjectNo—
content.followUp.blocks[].headingstringNoUp to 120 characters.
content.followUp.blocks[].imagestring (uri) | string (uri)NoA https:// link to an uploaded file
content.followUp.blocks[].videoobjectNo—
content.followUp.cardsarray<object>NoUp to 30 items. Default: [].
content.followUp.cards[].bodystringYes1–2000 characters.
content.followUp.cards[].buttonobjectNo—
content.followUp.cards[].enabledbooleanNoDefault: true.
content.followUp.cards[].imagestring (uri) | string (uri)NoA https:// link to an uploaded file
content.followUp.cards[].showWhenobject | object | object | object | object | object | object | object | object | objectNo—
content.followUp.cards[].titlestringYes1–120 characters.
content.followUp.chatobjectNoDefault: \{"callContext":true,"enabled":false\}.
content.followUp.chat.callContextbooleanNoDefault: true.
content.followUp.chat.enabledbooleanNoDefault: false.
content.followUp.consentQuestionstringNo1–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.emailsobjectNo—
content.followUp.emails.after_visitobject | nullNo—
content.followUp.emails.cancel_confirmationobject | nullNo—
content.followUp.emails.initial_linkobject | nullNo—
content.followUp.emails.reminderobject | nullNo—
content.followUp.emails.reschedule_confirmationobject | nullNo—
content.followUp.enabledbooleanNoDefault: false.
content.followUp.formobjectNoDefault: \{"fields":[]\}.
content.followUp.form.fieldsarray<object>NoUp to 8 items. Default: [].
content.followUp.form.introstringNoUp to 480 characters.
content.followUp.leadsobjectNoDefault: \{\}.
content.followUp.leads.afterVisitstringNoUp to 480 characters.
content.followUp.leads.cancelledstringNoUp to 480 characters.
content.followUp.leads.noBookingstringNoUp to 480 characters.
content.followUp.linkExpiryDaysintegerNoBetween 7 and 365. Default: 60.
content.followUp.messagesobjectNoDefault: \{"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.afterVisitobjectNoDefault: \{"enabled":false\}.
content.followUp.messages.initialSmsstringYes1–480 characters.
content.followUp.messages.remindersarray<object>NoUp to 4 items. Default: [\{"before":"24h"\},\{"before":"2h"\}].
content.followUp.modulesarray<object>NoDefault: [\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\},\{\}].
content.followUp.modules[].blockIdstringNo1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.followUp.modules[].headingstringNoUp to 120 characters.
content.followUp.modules[].showWhenobject | object | object | object | object | object | object | object | object | objectNo—
content.followUp.modules[].statesarray<enum>NoItems: "upcoming", "day_of", "after_visit", "no_booking", "cancelled", "expired", "revoked".
content.followUp.prepobjectNoDefault: \{"checklist":[]\}.
content.followUp.prep.bodystringNoUp to 2000 characters.
content.followUp.prep.checklistarray<object>NoUp to 12 items. Default: [].
content.followUp.resourcesarray<object>NoUp to 20 items. Default: [].
content.followUp.resources[].descriptionstringNoUp to 300 characters.
content.followUp.resources[].labelstringYes1–120 characters.
content.followUp.resources[].urlstring (uri)YesA https:// link Up to 2000 characters.
content.followUp.reviewsarray<object>NoUp to 12 items. Default: [].
content.followUp.reviews[].attributionstringNoUp to 120 characters.
content.followUp.reviews[].quotestringYes1–600 characters.
content.followUp.sendWhenobject | object | object | object | object | object | object | object | object | objectNo—
content.followUp.sendWhen.allarray<object | object | object | object | object | object | object | object | object | object>Yes(variant 1)
content.followUp.sendWhen.anyarray<object | object | object | object | object | object | object | object | object | object>Yes(variant 2)
content.followUp.sendWhen.notobject | object | object | object | object | object | object | object | object | objectYes(variant 3)
content.followUp.sendWhen.alwaysenumYes(variant 4) One of: true.
content.followUp.sendWhen.factstringYes(variant 5) (variant 1) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.followUp.sendWhen.isstring | number | booleanYes(variant 5) (variant 1)
content.followUp.sendWhen.factstringYes(variant 5) (variant 2) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.followUp.sendWhen.inarray<string | number | boolean>Yes(variant 5) (variant 2)
content.followUp.sendWhen.factstringYes(variant 5) (variant 3) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.followUp.sendWhen.gtnumberYes(variant 5) (variant 3)
content.followUp.sendWhen.factstringYes(variant 5) (variant 4) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.followUp.sendWhen.ltnumberYes(variant 5) (variant 4)
content.followUp.sendWhen.betweenarrayYes(variant 5) (variant 5) Up to 2 items.
content.followUp.sendWhen.factstringYes(variant 5) (variant 5) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.followUp.sendWhen.factstringYes(variant 5) (variant 6) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.followUp.sendWhen.missingbooleanYes(variant 5) (variant 6)
content.followUp.themeobjectNoDefault: \{"accent":"#B4512E","background":"#F7F3EC","font":"system","primary":"#24473D"\}.
content.followUp.theme.accentstringYesPattern: ^#[0-9a-f]\{6\}$.
content.followUp.theme.backgroundstringNoPattern: ^#[0-9a-f]\{6\}$. Default: "#F7F3EC".
content.followUp.theme.fontenumNoOne of: "system", "serif_warm", "sans_modern". Default: "system".
content.followUp.theme.logostring (uri) | string (uri)NoA https:// link to an uploaded file
content.followUp.theme.primarystringYesPattern: ^#[0-9a-f]\{6\}$.
content.guardrailsobjectYes—
content.guardrails.allowPriceDiscussionbooleanNoDefault: true.
content.guardrails.declineTopicsarray<object>NoDefault: [].
content.guardrails.declineTopics[].textstringYes1–1000 characters.
content.guardrails.emergencyLinestringYes1–300 characters.
content.guardrails.fallbackLinestringYes1–300 characters.
content.guardrails.neverSayarray<object>NoDefault: [].
content.guardrails.neverSay[].textstringYes1–1000 characters.
content.guardrails.prohibitedClaimsarray<object>NoDefault: [].
content.guardrails.prohibitedClaims[].textstringYes1–1000 characters.
content.guardrails.redirectLinesobjectYes—
content.guardrails.redirectLines.existing_customerstringYes1–500 characters.
content.guardrails.redirectLines.job_seekerstringYes1–500 characters.
content.guardrails.redirectLines.resident_familystringYes1–500 characters.
content.guardrails.redirectLines.vendorstringYes1–500 characters.
content.guardrails.redirectLines.wrong_numberstringYes1–500 characters.
content.guardrails.requiredDisclosuresarray<object>NoDefault: [].
content.guardrails.requiredDisclosures[].textstringYes1–1000 characters.
content.integrationsobjectNoDefault: \{\}.
content.integrations.crmobjectNo—
content.integrations.crm.connectionIdstring (conn_… ID)YesID (conn_…)
content.integrations.crm.connectorstringYes1–64 characters.
content.integrations.crm.createContactsbooleanNoDefault: true.
content.integrations.crm.fieldMapmapNoDefault: \{\}.
content.integrations.crm.historyLookbackDaysintegerNoBetween 0 and 3650. Default: 180.
content.integrations.crm.logCallsbooleanNoDefault: true.
content.integrations.crm.optionsmapNoDefault: \{\}.
content.integrations.schedulerobjectNo—
content.integrations.scheduler.activityTypestringYes1–64 characters.
content.integrations.scheduler.connectionIdstring (conn_… ID)YesID (conn_…)
content.integrations.scheduler.connectorstringYes1–64 characters.
content.integrations.scheduler.optionsmapNoDefault: \{\}.
content.knowledgeobjectNoDefault: \{"documents":[],"faq":[]\}.
content.knowledge.documentsarray<object>NoDefault: [].
content.knowledge.documents[].titlestringYes1–200 characters.
content.knowledge.faqarray<object>NoDefault: [].
content.knowledge.faq[].answerstringYes1–2000 characters.
content.knowledge.faq[].questionstringYes1–300 characters.
content.lexiconobjectNoDefault: \{"account":[],"packs":[],"platform":1\}.
content.lexicon.accountarray<object>NoUp to 200 items. Default: [].
content.lexicon.account[].conceptstringYesUp to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$.
content.lexicon.account[].neverarray<string>NoUp to 50 items. Default: [].
content.lexicon.account[].phrasesarray<string>NoUp to 50 items. Default: [].
content.lexicon.packsarray<object>NoUp to 10 items. Default: [].
content.lexicon.packs[].versionintegerYesMinimum 1.
content.lexicon.platformintegerNoMinimum 1. Default: 1.
content.locksarray<string>No—
content.modelsobjectNoDefault: \{"keyterms":[]\}.
content.models.keytermsarray<string>NoDefault: [].
content.models.llmstringNoUp to 200 characters.
content.models.sttstringNoUp to 200 characters.
content.objectionsarray<object>NoDefault: [].
content.objections[].guidancestringYes1–1000 characters.
content.objections[].triggerstringYes1–200 characters.
content.objectivesobjectNoDefault: \{"channels":\{\},"fallbacks":[],"primary":\{"label":"Book a meeting","meetingTypes":[],"qualifiedOnly":false,"type":"book_meeting"\},"secondary":[]\}.
content.objectives.channelsobjectNoDefault: \{\}.
content.objectives.channels.page_chatobjectNo—
content.objectives.channels.site_chatobjectNo—
content.objectives.fallbacksarray<object | object | object | object | object | object | object | object | object | object | object | object | object>NoUp to 3 items. Default: [].
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 1)
content.objectives.fallbacks[].labelstringYes(variant 1) 1–80 characters.
content.objectives.fallbacks[].meetingTypesarray<string>No(variant 1) Up to 10 items. Default: [].
content.objectives.fallbacks[].qualifiedOnlybooleanNo(variant 1) Default: false.
content.objectives.fallbacks[].typeenumYes(variant 1) One of: "book_meeting".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 2)
content.objectives.fallbacks[].labelstringYes(variant 2) 1–80 characters.
content.objectives.fallbacks[].reasonsarray<enum>No(variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: [].
content.objectives.fallbacks[].typeenumYes(variant 2) One of: "live_transfer".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 3)
content.objectives.fallbacks[].labelstringYes(variant 3) 1–80 characters.
content.objectives.fallbacks[].requireReasonbooleanNo(variant 3) Default: false.
content.objectives.fallbacks[].typeenumYes(variant 3) One of: "capture_callback".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 4)
content.objectives.fallbacks[].fieldsarray<string>Yes(variant 4) Up to 10 items.
content.objectives.fallbacks[].labelstringYes(variant 4) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 4) One of: "capture_contact".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 5)
content.objectives.fallbacks[].fieldsarray<string>No(variant 5) Up to 30 items. Default: [].
content.objectives.fallbacks[].flowIdstringNo(variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.objectives.fallbacks[].labelstringYes(variant 5) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 5) One of: "qualify".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 6)
content.objectives.fallbacks[].labelstringYes(variant 6) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 6) One of: "text_follow_up".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 7)
content.objectives.fallbacks[].labelstringYes(variant 7) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 7) One of: "manage_booking".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 8)
content.objectives.fallbacks[].kindsarray<enum>No(variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: [].
content.objectives.fallbacks[].labelstringYes(variant 8) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 8) One of: "route_correctly".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 9)
content.objectives.fallbacks[].labelstringYes(variant 9) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 9) One of: "nurture".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 10)
content.objectives.fallbacks[].bindingIdstringYes(variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.objectives.fallbacks[].labelstringYes(variant 10) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 10) One of: "run_tool".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 11)
content.objectives.fallbacks[].labelstringYes(variant 11) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 11) One of: "answer_questions".
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 12)
content.objectives.fallbacks[].labelstringYes(variant 12) 1–80 characters.
content.objectives.fallbacks[].typeenumYes(variant 12) One of: "custom_condition".
content.objectives.fallbacks[].whenobject | object | object | object | object | object | object | object | object | objectYes(variant 12)
content.objectives.fallbacks[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 13)
content.objectives.fallbacks[].labelstringYes(variant 13) 1–80 characters.
content.objectives.fallbacks[].rubricstringYes(variant 13) 1–500 characters.
content.objectives.fallbacks[].typeenumYes(variant 13) One of: "custom_judged".
content.objectives.primaryobject | object | object | object | object | object | object | object | object | object | object | object | objectYes—
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 1)
content.objectives.primary.labelstringYes(variant 1) 1–80 characters.
content.objectives.primary.meetingTypesarray<string>No(variant 1) Up to 10 items. Default: [].
content.objectives.primary.qualifiedOnlybooleanNo(variant 1) Default: false.
content.objectives.primary.typeenumYes(variant 1) One of: "book_meeting".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 2)
content.objectives.primary.labelstringYes(variant 2) 1–80 characters.
content.objectives.primary.reasonsarray<enum>No(variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: [].
content.objectives.primary.typeenumYes(variant 2) One of: "live_transfer".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 3)
content.objectives.primary.labelstringYes(variant 3) 1–80 characters.
content.objectives.primary.requireReasonbooleanNo(variant 3) Default: false.
content.objectives.primary.typeenumYes(variant 3) One of: "capture_callback".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 4)
content.objectives.primary.fieldsarray<string>Yes(variant 4) Up to 10 items.
content.objectives.primary.labelstringYes(variant 4) 1–80 characters.
content.objectives.primary.typeenumYes(variant 4) One of: "capture_contact".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 5)
content.objectives.primary.fieldsarray<string>No(variant 5) Up to 30 items. Default: [].
content.objectives.primary.flowIdstringNo(variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.objectives.primary.labelstringYes(variant 5) 1–80 characters.
content.objectives.primary.typeenumYes(variant 5) One of: "qualify".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 6)
content.objectives.primary.labelstringYes(variant 6) 1–80 characters.
content.objectives.primary.typeenumYes(variant 6) One of: "text_follow_up".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 7)
content.objectives.primary.labelstringYes(variant 7) 1–80 characters.
content.objectives.primary.typeenumYes(variant 7) One of: "manage_booking".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 8)
content.objectives.primary.kindsarray<enum>No(variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: [].
content.objectives.primary.labelstringYes(variant 8) 1–80 characters.
content.objectives.primary.typeenumYes(variant 8) One of: "route_correctly".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 9)
content.objectives.primary.labelstringYes(variant 9) 1–80 characters.
content.objectives.primary.typeenumYes(variant 9) One of: "nurture".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 10)
content.objectives.primary.bindingIdstringYes(variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.objectives.primary.labelstringYes(variant 10) 1–80 characters.
content.objectives.primary.typeenumYes(variant 10) One of: "run_tool".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 11)
content.objectives.primary.labelstringYes(variant 11) 1–80 characters.
content.objectives.primary.typeenumYes(variant 11) One of: "answer_questions".
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 12)
content.objectives.primary.labelstringYes(variant 12) 1–80 characters.
content.objectives.primary.typeenumYes(variant 12) One of: "custom_condition".
content.objectives.primary.whenobject | object | object | object | object | object | object | object | object | objectYes(variant 12)
content.objectives.primary.appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 13)
content.objectives.primary.labelstringYes(variant 13) 1–80 characters.
content.objectives.primary.rubricstringYes(variant 13) 1–500 characters.
content.objectives.primary.typeenumYes(variant 13) One of: "custom_judged".
content.objectives.secondaryarray<object | object | object | object | object | object | object | object | object | object | object | object | object>NoUp to 5 items. Default: [].
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 1)
content.objectives.secondary[].labelstringYes(variant 1) 1–80 characters.
content.objectives.secondary[].meetingTypesarray<string>No(variant 1) Up to 10 items. Default: [].
content.objectives.secondary[].qualifiedOnlybooleanNo(variant 1) Default: false.
content.objectives.secondary[].typeenumYes(variant 1) One of: "book_meeting".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 2)
content.objectives.secondary[].labelstringYes(variant 2) 1–80 characters.
content.objectives.secondary[].reasonsarray<enum>No(variant 2) Items: "caller_request", "rule_transfer", "unanswered", "frustration", "guardrail", "system_failure", "emergency". Up to 10 items. Default: [].
content.objectives.secondary[].typeenumYes(variant 2) One of: "live_transfer".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 3)
content.objectives.secondary[].labelstringYes(variant 3) 1–80 characters.
content.objectives.secondary[].requireReasonbooleanNo(variant 3) Default: false.
content.objectives.secondary[].typeenumYes(variant 3) One of: "capture_callback".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 4)
content.objectives.secondary[].fieldsarray<string>Yes(variant 4) Up to 10 items.
content.objectives.secondary[].labelstringYes(variant 4) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 4) One of: "capture_contact".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 5)
content.objectives.secondary[].fieldsarray<string>No(variant 5) Up to 30 items. Default: [].
content.objectives.secondary[].flowIdstringNo(variant 5) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.objectives.secondary[].labelstringYes(variant 5) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 5) One of: "qualify".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 6)
content.objectives.secondary[].labelstringYes(variant 6) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 6) One of: "text_follow_up".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 7)
content.objectives.secondary[].labelstringYes(variant 7) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 7) One of: "manage_booking".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 8)
content.objectives.secondary[].kindsarray<enum>No(variant 8) Items: "wrong_number", "existing_customer", "vendor", "job_seeker", "resident_family". Up to 10 items. Default: [].
content.objectives.secondary[].labelstringYes(variant 8) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 8) One of: "route_correctly".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 9)
content.objectives.secondary[].labelstringYes(variant 9) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 9) One of: "nurture".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 10)
content.objectives.secondary[].bindingIdstringYes(variant 10) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.objectives.secondary[].labelstringYes(variant 10) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 10) One of: "run_tool".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 11)
content.objectives.secondary[].labelstringYes(variant 11) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 11) One of: "answer_questions".
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 12)
content.objectives.secondary[].labelstringYes(variant 12) 1–80 characters.
content.objectives.secondary[].typeenumYes(variant 12) One of: "custom_condition".
content.objectives.secondary[].whenobject | object | object | object | object | object | object | object | object | objectYes(variant 12)
content.objectives.secondary[].appliesWhenobject | object | object | object | object | object | object | object | object | objectNo(variant 13)
content.objectives.secondary[].labelstringYes(variant 13) 1–80 characters.
content.objectives.secondary[].rubricstringYes(variant 13) 1–500 characters.
content.objectives.secondary[].typeenumYes(variant 13) One of: "custom_judged".
content.personaobjectYes—
content.persona.agentNamestringYes1–60 characters.
content.persona.companyNamestringYes1–120 characters.
content.persona.exampleExchangesarray<object>NoDefault: [].
content.persona.exampleExchanges[].agentstringYes1–500 characters.
content.persona.exampleExchanges[].callerstringYes1–500 characters.
content.persona.openingstringYes1–600 characters.
content.persona.openingAfterRingstringNo1–600 characters.
content.persona.openingNotRecordedstringNo1–600 characters.
content.persona.openingQuestionstringYes1–300 characters.
content.persona.preRingNoticestringNo1–300 characters.
content.persona.returningCallerLinestringNoUp to 300 characters.
content.persona.tonestringYes1–300 characters.
content.persona.voiceobjectYes—
content.persona.voice.ambiencebooleanNoDefault: false.
content.persona.voice.expressivebooleanNoDefault: false.
content.persona.voice.modeenumNoOne of: "cascaded". Default: "cascaded".
content.persona.voice.modelstringNoUp to 200 characters.
content.persona.voice.pronunciationsarray<object>NoDefault: [].
content.persona.voice.providerenumYesOne of: "cartesia", "elevenlabs", "deepgram", "fishaudio", "gradium", "inworld", "rime", "xai", "openai", "google".
content.persona.voice.thinkingSoundsbooleanNoDefault: true.
content.persona.voice.tuningmapNoDefault: \{\}.
content.persona.voice.voiceIdstringYes1–200 characters.
content.pricingobjectNoDefault: \{"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.feeLinestringNo1–300 characters. Default: "The \{\{price.service\}\} is \{\{price.amount\}\} \{\{price.per\}\}.".
content.pricing.floorPlanLinestringNo1–300 characters. Default: "\{\{floorPlan.name\}\} is \{\{floorPlan.details\}\}.".
content.pricing.mentionSpecialsenumNoOne of: "when_price_comes_up", "once_after_discovery", "only_when_asked". Default: "when_price_comes_up".
content.pricing.notOfferedLinestringNo1–300 characters. Default: "\{\{group.displayName\}\} doesn't offer \{\{price.service\}\}.".
content.pricing.onRequestLinestringNo1–300 characters. Default: "Our team will go over pricing for \{\{price.service\}\} with you.".
content.pricing.otherLocationsenumNoOne of: "off", "mention", "mention_and_connect". Default: "off".
content.pricing.otherLocationsLinestringNo1–300 characters. Default: "\{\{price.service\}\} is offered at \{\{price.locations\}\}.".
content.pricing.specialLinestringNo1–300 characters. Default: "\{\{price.specialWording\}\}. It ends \{\{price.specialEnds\}\}.".
content.pricing.specialLineOpenEndedstringNo1–300 characters. Default: "\{\{price.specialWording\}\}.".
content.pricing.startingAtLinestringNo1–300 characters. Default: "\{\{price.service\}\} starts at \{\{price.amount\}\} \{\{price.per\}\}.".
content.pricing.startingAtWithOptionsstringNo1–300 characters. Default: "\{\{price.service\}\}, \{\{price.options\}\}, starts at \{\{price.amount\}\} \{\{price.per\}\}.".
content.recordingobjectNoDefault: \{"enabled":true\}.
content.recording.enabledbooleanNoDefault: true.
content.retentionobjectNoDefault: \{"recordingDays":90,"transcriptDays":90\}.
content.retention.recordingDaysintegerNoBetween 1 and 3650. Default: 90.
content.retention.transcriptDaysintegerNoBetween 1 and 3650. Default: 90.
content.schemaVersionenumNoOne of: 1. Default: 1.
content.toolsobjectNoDefault: \{"bindings":[]\}.
content.tools.bindingsarray<object>NoUp to 20 items. Default: [].
content.tools.bindings[].allowCallerInputbooleanNoDefault: true.
content.tools.bindings[].argsmapNoDefault: \{\}.
content.tools.bindings[].asstringYes1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.tools.bindings[].channelsarray<enum>NoItems: "phone", "web_voice", "web_chat". Default: ["phone","web_voice","web_chat"].
content.tools.bindings[].confirmWithCallerbooleanNoDefault: false.
content.tools.bindings[].enabledbooleanNoDefault: true.
content.tools.bindings[].holdingLinestringNo1–200 characters.
content.tools.bindings[].inputsmapNoDefault: \{\}.
content.tools.bindings[].labelstringYes1–80 characters.
content.tools.bindings[].maxCallsintegerNoBetween 1 and 3. Default: 3.
content.tools.bindings[].onFailureenumNoOne of: "say_will_follow_up", "continue_silently", "offer_callback", "transfer". Default: "say_will_follow_up".
content.tools.bindings[].resultobjectYes—
content.tools.bindings[].toolobjectYes—
content.tools.bindings[].triggerobject | objectYes—
content.tools.bindings[].whenobject | object | object | object | object | object | object | object | object | objectNo—
content.visitActionsobjectNo—
content.visitActions.allowCustombooleanNoDefault: true.
content.visitActions.itemsarray<object>NoUp to 30 items.
content.visitActions.items[].crmTaskbooleanNoDefault: false.
content.visitActions.items[].dueDaysintegerNoBetween 0 and 30. Default: 1.
content.visitActions.items[].keystringYes1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
content.visitActions.items[].labelstringYes1–240 characters.
content.visitActions.items[].ownerenumNoOne of: "rep", "backup". Default: "rep".
content.visitActions.typedCrmTaskbooleanNoDefault: false.
content.webWidgetobjectNoDefault: \{"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.continuationDisclosurestringNo1–320 characters. Default: "Hi again — this is the AI assistant you spoke with on the phone.".
content.webWidget.continuationGreetingstringNo1–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.copyobjectNoDefault: \{"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.agentLabelstringNo1–80 characters. Default: "AI assistant".
content.webWidget.copy.choicesLabelstringNo1–80 characters. Default: "Tap an answer, or type your own".
content.webWidget.copy.closeLabelstringNo1–80 characters. Default: "Close the chat".
content.webWidget.copy.composerDisabledNotestringNo1–320 characters. Default: "Messaging is not switched on here yet.".
content.webWidget.copy.continuingNotestringNo1–80 characters. Default: "Continuing from your call on \{date\}".
content.webWidget.copy.endedNotestringNo1–320 characters. Default: "This conversation has ended.".
content.webWidget.copy.errorBodystringNo1–320 characters. Default: "Please try again in a moment, or call us and we will help.".
content.webWidget.copy.errorTitlestringNo1–80 characters. Default: "We could not load the chat".
content.webWidget.copy.inputPlaceholderstringNo1–80 characters. Default: "Type your question".
content.webWidget.copy.loadingLabelstringNo1–80 characters. Default: "Loading the chat".
content.webWidget.copy.newChatLabelstringNo1–80 characters. Default: "Start a new chat".
content.webWidget.copy.notAllowedBodystringNo1–320 characters. Default: "If you run this website, add it to the allowed list in your admin settings.".
content.webWidget.copy.notAllowedTitlestringNo1–80 characters. Default: "This chat is not available on this site".
content.webWidget.copy.openLabelstringNo1–80 characters. Default: "Open the chat".
content.webWidget.copy.retryLabelstringNo1–80 characters. Default: "Try again".
content.webWidget.copy.sendFailedstringNo1–320 characters. Default: "That message did not send. Please try again.".
content.webWidget.copy.sendLabelstringNo1–80 characters. Default: "Send".
content.webWidget.copy.subtitlestringNo1–80 characters. Default: "Answers in a moment".
content.webWidget.copy.typingLabelstringNo1–80 characters. Default: "Writing a reply".
content.webWidget.copy.visitorLabelstringNo1–80 characters. Default: "You".
content.webWidget.disclosurestringNo1–320 characters. Default: "Hi — I am an AI assistant, and I can answer questions or book you a time to visit.".
content.webWidget.enabledbooleanNoDefault: false.
content.webWidget.greetingstringNo1–320 characters. Default: "What would you like to know?".
content.webWidget.launcherobjectNoDefault: \{"icon":"chat","label":"Chat with us","offset":\{"x":20,"y":20\},"position":"bottom-right","shape":"circle","showLabel":false,"size":"medium"\}.
content.webWidget.launcher.iconenumNoOne of: "chat", "message", "question", "sparkle", "phone", "headset". Default: "chat".
content.webWidget.launcher.iconUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
content.webWidget.launcher.labelstringNo1–80 characters. Default: "Chat with us".
content.webWidget.launcher.offsetobjectNoDefault: \{"x":20,"y":20\}.
content.webWidget.launcher.positionenumNoOne of: "bottom-right", "bottom-left". Default: "bottom-right".
content.webWidget.launcher.shapeenumNoOne of: "circle", "rounded". Default: "circle".
content.webWidget.launcher.showLabelbooleanNoDefault: false.
content.webWidget.launcher.sizeenumNoOne of: "medium", "large". Default: "medium".
content.webWidget.limitsobjectNoDefault: \{"charactersPerMessage":2000,"messagesPerConversation":200,"messagesPerHour":30\}.
content.webWidget.limits.charactersPerMessageintegerNoBetween 200 and 8000. Default: 2000.
content.webWidget.limits.messagesPerConversationintegerNoBetween 1 and 2000. Default: 200.
content.webWidget.limits.messagesPerHourintegerNoBetween 1 and 500. Default: 30.
content.webWidget.panelobjectNoDefault: \{"height":620,"presentation":"panel","width":400\}.
content.webWidget.panel.headingstringNo1–80 characters.
content.webWidget.panel.heightintegerNoBetween 420 and 800. Default: 620.
content.webWidget.panel.presentationenumNoOne of: "panel", "sheet", "fullscreen". Default: "panel".
content.webWidget.panel.widthintegerNoBetween 320 and 560. Default: 400.
content.webWidget.showMediabooleanNoDefault: false.
content.webWidget.surfacesobjectNoDefault: \{"chat":true,"voice":false\}.
content.webWidget.surfaces.chatbooleanNoDefault: true.
content.webWidget.surfaces.voicebooleanNoDefault: false.
content.webWidget.themeobjectNoDefault: \{"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.avatarstring (uri) | string (uri)NoA https:// link to an uploaded file
content.webWidget.theme.darkobjectNoDefault: \{"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.fontenumNoOne of: "system", "serif_warm", "sans_modern". Default: "system".
content.webWidget.theme.lightobjectNoDefault: \{"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.logostring (uri) | string (uri)NoA https:// link to an uploaded file
content.webWidget.theme.radiusobjectNoDefault: \{"bubble":14,"launcher":28,"panel":16\}.
content.webWidget.theme.schemeenumNoOne of: "auto", "light", "dark". Default: "auto".
customizedarray<object>Yes—
customized[].blockstringYes—
customized[].collectionstringNo—
customized[].customizationIdstringYes—
customized[].itemIdstringNo—
customized[].kindenumYesOne of: "change", "off", "add".
customized[].parentIdstringNo—
customized[].scalarstringNo—
groupDraftbooleanYes—
hashstringYes—
issuesarray<object>Yes—
issues[].customizationIdstringNo—
issues[].kindenumYesOne of: "target_missing", "target_changed", "locked", "invalid_value", "anchor_missing", "placeholder_missing".
issues[].messagestringYes—
needsReviewbooleanYes—
playbookIdstring (pb_… ID)YesID (pb_…)
priceLinesarray<string> | nullYes—
versionintegerYes—
versionStatusenumYesOne of: "draft", "published", "archived", "discarded".
vocabularyobjectYes—
vocabulary.contactstringYes1–40 characters. Default: "contact".
vocabulary.contactPluralstringYes1–40 characters. Default: "contacts".
vocabulary.groupstringYes1–40 characters. Default: "location".
vocabulary.groupPluralstringYes1–40 characters. Default: "locations".
vocabulary.meetingstringYes1–40 characters. Default: "meeting".
vocabulary.meetingPluralstringYes1–40 characters. Default: "meetings".
vocabulary.servicestringYes1–40 characters. Default: "service".
vocabulary.servicePluralstringYes1–40 characters. Default: "services".
vocabulary.specialstringYes1–40 characters. Default: "special".
vocabulary.specialPluralstringYes1–40 characters. Default: "specials".

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Query parameters

NameTypeRequiredDescription
sourceenumNoOne of: "live", "draft". Default: "live".

Response 200

FieldTypeRequiredDescription
fromDraftbooleanYes—
humanBackupobjectYes—
humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
humanBackup.missedCallFollowUpbooleanNo—
humanBackup.notetakerbooleanNo—
humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
humanBackup.notifySmsarray<string>YesDefault: [].
humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
humanBackup.staffedHoursarray<object>YesDefault: [].
humanBackup.staffedHours[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
humanBackup.staffedHours[].endstring | enumYes—
humanBackup.staffedHours[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
humanBackup.transferLinestringNoUp to 300 characters.
humanBackup.unavailableLinestringNoUp to 300 characters.
issuesarray<object>Yes—
issues[].messagestringYes—
issues[].pathstringYes—
profileVersionintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
baseHashstring | nullNoUp to 128 characters.
humanBackupobjectYes—
humanBackup.answerTimeoutSecondsintegerNoBetween 5 and 120. Default: 25.
humanBackup.callbackTargetMinutesintegerNoBetween 5 and 10080. Default: 60.
humanBackup.missedCallFollowUpbooleanNo—
humanBackup.notetakerbooleanNo—
humanBackup.notifyEmailsarray<string (email)>NoDefault: [].
humanBackup.notifySmsarray<string>NoDefault: [].
humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
humanBackup.staffedHoursarray<object>NoDefault: [].
humanBackup.staffedHours[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
humanBackup.staffedHours[].endstring | enumYes—
humanBackup.staffedHours[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
humanBackup.transferLinestringNoUp to 300 characters.
humanBackup.unavailableLinestringNoUp to 300 characters.
notestringNoUp to 500 characters.

Response 200

FieldTypeRequiredDescription
draftany | nullYes—
profileGroupProfileVersionYes—
profile.contentobjectYes—
profile.content.addressstringNoUp to 300 characters.
profile.content.addressPartsobjectNo—
profile.content.addressParts.citystringYes1–80 characters.
profile.content.addressParts.countryenumYesOne of: "US", "CA", "MX". Default: "US".
profile.content.addressParts.line1stringYes1–120 characters.
profile.content.addressParts.line2stringNoUp to 120 characters.
profile.content.addressParts.postalCodestringYes1–20 characters.
profile.content.addressParts.regionstringYes1–40 characters.
profile.content.closuresarray<object>YesUp to 60 items. Default: [].
profile.content.closures[].fromstring (date)Yes—
profile.content.closures[].hoursobject | nullYes—
profile.content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.closures[].namestringYes1–60 characters.
profile.content.closures[].tostring (date)Yes—
profile.content.crmLocationIdstringNoUp to 64 characters.
profile.content.custommapYesDefault: \{\}.
profile.content.custom.{key}stringNoAny key. Up to 1000 characters.
profile.content.directionsobjectYesDefault: \{\}.
profile.content.directions.accessibilitystringNoUp to 600 characters.
profile.content.directions.entrancestringNoUp to 600 characters.
profile.content.directions.parkingstringNoUp to 600 characters.
profile.content.displayNamestringNoUp to 160 characters.
profile.content.geoobjectNo—
profile.content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
profile.content.geo.atstring (date-time)Yes—
profile.content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
profile.content.geo.latnumberYesBetween -90 and 90.
profile.content.geo.lngnumberYesBetween -180 and 180.
profile.content.geo.sourceenumYesOne of: "geocoder", "pin".
profile.content.hoursstringNoUp to 300 characters.
profile.content.humanBackupobjectYes—
profile.content.humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
profile.content.humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
profile.content.humanBackup.missedCallFollowUpbooleanNo—
profile.content.humanBackup.notetakerbooleanNo—
profile.content.humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
profile.content.humanBackup.notifySmsarray<string>YesDefault: [].
profile.content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
profile.content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.staffedHoursarray<object>YesDefault: [].
profile.content.humanBackup.transferLinestringNoUp to 300 characters.
profile.content.humanBackup.unavailableLinestringNoUp to 300 characters.
profile.content.meetingWindowsarray<object>YesDefault: [].
profile.content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
profile.content.meetingWindows[].endstring | constantYes—
profile.content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
profile.content.namestringYes1–120 characters.
profile.content.nearbyGroupIdsarray<string (grp_… ID)>YesUp to 10 items. Default: [].
profile.content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.preRingNoticestringNo1–300 characters.
profile.content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
profile.content.replyToEmailstring (email)No—
profile.content.repsBySpecialtybooleanYesDefault: false.
profile.content.staffarray<object>YesDefault: [].
profile.content.staff[].biostringNoUp to 800 characters.
profile.content.staff[].crmUserIdstringNoUp to 64 characters.
profile.content.staff[].emailstring (email)No—
profile.content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.staff[].isDefaultIntrobooleanNo—
profile.content.staff[].namestringYes1–120 characters.
profile.content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
profile.content.staff[].rolestringYes1–64 characters.
profile.content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
profile.content.staff[].takesMeetingsconstantNoAlways false.
profile.content.staff[].titlestringNoUp to 120 characters.
profile.content.staff[].userIdstring (usr_… ID)NoID (usr_…)
profile.content.staff[].videoobjectNo—
profile.content.surroundingsstringNoUp to 2000 characters.
profile.content.talkingPointsarray<object>YesDefault: [].
profile.content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.talkingPoints[].textstringYes1–1000 characters.
profile.content.timeZonestringYes—
profile.createdAtstring (date-time)Yes—
profile.createdBystring (usr_… ID) | string (svc_… ID) | nullYes—
profile.fromDraftbooleanYes—
profile.groupIdstring (grp_… ID)YesID (grp_…)
profile.issuesarray<object>Yes—
profile.issues[].messagestringYes—
profile.issues[].pathstringYes—
profile.issues[].severityenumYesOne of: "error", "warning".
profile.notestring | nullYes—
profile.placeholdersarray<string>Yes—
profile.versionintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Response 200

FieldTypeRequiredDescription
contentobjectYes—
content.addressstringNoUp to 300 characters.
content.addressPartsobjectNo—
content.addressParts.citystringYes1–80 characters.
content.addressParts.countryenumYesOne of: "US", "CA", "MX". Default: "US".
content.addressParts.line1stringYes1–120 characters.
content.addressParts.line2stringNoUp to 120 characters.
content.addressParts.postalCodestringYes1–20 characters.
content.addressParts.regionstringYes1–40 characters.
content.closuresarray<object>YesUp to 60 items. Default: [].
content.closures[].fromstring (date)Yes—
content.closures[].hoursobject | nullYes—
content.closures[].hours.endstring | constantYes—
content.closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.closures[].namestringYes1–60 characters.
content.closures[].tostring (date)Yes—
content.crmLocationIdstringNoUp to 64 characters.
content.custommapYesDefault: \{\}.
content.custom.{key}stringNoAny key. Up to 1000 characters.
content.directionsobjectYesDefault: \{\}.
content.directions.accessibilitystringNoUp to 600 characters.
content.directions.entrancestringNoUp to 600 characters.
content.directions.parkingstringNoUp to 600 characters.
content.displayNamestringNoUp to 160 characters.
content.geoobjectNo—
content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
content.geo.atstring (date-time)Yes—
content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
content.geo.latnumberYesBetween -90 and 90.
content.geo.lngnumberYesBetween -180 and 180.
content.geo.sourceenumYesOne of: "geocoder", "pin".
content.hoursstringNoUp to 300 characters.
content.humanBackupobjectYes—
content.humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
content.humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
content.humanBackup.missedCallFollowUpbooleanNo—
content.humanBackup.notetakerbooleanNo—
content.humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
content.humanBackup.notifySmsarray<string>YesDefault: [].
content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
content.humanBackup.staffedHoursarray<object>YesDefault: [].
content.humanBackup.staffedHours[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
content.humanBackup.staffedHours[].endstring | constantYes—
content.humanBackup.staffedHours[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
content.humanBackup.transferLinestringNoUp to 300 characters.
content.humanBackup.unavailableLinestringNoUp to 300 characters.
content.meetingWindowsarray<object>YesDefault: [].
content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
content.meetingWindows[].endstring | constantYes—
content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
content.namestringYes1–120 characters.
content.nearbyGroupIdsarray<string (grp_… ID)>YesUp to 10 items. Default: [].
content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
content.preRingNoticestringNo1–300 characters.
content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
content.replyToEmailstring (email)No—
content.repsBySpecialtybooleanYesDefault: false.
content.staffarray<object>YesDefault: [].
content.staff[].biostringNoUp to 800 characters.
content.staff[].crmUserIdstringNoUp to 64 characters.
content.staff[].emailstring (email)No—
content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.staff[].isDefaultIntrobooleanNo—
content.staff[].namestringYes1–120 characters.
content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
content.staff[].rolestringYes1–64 characters.
content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
content.staff[].takesMeetingsconstantNoAlways false.
content.staff[].titlestringNoUp to 120 characters.
content.staff[].userIdstring (usr_… ID)NoID (usr_…)
content.staff[].videoobjectNo—
content.staff[].video.captionsUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
content.staff[].video.kindenumYesOne of: "upload", "youtube", "vimeo", "loom".
content.staff[].video.urlstring (uri) | string (uri)YesA https:// link to an uploaded file
content.surroundingsstringNoUp to 2000 characters.
content.talkingPointsarray<object>YesDefault: [].
content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.talkingPoints[].textstringYes1–1000 characters.
content.timeZonestringYes—
createdAtstring (date-time)Yes—
createdBystring (usr_… ID) | string (svc_… ID) | nullYes—
fromDraftbooleanYes—
groupIdstring (grp_… ID)YesID (grp_…)
issuesarray<object>Yes—
issues[].messagestringYes—
issues[].pathstringYes—
issues[].severityenumYesOne of: "error", "warning".
notestring | nullYes—
placeholdersarray<string>Yes—
versionintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
baseHashstring | nullNoUp to 128 characters.
contentobjectYes—
content.addressstringNoUp to 300 characters.
content.addressPartsobjectNo—
content.addressParts.citystringYes1–80 characters.
content.addressParts.countryenumNoOne of: "US", "CA", "MX". Default: "US".
content.addressParts.line1stringYes1–120 characters.
content.addressParts.line2stringNoUp to 120 characters.
content.addressParts.postalCodestringYes1–20 characters.
content.addressParts.regionstringYes1–40 characters.
content.closuresarray<object>NoUp to 60 items. Default: [].
content.closures[].fromstring (date)Yes—
content.closures[].hoursobject | nullNo—
content.closures[].hours.endstring | enumYes—
content.closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.closures[].namestringYes1–60 characters.
content.closures[].tostring (date)Yes—
content.crmLocationIdstringNoUp to 64 characters.
content.custommapNoDefault: \{\}.
content.custom.{key}stringNoAny key. Up to 1000 characters.
content.directionsobjectNoDefault: \{\}.
content.directions.accessibilitystringNoUp to 600 characters.
content.directions.entrancestringNoUp to 600 characters.
content.directions.parkingstringNoUp to 600 characters.
content.displayNamestringNoUp to 160 characters.
content.geoobjectNo—
content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
content.geo.atstring (date-time)Yes—
content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
content.geo.latnumberYesBetween -90 and 90.
content.geo.lngnumberYesBetween -180 and 180.
content.geo.sourceenumYesOne of: "geocoder", "pin".
content.hoursstringNoUp to 300 characters.
content.humanBackupobjectYes—
content.humanBackup.answerTimeoutSecondsintegerNoBetween 5 and 120. Default: 25.
content.humanBackup.callbackTargetMinutesintegerNoBetween 5 and 10080. Default: 60.
content.humanBackup.missedCallFollowUpbooleanNo—
content.humanBackup.notetakerbooleanNo—
content.humanBackup.notifyEmailsarray<string (email)>NoDefault: [].
content.humanBackup.notifySmsarray<string>NoDefault: [].
content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
content.humanBackup.staffedHoursarray<object>NoDefault: [].
content.humanBackup.staffedHours[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
content.humanBackup.staffedHours[].endstring | enumYes—
content.humanBackup.staffedHours[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
content.humanBackup.transferLinestringNoUp to 300 characters.
content.humanBackup.unavailableLinestringNoUp to 300 characters.
content.meetingWindowsarray<object>NoDefault: [].
content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
content.meetingWindows[].endstring | enumYes—
content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
content.namestringYes1–120 characters.
content.nearbyGroupIdsarray<string (grp_… ID)>NoUp to 10 items. Default: [].
content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
content.preRingNoticestringNo1–300 characters.
content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
content.replyToEmailstring (email)No—
content.repsBySpecialtybooleanNoDefault: false.
content.staffarray<object>NoDefault: [].
content.staff[].biostringNoUp to 800 characters.
content.staff[].crmUserIdstringNoUp to 64 characters.
content.staff[].emailstring (email)No—
content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.staff[].isDefaultIntrobooleanNo—
content.staff[].namestringYes1–120 characters.
content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
content.staff[].rolestringYes1–64 characters.
content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
content.staff[].takesMeetingsenumNoOne of: false.
content.staff[].titlestringNoUp to 120 characters.
content.staff[].userIdstring (usr_… ID)NoID (usr_…)
content.staff[].videoobjectNo—
content.staff[].video.captionsUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
content.staff[].video.kindenumYesOne of: "upload", "youtube", "vimeo", "loom".
content.staff[].video.urlstring (uri) | string (uri)YesA https:// link to an uploaded file
content.surroundingsstringNoUp to 2000 characters.
content.talkingPointsarray<object>NoDefault: [].
content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
content.talkingPoints[].textstringYes1–1000 characters.
content.timeZonestringYes—
expectedVersionintegerNoMinimum 1.
notestringNoUp to 500 characters.

Response 200

FieldTypeRequiredDescription
draftany | nullYes—
profileGroupProfileVersionYes—
profile.contentobjectYes—
profile.content.addressstringNoUp to 300 characters.
profile.content.addressPartsobjectNo—
profile.content.addressParts.citystringYes1–80 characters.
profile.content.addressParts.countryenumYesOne of: "US", "CA", "MX". Default: "US".
profile.content.addressParts.line1stringYes1–120 characters.
profile.content.addressParts.line2stringNoUp to 120 characters.
profile.content.addressParts.postalCodestringYes1–20 characters.
profile.content.addressParts.regionstringYes1–40 characters.
profile.content.closuresarray<object>YesUp to 60 items. Default: [].
profile.content.closures[].fromstring (date)Yes—
profile.content.closures[].hoursobject | nullYes—
profile.content.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.closures[].namestringYes1–60 characters.
profile.content.closures[].tostring (date)Yes—
profile.content.crmLocationIdstringNoUp to 64 characters.
profile.content.custommapYesDefault: \{\}.
profile.content.custom.{key}stringNoAny key. Up to 1000 characters.
profile.content.directionsobjectYesDefault: \{\}.
profile.content.directions.accessibilitystringNoUp to 600 characters.
profile.content.directions.entrancestringNoUp to 600 characters.
profile.content.directions.parkingstringNoUp to 600 characters.
profile.content.displayNamestringNoUp to 160 characters.
profile.content.geoobjectNo—
profile.content.geo.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
profile.content.geo.atstring (date-time)Yes—
profile.content.geo.fromstringYesPattern: ^[0-9a-f]\{16\}$.
profile.content.geo.latnumberYesBetween -90 and 90.
profile.content.geo.lngnumberYesBetween -180 and 180.
profile.content.geo.sourceenumYesOne of: "geocoder", "pin".
profile.content.hoursstringNoUp to 300 characters.
profile.content.humanBackupobjectYes—
profile.content.humanBackup.answerTimeoutSecondsintegerYesBetween 5 and 120. Default: 25.
profile.content.humanBackup.callbackTargetMinutesintegerYesBetween 5 and 10080. Default: 60.
profile.content.humanBackup.missedCallFollowUpbooleanNo—
profile.content.humanBackup.notetakerbooleanNo—
profile.content.humanBackup.notifyEmailsarray<string (email)>YesDefault: [].
profile.content.humanBackup.notifySmsarray<string>YesDefault: [].
profile.content.humanBackup.primaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.primaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.ringGroupIdstring (rgp_… ID)NoID (rgp_…)
profile.content.humanBackup.secondaryNumberstringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.humanBackup.secondaryRepUserIdstring (usr_… ID)NoID (usr_…)
profile.content.humanBackup.staffedHoursarray<object>YesDefault: [].
profile.content.humanBackup.transferLinestringNoUp to 300 characters.
profile.content.humanBackup.unavailableLinestringNoUp to 300 characters.
profile.content.meetingWindowsarray<object>YesDefault: [].
profile.content.meetingWindows[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
profile.content.meetingWindows[].endstring | constantYes—
profile.content.meetingWindows[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
profile.content.namestringYes1–120 characters.
profile.content.nearbyGroupIdsarray<string (grp_… ID)>YesUp to 10 items. Default: [].
profile.content.phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
profile.content.preRingNoticestringNo1–300 characters.
profile.content.pricePointsarray<any>NoRetired (ADR 0129). Ignored; prices are in the price book.
profile.content.replyToEmailstring (email)No—
profile.content.repsBySpecialtybooleanYesDefault: false.
profile.content.staffarray<object>YesDefault: [].
profile.content.staff[].biostringNoUp to 800 characters.
profile.content.staff[].crmUserIdstringNoUp to 64 characters.
profile.content.staff[].emailstring (email)No—
profile.content.staff[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.staff[].isDefaultIntrobooleanNo—
profile.content.staff[].namestringYes1–120 characters.
profile.content.staff[].photoUrlstring (uri) | string (uri)NoA https:// link to an uploaded file
profile.content.staff[].rolestringYes1–64 characters.
profile.content.staff[].servicesarray<string (srv_… ID)>NoUp to 50 items.
profile.content.staff[].takesMeetingsconstantNoAlways false.
profile.content.staff[].titlestringNoUp to 120 characters.
profile.content.staff[].userIdstring (usr_… ID)NoID (usr_…)
profile.content.staff[].videoobjectNo—
profile.content.surroundingsstringNoUp to 2000 characters.
profile.content.talkingPointsarray<object>YesDefault: [].
profile.content.talkingPoints[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
profile.content.talkingPoints[].textstringYes1–1000 characters.
profile.content.timeZonestringYes—
profile.createdAtstring (date-time)Yes—
profile.createdBystring (usr_… ID) | string (svc_… ID) | nullYes—
profile.fromDraftbooleanYes—
profile.groupIdstring (grp_… ID)YesID (grp_…)
profile.issuesarray<object>Yes—
profile.issues[].messagestringYes—
profile.issues[].pathstringYes—
profile.issues[].severityenumYesOne of: "error", "warning".
profile.notestring | nullYes—
profile.placeholdersarray<string>Yes—
profile.versionintegerYes—

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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

NameTypeRequiredDescription
groupIdstring (grp_… ID)YesID (grp_…)

Request body

application/json, required.

FieldTypeRequiredDescription
addressstringNoUp to 300 characters.
addressPartsobjectNo—
addressParts.citystringYes1–80 characters.
addressParts.countryenumNoOne of: "US", "CA", "MX". Default: "US".
addressParts.line1stringYes1–120 characters.
addressParts.line2stringNoUp to 120 characters.
addressParts.postalCodestringYes1–20 characters.
addressParts.regionstringYes1–40 characters.

Response 200

FieldTypeRequiredDescription
fromstring | nullYes—
resultobject | nullYes—
result.accuracyenumYesOne of: "rooftop", "street", "postal", "city".
result.latnumberYes—
result.lngnumberYes—
statusenumYesOne of: "found", "not_found", "unavailable", "no_address".

Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.

Example

bash
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"
  }
}'