API reference

Public

Public marketing site endpoints

MethodPathSummary
GET/v1/public/book/manage/{token}A booking by its manage link, to see, reschedule or cancel it
POST/v1/public/book/manage/{token}/cancelCancel a booking by its manage link
POST/v1/public/book/manage/{token}/rescheduleMove a booking to another open time on its page, by its manage link
GET/v1/public/book/manage/{token}/timesTimes a booking can move to on its page, by its manage link
GET/v1/public/book/{account}/{owner}A rep's or a community's booking pages, for their landing page
GET/v1/public/book/{account}/{owner}/{page}A booking page for rendering, or why it takes no bookings, or where it moved
POST/v1/public/book/{account}/{owner}/{page}/bookingsBook a time on a booking page. A repeat with the same request key returns the first booking
POST/v1/public/book/{account}/{owner}/{page}/eventsCount a view of a booking page, or a time picked on it, once per visitor a day
GET/v1/public/book/{account}/{owner}/{page}/timesOpen start times on a booking page in a range (a month at most), for one length, and on a group page one service or member
POST/v1/public/coupons/checkWhether a promo code can be used at sign-up, and what it gives
POST/v1/public/demo-requestsRequest a demo or early access from the marketing site
GET/v1/public/email/unsubscribe/{token}The page an unsubscribe link opens: one button, so a link scanner changes nothing
POST/v1/public/email/unsubscribe/{token}Unsubscribe from caller email (RFC 8058 one-click)
GET/v1/public/mobile-configThe mobile app's lock timings and minimum version
GET/v1/public/pages/{token}A caller's follow-up page, by link token: state, theme and the resolved modules. Expired and revoked links return the neutral page; an unknown link is a 404
POST/v1/public/pages/{token}/bookingBook, move or cancel this caller's meeting from their page. Booking and moving go through the playbook's own booking rules; cancelling needs no rule's permission
POST/v1/public/pages/{token}/eventsRecord what a visitor did on their follow-up page: one of the contract's event types and an optional module, never free text
POST/v1/public/pages/{token}/formAnswer the pre-visit questions on a follow-up page. Every question is optional, and sending again replaces the previous answers
POST/v1/public/pages/{token}/shareMint a link the caller can send to family. It opens a limited view with no personal detail, and expires sooner than the page itself
GET/v1/public/pages/{token}/slotsTimes this caller may book from their page, decided by the same booking rules the agent used
POST/v1/public/signupsStart a self-serve trial: the confirmation link is emailed. The answer is the same for an address that already has a login

A booking by its manage link, to see, reschedule or cancel it#

GET /v1/public/book/manage/{token}

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Response 200

FieldTypeRequiredDescription
brandany | nullYes—
canChangebooleanYes—
cancelledByenum | nullYesOne of: "caller", "rep", "admin", "calendar".
durationintegerYes—
endstring | nullYes—
groupNamestringYes—
groupPhonestring | nullYes—
pagePathstring | nullYes—
repNamestringYes—
startstringYes—
statusenumYesOne of: "upcoming", "past", "cancelled".
timeZonestringYes—
titlestringYes—
wherestringYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}"

Cancel a booking by its manage link#

POST /v1/public/book/manage/{token}/cancel

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Response 200

FieldTypeRequiredDescription
brandany | nullYes—
canChangebooleanYes—
cancelledByenum | nullYesOne of: "caller", "rep", "admin", "calendar".
durationintegerYes—
endstring | nullYes—
groupNamestringYes—
groupPhonestring | nullYes—
pagePathstring | nullYes—
repNamestringYes—
startstringYes—
statusenumYesOne of: "upcoming", "past", "cancelled".
timeZonestringYes—
titlestringYes—
wherestringYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}/cancel"

Move a booking to another open time on its page, by its manage link#

POST /v1/public/book/manage/{token}/reschedule

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Request body

application/json, required.

FieldTypeRequiredDescription
startAtstring (date-time)Yes—

Response 200

FieldTypeRequiredDescription
brandany | nullYes—
canChangebooleanYes—
cancelledByenum | nullYesOne of: "caller", "rep", "admin", "calendar".
durationintegerYes—
endstring | nullYes—
groupNamestringYes—
groupPhonestring | nullYes—
pagePathstring | nullYes—
repNamestringYes—
startstringYes—
statusenumYesOne of: "upcoming", "past", "cancelled".
timeZonestringYes—
titlestringYes—
wherestringYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}/reschedule" \
  -H "Content-Type: application/json" \
  -d '{
  "startAt": "2026-01-15T15:30:00Z"
}'

Times a booking can move to on its page, by its manage link#

GET /v1/public/book/manage/{token}/times

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Query parameters

