API reference

Account

Account settings and team

MethodPathSummary
GET/v1/accountThe account: name, vocabulary, lexicon and settings
PATCH/v1/accountChange the account name, vocabulary, lexicon, settings or recording policy (owner only)
GET/v1/account/api-tokensEvery API token in the account, whose it is, and when it was last used
DELETE/v1/account/api-tokens/{tokenId}Revoke any token in the account. It stops working at once
POST/v1/account/billing/cancelCancel (owner only): the plan runs to the end of the billing period; a trial ends at once
DELETE/v1/account/billing/cancelKeep a plan that was set to end (owner only)
POST/v1/account/billing/cardPut a card on file: a Stripe Checkout page in setup mode (owner only)
POST/v1/account/billing/couponUse a promo code on this account (owner only)
GET/v1/account/billing/couponsThe promo codes this account has used, and what each gave
GET/v1/account/billing/planWhat the account’s plan includes and costs: its own prices, number limit and allowances
POST/v1/account/billing/planChange plan (owner only): at once in a trial or for a higher fee, otherwise from the next billing period
POST/v1/account/billing/plan-requestAsk our team to move a sales-led account to another plan (owner only); nothing changes until they do
GET/v1/account/billing/plansThe plans a self-serve account can choose, with their prices
POST/v1/account/billing/portalChange the card on file in Stripe's billing portal (owner only)
GET/v1/account/billing/subscriptionThe plan, the trial and its days left, and the trial allowances used
POST/v1/account/booking-pages/{pageId}/pausePause anyone's booking page. The rep is told and cannot resume it themselves
POST/v1/account/booking-pages/{pageId}/resumeResume anyone's booking page. The rep is told
GET/v1/account/entitlementsThe features this account has, and where each came from
GET/v1/account/mcp-policyThe account's rules for connected apps
PUT/v1/account/mcp-policyWhether members may connect apps, who may give write access, and which apps (owners and admins). Takes effect within a minute, without revoking anything
GET/v1/account/membersTeam members
POST/v1/account/membersInvite a team member by email (owner only)
PATCH/v1/account/members/{memberId}Change a member role or group scope (owner only)
POST/v1/account/members/{memberId}/deactivateDeactivate a member: their login is blocked at once (owner only)
POST/v1/account/members/{memberId}/reactivateGive a deactivated member their access back (owner only)
POST/v1/account/members/{memberId}/resend-inviteSend the invite email again (owner only)
GET/v1/account/oauth-grantsEvery app connected to the account, and who connected it
DELETE/v1/account/oauth-grants/{grantId}Take access away from any app connected to the account
GET/v1/account/reps/{userId}/booking-pagesA member's booking pages, to pause or resume them
GET/v1/account/sample-dataThe sample community and playbook, whether they are hidden, and what blocks hiding
PUT/v1/account/sample-dataHide or show the sample data (owner only). Nothing is deleted
POST/v1/account/sample-data/keepKeep a sample community or playbook as an ordinary record. Keeping a community keeps the sample playbook it runs
GET/v1/account/service-identitiesSoftware the account lets in, each with a role ceiling
POST/v1/account/service-identitiesMake a service identity for software, with a role ceiling no higher than your own and an optional group limit
PATCH/v1/account/service-identities/{identityId}Rename a service identity, or disable it: its tokens stop working until it is enabled again
GET/v1/account/service-identities/{identityId}/oauth-clientsA service identity's OAuth clients, for partners that expect client_credentials
POST/v1/account/service-identities/{identityId}/oauth-clientsGive a service identity an OAuth client that signs in with client_credentials at our authorization server. The secret is shown once
DELETE/v1/account/service-identities/{identityId}/oauth-clients/{clientId}Revoke a service identity’s OAuth client. Its access tokens stop working at once
POST/v1/account/service-identities/{identityId}/tokensGive a service identity a token, within its role ceiling. 365 days unless you choose; only an owner may choose no expiry
POST/v1/account/talk-to-salesAsk our team about a feature the account does not have (the locked state’s Talk to us)
GET/v1/account/visit-actionsOpen next steps from visits at my communities, soonest due first: who owns each, and which are overdue
GET/v1/account/visits/{bookingId}A visit at one of my communities: its notes, next steps, photo counts and where they stand. No photo links

The account: name, vocabulary, lexicon and settings#

GET /v1/account

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
complianceModebooleanYes—
createdAtstring (date-time)Yes—
idstring (acct_… ID)YesID (acct_…)
lexiconarray<object>YesUp to 200 items.
lexicon[].conceptstringYesUp to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$.
lexicon[].neverarray<string>YesUp to 50 items. Default: [].
lexicon[].phrasesarray<string>YesUp to 50 items. Default: [].
lexiconSuggestionsarray<object>Yes—
lexiconSuggestions[].conceptstringYes—
lexiconSuggestions[].countintegerYes—
lexiconSuggestions[].phrasestringYes—
namestringYes—
numberLimitintegerYes—
recordingPolicyenumYesOne of: "always", "never", "optional".
settingsAccountSettingsYes—
settings.loginSecurityLoginSecurityPolicyNo—
settings.loginSecurity.appliesToenumYesOne of: "owners_admins", "everyone". Default: "everyone".
settings.loginSecurity.enabledbooleanYesDefault: false.
settings.loginSecurity.methodsarray<enum>YesItems: "email", "sms", "totp", "passkey". Default: ["passkey","totp","sms","email"].
settings.notetakerobjectNo—
settings.notetaker.enabledbooleanYesDefault: true.
settings.notetaker.lockedOnbooleanYesDefault: false.
settings.pricingobjectNo—
settings.pricing.allowLocationServicesbooleanYesDefault: true.
settings.pricing.priceApprovalenumYesOne of: "off", "group_managers", "everyone". Default: "off".
settings.pricing.priceApprovalIncludesCrmbooleanYesDefault: false.
settings.pricing.priceReviewDaysintegerYesBetween 0 and 3650. Default: 90.
settings.spendAlertsobjectNo—
settings.spendAlerts.enabledbooleanYesDefault: true.
settings.spendAlerts.monthlyBudgetCentsintegerYesBetween 100 and 100000000.
settings.spendAlerts.thresholdsPercentarray<integer>YesUp to 5 items. Default: [80,100].
slugstringYes—
statusenumYesOne of: "active", "suspended", "deleted".
updatedAtstring (date-time)Yes—
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" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Change the account name, vocabulary, lexicon, settings or recording policy (owner only)#

