API reference

Numbers

Phone numbers and playbook assignments

MethodPathSummary
GET/v1/account/direct-linesReps' direct lines: numbers that ring one rep first, then the agent
GET/v1/account/numbersThe account's phone numbers with their group and what they run
GET/v1/account/numbers/availableLocal numbers you can buy, by area code (owner of a self-serve account with a card)
POST/v1/account/numbers/buyBuy a number and place it in a community (owner of a self-serve account with a card, within the plan’s limit)
GET/v1/account/numbers/self-serveWhether the owner can buy a number now, and how many the plan allows
PATCH/v1/account/numbers/{numberId}Rename a number (the label your team sees next to it), or say whether the test number rings your team on test calls
PUT/v1/account/numbers/{numberId}/assignmentPoint a number at a playbook: pinned to a version or following the latest publish. Its schedule, if it has one, is kept
GET/v1/account/numbers/{numberId}/assignmentsWhat this number ran and when, newest first
PUT/v1/account/numbers/{numberId}/direct-lineMake a number a rep's direct line: every part of its schedule rings them first, then its playbook
DELETE/v1/account/numbers/{numberId}/direct-lineStop a number being a rep’s direct line: the agent answers it straight away again
PUT/v1/account/numbers/{numberId}/groupPlace a number in one of your groups, move it to another, or leave it unplaced
PUT/v1/account/numbers/{numberId}/routingSave a number's whole schedule: what it runs at all other times, and each holiday, closure or weekly window that runs another playbook
GET/v1/account/numbers/{numberId}/routing/previewWhat a call to this number would do at a moment: which part of the schedule answers, who would ring and when, and who would be skipped and why

Reps' direct lines: numbers that ring one rep first, then the agent#

GET /v1/account/direct-lines

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
canRingbooleanYes—
directLinesarray<DirectLine>Yes—
directLines[].e164stringYes—
directLines[].groupIdstring (grp_… ID)YesID (grp_…)
directLines[].labelstring | nullYes—
directLines[].phoneNumberIdstring (pn_… ID)YesID (pn_…)
directLines[].ringGroupIdstring (rgp_… ID)YesID (rgp_…)
directLines[].ringSecondsintegerYes—
directLines[].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/direct-lines" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

The account's phone numbers with their group and what they run#

GET /v1/account/numbers

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

Response 200

FieldTypeRequiredDescription
numbersarray<PhoneNumber>Yes—
numbers[].assignmentany | nullYes—
numbers[].closuresarray<object>Yes—
numbers[].closures[].fromstring (date)Yes—
numbers[].closures[].hoursobject | nullYes—
numbers[].closures[].hours.endstring | constantYes—
numbers[].closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
numbers[].closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
numbers[].closures[].namestringYes1–60 characters.
numbers[].closures[].tostring (date)Yes—
numbers[].e164stringYes—
numbers[].groupIdstring (grp_… ID) | nullYes—
numbers[].groupNamestring | nullYes—
numbers[].idstring (pn_… ID)YesID (pn_…)
numbers[].isTestbooleanYes—
numbers[].labelstring | nullYes—
numbers[].statusenumYesOne of: "active", "released".
numbers[].testRingsTeambooleanYes—
numbers[].timeZonestring | nullYes—

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

Example

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

Local numbers you can buy, by area code (owner of a self-serve account with a card)#

GET /v1/account/numbers/available

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

Query parameters

NameTypeRequiredDescription
areaCodestringYesPattern: ^\d\{3\}$.

Response 200

FieldTypeRequiredDescription
numbersarray<AvailableNumber>Yes—
numbers[].e164stringYes—
numbers[].localitystringNo—
numbers[].regionstringNo—
numbers[].typeenumYesOne of: "local", "toll_free".

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/numbers/available?areaCode=string" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Buy a number and place it in a community (owner of a self-serve account with a card, within the plan’s limit)#

POST /v1/account/numbers/buy

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

Request body

application/json, required.

FieldTypeRequiredDescription
e164stringYesPattern: ^\+1[2-9][0-9]\{9\}$.
groupIdstring (grp_… ID)YesID (grp_…)

Response 201

FieldTypeRequiredDescription
numberPhoneNumberYes—
number.assignmentany | nullYes—
number.closuresarray<object>Yes—
number.closures[].fromstring (date)Yes—
number.closures[].hoursobject | nullYes—
number.closures[].hours.endstring | constantYes—
number.closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
number.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
number.closures[].namestringYes1–60 characters.
number.closures[].tostring (date)Yes—
number.e164stringYes—
number.groupIdstring (grp_… ID) | nullYes—
number.groupNamestring | nullYes—
number.idstring (pn_… ID)YesID (pn_…)
number.isTestbooleanYes—
number.labelstring | nullYes—
number.statusenumYesOne of: "active", "released".
number.testRingsTeambooleanYes—
number.timeZonestring | nullYes—

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