NameTypeRequiredDescription
fromstring (date-time)Yes—
tostring (date-time)Yes—
durationintegerYesBetween 5 and 240.
servicestringNoUp to 40 characters.
memberstringNoUp to 40 characters.

Response 200

FieldTypeRequiredDescription
timesarray<object>Yes—
times[].endstringYes—
times[].startstringYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/manage/{token}/times?from=2026-01-15T15:30:00Z&to=2026-01-15T15:30:00Z&duration=5"

A rep's or a community's booking pages, for their landing page#

GET /v1/public/book/{account}/{owner}

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
accountstringYes1–64 characters.
ownerstringYes1–64 characters.

Response 200

FieldTypeRequiredDescription
brandany | nullYes(variant 1)
groupobjectYes(variant 1)
group.namestringYes(variant 1)
group.phonestring | nullYes(variant 1)
kindenumYes(variant 1) One of: "personal", "group".
pagesarray<object>Yes(variant 1)
pages[].colorstring | nullYes(variant 1)
pages[].descriptionstringYes(variant 1)
pages[].durationsarray<integer>Yes(variant 1)
pages[].slugstringYes(variant 1)
pages[].titlestringYes(variant 1)
repobject | nullYes(variant 1)
rep.biostring | nullYes(variant 1)
rep.namestringYes(variant 1)
rep.photoUrlstring | nullYes(variant 1)
rep.titlestring | nullYes(variant 1)
statusconstantYes(variant 1) Always "open".
brandany | nullYes(variant 2)
groupobject | nullYes(variant 2)
group.namestringYes(variant 2)
group.phonestring | nullYes(variant 2)
repobject | nullYes(variant 2)
rep.namestringYes(variant 2)
statusconstantYes(variant 2) Always "unavailable".
pathstringYes(variant 3)
statusconstantYes(variant 3) Always "moved".

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}"

A booking page for rendering, or why it takes no bookings, or where it moved#

GET /v1/public/book/{account}/{owner}/{page}

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
accountstringYes1–64 characters.
ownerstringYes1–64 characters.
pagestringYes1–64 characters.

Query parameters

NameTypeRequiredDescription
fromstringNoUp to 64 characters.

Response 200

FieldTypeRequiredDescription
brandany | nullYes(variant 1)
groupobjectYes(variant 1)
group.namestringYes(variant 1)
group.phonestring | nullYes(variant 1)
kindenumYes(variant 1) One of: "personal", "group".
membersarray<object> | nullYes(variant 1)
members[].biostring | nullYes(variant 1)
members[].idstringYes(variant 1)
members[].namestringYes(variant 1)
members[].photoUrlstring | nullYes(variant 1)
members[].titlestring | nullYes(variant 1)
pageobjectYes(variant 1)
page.colorstring | nullYes(variant 1)
page.descriptionstringYes(variant 1)
page.durationsarray<integer>Yes(variant 1)
page.locationobjectYes(variant 1)
page.location.kindenumYes(variant 1) One of: "in_person", "phone_invitee", "phone_rep", "video", "custom".
page.location.labelstringYes(variant 1)
page.questionsarray<object>Yes(variant 1)
page.questions[].fieldKeystringNo(variant 1) 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
page.questions[].idstringYes(variant 1) 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
page.questions[].kindenumYes(variant 1) One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date".
page.questions[].labelstringYes(variant 1) 1–200 characters.
page.questions[].optionsarray<string>No(variant 1) Up to 20 items.
page.questions[].requiredbooleanYes(variant 1) Default: false.
page.requireEmailbooleanYes(variant 1)
page.requirePhonebooleanYes(variant 1)
page.textConsentstring | nullYes(variant 1)
page.titlestringYes(variant 1)
prefillobject | nullYes(variant 1)
prefill.emailstringNo(variant 1)
prefill.firstNamestringNo(variant 1)
prefill.lastNamestringNo(variant 1)
prefill.phonestringNo(variant 1)
repobject | nullYes(variant 1)
rep.biostring | nullYes(variant 1)
rep.namestringYes(variant 1)
rep.photoUrlstring | nullYes(variant 1)
rep.titlestring | nullYes(variant 1)
serviceobject | nullYes(variant 1)
service.descriptionstringYes(variant 1)
service.idstringYes(variant 1)
service.namestringYes(variant 1)
servicesarray<object> | nullYes(variant 1)
services[].descriptionstringYes(variant 1)
services[].idstringYes(variant 1)
services[].namestringYes(variant 1)
statusconstantYes(variant 1) Always "open".
timeZonestringYes(variant 1)
windowobjectYes(variant 1)
window.endstringYes(variant 1)
window.startstringYes(variant 1)
yourRepobject | nullYes(variant 1)
yourRep.biostring | nullYes(variant 1)
yourRep.idstringYes(variant 1)
yourRep.namestringYes(variant 1)
yourRep.photoUrlstring | nullYes(variant 1)
yourRep.titlestring | nullYes(variant 1)
brandany | nullYes(variant 2)
groupobject | nullYes(variant 2)
group.namestringYes(variant 2)
group.phonestring | nullYes(variant 2)
repobject | nullYes(variant 2)
rep.namestringYes(variant 2)
statusconstantYes(variant 2) Always "unavailable".
pathstringYes(variant 3)
statusconstantYes(variant 3) Always "moved".

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}"