PATCH /v1/account

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
dismissSuggestionsarray<object>NoUp to 50 items.
dismissSuggestions[].conceptstringYesUp to 80 characters.
dismissSuggestions[].phrasestringYesUp to 60 characters.
lexiconarray<object>NoUp to 200 items.
lexicon[].conceptstringYesUp to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$.
lexicon[].neverarray<string>NoUp to 50 items. Default: [].
lexicon[].phrasesarray<string>NoUp to 50 items. Default: [].
namestringNo1–120 characters.
recordingPolicyenumNoOne of: "always", "never", "optional".
settingsAccountSettingsInputNo—
settings.loginSecurityLoginSecurityPolicyInputNo—
settings.loginSecurity.appliesToenumNoOne of: "owners_admins", "everyone". Default: "everyone".
settings.loginSecurity.enabledbooleanNoDefault: false.
settings.loginSecurity.methodsarray<enum>NoItems: "email", "sms", "totp", "passkey". Default: ["passkey","totp","sms","email"].
settings.notetakerobjectNo—
settings.notetaker.enabledbooleanNoDefault: true.
settings.notetaker.lockedOnbooleanNoDefault: false.
settings.pricingobjectNo—
settings.pricing.allowLocationServicesbooleanNoDefault: true.
settings.pricing.priceApprovalenumNoOne of: "off", "group_managers", "everyone". Default: "off".
settings.pricing.priceApprovalIncludesCrmbooleanNoDefault: false.
settings.pricing.priceReviewDaysintegerNoBetween 0 and 3650. Default: 90.
settings.spendAlertsobjectNo—
settings.spendAlerts.enabledbooleanNoDefault: true.
settings.spendAlerts.monthlyBudgetCentsintegerYesBetween 100 and 100000000.
settings.spendAlerts.thresholdsPercentarray<integer>NoUp to 5 items. Default: [80,100].
vocabularyobjectNo—
vocabulary.contactstringNo1–40 characters.
vocabulary.contactPluralstringNo1–40 characters.
vocabulary.groupstringNo1–40 characters.
vocabulary.groupPluralstringNo1–40 characters.
vocabulary.meetingstringNo1–40 characters.
vocabulary.meetingPluralstringNo1–40 characters.
vocabulary.servicestringNo1–40 characters.
vocabulary.servicePluralstringNo1–40 characters.
vocabulary.specialstringNo1–40 characters.
vocabulary.specialPluralstringNo1–40 characters.

Response 200

FieldTypeRequiredDescription
complianceModebooleanYes—
createdAtstring (date-time)Yes—
idstring (acct_… ID)YesID (acct_…)
lexiconarray<object>YesUp to 200 items.
lexicon[].conceptstringYesUp to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$.
lexicon[].neverarray<string>YesUp to 50 items. Default: [].
lexicon[].phrasesarray<string>YesUp to 50 items. Default: [].
lexiconSuggestionsarray<object>Yes—
lexiconSuggestions[].conceptstringYes—
lexiconSuggestions[].countintegerYes—
lexiconSuggestions[].phrasestringYes—
namestringYes—
numberLimitintegerYes—
recordingPolicyenumYesOne of: "always", "never", "optional".
settingsAccountSettingsYes—
settings.loginSecurityLoginSecurityPolicyNo—
settings.loginSecurity.appliesToenumYesOne of: "owners_admins", "everyone". Default: "everyone".
settings.loginSecurity.enabledbooleanYesDefault: false.
settings.loginSecurity.methodsarray<enum>YesItems: "email", "sms", "totp", "passkey". Default: ["passkey","totp","sms","email"].
settings.notetakerobjectNo—
settings.notetaker.enabledbooleanYesDefault: true.
settings.notetaker.lockedOnbooleanYesDefault: false.
settings.pricingobjectNo—
settings.pricing.allowLocationServicesbooleanYesDefault: true.
settings.pricing.priceApprovalenumYesOne of: "off", "group_managers", "everyone". Default: "off".
settings.pricing.priceApprovalIncludesCrmbooleanYesDefault: false.
settings.pricing.priceReviewDaysintegerYesBetween 0 and 3650. Default: 90.
settings.spendAlertsobjectNo—
settings.spendAlerts.enabledbooleanYesDefault: true.
settings.spendAlerts.monthlyBudgetCentsintegerYesBetween 100 and 100000000.
settings.spendAlerts.thresholdsPercentarray<integer>YesUp to 5 items. Default: [80,100].
slugstringYes—
statusenumYesOne of: "active", "suspended", "deleted".
updatedAtstring (date-time)Yes—
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 PATCH "$ANSWERSTACK_API_URL/v1/account" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "dismissSuggestions": [
    {
      "concept": "string",
      "phrase": "string"
    }
  ],
  "lexicon": [
    {
      "concept": "string"
    }
  ],
  "name": "string",
  "recordingPolicy": "always",
  "settings": {
    "loginSecurity": {
      "appliesTo": "everyone",
      "enabled": false,
      "methods": [
        "passkey",
        "totp",
        "sms",
        "email"
      ]
    },
    "notetaker": {
      "enabled": true,
      "lockedOn": false
    },
    "pricing": {
      "allowLocationServices": true,
      "priceApproval": "off",
      "priceApprovalIncludesCrm": false,
      "priceReviewDays": 90
    },
    "spendAlerts": {
      "monthlyBudgetCents": 100
    }
  },
  "vocabulary": {
    "contact": "string",
    "contactPlural": "string",
    "group": "string",
    "groupPlural": "string",
    "meeting": "string",
    "meetingPlural": "string",
    "service": "string",
    "servicePlural": "string",
    "special": "string",
    "specialPlural": "string"
  }
}'

Every API token in the account, whose it is, and when it was last used#