Example

bash
curl -X POST "$ANSWERSTACK_API_URL/v1/account/numbers/buy" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "e164": "string",
  "groupId": "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'

Whether the owner can buy a number now, and how many the plan allows#

GET /v1/account/numbers/self-serve

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

Response 200

FieldTypeRequiredDescription
allowedbooleanYes—
heldinteger | nullYes—
limitinteger | nullYes—
needsCardbooleanYes—
reasonstring | nullYes—

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

Example

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

Rename a number (the label your team sees next to it), or say whether the test number rings your team on test calls#

PATCH /v1/account/numbers/{numberId}

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

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Request body

application/json, required.

FieldTypeRequiredDescription
labelstring | nullNoUp to 120 characters.
testRingsTeambooleanNo—

Response 200

FieldTypeRequiredDescription
numberPhoneNumberYes—
number.assignmentany | nullYes—
number.closuresarray<object>Yes—
number.closures[].fromstring (date)Yes—
number.closures[].hoursobject | nullYes—
number.closures[].hours.endstring | constantYes—
number.closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
number.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
number.closures[].namestringYes1–60 characters.
number.closures[].tostring (date)Yes—
number.e164stringYes—
number.groupIdstring (grp_… ID) | nullYes—
number.groupNamestring | nullYes—
number.idstring (pn_… ID)YesID (pn_…)
number.isTestbooleanYes—
number.labelstring | nullYes—
number.statusenumYesOne of: "active", "released".
number.testRingsTeambooleanYes—
number.timeZonestring | nullYes—

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

Example

bash
curl -X PATCH "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "label": "string",
  "testRingsTeam": true
}'

Point a number at a playbook: pinned to a version or following the latest publish. Its schedule, if it has one, is kept#

PUT /v1/account/numbers/{numberId}/assignment

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

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Request body

application/json, required.

FieldTypeRequiredDescription
modeenumYesOne of: "pinned", "follow_latest".
playbookIdstring (pb_… ID)YesID (pb_…)
versioninteger | enumNo—

Response 200

FieldTypeRequiredDescription
droppedRoutesarray<string>Yes—
effectiveobject | nullYes—
effective.issuesarray<string>Yes—
effective.outcomestringYes—
numberPhoneNumberYes—
number.assignmentany | nullYes—
number.closuresarray<object>Yes—
number.closures[].fromstring (date)Yes—
number.closures[].hoursobject | nullYes—
number.closures[].hours.endstring | constantYes—
number.closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
number.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
number.closures[].namestringYes1–60 characters.
number.closures[].tostring (date)Yes—
number.e164stringYes—
number.groupIdstring (grp_… ID) | nullYes—
number.groupNamestring | nullYes—
number.idstring (pn_… ID)YesID (pn_…)
number.isTestbooleanYes—
number.labelstring | nullYes—
number.statusenumYesOne of: "active", "released".
number.testRingsTeambooleanYes—
number.timeZonestring | nullYes—

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

Example

bash
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}/assignment" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "playbookId": "pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
  "mode": "pinned"
}'

What this number ran and when, newest first#

GET /v1/account/numbers/{numberId}/assignments

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

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Response 200

FieldTypeRequiredDescription
assignmentsarray<NumberAssignment>Yes—
assignments[].assignedBystring (usr_… ID) | string (svc_… ID) | nullYes—
assignments[].effectiveFromstring (date-time)Yes—
assignments[].effectiveTostring (date-time) | nullYes—
assignments[].experimentobject | nullYes—
assignments[].experiment.idstring (exp_… ID)YesID (exp_…)
assignments[].experiment.namestringYes—
assignments[].experiment.versionsarray<integer>Yes—
assignments[].idstring (nas_… ID)YesID (nas_…)
assignments[].modeenumYesOne of: "pinned", "follow_latest".
assignments[].playbookIdstring (pb_… ID)YesID (pb_…)
assignments[].playbookNamestringYes—
assignments[].playbookVersionIdstring (pbv_… ID) | nullYes—
assignments[].ringFirstany | nullYes—
assignments[].routesarray<NumberRoute>Yes—
assignments[].routes[].idstring (nrt_… ID)YesID (nrt_…)
assignments[].routes[].modeenumYesOne of: "pinned", "follow_latest".
assignments[].routes[].namestringYes—
assignments[].routes[].playbookIdstring (pb_… ID)YesID (pb_…)
assignments[].routes[].playbookNamestringYes—
assignments[].routes[].playbookVersionIdstring (pbv_… ID) | nullYes—
assignments[].routes[].ringFirstany | nullYes—
assignments[].routes[].runningVersioninteger | nullYes—
assignments[].routes[].whenobject | object | objectYes—
assignments[].routes[].when.kindconstantYes(variant 1) Always "weekly".
assignments[].routes[].when.windowsarray<object>Yes(variant 1) Up to 14 items.
assignments[].routes[].when.everyYearbooleanYes(variant 2) Default: false.
assignments[].routes[].when.hoursobject | nullYes(variant 2)
assignments[].routes[].when.kindconstantYes(variant 2) Always "dates".
assignments[].routes[].when.rangesarray<object>Yes(variant 2) Up to 30 items.
assignments[].routes[].when.kindconstantYes(variant 3) Always "closed".
assignments[].routes[].whenInWordsstringYes—
assignments[].runningDraftbooleanYes—
assignments[].runningVersioninteger | nullYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}/assignments" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Make a number a rep's direct line: every part of its schedule rings them first, then its playbook#