Book a time on a booking page. A repeat with the same request key returns the first booking#

POST /v1/public/book/{account}/{owner}/{page}/bookings

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
accountstringYes1–64 characters.
ownerstringYes1–64 characters.
pagestringYes1–64 characters.

Request body

application/json, required.

FieldTypeRequiredDescription
answersmapNoDefault: \{\}.
answers.{key}string | array<string> | booleanNoAny key.
botTokenstringNoUp to 2048 characters.
durationintegerYesBetween 5 and 240.
emailstring (email)NoUp to 200 characters.
firstNamestringYes1–80 characters.
followUpstringNoUp to 64 characters.
formMsintegerYesMinimum 0.
fromstringNoUp to 64 characters.
lastNamestringNo1–80 characters.
memberstringNoUp to 40 characters.
phonestringNoPattern: ^\+[1-9]\d\{6,14\}$.
requestKeystringYes16–64 characters.
servicestringNoUp to 40 characters.
startAtstring (date-time)Yes—
textConsentbooleanNo—
timeZonestringYes1–64 characters.
utmobjectNo—
utm.campaignstringNo1–200 characters.
utm.contentstringNo1–200 characters.
utm.mediumstringNo1–200 characters.
utm.sourcestringNo1–200 characters.
utm.termstringNo1–200 characters.
viaenumNoOne of: "link", "inline", "popup".
websitestringNoUp to 200 characters.

Response 201

FieldTypeRequiredDescription
bookingobjectYes—
booking.endstringYes—
booking.groupNamestringYes—
booking.idstringYes—
booking.repNamestringYes—
booking.startstringYes—
booking.titlestringYes—
booking.wherestringYes—
manageTokenstringYes—
redirectUrlstring | nullYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}/bookings" \
  -H "Content-Type: application/json" \
  -d '{
  "startAt": "2026-01-15T15:30:00Z",
  "duration": 5,
  "firstName": "string",
  "timeZone": "string",
  "requestKey": "string",
  "formMs": 0
}'

Count a view of a booking page, or a time picked on it, once per visitor a day#

POST /v1/public/book/{account}/{owner}/{page}/events

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
accountstringYes1–64 characters.
ownerstringYes1–64 characters.
pagestringYes1–64 characters.

Request body

application/json, required.

FieldTypeRequiredDescription
kindenumYesOne of: "view", "picked".

Response 204

No content.

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}/events" \
  -H "Content-Type: application/json" \
  -d '{
  "kind": "view"
}'

Open start times on a booking page in a range (a month at most), for one length, and on a group page one service or member#

GET /v1/public/book/{account}/{owner}/{page}/times

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
accountstringYes1–64 characters.
ownerstringYes1–64 characters.
pagestringYes1–64 characters.

Query parameters

NameTypeRequiredDescription
fromstring (date-time)Yes—
tostring (date-time)Yes—
durationintegerYesBetween 5 and 240.
servicestringNoUp to 40 characters.
memberstringNoUp to 40 characters.

Response 200

FieldTypeRequiredDescription
timesarray<object>Yes—
times[].endstringYes—
times[].startstringYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/book/{account}/{owner}/{page}/times?from=2026-01-15T15:30:00Z&to=2026-01-15T15:30:00Z&duration=5"

Whether a promo code can be used at sign-up, and what it gives#

POST /v1/public/coupons/check

Authentication: None. This endpoint does not take an access token.

Request body

application/json, required.

FieldTypeRequiredDescription
codestringYes—
planIdstring (plan_… ID)NoID (plan_…)

Response 200

FieldTypeRequiredDescription
summarystringYes(variant 1)
validenumYes(variant 1) One of: true.
messagestringYes(variant 2)
validenumYes(variant 2) One of: false.

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/coupons/check" \
  -H "Content-Type: application/json" \
  -d '{
  "code": "string"
}'

Request a demo or early access from the marketing site#

POST /v1/public/demo-requests

Authentication: None. This endpoint does not take an access token.

Request body

application/json, required.