GET /v1/account/api-tokens

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
tokensarray<ApiToken>Yes—
tokens[].createdAtstring (date-time)Yes—
tokens[].expiresAtstring (date-time) | nullYes—
tokens[].groupIdsarray<string (grp_… ID)> | nullYes—
tokens[].idstring (tok_… ID)YesID (tok_…)
tokens[].ipAllowlistarray<string> | nullYes—
tokens[].kindenumYesOne of: "personal", "service".
tokens[].lastFourstringYes—
tokens[].lastUsedAtstring (date-time) | nullYes—
tokens[].lastUsedIpstring | nullYes—
tokens[].namestringYes—
tokens[].prefixstringYes—
tokens[].scopesarray<string>Yes—
tokens[].serviceIdentityIdstring (svc_… ID) | nullYes—
tokens[].serviceIdentityNamestring | nullYes—
tokens[].userEmailstring | nullYes—
tokens[].userIdstring (usr_… ID) | nullYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/api-tokens" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Revoke any token in the account. It stops working at once#

DELETE /v1/account/api-tokens/{tokenId}

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
tokenIdstring (tok_… ID)YesID (tok_…)

Response 200

FieldTypeRequiredDescription
revokedenumYesOne of: true.

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

Example

bash
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/api-tokens/{tokenId}" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Cancel (owner only): the plan runs to the end of the billing period; a trial ends at once#

POST /v1/account/billing/cancel

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
notestringNoUp to 2000 characters.
reasonenumYesOne of: "too_expensive", "missing_features", "not_using", "switching", "technical_issues", "other".

Response 200

FieldTypeRequiredDescription
endsOnstringYes—
immediatebooleanYes—
subscriptionAccountSubscriptionYes—
subscription.allowanceobject | nullYes—
subscription.allowance.testCallMinutesobjectYes—
subscription.allowance.testCallMinutes.limitintegerYes—
subscription.allowance.testCallMinutes.usedintegerYes—
subscription.allowance.testChatMessagesobjectYes—
subscription.allowance.testChatMessages.limitintegerYes—
subscription.allowance.testChatMessages.usedintegerYes—
subscription.cancelAtstring | nullYes—
subscription.daysLeftinteger | nullYes—
subscription.endedByenum | nullYesOne of: "trial", "cancellation".
subscription.hasPaymentMethodbooleanYes—
subscription.motionenum | nullYesOne of: "self_serve", "sales".
subscription.planIdstring | nullYes—
subscription.planNamestring | nullYes—
subscription.scheduledPlanobject | nullYes—
subscription.scheduledPlan.idstringYes—
subscription.scheduledPlan.namestringYes—
subscription.scheduledPlan.onstringYes—
subscription.statusenumYesOne of: "trialing", "active", "past_due", "expired", "none".
subscription.trialEndsOnstring | nullYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/billing/cancel" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "too_expensive"
}'

Keep a plan that was set to end (owner only)#

DELETE /v1/account/billing/cancel

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
subscriptionAccountSubscriptionYes—
subscription.allowanceobject | nullYes—
subscription.allowance.testCallMinutesobjectYes—
subscription.allowance.testCallMinutes.limitintegerYes—
subscription.allowance.testCallMinutes.usedintegerYes—
subscription.allowance.testChatMessagesobjectYes—
subscription.allowance.testChatMessages.limitintegerYes—
subscription.allowance.testChatMessages.usedintegerYes—
subscription.cancelAtstring | nullYes—
subscription.daysLeftinteger | nullYes—
subscription.endedByenum | nullYesOne of: "trial", "cancellation".
subscription.hasPaymentMethodbooleanYes—
subscription.motionenum | nullYesOne of: "self_serve", "sales".
subscription.planIdstring | nullYes—
subscription.planNamestring | nullYes—
subscription.scheduledPlanobject | nullYes—
subscription.scheduledPlan.idstringYes—
subscription.scheduledPlan.namestringYes—
subscription.scheduledPlan.onstringYes—
subscription.statusenumYesOne of: "trialing", "active", "past_due", "expired", "none".
subscription.trialEndsOnstring | nullYes—

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

Example

bash
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/billing/cancel" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Put a card on file: a Stripe Checkout page in setup mode (owner only)#

POST /v1/account/billing/card

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
completedbooleanYes—
urlstringYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/billing/card" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Use a promo code on this account (owner only)#

POST /v1/account/billing/coupon

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
codestringYes—

Response 200

FieldTypeRequiredDescription
couponUsedCouponYes—
coupon.namestringYes—
coupon.redeemedAtstring (date-time)Yes—
coupon.summarystringYes—
subscriptionAccountSubscriptionYes—
subscription.allowanceobject | nullYes—
subscription.allowance.testCallMinutesobjectYes—
subscription.allowance.testCallMinutes.limitintegerYes—
subscription.allowance.testCallMinutes.usedintegerYes—
subscription.allowance.testChatMessagesobjectYes—
subscription.allowance.testChatMessages.limitintegerYes—
subscription.allowance.testChatMessages.usedintegerYes—
subscription.cancelAtstring | nullYes—
subscription.daysLeftinteger | nullYes—
subscription.endedByenum | nullYesOne of: "trial", "cancellation".
subscription.hasPaymentMethodbooleanYes—
subscription.motionenum | nullYesOne of: "self_serve", "sales".
subscription.planIdstring | nullYes—
subscription.planNamestring | nullYes—
subscription.scheduledPlanobject | nullYes—
subscription.scheduledPlan.idstringYes—
subscription.scheduledPlan.namestringYes—
subscription.scheduledPlan.onstringYes—
subscription.statusenumYesOne of: "trialing", "active", "past_due", "expired", "none".
subscription.trialEndsOnstring | nullYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/billing/coupon" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "code": "string"
}'

The promo codes this account has used, and what each gave#

GET /v1/account/billing/coupons

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
couponsarray<UsedCoupon>Yes—
coupons[].namestringYes—
coupons[].redeemedAtstring (date-time)Yes—
coupons[].summarystringYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/billing/coupons" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

What the account’s plan includes and costs: its own prices, number limit and allowances#