PUT /v1/account/numbers/{numberId}/direct-line

Makes (or reuses) a ring group of that one rep in the number's location and saves the number's plan again with the ring step on every part. The playbooks and the schedule stay as they were; any experiment on the number stops.

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

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Request body

application/json, required.

FieldTypeRequiredDescription
ringSecondsintegerNoBetween 10 and 60. Default: 25.
userIdstring (usr_… ID)YesID (usr_…)

Response 200

FieldTypeRequiredDescription
directLineDirectLineYes—
directLine.e164stringYes—
directLine.groupIdstring (grp_… ID)YesID (grp_…)
directLine.labelstring | nullYes—
directLine.phoneNumberIdstring (pn_… ID)YesID (pn_…)
directLine.ringGroupIdstring (rgp_… ID)YesID (rgp_…)
directLine.ringSecondsintegerYes—
directLine.userIdstring (usr_… ID)YesID (usr_…)

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

Example

bash
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}/direct-line" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "userId": "usr_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'

Stop a number being a rep’s direct line: the agent answers it straight away again#

DELETE /v1/account/numbers/{numberId}/direct-line

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

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Response 204

No content.

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

Example

bash
curl -X DELETE "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}/direct-line" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Place a number in one of your groups, move it to another, or leave it unplaced#

PUT /v1/account/numbers/{numberId}/group

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

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Request body

application/json, required.

FieldTypeRequiredDescription
groupIdstring (grp_… ID) | nullYes—

Response 200

FieldTypeRequiredDescription
droppedRoutesarray<string>Yes—
effectiveobject | nullYes—
effective.issuesarray<string>Yes—
effective.outcomestringYes—
numberPhoneNumberYes—
number.assignmentany | nullYes—
number.closuresarray<object>Yes—
number.closures[].fromstring (date)Yes—
number.closures[].hoursobject | nullYes—
number.closures[].hours.endstring | constantYes—
number.closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
number.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
number.closures[].namestringYes1–60 characters.
number.closures[].tostring (date)Yes—
number.e164stringYes—
number.groupIdstring (grp_… ID) | nullYes—
number.groupNamestring | nullYes—
number.idstring (pn_… ID)YesID (pn_…)
number.isTestbooleanYes—
number.labelstring | nullYes—
number.statusenumYesOne of: "active", "released".
number.testRingsTeambooleanYes—
number.timeZonestring | nullYes—
outcomesarray<NumberRoutingOutcome>Yes—
outcomes[].issuesarray<string>Yes—
outcomes[].outcomestringYes—
outcomes[].playbookIdstring (pb_… ID)YesID (pb_…)
outcomes[].routesarray<string | null>Yes—
outcomes[].versionintegerYes—

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

Example

bash
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}/group" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "groupId": "grp_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}'

Save a number's whole schedule: what it runs at all other times, and each holiday, closure or weekly window that runs another playbook#

PUT /v1/account/numbers/{numberId}/routing

Holidays and closures are checked first, then the weekly schedule, each in the order given; the first that matches answers, in the group's time zone. Saving closes the number's assignment and opens a new one, so any experiment running on the number stops.

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

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Request body

application/json, required.