FieldTypeRequiredDescription
communitiesstringNoUp to 40 characters.
crmstringNoUp to 80 characters.
emailstring (email)YesUp to 254 characters.
interestsarray<enum>NoItems: "voice", "chat", "booking", "follow_up", "insights", "sales_team", "api". Up to 7 items.
kindenumNoOne of: "demo", "early_access". Default: "demo".
namestringYes1–120 characters.
notestringNoUp to 1000 characters.
organizationstringYes1–160 characters.
rolestringNoUp to 80 characters.
websitestringNoUp to 500 characters.

Response 202

FieldTypeRequiredDescription
statusenumYesOne of: "received".

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/demo-requests" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "email": "[email protected]",
  "organization": "string"
}'

The page an unsubscribe link opens: one button, so a link scanner changes nothing#

GET /v1/public/email/unsubscribe/{token}

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes10–200 characters.

Response 200

No content.

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/email/unsubscribe/{token}"

Unsubscribe from caller email (RFC 8058 one-click)#

POST /v1/public/email/unsubscribe/{token}

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes10–200 characters.

Response 200

No content.

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/email/unsubscribe/{token}"

The mobile app's lock timings and minimum version#

GET /v1/public/mobile-config

Authentication: None. This endpoint does not take an access token.

Response 200

FieldTypeRequiredDescription
lockobjectYes—
lock.backgroundSecondsintegerYesBetween 0 and 900.
lock.fullSignInDaysintegerYesBetween 1 and 90.
lock.idleSecondsintegerYesBetween 60 and 1800.
lock.maxFailedUnlocksintegerYesBetween 3 and 10.
minVersionstringYesPattern: ^\d\{1,4\}\.\d\{1,4\}\.\d\{1,6\}$.

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/mobile-config"

A caller's follow-up page, by link token: state, theme and the resolved modules. Expired and revoked links return the neutral page; an unknown link is a 404#

GET /v1/public/pages/{token}

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Response 200