GET /v1/account/billing/plan

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
customPricingbooleanYes—
motionenum | nullYesOne of: "self_serve", "sales".
numberLimitintegerYes—
planobject | nullYes—
plan.descriptionstring | nullYes—
plan.idstring (plan_… ID)YesID (plan_…)
plan.namestringYes—
termsobject | nullYes—
terms.billingIncrementSecondsintegerYes—
terms.cancellationGraceHoursinteger | nullYes—
terms.currencystringYes—
terms.metersarray<object>Yes—
terms.meters[].includednumberYes—
terms.meters[].meterenumYesOne of: "minutes", "answered", "booked", "sms_sent", "chat_message", "notetaker_minutes", "rep_minutes".
terms.meters[].tiersarray<object>Yes—
terms.meters[].tiers[].unitPriceCentsnumberYes—
terms.meters[].tiers[].upTonumber | nullYes—
terms.meters[].unitPriceCentsnumberYes—
terms.monthlyCreditCentsintegerYes—
terms.monthlyFeeCentsintegerYes—
terms.perNumberFeeCentsintegerYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/billing/plan" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Change plan (owner only): at once in a trial or for a higher fee, otherwise from the next billing period#

POST /v1/account/billing/plan

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
planIdstring (plan_… ID)YesID (plan_…)

Response 200

FieldTypeRequiredDescription
changeobjectYes—
change.effectenumYesOne of: "now", "scheduled", "unchanged".
change.onstringYes—
subscriptionAccountSubscriptionYes—
subscription.allowanceobject | nullYes—
subscription.allowance.testCallMinutesobjectYes—
subscription.allowance.testCallMinutes.limitintegerYes—
subscription.allowance.testCallMinutes.usedintegerYes—
subscription.allowance.testChatMessagesobjectYes—
subscription.allowance.testChatMessages.limitintegerYes—
subscription.allowance.testChatMessages.usedintegerYes—
subscription.cancelAtstring | nullYes—
subscription.daysLeftinteger | nullYes—
subscription.endedByenum | nullYesOne of: "trial", "cancellation".
subscription.hasPaymentMethodbooleanYes—
subscription.motionenum | nullYesOne of: "self_serve", "sales".
subscription.planIdstring | nullYes—
subscription.planNamestring | nullYes—
subscription.scheduledPlanobject | nullYes—
subscription.scheduledPlan.idstringYes—
subscription.scheduledPlan.namestringYes—
subscription.scheduledPlan.onstringYes—
subscription.statusenumYesOne of: "trialing", "active", "past_due", "expired", "none".
subscription.trialEndsOnstring | nullYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/billing/plan" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "planId": "plan_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'

Ask our team to move a sales-led account to another plan (owner only); nothing changes until they do#

POST /v1/account/billing/plan-request

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
planIdstring (plan_… ID)YesID (plan_…)

Response 202

FieldTypeRequiredDescription
statusenumYesOne of: "sent".

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/billing/plan-request" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "planId": "plan_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'

The plans a self-serve account can choose, with their prices#

GET /v1/account/billing/plans

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
plansarray<SelfServePlan>Yes—
plans[].currencystringYes—
plans[].currentbooleanYes—
plans[].descriptionstring | nullYes—
plans[].idstring (plan_… ID)YesID (plan_…)
plans[].includedBookednumberYes—
plans[].includedMinutesnumberYes—
plans[].monthlyFeeCentsintegerYes—
plans[].namestringYes—
plans[].numberLimitintegerYes—
plans[].perNumberFeeCentsintegerYes—
plans[].pricePerBookedCentsnumberYes—
plans[].pricePerMinuteCentsnumberYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/billing/plans" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Change the card on file in Stripe's billing portal (owner only)#

POST /v1/account/billing/portal

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
urlstringYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/billing/portal" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

The plan, the trial and its days left, and the trial allowances used#

GET /v1/account/billing/subscription

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
allowanceobject | nullYes—
allowance.testCallMinutesobjectYes—
allowance.testCallMinutes.limitintegerYes—
allowance.testCallMinutes.usedintegerYes—
allowance.testChatMessagesobjectYes—
allowance.testChatMessages.limitintegerYes—
allowance.testChatMessages.usedintegerYes—
cancelAtstring | nullYes—
daysLeftinteger | nullYes—
endedByenum | nullYesOne of: "trial", "cancellation".
hasPaymentMethodbooleanYes—
motionenum | nullYesOne of: "self_serve", "sales".
planIdstring | nullYes—
planNamestring | nullYes—
scheduledPlanobject | nullYes—
scheduledPlan.idstringYes—
scheduledPlan.namestringYes—
scheduledPlan.onstringYes—
statusenumYesOne of: "trialing", "active", "past_due", "expired", "none".
trialEndsOnstring | nullYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/billing/subscription" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Pause anyone's booking page. The rep is told and cannot resume it themselves#

POST /v1/account/booking-pages/{pageId}/pause

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
pageIdstring (bpg_… ID)YesID (bpg_…)

Response 200

FieldTypeRequiredDescription
statusenumYesOne of: "active", "paused", "archived".

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/booking-pages/{pageId}/pause" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Resume anyone's booking page. The rep is told#

POST /v1/account/booking-pages/{pageId}/resume

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
pageIdstring (bpg_… ID)YesID (bpg_…)

Response 200

FieldTypeRequiredDescription
statusenumYesOne of: "active", "paused", "archived".

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/booking-pages/{pageId}/resume" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

The features this account has, and where each came from#

GET /v1/account/entitlements

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

Response 200

FieldTypeRequiredDescription
entitlementsarray<Entitlement>Yes—
entitlements[].decidedBystringYes—
entitlements[].descriptionstringYes—
entitlements[].keyenumYesOne of: "conversation_intelligence", "insights.ask", "notetaker", "booking_pages".
entitlements[].kindenumYesOne of: "boolean", "limit", "quota", "set", "level".
entitlements[].labelstringYes—
entitlements[].notestring | nullYes—
entitlements[].onbooleanYes—
entitlements[].provenancearray<object | object | object | object | object | object>Yes—
entitlements[].provenance[].layerconstantYes(variant 1) Always "default".
entitlements[].provenance[].layerconstantYes(variant 2) Always "plan".
entitlements[].provenance[].namestringYes(variant 2)
entitlements[].provenance[].layerconstantYes(variant 3) Always "add_on".
entitlements[].provenance[].namestringYes(variant 3)
entitlements[].provenance[].grantIdstringYes(variant 4)
entitlements[].provenance[].layerconstantYes(variant 4) Always "grant".
entitlements[].provenance[].sourceenumYes(variant 4) One of: "contract", "coupon", "trial", "trial_extension", "goodwill", "manual".
entitlements[].provenance[].layerconstantYes(variant 5) Always "included".
entitlements[].provenance[].withstringYes(variant 5)
entitlements[].provenance[].layerconstantYes(variant 6) Always "requires".
entitlements[].provenance[].missingstringYes(variant 6)
entitlements[].upgradePathenumYesOne of: "talk_to_sales", "upgrade".
entitlements[].valueboolean | number | string | array<string>Yes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/entitlements" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

