API reference
Account
Account settings and team
| Method | Path | Summary |
|---|---|---|
GET | /v1/account | The account: name, vocabulary, lexicon and settings |
PATCH | /v1/account | Change the account name, vocabulary, lexicon, settings or recording policy (owner only) |
GET | /v1/account/api-tokens | Every 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/cancel | Cancel (owner only): the plan runs to the end of the billing period; a trial ends at once |
DELETE | /v1/account/billing/cancel | Keep a plan that was set to end (owner only) |
POST | /v1/account/billing/card | Put a card on file: a Stripe Checkout page in setup mode (owner only) |
POST | /v1/account/billing/coupon | Use a promo code on this account (owner only) |
GET | /v1/account/billing/coupons | The promo codes this account has used, and what each gave |
GET | /v1/account/billing/plan | What the account’s plan includes and costs: its own prices, number limit and allowances |
POST | /v1/account/billing/plan | 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-request | Ask our team to move a sales-led account to another plan (owner only); nothing changes until they do |
GET | /v1/account/billing/plans | The plans a self-serve account can choose, with their prices |
POST | /v1/account/billing/portal | Change the card on file in Stripe's billing portal (owner only) |
GET | /v1/account/billing/subscription | The plan, the trial and its days left, and the trial allowances used |
POST | /v1/account/booking-pages/{pageId}/pause | Pause anyone's booking page. The rep is told and cannot resume it themselves |
POST | /v1/account/booking-pages/{pageId}/resume | Resume anyone's booking page. The rep is told |
GET | /v1/account/entitlements | The features this account has, and where each came from |
GET | /v1/account/mcp-policy | The account's rules for connected apps |
PUT | /v1/account/mcp-policy | Whether 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/members | Team members |
POST | /v1/account/members | Invite 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}/deactivate | Deactivate a member: their login is blocked at once (owner only) |
POST | /v1/account/members/{memberId}/reactivate | Give a deactivated member their access back (owner only) |
POST | /v1/account/members/{memberId}/resend-invite | Send the invite email again (owner only) |
GET | /v1/account/oauth-grants | Every 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-pages | A member's booking pages, to pause or resume them |
GET | /v1/account/sample-data | The sample community and playbook, whether they are hidden, and what blocks hiding |
PUT | /v1/account/sample-data | Hide or show the sample data (owner only). Nothing is deleted |
POST | /v1/account/sample-data/keep | Keep a sample community or playbook as an ordinary record. Keeping a community keeps the sample playbook it runs |
GET | /v1/account/service-identities | Software the account lets in, each with a role ceiling |
POST | /v1/account/service-identities | Make 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-clients | A service identity's OAuth clients, for partners that expect client_credentials |
POST | /v1/account/service-identities/{identityId}/oauth-clients | Give 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}/tokens | 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/talk-to-sales | Ask our team about a feature the account does not have (the locked state’s Talk to us) |
GET | /v1/account/visit-actions | Open 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
| Field | Type | Required | Description |
|---|---|---|---|
complianceMode | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
id | string (acct_… ID) | Yes | ID (acct_…) |
lexicon | array<object> | Yes | Up to 200 items. |
lexicon[].concept | string | Yes | Up to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$. |
lexicon[].never | array<string> | Yes | Up to 50 items. Default: []. |
lexicon[].phrases | array<string> | Yes | Up to 50 items. Default: []. |
lexiconSuggestions | array<object> | Yes | — |
lexiconSuggestions[].concept | string | Yes | — |
lexiconSuggestions[].count | integer | Yes | — |
lexiconSuggestions[].phrase | string | Yes | — |
name | string | Yes | — |
numberLimit | integer | Yes | — |
recordingPolicy | enum | Yes | One of: "always", "never", "optional". |
settings | AccountSettings | Yes | — |
settings.loginSecurity | LoginSecurityPolicy | No | — |
settings.loginSecurity.appliesTo | enum | Yes | One of: "owners_admins", "everyone". Default: "everyone". |
settings.loginSecurity.enabled | boolean | Yes | Default: false. |
settings.loginSecurity.methods | array<enum> | Yes | Items: "email", "sms", "totp", "passkey". Default: ["passkey","totp","sms","email"]. |
settings.notetaker | object | No | — |
settings.notetaker.enabled | boolean | Yes | Default: true. |
settings.notetaker.lockedOn | boolean | Yes | Default: false. |
settings.pricing | object | No | — |
settings.pricing.allowLocationServices | boolean | Yes | Default: true. |
settings.pricing.priceApproval | enum | Yes | One of: "off", "group_managers", "everyone". Default: "off". |
settings.pricing.priceApprovalIncludesCrm | boolean | Yes | Default: false. |
settings.pricing.priceReviewDays | integer | Yes | Between 0 and 3650. Default: 90. |
settings.spendAlerts | object | No | — |
settings.spendAlerts.enabled | boolean | Yes | Default: true. |
settings.spendAlerts.monthlyBudgetCents | integer | Yes | Between 100 and 100000000. |
settings.spendAlerts.thresholdsPercent | array<integer> | Yes | Up to 5 items. Default: [80,100]. |
slug | string | Yes | — |
status | enum | Yes | One of: "active", "suspended", "deleted". |
updatedAt | string (date-time) | Yes | — |
vocabulary | object | Yes | — |
vocabulary.contact | string | Yes | 1–40 characters. Default: "contact". |
vocabulary.contactPlural | string | Yes | 1–40 characters. Default: "contacts". |
vocabulary.group | string | Yes | 1–40 characters. Default: "location". |
vocabulary.groupPlural | string | Yes | 1–40 characters. Default: "locations". |
vocabulary.meeting | string | Yes | 1–40 characters. Default: "meeting". |
vocabulary.meetingPlural | string | Yes | 1–40 characters. Default: "meetings". |
vocabulary.service | string | Yes | 1–40 characters. Default: "service". |
vocabulary.servicePlural | string | Yes | 1–40 characters. Default: "services". |
vocabulary.special | string | Yes | 1–40 characters. Default: "special". |
vocabulary.specialPlural | string | Yes | 1–40 characters. Default: "specials". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account" \
-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.
| Field | Type | Required | Description |
|---|---|---|---|
dismissSuggestions | array<object> | No | Up to 50 items. |
dismissSuggestions[].concept | string | Yes | Up to 80 characters. |
dismissSuggestions[].phrase | string | Yes | Up to 60 characters. |
lexicon | array<object> | No | Up to 200 items. |
lexicon[].concept | string | Yes | Up to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$. |
lexicon[].never | array<string> | No | Up to 50 items. Default: []. |
lexicon[].phrases | array<string> | No | Up to 50 items. Default: []. |
name | string | No | 1–120 characters. |
recordingPolicy | enum | No | One of: "always", "never", "optional". |
settings | AccountSettingsInput | No | — |
settings.loginSecurity | LoginSecurityPolicyInput | No | — |
settings.loginSecurity.appliesTo | enum | No | One of: "owners_admins", "everyone". Default: "everyone". |
settings.loginSecurity.enabled | boolean | No | Default: false. |
settings.loginSecurity.methods | array<enum> | No | Items: "email", "sms", "totp", "passkey". Default: ["passkey","totp","sms","email"]. |
settings.notetaker | object | No | — |
settings.notetaker.enabled | boolean | No | Default: true. |
settings.notetaker.lockedOn | boolean | No | Default: false. |
settings.pricing | object | No | — |
settings.pricing.allowLocationServices | boolean | No | Default: true. |
settings.pricing.priceApproval | enum | No | One of: "off", "group_managers", "everyone". Default: "off". |
settings.pricing.priceApprovalIncludesCrm | boolean | No | Default: false. |
settings.pricing.priceReviewDays | integer | No | Between 0 and 3650. Default: 90. |
settings.spendAlerts | object | No | — |
settings.spendAlerts.enabled | boolean | No | Default: true. |
settings.spendAlerts.monthlyBudgetCents | integer | Yes | Between 100 and 100000000. |
settings.spendAlerts.thresholdsPercent | array<integer> | No | Up to 5 items. Default: [80,100]. |
vocabulary | object | No | — |
vocabulary.contact | string | No | 1–40 characters. |
vocabulary.contactPlural | string | No | 1–40 characters. |
vocabulary.group | string | No | 1–40 characters. |
vocabulary.groupPlural | string | No | 1–40 characters. |
vocabulary.meeting | string | No | 1–40 characters. |
vocabulary.meetingPlural | string | No | 1–40 characters. |
vocabulary.service | string | No | 1–40 characters. |
vocabulary.servicePlural | string | No | 1–40 characters. |
vocabulary.special | string | No | 1–40 characters. |
vocabulary.specialPlural | string | No | 1–40 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
complianceMode | boolean | Yes | — |
createdAt | string (date-time) | Yes | — |
id | string (acct_… ID) | Yes | ID (acct_…) |
lexicon | array<object> | Yes | Up to 200 items. |
lexicon[].concept | string | Yes | Up to 80 characters. Pattern: ^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$. |
lexicon[].never | array<string> | Yes | Up to 50 items. Default: []. |
lexicon[].phrases | array<string> | Yes | Up to 50 items. Default: []. |
lexiconSuggestions | array<object> | Yes | — |
lexiconSuggestions[].concept | string | Yes | — |
lexiconSuggestions[].count | integer | Yes | — |
lexiconSuggestions[].phrase | string | Yes | — |
name | string | Yes | — |
numberLimit | integer | Yes | — |
recordingPolicy | enum | Yes | One of: "always", "never", "optional". |
settings | AccountSettings | Yes | — |
settings.loginSecurity | LoginSecurityPolicy | No | — |
settings.loginSecurity.appliesTo | enum | Yes | One of: "owners_admins", "everyone". Default: "everyone". |
settings.loginSecurity.enabled | boolean | Yes | Default: false. |
settings.loginSecurity.methods | array<enum> | Yes | Items: "email", "sms", "totp", "passkey". Default: ["passkey","totp","sms","email"]. |
settings.notetaker | object | No | — |
settings.notetaker.enabled | boolean | Yes | Default: true. |
settings.notetaker.lockedOn | boolean | Yes | Default: false. |
settings.pricing | object | No | — |
settings.pricing.allowLocationServices | boolean | Yes | Default: true. |
settings.pricing.priceApproval | enum | Yes | One of: "off", "group_managers", "everyone". Default: "off". |
settings.pricing.priceApprovalIncludesCrm | boolean | Yes | Default: false. |
settings.pricing.priceReviewDays | integer | Yes | Between 0 and 3650. Default: 90. |
settings.spendAlerts | object | No | — |
settings.spendAlerts.enabled | boolean | Yes | Default: true. |
settings.spendAlerts.monthlyBudgetCents | integer | Yes | Between 100 and 100000000. |
settings.spendAlerts.thresholdsPercent | array<integer> | Yes | Up to 5 items. Default: [80,100]. |
slug | string | Yes | — |
status | enum | Yes | One of: "active", "suspended", "deleted". |
updatedAt | string (date-time) | Yes | — |
vocabulary | object | Yes | — |
vocabulary.contact | string | Yes | 1–40 characters. Default: "contact". |
vocabulary.contactPlural | string | Yes | 1–40 characters. Default: "contacts". |
vocabulary.group | string | Yes | 1–40 characters. Default: "location". |
vocabulary.groupPlural | string | Yes | 1–40 characters. Default: "locations". |
vocabulary.meeting | string | Yes | 1–40 characters. Default: "meeting". |
vocabulary.meetingPlural | string | Yes | 1–40 characters. Default: "meetings". |
vocabulary.service | string | Yes | 1–40 characters. Default: "service". |
vocabulary.servicePlural | string | Yes | 1–40 characters. Default: "services". |
vocabulary.special | string | Yes | 1–40 characters. Default: "special". |
vocabulary.specialPlural | string | Yes | 1–40 characters. Default: "specials". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X 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
| Field | Type | Required | Description |
|---|---|---|---|
tokens | array<ApiToken> | Yes | — |
tokens[].createdAt | string (date-time) | Yes | — |
tokens[].expiresAt | string (date-time) | null | Yes | — |
tokens[].groupIds | array<string (grp_… ID)> | null | Yes | — |
tokens[].id | string (tok_… ID) | Yes | ID (tok_…) |
tokens[].ipAllowlist | array<string> | null | Yes | — |
tokens[].kind | enum | Yes | One of: "personal", "service". |
tokens[].lastFour | string | Yes | — |
tokens[].lastUsedAt | string (date-time) | null | Yes | — |
tokens[].lastUsedIp | string | null | Yes | — |
tokens[].name | string | Yes | — |
tokens[].prefix | string | Yes | — |
tokens[].scopes | array<string> | Yes | — |
tokens[].serviceIdentityId | string (svc_… ID) | null | Yes | — |
tokens[].serviceIdentityName | string | null | Yes | — |
tokens[].userEmail | string | null | Yes | — |
tokens[].userId | string (usr_… ID) | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
tokenId | string (tok_… ID) | Yes | ID (tok_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
revoked | enum | Yes | One of: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
note | string | No | Up to 2000 characters. |
reason | enum | Yes | One of: "too_expensive", "missing_features", "not_using", "switching", "technical_issues", "other". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
endsOn | string | Yes | — |
immediate | boolean | Yes | — |
subscription | AccountSubscription | Yes | — |
subscription.allowance | object | null | Yes | — |
subscription.allowance.testCallMinutes | object | Yes | — |
subscription.allowance.testCallMinutes.limit | integer | Yes | — |
subscription.allowance.testCallMinutes.used | integer | Yes | — |
subscription.allowance.testChatMessages | object | Yes | — |
subscription.allowance.testChatMessages.limit | integer | Yes | — |
subscription.allowance.testChatMessages.used | integer | Yes | — |
subscription.cancelAt | string | null | Yes | — |
subscription.daysLeft | integer | null | Yes | — |
subscription.endedBy | enum | null | Yes | One of: "trial", "cancellation". |
subscription.hasPaymentMethod | boolean | Yes | — |
subscription.motion | enum | null | Yes | One of: "self_serve", "sales". |
subscription.planId | string | null | Yes | — |
subscription.planName | string | null | Yes | — |
subscription.scheduledPlan | object | null | Yes | — |
subscription.scheduledPlan.id | string | Yes | — |
subscription.scheduledPlan.name | string | Yes | — |
subscription.scheduledPlan.on | string | Yes | — |
subscription.status | enum | Yes | One of: "trialing", "active", "past_due", "expired", "none". |
subscription.trialEndsOn | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
subscription | AccountSubscription | Yes | — |
subscription.allowance | object | null | Yes | — |
subscription.allowance.testCallMinutes | object | Yes | — |
subscription.allowance.testCallMinutes.limit | integer | Yes | — |
subscription.allowance.testCallMinutes.used | integer | Yes | — |
subscription.allowance.testChatMessages | object | Yes | — |
subscription.allowance.testChatMessages.limit | integer | Yes | — |
subscription.allowance.testChatMessages.used | integer | Yes | — |
subscription.cancelAt | string | null | Yes | — |
subscription.daysLeft | integer | null | Yes | — |
subscription.endedBy | enum | null | Yes | One of: "trial", "cancellation". |
subscription.hasPaymentMethod | boolean | Yes | — |
subscription.motion | enum | null | Yes | One of: "self_serve", "sales". |
subscription.planId | string | null | Yes | — |
subscription.planName | string | null | Yes | — |
subscription.scheduledPlan | object | null | Yes | — |
subscription.scheduledPlan.id | string | Yes | — |
subscription.scheduledPlan.name | string | Yes | — |
subscription.scheduledPlan.on | string | Yes | — |
subscription.status | enum | Yes | One of: "trialing", "active", "past_due", "expired", "none". |
subscription.trialEndsOn | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
completed | boolean | Yes | — |
url | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
code | string | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
coupon | UsedCoupon | Yes | — |
coupon.name | string | Yes | — |
coupon.redeemedAt | string (date-time) | Yes | — |
coupon.summary | string | Yes | — |
subscription | AccountSubscription | Yes | — |
subscription.allowance | object | null | Yes | — |
subscription.allowance.testCallMinutes | object | Yes | — |
subscription.allowance.testCallMinutes.limit | integer | Yes | — |
subscription.allowance.testCallMinutes.used | integer | Yes | — |
subscription.allowance.testChatMessages | object | Yes | — |
subscription.allowance.testChatMessages.limit | integer | Yes | — |
subscription.allowance.testChatMessages.used | integer | Yes | — |
subscription.cancelAt | string | null | Yes | — |
subscription.daysLeft | integer | null | Yes | — |
subscription.endedBy | enum | null | Yes | One of: "trial", "cancellation". |
subscription.hasPaymentMethod | boolean | Yes | — |
subscription.motion | enum | null | Yes | One of: "self_serve", "sales". |
subscription.planId | string | null | Yes | — |
subscription.planName | string | null | Yes | — |
subscription.scheduledPlan | object | null | Yes | — |
subscription.scheduledPlan.id | string | Yes | — |
subscription.scheduledPlan.name | string | Yes | — |
subscription.scheduledPlan.on | string | Yes | — |
subscription.status | enum | Yes | One of: "trialing", "active", "past_due", "expired", "none". |
subscription.trialEndsOn | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
coupons | array<UsedCoupon> | Yes | — |
coupons[].name | string | Yes | — |
coupons[].redeemedAt | string (date-time) | Yes | — |
coupons[].summary | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
customPricing | boolean | Yes | — |
motion | enum | null | Yes | One of: "self_serve", "sales". |
numberLimit | integer | Yes | — |
plan | object | null | Yes | — |
plan.description | string | null | Yes | — |
plan.id | string (plan_… ID) | Yes | ID (plan_…) |
plan.name | string | Yes | — |
terms | object | null | Yes | — |
terms.billingIncrementSeconds | integer | Yes | — |
terms.cancellationGraceHours | integer | null | Yes | — |
terms.currency | string | Yes | — |
terms.meters | array<object> | Yes | — |
terms.meters[].included | number | Yes | — |
terms.meters[].meter | enum | Yes | One of: "minutes", "answered", "booked", "sms_sent", "chat_message", "notetaker_minutes", "rep_minutes". |
terms.meters[].tiers | array<object> | Yes | — |
terms.meters[].tiers[].unitPriceCents | number | Yes | — |
terms.meters[].tiers[].upTo | number | null | Yes | — |
terms.meters[].unitPriceCents | number | Yes | — |
terms.monthlyCreditCents | integer | Yes | — |
terms.monthlyFeeCents | integer | Yes | — |
terms.perNumberFeeCents | integer | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
planId | string (plan_… ID) | Yes | ID (plan_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
change | object | Yes | — |
change.effect | enum | Yes | One of: "now", "scheduled", "unchanged". |
change.on | string | Yes | — |
subscription | AccountSubscription | Yes | — |
subscription.allowance | object | null | Yes | — |
subscription.allowance.testCallMinutes | object | Yes | — |
subscription.allowance.testCallMinutes.limit | integer | Yes | — |
subscription.allowance.testCallMinutes.used | integer | Yes | — |
subscription.allowance.testChatMessages | object | Yes | — |
subscription.allowance.testChatMessages.limit | integer | Yes | — |
subscription.allowance.testChatMessages.used | integer | Yes | — |
subscription.cancelAt | string | null | Yes | — |
subscription.daysLeft | integer | null | Yes | — |
subscription.endedBy | enum | null | Yes | One of: "trial", "cancellation". |
subscription.hasPaymentMethod | boolean | Yes | — |
subscription.motion | enum | null | Yes | One of: "self_serve", "sales". |
subscription.planId | string | null | Yes | — |
subscription.planName | string | null | Yes | — |
subscription.scheduledPlan | object | null | Yes | — |
subscription.scheduledPlan.id | string | Yes | — |
subscription.scheduledPlan.name | string | Yes | — |
subscription.scheduledPlan.on | string | Yes | — |
subscription.status | enum | Yes | One of: "trialing", "active", "past_due", "expired", "none". |
subscription.trialEndsOn | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
planId | string (plan_… ID) | Yes | ID (plan_…) |
Response 202
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | One of: "sent". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
plans | array<SelfServePlan> | Yes | — |
plans[].currency | string | Yes | — |
plans[].current | boolean | Yes | — |
plans[].description | string | null | Yes | — |
plans[].id | string (plan_… ID) | Yes | ID (plan_…) |
plans[].includedBooked | number | Yes | — |
plans[].includedMinutes | number | Yes | — |
plans[].monthlyFeeCents | integer | Yes | — |
plans[].name | string | Yes | — |
plans[].numberLimit | integer | Yes | — |
plans[].perNumberFeeCents | integer | Yes | — |
plans[].pricePerBookedCents | number | Yes | — |
plans[].pricePerMinuteCents | number | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
allowance | object | null | Yes | — |
allowance.testCallMinutes | object | Yes | — |
allowance.testCallMinutes.limit | integer | Yes | — |
allowance.testCallMinutes.used | integer | Yes | — |
allowance.testChatMessages | object | Yes | — |
allowance.testChatMessages.limit | integer | Yes | — |
allowance.testChatMessages.used | integer | Yes | — |
cancelAt | string | null | Yes | — |
daysLeft | integer | null | Yes | — |
endedBy | enum | null | Yes | One of: "trial", "cancellation". |
hasPaymentMethod | boolean | Yes | — |
motion | enum | null | Yes | One of: "self_serve", "sales". |
planId | string | null | Yes | — |
planName | string | null | Yes | — |
scheduledPlan | object | null | Yes | — |
scheduledPlan.id | string | Yes | — |
scheduledPlan.name | string | Yes | — |
scheduledPlan.on | string | Yes | — |
status | enum | Yes | One of: "trialing", "active", "past_due", "expired", "none". |
trialEndsOn | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string (bpg_… ID) | Yes | ID (bpg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | One of: "active", "paused", "archived". |
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string (bpg_… ID) | Yes | ID (bpg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | One of: "active", "paused", "archived". |
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
entitlements | array<Entitlement> | Yes | — |
entitlements[].decidedBy | string | Yes | — |
entitlements[].description | string | Yes | — |
entitlements[].key | enum | Yes | One of: "conversation_intelligence", "insights.ask", "notetaker", "booking_pages". |
entitlements[].kind | enum | Yes | One of: "boolean", "limit", "quota", "set", "level". |
entitlements[].label | string | Yes | — |
entitlements[].note | string | null | Yes | — |
entitlements[].on | boolean | Yes | — |
entitlements[].provenance | array<object | object | object | object | object | object> | Yes | — |
entitlements[].provenance[].layer | constant | Yes | (variant 1) Always "default". |
entitlements[].provenance[].layer | constant | Yes | (variant 2) Always "plan". |
entitlements[].provenance[].name | string | Yes | (variant 2) |
entitlements[].provenance[].layer | constant | Yes | (variant 3) Always "add_on". |
entitlements[].provenance[].name | string | Yes | (variant 3) |
entitlements[].provenance[].grantId | string | Yes | (variant 4) |
entitlements[].provenance[].layer | constant | Yes | (variant 4) Always "grant". |
entitlements[].provenance[].source | enum | Yes | (variant 4) One of: "contract", "coupon", "trial", "trial_extension", "goodwill", "manual". |
entitlements[].provenance[].layer | constant | Yes | (variant 5) Always "included". |
entitlements[].provenance[].with | string | Yes | (variant 5) |
entitlements[].provenance[].layer | constant | Yes | (variant 6) Always "requires". |
entitlements[].provenance[].missing | string | Yes | (variant 6) |
entitlements[].upgradePath | enum | Yes | One of: "talk_to_sales", "upgrade". |
entitlements[].value | boolean | number | string | array<string> | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
clientAllowlist | array<string> | null | Yes | — |
enabled | boolean | Yes | — |
writeRoles | array<enum> | Yes | Items: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
clientAllowlist | array<string> | null | Yes | Up to 100 items. |
enabled | boolean | Yes | — |
writeRoles | array<enum> | Yes | Items: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". Up to 5 items. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
clientAllowlist | array<string> | null | Yes | — |
enabled | boolean | Yes | — |
writeRoles | array<enum> | Yes | Items: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
members | array<Member> | Yes | — |
members[].createdAt | string (date-time) | Yes | — |
members[].deactivatedAt | string (date-time) | null | Yes | — |
members[].email | string | null | Yes | — |
members[].groupIds | array<string (grp_… ID)> | Yes | — |
members[].id | string (mem_… ID) | Yes | ID (mem_…) |
members[].invitedAt | string (date-time) | null | Yes | — |
members[].joinedAt | string (date-time) | null | Yes | — |
members[].mfaEnrolled | boolean | Yes | — |
members[].name | string | null | Yes | — |
members[].role | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
members[].status | enum | Yes | One of: "invited", "active", "deactivated". |
members[].userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
email | string (email) | Yes | Up to 254 characters. |
groupIds | array<string (grp_… ID)> | No | Up to 200 items. Default: []. |
role | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
createdAt | string (date-time) | Yes | — |
deactivatedAt | string (date-time) | null | Yes | — |
email | string | null | Yes | — |
groupIds | array<string (grp_… ID)> | Yes | — |
id | string (mem_… ID) | Yes | ID (mem_…) |
invitedAt | string (date-time) | null | Yes | — |
joinedAt | string (date-time) | null | Yes | — |
mfaEnrolled | boolean | Yes | — |
name | string | null | Yes | — |
role | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
status | enum | Yes | One of: "invited", "active", "deactivated". |
userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
memberId | string (mem_… ID) | Yes | ID (mem_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
groupIds | array<string (grp_… ID)> | No | Up to 200 items. |
role | enum | No | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
createdAt | string (date-time) | Yes | — |
deactivatedAt | string (date-time) | null | Yes | — |
email | string | null | Yes | — |
groupIds | array<string (grp_… ID)> | Yes | — |
id | string (mem_… ID) | Yes | ID (mem_…) |
invitedAt | string (date-time) | null | Yes | — |
joinedAt | string (date-time) | null | Yes | — |
mfaEnrolled | boolean | Yes | — |
name | string | null | Yes | — |
role | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
status | enum | Yes | One of: "invited", "active", "deactivated". |
userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
memberId | string (mem_… ID) | Yes | ID (mem_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
createdAt | string (date-time) | Yes | — |
deactivatedAt | string (date-time) | null | Yes | — |
email | string | null | Yes | — |
groupIds | array<string (grp_… ID)> | Yes | — |
id | string (mem_… ID) | Yes | ID (mem_…) |
invitedAt | string (date-time) | null | Yes | — |
joinedAt | string (date-time) | null | Yes | — |
mfaEnrolled | boolean | Yes | — |
name | string | null | Yes | — |
role | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
status | enum | Yes | One of: "invited", "active", "deactivated". |
userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
memberId | string (mem_… ID) | Yes | ID (mem_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
createdAt | string (date-time) | Yes | — |
deactivatedAt | string (date-time) | null | Yes | — |
email | string | null | Yes | — |
groupIds | array<string (grp_… ID)> | Yes | — |
id | string (mem_… ID) | Yes | ID (mem_…) |
invitedAt | string (date-time) | null | Yes | — |
joinedAt | string (date-time) | null | Yes | — |
mfaEnrolled | boolean | Yes | — |
name | string | null | Yes | — |
role | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
status | enum | Yes | One of: "invited", "active", "deactivated". |
userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
memberId | string (mem_… ID) | Yes | ID (mem_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
createdAt | string (date-time) | Yes | — |
deactivatedAt | string (date-time) | null | Yes | — |
email | string | null | Yes | — |
groupIds | array<string (grp_… ID)> | Yes | — |
id | string (mem_… ID) | Yes | ID (mem_…) |
invitedAt | string (date-time) | null | Yes | — |
joinedAt | string (date-time) | null | Yes | — |
mfaEnrolled | boolean | Yes | — |
name | string | null | Yes | — |
role | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
status | enum | Yes | One of: "invited", "active", "deactivated". |
userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
grants | array<OAuthGrant> | Yes | — |
grants[].clientId | string | Yes | — |
grants[].clientName | string | null | Yes | — |
grants[].createdAt | string (date-time) | Yes | — |
grants[].expiresAt | string (date-time) | null | Yes | — |
grants[].groupIds | array<string (grp_… ID)> | null | Yes | — |
grants[].id | string (ogr_… ID) | Yes | ID (ogr_…) |
grants[].lastUsedAt | string (date-time) | null | Yes | — |
grants[].redirectHost | string | null | Yes | — |
grants[].scopes | array<string> | Yes | — |
grants[].userEmail | string | null | Yes | — |
grants[].userId | string (usr_… ID) | Yes | ID (usr_…) |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
grantId | string (ogr_… ID) | Yes | ID (ogr_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
revoked | enum | Yes | One of: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
userId | string (usr_… ID) | Yes | ID (usr_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
accountSlug | string | Yes | — |
bookingAppUrl | string | Yes | — |
groupPages | array<object> | Yes | — |
groupPages[].groupName | string | Yes | — |
groupPages[].id | string (bpg_… ID) | Yes | ID (bpg_…) |
groupPages[].status | enum | Yes | One of: "active", "paused", "archived". |
groupPages[].title | string | Yes | — |
groupPages[].url | string | null | Yes | — |
groups | array<object> | Yes | — |
groups[].id | string (grp_… ID) | Yes | ID (grp_…) |
groups[].name | string | Yes | — |
matchEmail | string | null | Yes | — |
pages | array<BookingPageSummary> | Yes | — |
pages[].bookingsThisMonth | integer | Yes | — |
pages[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
pages[].groupName | string | Yes | — |
pages[].id | string (bpg_… ID) | Yes | ID (bpg_…) |
pages[].pausedBy | enum | null | Yes | One of: "owner", "admin". |
pages[].settings | BookingPageSettings | Yes | — |
pages[].settings.assignment | object | object | Yes | Default: \{"mode":"round_robin","strategy":"equal"\}. |
pages[].settings.assignment.mode | constant | Yes | (variant 1) Always "round_robin". |
pages[].settings.assignment.strategy | enum | Yes | (variant 1) One of: "equal", "most_available". Default: "equal". |
pages[].settings.assignment.mode | constant | Yes | (variant 2) Always "invitee_chooses". |
pages[].settings.brandId | string (brd_… ID) | null | Yes | — |
pages[].settings.bufferAfterMinutes | integer | Yes | Between 0 and 120. Default: 0. |
pages[].settings.bufferBeforeMinutes | integer | Yes | Between 0 and 120. Default: 0. |
pages[].settings.color | string | null | Yes | Pattern: ^#[0-9a-f]\{6\}$. |
pages[].settings.coverPhoto | string (uri) | string (uri) | null | Yes | — |
pages[].settings.dailyLimit | integer | null | Yes | Between 1 and 50. |
pages[].settings.description | string | Yes | Up to 1000 characters. Default: "". |
pages[].settings.durations | array<constant | constant | constant | constant> | Yes | Up to 4 items. Default: [30]. |
pages[].settings.increment | constant | constant | constant | constant | Yes | Default: 30. |
pages[].settings.location | object | object | object | object | object | Yes | Default: \{"kind":"in_person"\}. |
pages[].settings.location.kind | constant | Yes | (variant 1) Always "in_person". |
pages[].settings.location.kind | constant | Yes | (variant 2) Always "phone_invitee". |
pages[].settings.location.kind | constant | Yes | (variant 3) Always "phone_rep". |
pages[].settings.location.phone | string | Yes | (variant 3) 7–32 characters. |
pages[].settings.location.kind | constant | Yes | (variant 4) Always "video". |
pages[].settings.location.url | string (uri) | Yes | (variant 4) A https:// link Up to 2000 characters. |
pages[].settings.location.kind | constant | Yes | (variant 5) Always "custom". |
pages[].settings.location.text | string | Yes | (variant 5) 1–200 characters. |
pages[].settings.meetingType | string | null | Yes | Up to 64 characters. |
pages[].settings.minNoticeMinutes | integer | Yes | Between 0 and 43200. Default: 240. |
pages[].settings.pageHours | array<object> | null | Yes | Up to 50 items. |
pages[].settings.pageHours[].days | array<enum> | Yes | Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". |
pages[].settings.pageHours[].end | string | constant | Yes | — |
pages[].settings.pageHours[].start | string | Yes | Pattern: ^([01]\d|2[0-3]):[0-5]\d$. |
pages[].settings.preferLeadRep | boolean | Yes | Default: true. |
pages[].settings.questions | array<object> | Yes | Up to 10 items. Default: []. |
pages[].settings.questions[].fieldKey | string | No | 1–64 characters. Pattern: ^[a-z][a-z0-9_]*$. |
pages[].settings.questions[].id | string | Yes | 1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$. |
pages[].settings.questions[].kind | enum | Yes | One of: "short_text", "long_text", "single_choice", "multiple_choice", "yes_no", "date". |
pages[].settings.questions[].label | string | Yes | 1–200 characters. |
pages[].settings.questions[].options | array<string> | No | Up to 20 items. |
pages[].settings.questions[].required | boolean | Yes | Default: false. |
pages[].settings.redirectUrl | string (uri) | null | Yes | Up to 2000 characters. |
pages[].settings.reminderDayBefore | boolean | Yes | Default: true. |
pages[].settings.reminderTwoHours | boolean | Yes | Default: true. |
pages[].settings.requireEmail | boolean | Yes | Default: true. |
pages[].settings.requirePhone | boolean | Yes | Default: true. |
pages[].settings.scheduleId | string | null | Yes | Up to 40 characters. |
pages[].settings.service | object | object | object | Yes | Default: \{"kind":"none"\}. |
pages[].settings.service.kind | constant | Yes | (variant 1) Always "none". |
pages[].settings.service.kind | constant | Yes | (variant 2) Always "fixed". |
pages[].settings.service.serviceId | string (srv_… ID) | Yes | (variant 2) ID (srv_…) |
pages[].settings.service.kind | constant | Yes | (variant 3) Always "ask". |
pages[].settings.serviceCoverPhoto | boolean | Yes | Default: false. |
pages[].settings.title | string | Yes | 1–80 characters. |
pages[].settings.window | object | object | Yes | Default: \{"days":30,"kind":"rolling"\}. |
pages[].settings.window.days | integer | Yes | (variant 1) Between 1 and 365. |
pages[].settings.window.kind | constant | Yes | (variant 1) Always "rolling". |
pages[].settings.window.from | string (date) | Yes | (variant 2) |
pages[].settings.window.kind | constant | Yes | (variant 2) Always "range". |
pages[].settings.window.to | string (date) | Yes | (variant 2) |
pages[].slug | string | Yes | — |
pages[].status | enum | Yes | One of: "active", "paused", "archived". |
pages[].updatedAt | string (date-time) | Yes | — |
pages[].url | string | null | Yes | — |
primaryGroupId | string (grp_… ID) | null | Yes | — |
repSlug | string | null | Yes | — |
schedules | array<object> | Yes | — |
schedules[].id | string (avs_… ID) | Yes | ID (avs_…) |
schedules[].isDefault | boolean | Yes | — |
schedules[].name | string | Yes | — |
Errors: 400, 401, 402, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
blockers | array<object> | Yes | — |
blockers[].reason | string | Yes | — |
blockers[].sample | SampleRecord | Yes | — |
blockers[].sample.id | string | Yes | — |
blockers[].sample.kind | enum | Yes | One of: "group", "playbook". |
blockers[].sample.name | string | Yes | — |
hidden | boolean | Yes | — |
samples | array<SampleRecord> | Yes | — |
samples[].id | string | Yes | — |
samples[].kind | enum | Yes | One of: "group", "playbook". |
samples[].name | string | Yes | — |
seeded | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
hidden | boolean | Yes | — |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
blockers | array<object> | Yes | — |
blockers[].reason | string | Yes | — |
blockers[].sample | SampleRecord | Yes | — |
blockers[].sample.id | string | Yes | — |
blockers[].sample.kind | enum | Yes | One of: "group", "playbook". |
blockers[].sample.name | string | Yes | — |
hidden | boolean | Yes | — |
samples | array<SampleRecord> | Yes | — |
samples[].id | string | Yes | — |
samples[].kind | enum | Yes | One of: "group", "playbook". |
samples[].name | string | Yes | — |
seeded | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
id | string (grp_… ID) | Yes | (variant 1) ID (grp_…) |
kind | enum | Yes | (variant 1) One of: "group". |
id | string (pb_… ID) | Yes | (variant 2) ID (pb_…) |
kind | enum | Yes | (variant 2) One of: "playbook". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
kept | array<SampleRecord> | Yes | — |
kept[].id | string | Yes | — |
kept[].kind | enum | Yes | One of: "group", "playbook". |
kept[].name | string | Yes | — |
sampleData | SampleData | Yes | — |
sampleData.blockers | array<object> | Yes | — |
sampleData.blockers[].reason | string | Yes | — |
sampleData.blockers[].sample | SampleRecord | Yes | — |
sampleData.blockers[].sample.id | string | Yes | — |
sampleData.blockers[].sample.kind | enum | Yes | One of: "group", "playbook". |
sampleData.blockers[].sample.name | string | Yes | — |
sampleData.hidden | boolean | Yes | — |
sampleData.samples | array<SampleRecord> | Yes | — |
sampleData.samples[].id | string | Yes | — |
sampleData.samples[].kind | enum | Yes | One of: "group", "playbook". |
sampleData.samples[].name | string | Yes | — |
sampleData.seeded | boolean | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Field | Type | Required | Description |
|---|---|---|---|
identities | array<ServiceIdentity> | Yes | — |
identities[].activeTokens | integer | Yes | — |
identities[].createdAt | string (date-time) | Yes | — |
identities[].description | string | null | Yes | — |
identities[].disabledAt | string (date-time) | null | Yes | — |
identities[].groupIds | array<string (grp_… ID)> | null | Yes | — |
identities[].id | string (svc_… ID) | Yes | ID (svc_…) |
identities[].name | string | Yes | — |
identities[].roleCeiling | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
description | string | No | Up to 300 characters. |
groupIds | array<string (grp_… ID)> | null | No | Up to 200 items. |
name | string | Yes | 1–80 characters. |
roleCeiling | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer". |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
identity | ServiceIdentity | Yes | — |
identity.activeTokens | integer | Yes | — |
identity.createdAt | string (date-time) | Yes | — |
identity.description | string | null | Yes | — |
identity.disabledAt | string (date-time) | null | Yes | — |
identity.groupIds | array<string (grp_… ID)> | null | Yes | — |
identity.id | string (svc_… ID) | Yes | ID (svc_…) |
identity.name | string | Yes | — |
identity.roleCeiling | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
identityId | string (svc_… ID) | Yes | ID (svc_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
description | string | null | No | Up to 300 characters. |
disabled | boolean | No | — |
name | string | No | 1–80 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
identity | ServiceIdentity | Yes | — |
identity.activeTokens | integer | Yes | — |
identity.createdAt | string (date-time) | Yes | — |
identity.description | string | null | Yes | — |
identity.disabledAt | string (date-time) | null | Yes | — |
identity.groupIds | array<string (grp_… ID)> | null | Yes | — |
identity.id | string (svc_… ID) | Yes | ID (svc_…) |
identity.name | string | Yes | — |
identity.roleCeiling | enum | Yes | One of: "owner", "admin", "editor", "group_manager", "viewer", "sales_rep". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
identityId | string (svc_… ID) | Yes | ID (svc_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
clients | array<ServiceOAuthClient> | Yes | — |
clients[].clientId | string | Yes | — |
clients[].createdAt | string (date-time) | Yes | — |
clients[].lastUsedAt | string (date-time) | null | Yes | — |
clients[].revokedAt | string (date-time) | null | Yes | — |
clients[].scopes | array<string> | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
identityId | string (svc_… ID) | Yes | ID (svc_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
scopes | array<string> | Yes | Up to 30 items. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
client | ServiceOAuthClient | Yes | — |
client.clientId | string | Yes | — |
client.createdAt | string (date-time) | Yes | — |
client.lastUsedAt | string (date-time) | null | Yes | — |
client.revokedAt | string (date-time) | null | Yes | — |
client.scopes | array<string> | Yes | — |
clientId | string | Yes | — |
clientSecret | string | Yes | — |
resource | string | Yes | — |
tokenEndpoint | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
identityId | string (svc_… ID) | Yes | ID (svc_…) |
clientId | string | Yes | 1–100 characters. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
revoked | enum | Yes | One of: true. |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
identityId | string (svc_… ID) | Yes | ID (svc_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
days | enum | enum | enum | null | No | — |
groupIds | array<string (grp_… ID)> | null | No | Up to 200 items. |
ipAllowlist | array<string> | null | No | Up to 20 items. |
name | string | Yes | 1–80 characters. |
scopes | array<string> | Yes | Up to 30 items. |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
apiToken | ApiToken | Yes | — |
apiToken.createdAt | string (date-time) | Yes | — |
apiToken.expiresAt | string (date-time) | null | Yes | — |
apiToken.groupIds | array<string (grp_… ID)> | null | Yes | — |
apiToken.id | string (tok_… ID) | Yes | ID (tok_…) |
apiToken.ipAllowlist | array<string> | null | Yes | — |
apiToken.kind | enum | Yes | One of: "personal", "service". |
apiToken.lastFour | string | Yes | — |
apiToken.lastUsedAt | string (date-time) | null | Yes | — |
apiToken.lastUsedIp | string | null | Yes | — |
apiToken.name | string | Yes | — |
apiToken.prefix | string | Yes | — |
apiToken.scopes | array<string> | Yes | — |
apiToken.serviceIdentityId | string (svc_… ID) | null | Yes | — |
apiToken.serviceIdentityName | string | null | Yes | — |
apiToken.userEmail | string | null | Yes | — |
apiToken.userId | string (usr_… ID) | null | Yes | — |
token | string | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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.
| Field | Type | Required | Description |
|---|---|---|---|
feature | enum | Yes | One of: "conversation_intelligence", "insights.ask", "notetaker", "booking_pages". |
Response 202
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | One of: "sent". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | No | ID (grp_…) |
limit | integer | No | Between 1 and 200. Default: 100. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
items | array<MyVisitAction> | Yes | — |
items[].actionKey | string | null | Yes | — |
items[].bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
items[].canTake | boolean | Yes | — |
items[].canUndo | boolean | Yes | — |
items[].canWork | boolean | Yes | — |
items[].closedAt | string (date-time) | null | Yes | — |
items[].closedInCrm | boolean | Yes | — |
items[].createdAt | string (date-time) | Yes | — |
items[].crmTask | boolean | Yes | — |
items[].dismissReason | string | null | Yes | — |
items[].dueAt | string (date-time) | Yes | — |
items[].id | string (vac_… ID) | Yes | ID (vac_…) |
items[].label | string | Yes | — |
items[].note | string | null | Yes | — |
items[].owner | object | null | Yes | — |
items[].owner.name | string | Yes | — |
items[].owner.userId | string (usr_… ID) | Yes | ID (usr_…) |
items[].ownerSource | enum | Yes | One of: "rep", "backup", "member". |
items[].status | enum | Yes | One of: "open", "done", "dismissed". |
items[].version | integer | Yes | — |
items[].visit | VisitActionVisit | Yes | — |
items[].visit.groupId | string (grp_… ID) | Yes | ID (grp_…) |
items[].visit.groupName | string | Yes | — |
items[].visit.open | object | object | object | Yes | — |
items[].visit.open.bookingId | string (bkg_… ID) | Yes | (variant 1) ID (bkg_…) |
items[].visit.open.kind | constant | Yes | (variant 1) Always "meeting". |
items[].visit.open.callId | string (call_… ID) | Yes | (variant 2) ID (call_…) |
items[].visit.open.kind | constant | Yes | (variant 2) Always "call". |
items[].visit.open.kind | constant | Yes | (variant 3) Always "none". |
items[].visit.start | string (date-time) | Yes | — |
items[].visit.timeZone | string | null | Yes | — |
items[].visit.who | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
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
| Name | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
bookingId | string (bkg_… ID) | Yes | ID (bkg_…) |
finishedAt | string (date-time) | null | Yes | — |
groupId | string (grp_… ID) | Yes | ID (grp_…) |
movedTo | string | null | Yes | — |
notes | array<object> | Yes | — |
notes[].author | string | Yes | — |
notes[].createdAt | string (date-time) | Yes | — |
notes[].text | string | Yes | — |
photos | object | Yes | — |
photos.onPage | integer | Yes | — |
photos.ready | integer | Yes | — |
photos.shared | integer | Yes | — |
sentToCrmAt | string (date-time) | null | Yes | — |
startAt | string (date-time) | Yes | — |
steps | array<object> | Yes | — |
steps[].crmTask | boolean | Yes | — |
steps[].dueAt | string (date-time) | Yes | — |
steps[].key | string | null | Yes | — |
steps[].label | string | Yes | — |
steps[].owner | string | null | Yes | — |
steps[].status | enum | Yes | One of: "open", "done", "dismissed". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/visits/{bookingId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"