FieldTypeRequiredDescription
bookingPageUrlstringNo(variant 1)
canobjectYes(variant 1)
can.bookbooleanYes(variant 1)
can.cancelbooleanYes(variant 1)
can.reschedulebooleanYes(variant 1)
chatbooleanYes(variant 1)
firstNamestring | nullYes(variant 1)
groupNamestringYes(variant 1)
leadstring | nullYes(variant 1)
modulesarray<object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object>Yes(variant 1)
modules[].dayLabelstringYes(variant 1) (variant 1)
modules[].durationLabelstring | nullYes(variant 1) (variant 1)
modules[].endAtstringYes(variant 1) (variant 1)
modules[].headingstringYes(variant 1) (variant 1)
modules[].idconstantYes(variant 1) (variant 1) Always "meeting_card".
modules[].locationstring | nullYes(variant 1) (variant 1)
modules[].staffNamestring | nullYes(variant 1) (variant 1)
modules[].startAtstringYes(variant 1) (variant 1)
modules[].statusenumYes(variant 1) (variant 1) One of: "confirmed", "cancelled".
modules[].timeLabelstringYes(variant 1) (variant 1)
modules[].whenstringYes(variant 1) (variant 1)
modules[].biostring | nullYes(variant 1) (variant 2)
modules[].headingstringYes(variant 1) (variant 2)
modules[].idconstantYes(variant 1) (variant 2) Always "staff_intro".
modules[].namestringYes(variant 1) (variant 2)
modules[].photoUrlstring (uri) | nullYes(variant 1) (variant 2)
modules[].titlestring | nullYes(variant 1) (variant 2)
modules[].videoobject | nullYes(variant 1) (variant 2)
modules[].video.captionsUrlstring (uri) | nullYes(variant 1) (variant 2)
modules[].video.kindenumYes(variant 1) (variant 2) One of: "upload", "youtube", "vimeo", "loom".
modules[].video.urlstring (uri)Yes(variant 1) (variant 2)
modules[].headingstringYes(variant 1) (variant 3)
modules[].idconstantYes(variant 1) (variant 3) Always "recap".
modules[].notedarray<object>Yes(variant 1) (variant 3)
modules[].noted[].labelstringYes(variant 1) (variant 3)
modules[].noted[].valuestringYes(variant 1) (variant 3)
modules[].summarystringYes(variant 1) (variant 3)
modules[].headingstringYes(variant 1) (variant 4)
modules[].idconstantYes(variant 1) (variant 4) Always "open_questions".
modules[].questionsarray<string>Yes(variant 1) (variant 4)
modules[].headingstringYes(variant 1) (variant 5)
modules[].idconstantYes(variant 1) (variant 5) Always "pricing".
modules[].servicesarray<object>Yes(variant 1) (variant 5)
modules[].services[].askedbooleanYes(variant 1) (variant 5)
modules[].services[].linestringYes(variant 1) (variant 5)
modules[].services[].namestringYes(variant 1) (variant 5)
modules[].specialsarray<object>Yes(variant 1) (variant 5)
modules[].specials[].endsOnstring | nullYes(variant 1) (variant 5)
modules[].specials[].itemsarray<object>No(variant 1) (variant 5)
modules[].specials[].items[].altTextstringYes(variant 1) (variant 5)
modules[].specials[].items[].captionstring | nullYes(variant 1) (variant 5)
modules[].specials[].items[].detailsstring | nullYes(variant 1) (variant 5)
modules[].specials[].items[].kindenumYes(variant 1) (variant 5) One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo".
modules[].specials[].items[].previewUrlstring (uri) | nullYes(variant 1) (variant 5)
modules[].specials[].items[].titlestringYes(variant 1) (variant 5)
modules[].specials[].items[].urlstring (uri)Yes(variant 1) (variant 5)
modules[].specials[].linestringYes(variant 1) (variant 5)
modules[].specials[].titlestringYes(variant 1) (variant 5)
modules[].headingstringYes(variant 1) (variant 6)
modules[].idconstantYes(variant 1) (variant 6) Always "service_media".
modules[].servicesarray<object>Yes(variant 1) (variant 6)
modules[].services[].itemsarray<object>Yes(variant 1) (variant 6)
modules[].services[].items[].altTextstringYes(variant 1) (variant 6)
modules[].services[].items[].captionstring | nullYes(variant 1) (variant 6)
modules[].services[].items[].detailsstring | nullYes(variant 1) (variant 6)
modules[].services[].items[].kindenumYes(variant 1) (variant 6) One of: "photo", "floor_plan", "brochure", "video", "tour", "document", "logo".
modules[].services[].items[].previewUrlstring (uri) | nullYes(variant 1) (variant 6)
modules[].services[].items[].titlestringYes(variant 1) (variant 6)
modules[].services[].items[].urlstring (uri)Yes(variant 1) (variant 6)
modules[].services[].namestringYes(variant 1) (variant 6)
modules[].cardsarray<object>Yes(variant 1) (variant 7)
modules[].cards[].bodystringYes(variant 1) (variant 7)
modules[].cards[].buttonobject | nullYes(variant 1) (variant 7)
modules[].cards[].button.labelstringYes(variant 1) (variant 7)
modules[].cards[].button.urlstring (uri)Yes(variant 1) (variant 7)
modules[].cards[].idstringYes(variant 1) (variant 7)
modules[].cards[].imageUrlstring (uri) | nullYes(variant 1) (variant 7)
modules[].cards[].titlestringYes(variant 1) (variant 7)
modules[].headingstringYes(variant 1) (variant 7)
modules[].idconstantYes(variant 1) (variant 7) Always "content_cards".
modules[].accessibilitystring | nullYes(variant 1) (variant 8)
modules[].addressstring | nullYes(variant 1) (variant 8)
modules[].entrancestring | nullYes(variant 1) (variant 8)
modules[].headingstringYes(variant 1) (variant 8)
modules[].idconstantYes(variant 1) (variant 8) Always "getting_here".
modules[].mapUrlstring (uri) | nullYes(variant 1) (variant 8)
modules[].nearbystring | nullYes(variant 1) (variant 8)
modules[].parkingstring | nullYes(variant 1) (variant 8)
modules[].bodystring | nullYes(variant 1) (variant 9)
modules[].checklistarray<string>Yes(variant 1) (variant 9)
modules[].headingstringYes(variant 1) (variant 9)
modules[].idconstantYes(variant 1) (variant 9) Always "prep".
modules[].answersmapYes(variant 1) (variant 10)
modules[].answers.{key}string | booleanNo(variant 1) (variant 10) Any key.
modules[].fieldsarray<object>Yes(variant 1) (variant 10)
modules[].fields[].idstringYes(variant 1) (variant 10)
modules[].fields[].labelstringYes(variant 1) (variant 10)
modules[].fields[].optionsarray<string>Yes(variant 1) (variant 10)
modules[].fields[].typeenumYes(variant 1) (variant 10) One of: "text", "choice", "boolean".
modules[].headingstringYes(variant 1) (variant 10)
modules[].idconstantYes(variant 1) (variant 10) Always "pre_visit_form".
modules[].introstring | nullYes(variant 1) (variant 10)
modules[].headingstringYes(variant 1) (variant 11)
modules[].idconstantYes(variant 1) (variant 11) Always "gallery".
modules[].photosarray<object>Yes(variant 1) (variant 11)
modules[].photos[].altTextstringNo(variant 1) (variant 11)
modules[].photos[].captionstring | nullYes(variant 1) (variant 11)
modules[].photos[].urlstring (uri)Yes(variant 1) (variant 11)
modules[].tourUrlstring (uri) | nullYes(variant 1) (variant 11)
modules[].headingstringYes(variant 1) (variant 12)
modules[].idconstantYes(variant 1) (variant 12) Always "reviews".
modules[].reviewsarray<object>Yes(variant 1) (variant 12)
modules[].reviews[].attributionstring | nullYes(variant 1) (variant 12)
modules[].reviews[].idstringYes(variant 1) (variant 12)
modules[].reviews[].quotestringYes(variant 1) (variant 12)
modules[].headingstringYes(variant 1) (variant 13)
modules[].idconstantYes(variant 1) (variant 13) Always "resources".
modules[].resourcesarray<object>Yes(variant 1) (variant 13)
modules[].resources[].descriptionstring | nullYes(variant 1) (variant 13)
modules[].resources[].idstringYes(variant 1) (variant 13)
modules[].resources[].labelstringYes(variant 1) (variant 13)
modules[].resources[].urlstring (uri)Yes(variant 1) (variant 13)
modules[].blockIdstringYes(variant 1) (variant 14)
modules[].bodystring | nullYes(variant 1) (variant 14)
modules[].buttonobject | nullYes(variant 1) (variant 14)
modules[].button.labelstringYes(variant 1) (variant 14)
modules[].button.urlstring (uri)Yes(variant 1) (variant 14)
modules[].headingstringYes(variant 1) (variant 14)
modules[].idconstantYes(variant 1) (variant 14) Always "custom_block".
modules[].imageUrlstring (uri) | nullYes(variant 1) (variant 14)
modules[].videoobject | nullYes(variant 1) (variant 14)
modules[].video.captionsUrlstring (uri) | nullYes(variant 1) (variant 14)
modules[].video.kindenumYes(variant 1) (variant 14) One of: "upload", "youtube", "vimeo", "loom".
modules[].video.urlstring (uri)Yes(variant 1) (variant 14)
modules[].headingstringYes(variant 1) (variant 15)
modules[].idconstantYes(variant 1) (variant 15) Always "share".
modules[].notestringYes(variant 1) (variant 15)
modules[].groupNamestringYes(variant 1) (variant 16)
modules[].headingstringYes(variant 1) (variant 16)
modules[].hoursstring | nullYes(variant 1) (variant 16)
modules[].idconstantYes(variant 1) (variant 16) Always "contact".
modules[].phonestring | nullYes(variant 1) (variant 16)
modules[].headingstringYes(variant 1) (variant 17)
modules[].idconstantYes(variant 1) (variant 17) Always "visit_photos".
modules[].photosarray<object>Yes(variant 1) (variant 17)
modules[].photos[].altTextstringYes(variant 1) (variant 17)
modules[].photos[].captionstring | nullYes(variant 1) (variant 17)
modules[].photos[].downloadUrlstring (uri)Yes(variant 1) (variant 17)
modules[].photos[].heightinteger | nullYes(variant 1) (variant 17)
modules[].photos[].largeUrlstring (uri)Yes(variant 1) (variant 17)
modules[].photos[].thumbUrlstring (uri)Yes(variant 1) (variant 17)
modules[].photos[].widthinteger | nullYes(variant 1) (variant 17)
stateenumYes(variant 1) One of: "upcoming", "day_of", "after_visit", "no_booking", "cancelled".
themeobjectYes(variant 1)
theme.accentstringYes(variant 1)
theme.backgroundstringYes(variant 1)
theme.fontenumYes(variant 1) One of: "system", "serif_warm", "sans_modern".
theme.logoUrlstring (uri) | nullYes(variant 1)
theme.primarystringYes(variant 1)
timeZonestringYes(variant 1)
groupNamestringYes(variant 2)
modulesarray<object | object | object | object | object | object | object | object | object | object>Yes(variant 2)
modules[].dayLabelstringYes(variant 2) (variant 1)
modules[].durationLabelstring | nullYes(variant 2) (variant 1)
modules[].headingstringYes(variant 2) (variant 1)
modules[].idconstantYes(variant 2) (variant 1) Always "meeting_card".
modules[].statusenumYes(variant 2) (variant 1) One of: "confirmed", "cancelled".
modules[].timeLabelstringYes(variant 2) (variant 1)
modules[].whenstringYes(variant 2) (variant 1)
modules[].biostring | nullYes(variant 2) (variant 2)
modules[].headingstringYes(variant 2) (variant 2)
modules[].idconstantYes(variant 2) (variant 2) Always "staff_intro".
modules[].namestringYes(variant 2) (variant 2)
modules[].photoUrlstring (uri) | nullYes(variant 2) (variant 2)
modules[].titlestring | nullYes(variant 2) (variant 2)
modules[].videoobject | nullYes(variant 2) (variant 2)
modules[].video.captionsUrlstring (uri) | nullYes(variant 2) (variant 2)
modules[].video.kindenumYes(variant 2) (variant 2) One of: "upload", "youtube", "vimeo", "loom".
modules[].video.urlstring (uri)Yes(variant 2) (variant 2)
modules[].cardsarray<object>Yes(variant 2) (variant 3)
modules[].cards[].bodystringYes(variant 2) (variant 3)
modules[].cards[].buttonobject | nullYes(variant 2) (variant 3)
modules[].cards[].button.labelstringYes(variant 2) (variant 3)
modules[].cards[].button.urlstring (uri)Yes(variant 2) (variant 3)
modules[].cards[].idstringYes(variant 2) (variant 3)
modules[].cards[].imageUrlstring (uri) | nullYes(variant 2) (variant 3)
modules[].cards[].titlestringYes(variant 2) (variant 3)
modules[].headingstringYes(variant 2) (variant 3)
modules[].idconstantYes(variant 2) (variant 3) Always "content_cards".
modules[].accessibilitystring | nullYes(variant 2) (variant 4)
modules[].addressstring | nullYes(variant 2) (variant 4)
modules[].entrancestring | nullYes(variant 2) (variant 4)
modules[].headingstringYes(variant 2) (variant 4)
modules[].idconstantYes(variant 2) (variant 4) Always "getting_here".
modules[].mapUrlstring (uri) | nullYes(variant 2) (variant 4)
modules[].nearbystring | nullYes(variant 2) (variant 4)
modules[].parkingstring | nullYes(variant 2) (variant 4)
modules[].headingstringYes(variant 2) (variant 5)
modules[].idconstantYes(variant 2) (variant 5) Always "gallery".
modules[].photosarray<object>Yes(variant 2) (variant 5)
modules[].photos[].altTextstringNo(variant 2) (variant 5)
modules[].photos[].captionstring | nullYes(variant 2) (variant 5)
modules[].photos[].urlstring (uri)Yes(variant 2) (variant 5)
modules[].tourUrlstring (uri) | nullYes(variant 2) (variant 5)
modules[].headingstringYes(variant 2) (variant 6)
modules[].idconstantYes(variant 2) (variant 6) Always "reviews".
modules[].reviewsarray<object>Yes(variant 2) (variant 6)
modules[].reviews[].attributionstring | nullYes(variant 2) (variant 6)
modules[].reviews[].idstringYes(variant 2) (variant 6)
modules[].reviews[].quotestringYes(variant 2) (variant 6)
modules[].headingstringYes(variant 2) (variant 7)
modules[].idconstantYes(variant 2) (variant 7) Always "resources".
modules[].resourcesarray<object>Yes(variant 2) (variant 7)
modules[].resources[].descriptionstring | nullYes(variant 2) (variant 7)
modules[].resources[].idstringYes(variant 2) (variant 7)
modules[].resources[].labelstringYes(variant 2) (variant 7)
modules[].resources[].urlstring (uri)Yes(variant 2) (variant 7)
modules[].blockIdstringYes(variant 2) (variant 8)
modules[].bodystring | nullYes(variant 2) (variant 8)
modules[].buttonobject | nullYes(variant 2) (variant 8)
modules[].button.labelstringYes(variant 2) (variant 8)
modules[].button.urlstring (uri)Yes(variant 2) (variant 8)
modules[].headingstringYes(variant 2) (variant 8)
modules[].idconstantYes(variant 2) (variant 8) Always "custom_block".
modules[].imageUrlstring (uri) | nullYes(variant 2) (variant 8)
modules[].videoobject | nullYes(variant 2) (variant 8)
modules[].video.captionsUrlstring (uri) | nullYes(variant 2) (variant 8)
modules[].video.kindenumYes(variant 2) (variant 8) One of: "upload", "youtube", "vimeo", "loom".
modules[].video.urlstring (uri)Yes(variant 2) (variant 8)
modules[].groupNamestringYes(variant 2) (variant 9)
modules[].headingstringYes(variant 2) (variant 9)
modules[].hoursstring | nullYes(variant 2) (variant 9)
modules[].idconstantYes(variant 2) (variant 9) Always "contact".
modules[].phonestring | nullYes(variant 2) (variant 9)
modules[].headingstringYes(variant 2) (variant 10)
modules[].idconstantYes(variant 2) (variant 10) Always "visit_photos".
modules[].photosarray<object>Yes(variant 2) (variant 10)
modules[].photos[].altTextstringYes(variant 2) (variant 10)
modules[].photos[].captionstring | nullYes(variant 2) (variant 10)
modules[].photos[].downloadUrlstring (uri)Yes(variant 2) (variant 10)
modules[].photos[].heightinteger | nullYes(variant 2) (variant 10)
modules[].photos[].largeUrlstring (uri)Yes(variant 2) (variant 10)
modules[].photos[].thumbUrlstring (uri)Yes(variant 2) (variant 10)
modules[].photos[].widthinteger | nullYes(variant 2) (variant 10)
stateconstantYes(variant 2) Always "shared".
themeobjectYes(variant 2)
theme.accentstringYes(variant 2)
theme.backgroundstringYes(variant 2)
theme.fontenumYes(variant 2) One of: "system", "serif_warm", "sans_modern".
theme.logoUrlstring (uri) | nullYes(variant 2)
theme.primarystringYes(variant 2)
groupNamestringYes(variant 3)
phonestring | nullYes(variant 3)
stateenumYes(variant 3) One of: "expired", "revoked".

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/pages/{token}"