The account's rules for connected apps#

GET /v1/account/mcp-policy

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
clientAllowlistarray<string> | nullYes—
enabledbooleanYes—
writeRolesarray<enum>YesItems: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/mcp-policy" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Whether members may connect apps, who may give write access, and which apps (owners and admins). Takes effect within a minute, without revoking anything#

PUT /v1/account/mcp-policy

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
clientAllowlistarray<string> | nullYesUp to 100 items.
enabledbooleanYes—
writeRolesarray<enum>YesItems: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". Up to 5 items.

Response 200

FieldTypeRequiredDescription
clientAllowlistarray<string> | nullYes—
enabledbooleanYes—
writeRolesarray<enum>YesItems: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".

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

Example

bash
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/mcp-policy" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": true,
  "writeRoles": [
    "owner"
  ],
  "clientAllowlist": [
    "string"
  ]
}'

Team members#

GET /v1/account/members

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
membersarray<Member>Yes—
members[].createdAtstring (date-time)Yes—
members[].deactivatedAtstring (date-time) | nullYes—
members[].emailstring | nullYes—
members[].groupIdsarray<string (grp_… ID)>Yes—
members[].idstring (mem_… ID)YesID (mem_…)
members[].invitedAtstring (date-time) | nullYes—
members[].joinedAtstring (date-time) | nullYes—
members[].mfaEnrolledbooleanYes—
members[].namestring | nullYes—
members[].roleenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".
members[].statusenumYesOne of: "invited", "active", "deactivated".
members[].userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/members" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Invite a team member by email (owner only)#

POST /v1/account/members

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
emailstring (email)YesUp to 254 characters.
groupIdsarray<string (grp_… ID)>NoUp to 200 items. Default: [].
roleenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".

Response 201

FieldTypeRequiredDescription
createdAtstring (date-time)Yes—
deactivatedAtstring (date-time) | nullYes—
emailstring | nullYes—
groupIdsarray<string (grp_… ID)>Yes—
idstring (mem_… ID)YesID (mem_…)
invitedAtstring (date-time) | nullYes—
joinedAtstring (date-time) | nullYes—
mfaEnrolledbooleanYes—
namestring | nullYes—
roleenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".
statusenumYesOne of: "invited", "active", "deactivated".
userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/members" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "[email protected]",
  "role": "owner"
}'

Change a member role or group scope (owner only)#

PATCH /v1/account/members/{memberId}

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
memberIdstring (mem_… ID)YesID (mem_…)

Request body

application/json, required.

FieldTypeRequiredDescription
groupIdsarray<string (grp_… ID)>NoUp to 200 items.
roleenumNoOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".

Response 200

FieldTypeRequiredDescription
createdAtstring (date-time)Yes—
deactivatedAtstring (date-time) | nullYes—
emailstring | nullYes—
groupIdsarray<string (grp_… ID)>Yes—
idstring (mem_… ID)YesID (mem_…)
invitedAtstring (date-time) | nullYes—
joinedAtstring (date-time) | nullYes—
mfaEnrolledbooleanYes—
namestring | nullYes—
roleenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".
statusenumYesOne of: "invited", "active", "deactivated".
userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X PATCH "$ANSWERSTACK_API_URL/v1/account/members/{memberId}" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "groupIds": [
    "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
  ],
  "role": "owner"
}'

Deactivate a member: their login is blocked at once (owner only)#

POST /v1/account/members/{memberId}/deactivate

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
memberIdstring (mem_… ID)YesID (mem_…)

Response 200

FieldTypeRequiredDescription
createdAtstring (date-time)Yes—
deactivatedAtstring (date-time) | nullYes—
emailstring | nullYes—
groupIdsarray<string (grp_… ID)>Yes—
idstring (mem_… ID)YesID (mem_…)
invitedAtstring (date-time) | nullYes—
joinedAtstring (date-time) | nullYes—
mfaEnrolledbooleanYes—
namestring | nullYes—
roleenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".
statusenumYesOne of: "invited", "active", "deactivated".
userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/members/{memberId}/deactivate" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Give a deactivated member their access back (owner only)#

POST /v1/account/members/{memberId}/reactivate

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
memberIdstring (mem_… ID)YesID (mem_…)

Response 200

FieldTypeRequiredDescription
createdAtstring (date-time)Yes—
deactivatedAtstring (date-time) | nullYes—
emailstring | nullYes—
groupIdsarray<string (grp_… ID)>Yes—
idstring (mem_… ID)YesID (mem_…)
invitedAtstring (date-time) | nullYes—
joinedAtstring (date-time) | nullYes—
mfaEnrolledbooleanYes—
namestring | nullYes—
roleenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".
statusenumYesOne of: "invited", "active", "deactivated".
userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/members/{memberId}/reactivate" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Send the invite email again (owner only)#

POST /v1/account/members/{memberId}/resend-invite

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
memberIdstring (mem_… ID)YesID (mem_…)

Response 200

FieldTypeRequiredDescription
createdAtstring (date-time)Yes—
deactivatedAtstring (date-time) | nullYes—
emailstring | nullYes—
groupIdsarray<string (grp_… ID)>Yes—
idstring (mem_… ID)YesID (mem_…)
invitedAtstring (date-time) | nullYes—
joinedAtstring (date-time) | nullYes—
mfaEnrolledbooleanYes—
namestring | nullYes—
roleenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".
statusenumYesOne of: "invited", "active", "deactivated".
userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/members/{memberId}/resend-invite" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Every app connected to the account, and who connected it#

GET /v1/account/oauth-grants

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
grantsarray<OAuthGrant>Yes—
grants[].clientIdstringYes—
grants[].clientNamestring | nullYes—
grants[].createdAtstring (date-time)Yes—
grants[].expiresAtstring (date-time) | nullYes—
grants[].groupIdsarray<string (grp_… ID)> | nullYes—
grants[].idstring (ogr_… ID)YesID (ogr_…)
grants[].lastUsedAtstring (date-time) | nullYes—
grants[].redirectHoststring | nullYes—
grants[].scopesarray<string>Yes—
grants[].userEmailstring | nullYes—
grants[].userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/oauth-grants" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Take access away from any app connected to the account#