FieldTypeRequiredDescription
defaultobjectYes—
default.modeenumYesOne of: "pinned", "follow_latest".
default.playbookIdstring (pb_… ID)YesID (pb_…)
default.ringFirstobjectNo—
default.ringFirst.ringGroupIdstring (rgp_… ID)YesID (rgp_…)
default.ringFirst.ringSecondsintegerNoBetween 10 and 60. Default: 25.
default.versioninteger | enumNo—
routesarray<object>YesUp to 20 items.
routes[].modeenumYesOne of: "pinned", "follow_latest".
routes[].namestringYes1–60 characters.
routes[].playbookIdstring (pb_… ID)YesID (pb_…)
routes[].ringFirstobjectNo—
routes[].ringFirst.ringGroupIdstring (rgp_… ID)YesID (rgp_…)
routes[].ringFirst.ringSecondsintegerNoBetween 10 and 60. Default: 25.
routes[].versionintegerNoMinimum 1.
routes[].whenobject | object | objectYes—
routes[].when.kindenumYes(variant 1) One of: "weekly".
routes[].when.windowsarray<object>Yes(variant 1) Up to 14 items.
routes[].when.windows[].daysarray<enum>Yes(variant 1) Items: "mon", "tue", "wed", "thu", "fri", "sat", "sun". Up to 7 items.
routes[].when.windows[].endstring | enumYes(variant 1)
routes[].when.windows[].startstringYes(variant 1) Pattern: ^([01]\d|2[0-3]):[0-5]\d$.
routes[].when.everyYearbooleanNo(variant 2) Default: false.
routes[].when.hoursobject | nullNo(variant 2)
routes[].when.hours.endstring | enumYes(variant 2)
routes[].when.hours.startstringYes(variant 2) Pattern: ^([01]\d|2[0-3]):[0-5]\d$.
routes[].when.kindenumYes(variant 2) One of: "dates".
routes[].when.rangesarray<object>Yes(variant 2) Up to 30 items.
routes[].when.ranges[].fromstring (date)Yes(variant 2)
routes[].when.ranges[].tostring (date)Yes(variant 2)
routes[].when.kindenumYes(variant 3) One of: "closed".

Response 200

FieldTypeRequiredDescription
numberPhoneNumberYes—
number.assignmentany | nullYes—
number.closuresarray<object>Yes—
number.closures[].fromstring (date)Yes—
number.closures[].hoursobject | nullYes—
number.closures[].hours.endstring | constantYes—
number.closures[].hours.startstringYesPattern: ^([01]\d|2[0-3]):[0-5]\d$.
number.closures[].idstringYes1–64 characters. Pattern: ^[a-z0-9][a-z0-9_-]*$.
number.closures[].namestringYes1–60 characters.
number.closures[].tostring (date)Yes—
number.e164stringYes—
number.groupIdstring (grp_… ID) | nullYes—
number.groupNamestring | nullYes—
number.idstring (pn_… ID)YesID (pn_…)
number.isTestbooleanYes—
number.labelstring | nullYes—
number.statusenumYesOne of: "active", "released".
number.testRingsTeambooleanYes—
number.timeZonestring | nullYes—
outcomesarray<NumberRoutingOutcome>Yes—
outcomes[].issuesarray<string>Yes—
outcomes[].outcomestringYes—
outcomes[].playbookIdstring (pb_… ID)YesID (pb_…)
outcomes[].routesarray<string | null>Yes—
outcomes[].versionintegerYes—

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

Example

bash
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}/routing" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "default": {
    "playbookId": "pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
    "mode": "pinned"
  },
  "routes": [
    {
      "name": "string",
      "when": {
        "kind": "weekly",
        "windows": [
          {}
        ]
      },
      "playbookId": "pb_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE",
      "mode": "pinned"
    }
  ]
}'

What a call to this number would do at a moment: which part of the schedule answers, who would ring and when, and who would be skipped and why#

GET /v1/account/numbers/{numberId}/routing/preview

Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).

Path parameters

NameTypeRequiredDescription
numberIdstring (pn_… ID)YesID (pn_…)

Query parameters

NameTypeRequiredDescription
atstring (date-time)No—
assumeAvailableenumNoOne of: "true", "false".

Response 200

FieldTypeRequiredDescription
atstring (date-time)Yes—
canRingbooleanYes—
playbookIdstring (pb_… ID)YesID (pb_…)
playbookNamestringYes—
ringFirstobject | nullYes—
ringFirst.canRingbooleanYes—
ringFirst.membersarray<object>Yes—
ringFirst.members[].endSecondinteger | nullYes—
ringFirst.members[].memberIdstring (rgm_… ID)YesID (rgm_…)
ringFirst.members[].namestringYes—
ringFirst.members[].reasonstring | nullYes—
ringFirst.members[].reasonInWordsstring | nullYes—
ringFirst.members[].ringbooleanYes—
ringFirst.members[].startSecondinteger | nullYes—
ringFirst.requireKeyPressbooleanYes—
ringFirst.ringGroupIdstring (rgp_… ID)YesID (rgp_…)
ringFirst.ringGroupNamestringYes—
ringFirst.ringSecondsintegerYes—
ringFirst.strategyenumYesOne of: "all", "in_order", "rotate".
routeIdstring (nrt_… ID) | nullYes—
routeNamestringYes—
runningVersioninteger | nullYes—
sentencestringYes—
timeZonestringYes—

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

Example

bash
curl -X GET "$ANSWERSTACK_API_URL/v1/account/numbers/{numberId}/routing/preview" \
  -H "Authorization: Bearer $ACCESS_TOKEN"