Book, move or cancel this caller's meeting from their page. Booking and moving go through the playbook's own booking rules; cancelling needs no rule's permission#

POST /v1/public/pages/{token}/booking

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Request body

application/json, required.

FieldTypeRequiredDescription
actionenumYesOne of: "book", "reschedule", "cancel".
startAtstring (date-time)No—

Response 200

FieldTypeRequiredDescription
donebooleanYes—
messagestringYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/booking" \
  -H "Content-Type: application/json" \
  -d '{
  "action": "book"
}'

Record what a visitor did on their follow-up page: one of the contract's event types and an optional module, never free text#

POST /v1/public/pages/{token}/events

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Request body

application/json, required.

FieldTypeRequiredDescription
moduleIdstringNoUp to 80 characters.
positionintegerNoBetween 1 and 10000.
typeenumYesOne of: "opened", "module_viewed", "link_clicked", "calendar_added", "video_played", "form_submitted", "shared", "booked", "rescheduled", "cancelled", "visit_photos_viewed", "visit_photo_downloaded".

Response 202

FieldTypeRequiredDescription
recordedbooleanYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/events" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "opened"
}'

Answer the pre-visit questions on a follow-up page. Every question is optional, and sending again replaces the previous answers#

POST /v1/public/pages/{token}/form

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Request body