DELETE /v1/account/oauth-grants/{grantId}

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
grantIdstring (ogr_… ID)YesID (ogr_…)

Response 200

FieldTypeRequiredDescription
revokedenumYesOne of: true.

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

Example

bash
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/oauth-grants/{grantId}" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

A member's booking pages, to pause or resume them#

GET /v1/account/reps/{userId}/booking-pages

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
userIdstring (usr_… ID)YesID (usr_…)

Response 200

FieldTypeRequiredDescription
accountSlugstringYes—
bookingAppUrlstringYes—
groupPagesarray<object>Yes—
groupPages[].groupNamestringYes—
groupPages[].idstring (bpg_… ID)YesID (bpg_…)
groupPages[].statusenumYesOne of: "active", "paused", "archived".
groupPages[].titlestringYes—
groupPages[].urlstring | nullYes—
groupsarray<object>Yes—
groups[].idstring (grp_… ID)YesID (grp_…)
groups[].namestringYes—
matchEmailstring | nullYes—
pagesarray<BookingPageSummary>Yes—
pages[].bookingsThisMonthintegerYes—
pages[].groupIdstring (grp_… ID)YesID (grp_…)
pages[].groupNamestringYes—
pages[].idstring (bpg_… ID)YesID (bpg_…)
pages[].pausedByenum | nullYesOne of: "owner", "admin".
pages[].settingsBookingPageSettingsYes—
pages[].settings.assignmentobject | objectYesDefault: \{"mode":"round_robin","strategy":"equal"\}.
pages[].settings.assignment.modeconstantYes(variant 1) Always "round_robin".
pages[].settings.assignment.strategyenumYes(variant 1) One of: "equal", "most_available". Default: "equal".
pages[].settings.assignment.modeconstantYes(variant 2) Always "invitee_chooses".
pages[].settings.brandIdstring (brd_… ID) | nullYes—
pages[].settings.bufferAfterMinutesintegerYesBetween 0 and 120. Default: 0.
pages[].settings.bufferBeforeMinutesintegerYesBetween 0 and 120. Default: 0.
pages[].settings.colorstring | nullYesPattern: ^#[0-9a-f]\{6\}$.
pages[].settings.coverPhotostring (uri) | string (uri) | nullYes—
pages[].settings.dailyLimitinteger | nullYesBetween 1 and 50.
pages[].settings.descriptionstringYesUp to 1000 characters. Default: "".
pages[].settings.durationsarray<constant | constant | constant | constant>YesUp to 4 items. Default: [30].
pages[].settings.incrementconstant | constant | constant | constantYesDefault: 30.
pages[].settings.locationobject | object | object | object | objectYesDefault: \{"kind":"in_person"\}.
pages[].settings.location.kindconstantYes(variant 1) Always "in_person".
pages[].settings.location.kindconstantYes(variant 2) Always "phone_invitee".
pages[].settings.location.kindconstantYes(variant 3) Always "phone_rep".
pages[].settings.location.phonestringYes(variant 3) 7–32 characters.
pages[].settings.location.kindconstantYes(variant 4) Always "video".
pages[].settings.location.urlstring (uri)Yes(variant 4) A https:// link Up to 2000 characters.
pages[].settings.location.kindconstantYes(variant 5) Always "custom".
pages[].settings.location.textstringYes(variant 5) 1–200 characters.
pages[].settings.meetingTypestring | nullYesUp to 64 characters.
pages[].settings.minNoticeMinutesintegerYesBetween 0 and 43200. Default: 240.
pages[].settings.pageHoursarray<object> | nullYesUp to 50 items.
pages[].settings.pageHours[].daysarray<enum>YesItems: "mon", "tue", "wed", "thu", "fri", "sat", "sun".
pages[].settings.pageHours[].endstring | constantYes—
pages[].settings.pageHours[].startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
pages[].settings.preferLeadRepbooleanYesDefault: true.
pages[].settings.questionsarray<object>YesUp to 10 items. Default: [].
pages[].settings.questions[].fieldKeystringNo1–64 characters. Pattern: ^[a-z][a-z0-9_]*$.
pages[].settings.questions[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
pages[].settings.questions[].kindenumYesOne of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date".
pages[].settings.questions[].labelstringYes1–200 characters.
pages[].settings.questions[].optionsarray<string>NoUp to 20 items.
pages[].settings.questions[].requiredbooleanYesDefault: false.
pages[].settings.redirectUrlstring (uri) | nullYesUp to 2000 characters.
pages[].settings.reminderDayBeforebooleanYesDefault: true.
pages[].settings.reminderTwoHoursbooleanYesDefault: true.
pages[].settings.requireEmailbooleanYesDefault: true.
pages[].settings.requirePhonebooleanYesDefault: true.
pages[].settings.scheduleIdstring | nullYesUp to 40 characters.
pages[].settings.serviceobject | object | objectYesDefault: \{"kind":"none"\}.
pages[].settings.service.kindconstantYes(variant 1) Always "none".
pages[].settings.service.kindconstantYes(variant 2) Always "fixed".
pages[].settings.service.serviceIdstring (srv_… ID)Yes(variant 2) ID (srv_…)
pages[].settings.service.kindconstantYes(variant 3) Always "ask".
pages[].settings.serviceCoverPhotobooleanYesDefault: false.
pages[].settings.titlestringYes1–80 characters.
pages[].settings.windowobject | objectYesDefault: \{"days":30,"kind":"rolling"\}.
pages[].settings.window.daysintegerYes(variant 1) Between 1 and 365.
pages[].settings.window.kindconstantYes(variant 1) Always "rolling".
pages[].settings.window.fromstring (date)Yes(variant 2)
pages[].settings.window.kindconstantYes(variant 2) Always "range".
pages[].settings.window.tostring (date)Yes(variant 2)
pages[].slugstringYes—
pages[].statusenumYesOne of: "active", "paused", "archived".
pages[].updatedAtstring (date-time)Yes—
pages[].urlstring | nullYes—
primaryGroupIdstring (grp_… ID) | nullYes—
repSlugstring | nullYes—
schedulesarray<object>Yes—
schedules[].idstring (avs_… ID)YesID (avs_…)
schedules[].isDefaultbooleanYes—
schedules[].namestringYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/reps/{userId}/booking-pages" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

The sample community and playbook, whether they are hidden, and what blocks hiding#

GET /v1/account/sample-data

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
blockersarray<object>Yes—
blockers[].reasonstringYes—
blockers[].sampleSampleRecordYes—
blockers[].sample.idstringYes—
blockers[].sample.kindenumYesOne of: "group", "playbook".
blockers[].sample.namestringYes—
hiddenbooleanYes—
samplesarray<SampleRecord>Yes—
samples[].idstringYes—
samples[].kindenumYesOne of: "group", "playbook".
samples[].namestringYes—
seededbooleanYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/sample-data" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Hide or show the sample data (owner only). Nothing is deleted#

PUT /v1/account/sample-data

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
hiddenbooleanYes—

Response 200

FieldTypeRequiredDescription
blockersarray<object>Yes—
blockers[].reasonstringYes—
blockers[].sampleSampleRecordYes—
blockers[].sample.idstringYes—
blockers[].sample.kindenumYesOne of: "group", "playbook".
blockers[].sample.namestringYes—
hiddenbooleanYes—
samplesarray<SampleRecord>Yes—
samples[].idstringYes—
samples[].kindenumYesOne of: "group", "playbook".
samples[].namestringYes—
seededbooleanYes—

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

Example

bash
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/sample-data" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "hidden": true
}'

Keep a sample community or playbook as an ordinary record. Keeping a community keeps the sample playbook it runs#

POST /v1/account/sample-data/keep

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
idstring (grp_… ID)Yes(variant 1) ID (grp_…)
kindenumYes(variant 1) One of: "group".
idstring (pb_… ID)Yes(variant 2) ID (pb_…)
kindenumYes(variant 2) One of: "playbook".

Response 200

FieldTypeRequiredDescription
keptarray<SampleRecord>Yes—
kept[].idstringYes—
kept[].kindenumYesOne of: "group", "playbook".
kept[].namestringYes—
sampleDataSampleDataYes—
sampleData.blockersarray<object>Yes—
sampleData.blockers[].reasonstringYes—
sampleData.blockers[].sampleSampleRecordYes—
sampleData.blockers[].sample.idstringYes—
sampleData.blockers[].sample.kindenumYesOne of: "group", "playbook".
sampleData.blockers[].sample.namestringYes—
sampleData.hiddenbooleanYes—
sampleData.samplesarray<SampleRecord>Yes—
sampleData.samples[].idstringYes—
sampleData.samples[].kindenumYesOne of: "group", "playbook".
sampleData.samples[].namestringYes—
sampleData.seededbooleanYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/sample-data/keep" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "kind": "group",
  "id": "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'

Software the account lets in, each with a role ceiling#

GET /v1/account/service-identities

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Response 200

FieldTypeRequiredDescription
identitiesarray<ServiceIdentity>Yes—
identities[].activeTokensintegerYes—
identities[].createdAtstring (date-time)Yes—
identities[].descriptionstring | nullYes—
identities[].disabledAtstring (date-time) | nullYes—
identities[].groupIdsarray<string (grp_… ID)> | nullYes—
identities[].idstring (svc_… ID)YesID (svc_…)
identities[].namestringYes—
identities[].roleCeilingenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/service-identities" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Make a service identity for software, with a role ceiling no higher than your own and an optional group limit#

POST /v1/account/service-identities

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
descriptionstringNoUp to 300 characters.
groupIdsarray<string (grp_… ID)> | nullNoUp to 200 items.
namestringYes1–80 characters.
roleCeilingenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer".

Response 201

FieldTypeRequiredDescription
identityServiceIdentityYes—
identity.activeTokensintegerYes—
identity.createdAtstring (date-time)Yes—
identity.descriptionstring | nullYes—
identity.disabledAtstring (date-time) | nullYes—
identity.groupIdsarray<string (grp_… ID)> | nullYes—
identity.idstring (svc_… ID)YesID (svc_…)
identity.namestringYes—
identity.roleCeilingenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/service-identities" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "roleCeiling": "owner"
}'

Rename a service identity, or disable it: its tokens stop working until it is enabled again#

PATCH /v1/account/service-identities/{identityId}

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
identityIdstring (svc_… ID)YesID (svc_…)

Request body

application/json, required.

FieldTypeRequiredDescription
descriptionstring | nullNoUp to 300 characters.
disabledbooleanNo—
namestringNo1–80 characters.

Response 200

FieldTypeRequiredDescription
identityServiceIdentityYes—
identity.activeTokensintegerYes—
identity.createdAtstring (date-time)Yes—
identity.descriptionstring | nullYes—
identity.disabledAtstring (date-time) | nullYes—
identity.groupIdsarray<string (grp_… ID)> | nullYes—
identity.idstring (svc_… ID)YesID (svc_…)
identity.namestringYes—
identity.roleCeilingenumYesOne of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep".

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

Example

bash
curl -X PATCH "$ANSWERSTACK_API_URL/v1/account/service-identities/{identityId}" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "description": "string",
  "disabled": true,
  "name": "string"
}'

A service identity's OAuth clients, for partners that expect client_credentials#

GET /v1/account/service-identities/{identityId}/oauth-clients

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
identityIdstring (svc_… ID)YesID (svc_…)

Response 200

FieldTypeRequiredDescription
clientsarray<ServiceOAuthClient>Yes—
clients[].clientIdstringYes—
clients[].createdAtstring (date-time)Yes—
clients[].lastUsedAtstring (date-time) | nullYes—
clients[].revokedAtstring (date-time) | nullYes—
clients[].scopesarray<string>Yes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/service-identities/{identityId}/oauth-clients" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Give a service identity an OAuth client that signs in with client_credentials at our authorization server. The secret is shown once#

POST /v1/account/service-identities/{identityId}/oauth-clients

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
identityIdstring (svc_… ID)YesID (svc_…)

Request body

application/json, required.

FieldTypeRequiredDescription
scopesarray<string>YesUp to 30 items.

Response 201