application/json, required.

FieldTypeRequiredDescription
answersmapYes—
answers.{key}string | booleanNoAny key.

Response 200

FieldTypeRequiredDescription
savedbooleanYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/form" \
  -H "Content-Type: application/json" \
  -d '{
  "answers": {}
}'

Mint a link the caller can send to family. It opens a limited view with no personal detail, and expires sooner than the page itself#

POST /v1/public/pages/{token}/share

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Response 200

FieldTypeRequiredDescription
expiresAtstring (date-time)Yes—
urlstring (uri)Yes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/pages/{token}/share"

Times this caller may book from their page, decided by the same booking rules the agent used#

GET /v1/public/pages/{token}/slots

Authentication: None. This endpoint does not take an access token.

Path parameters

NameTypeRequiredDescription
tokenstringYes1–64 characters.

Response 200

FieldTypeRequiredDescription
reasonstring | nullYes—
slotsarray<object>Yes—
slots[].endstring (date-time)Yes—
slots[].staffNamestring | nullYes—
slots[].startstring (date-time)Yes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/public/pages/{token}/slots"

Start a self-serve trial: the confirmation link is emailed. The answer is the same for an address that already has a login#

POST /v1/public/signups

Authentication: None. This endpoint does not take an access token.

Request body

application/json, required.

FieldTypeRequiredDescription
acceptTermsenumYesOne of: true.
botTokenstringYesUp to 2048 characters.
codestringNoUp to 40 characters.
companystringYes2–120 characters.
emailstring (email)YesUp to 254 characters.
groupWordenumNoOne of: "community", "location", "office", "practice", "branch". Default: "community".
namestringYes1–120 characters.
phonestring | nullNoPattern: ^\+[1-9]\d\{7,14\}$.
planIdstring (plan_… ID)NoID (plan_…)
utmobjectNo—
utm.campaignstringNoUp to 120 characters.
utm.contentstringNoUp to 120 characters.
utm.mediumstringNoUp to 120 characters.
utm.sourcestringNoUp to 120 characters.
utm.termstringNoUp to 120 characters.
websitestringNoUp to 500 characters.

Response 202

FieldTypeRequiredDescription
statusenumYesOne of: "check_email".

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/public/signups" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "email": "[email protected]",
  "company": "string",
  "botToken": "string",
  "acceptTerms": true
}'