FieldTypeRequiredDescription
clientServiceOAuthClientYes—
client.clientIdstringYes—
client.createdAtstring (date-time)Yes—
client.lastUsedAtstring (date-time) | nullYes—
client.revokedAtstring (date-time) | nullYes—
client.scopesarray<string>Yes—
clientIdstringYes—
clientSecretstringYes—
resourcestringYes—
tokenEndpointstringYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/service-identities/{identityId}/oauth-clients" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "scopes": [
    "string"
  ]
}'

Revoke a service identity’s OAuth client. Its access tokens stop working at once#

DELETE /v1/account/service-identities/{identityId}/oauth-clients/{clientId}

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
identityIdstring (svc_… ID)YesID (svc_…)
clientIdstringYes1–100 characters.

Response 200

FieldTypeRequiredDescription
revokedenumYesOne of: true.

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

Example

bash
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/service-identities/{identityId}/oauth-clients/{clientId}" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Give a service identity a token, within its role ceiling. 365 days unless you choose; only an owner may choose no expiry#

POST /v1/account/service-identities/{identityId}/tokens

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Path parameters

NameTypeRequiredDescription
identityIdstring (svc_… ID)YesID (svc_…)

Request body

application/json, required.

FieldTypeRequiredDescription
daysenum | enum | enum | nullNo—
groupIdsarray<string (grp_… ID)> | nullNoUp to 200 items.
ipAllowlistarray<string> | nullNoUp to 20 items.
namestringYes1–80 characters.
scopesarray<string>YesUp to 30 items.

Response 201

FieldTypeRequiredDescription
apiTokenApiTokenYes—
apiToken.createdAtstring (date-time)Yes—
apiToken.expiresAtstring (date-time) | nullYes—
apiToken.groupIdsarray<string (grp_… ID)> | nullYes—
apiToken.idstring (tok_… ID)YesID (tok_…)
apiToken.ipAllowlistarray<string> | nullYes—
apiToken.kindenumYesOne of: "personal", "service".
apiToken.lastFourstringYes—
apiToken.lastUsedAtstring (date-time) | nullYes—
apiToken.lastUsedIpstring | nullYes—
apiToken.namestringYes—
apiToken.prefixstringYes—
apiToken.scopesarray<string>Yes—
apiToken.serviceIdentityIdstring (svc_… ID) | nullYes—
apiToken.serviceIdentityNamestring | nullYes—
apiToken.userEmailstring | nullYes—
apiToken.userIdstring (usr_… ID) | nullYes—
tokenstringYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/service-identities/{identityId}/tokens" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "scopes": [
    "string"
  ]
}'

Ask our team about a feature the account does not have (the locked state’s Talk to us)#

POST /v1/account/talk-to-sales

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).

Request body

application/json, required.

FieldTypeRequiredDescription
featureenumYesOne of: "conversation_intelligence", "insights.ask", "notetaker", "booking_pages".

Response 202

FieldTypeRequiredDescription
statusenumYesOne of: "sent".

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/talk-to-sales" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "feature": "conversation_intelligence"
}'

Open next steps from visits at my communities, soonest due first: who owns each, and which are overdue#

GET /v1/account/visit-actions

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
groupIdstring (grp_… ID)NoID (grp_…)
limitintegerNoBetween 1 and 200. Default: 100.

Response 200

FieldTypeRequiredDescription
itemsarray<MyVisitAction>Yes—
items[].actionKeystring | nullYes—
items[].bookingIdstring (bkg_… ID)YesID (bkg_…)
items[].canTakebooleanYes—
items[].canUndobooleanYes—
items[].canWorkbooleanYes—
items[].closedAtstring (date-time) | nullYes—
items[].closedInCrmbooleanYes—
items[].createdAtstring (date-time)Yes—
items[].crmTaskbooleanYes—
items[].dismissReasonstring | nullYes—
items[].dueAtstring (date-time)Yes—
items[].idstring (vac_… ID)YesID (vac_…)
items[].labelstringYes—
items[].notestring | nullYes—
items[].ownerobject | nullYes—
items[].owner.namestringYes—
items[].owner.userIdstring (usr_… ID)YesID (usr_…)
items[].ownerSourceenumYesOne of: "rep", "backup", "member".
items[].statusenumYesOne of: "open", "done", "dismissed".
items[].versionintegerYes—
items[].visitVisitActionVisitYes—
items[].visit.groupIdstring (grp_… ID)YesID (grp_…)
items[].visit.groupNamestringYes—
items[].visit.openobject | object | objectYes—
items[].visit.open.bookingIdstring (bkg_… ID)Yes(variant 1) ID (bkg_…)
items[].visit.open.kindconstantYes(variant 1) Always "meeting".
items[].visit.open.callIdstring (call_… ID)Yes(variant 2) ID (call_…)
items[].visit.open.kindconstantYes(variant 2) Always "call".
items[].visit.open.kindconstantYes(variant 3) Always "none".
items[].visit.startstring (date-time)Yes—
items[].visit.timeZonestring | nullYes—
items[].visit.whostring | nullYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/visit-actions" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

A visit at one of my communities: its notes, next steps, photo counts and where they stand. No photo links#

GET /v1/account/visits/{bookingId}

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
bookingIdstring (bkg_… ID)YesID (bkg_…)

Response 200

FieldTypeRequiredDescription
bookingIdstring (bkg_… ID)YesID (bkg_…)
finishedAtstring (date-time) | nullYes—
groupIdstring (grp_… ID)YesID (grp_…)
movedTostring | nullYes—
notesarray<object>Yes—
notes[].authorstringYes—
notes[].createdAtstring (date-time)Yes—
notes[].textstringYes—
photosobjectYes—
photos.onPageintegerYes—
photos.readyintegerYes—
photos.sharedintegerYes—
sentToCrmAtstring (date-time) | nullYes—
startAtstring (date-time)Yes—
stepsarray<object>Yes—
steps[].crmTaskbooleanYes—
steps[].dueAtstring (date-time)Yes—
steps[].keystring | nullYes—
steps[].labelstringYes—
steps[].ownerstring | nullYes—
steps[].statusenumYesOne of: "open", "done", "dismissed".

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/visits/{bookingId}" \
  -H "Authorization: Bearer $ACCESS_TOKEN"