API reference
Ring Groups
Ring Groups endpoints.
| Method | Path | Summary |
|---|---|---|
GET | /v1/account/groups/{groupId}/ring-groups | A location's ring groups: who its numbers can ring before the agent answers |
POST | /v1/account/groups/{groupId}/ring-groups | Add a ring group to a location |
GET | /v1/account/ring-groups/{ringGroupId} | A ring group with its members and the numbers that ring it |
PUT | /v1/account/ring-groups/{ringGroupId} | Save a ring group whole: its settings and its members in ring order. Every number that rings it uses the change on its next call |
POST | /v1/account/ring-groups/{ringGroupId}/archive | Archive a ring group no number rings any more |
GET | /v1/account/ring-groups/{ringGroupId}/history | Every saved state of a ring group, newest first: who was in it, in what order, and how it rang |
POST | /v1/account/ring-groups/{ringGroupId}/restore | Bring an archived ring group back |
A location's ring groups: who its numbers can ring before the agent answers#
GET /v1/account/groups/{groupId}/ring-groups
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token). Bearer token: Authorization: Bearer <token> (An API token (ans_pat_ or ans_svc_). Only routes that list a scope here accept one, and only with that scope.).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
archived | enum | No | One of: "true", "false". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
ringGroups | array<RingGroup> | Yes | — |
ringGroups[].archivedAt | string (date-time) | null | Yes | — |
ringGroups[].groupId | string (grp_… ID) | Yes | ID (grp_…) |
ringGroups[].id | string (rgp_… ID) | Yes | ID (rgp_…) |
ringGroups[].memberSeconds | integer | Yes | — |
ringGroups[].members | array<RingGroupMember> | Yes | — |
ringGroups[].members[].active | boolean | Yes | — |
ringGroups[].members[].email | string | null | Yes | — |
ringGroups[].members[].hasPhone | boolean | Yes | — |
ringGroups[].members[].id | string (rgm_… ID) | Yes | ID (rgm_…) |
ringGroups[].members[].kind | enum | Yes | One of: "rep", "number". |
ringGroups[].members[].label | string | null | Yes | — |
ringGroups[].members[].name | string | Yes | — |
ringGroups[].members[].phone | string | null | Yes | — |
ringGroups[].members[].position | integer | Yes | — |
ringGroups[].members[].takingCalls | boolean | null | Yes | — |
ringGroups[].members[].userId | string (usr_… ID) | null | Yes | — |
ringGroups[].name | string | Yes | — |
ringGroups[].onlyInsideRepHours | boolean | Yes | — |
ringGroups[].requireKeyPress | boolean | Yes | — |
ringGroups[].revision | integer | Yes | — |
ringGroups[].ringsOnHandoff | boolean | Yes | — |
ringGroups[].rotateCursor | integer | null | Yes | — |
ringGroups[].strategy | enum | Yes | One of: "all", "in_order", "rotate". |
ringGroups[].updatedAt | string (date-time) | Yes | — |
ringGroups[].usedBy | array<object> | Yes | — |
ringGroups[].usedBy[].e164 | string | Yes | — |
ringGroups[].usedBy[].label | string | null | Yes | — |
ringGroups[].usedBy[].phoneNumberId | string (pn_… ID) | Yes | ID (pn_…) |
ringGroups[].usedBy[].routeName | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/ring-groups" \
-H "Authorization: Bearer $ACCESS_TOKEN"Add a ring group to a location#
POST /v1/account/groups/{groupId}/ring-groups
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
groupId | string (grp_… ID) | Yes | ID (grp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
memberSeconds | integer | No | Between 5 and 60. Default: 15. |
members | array<object> | Yes | Up to 25 items. |
members[].label | string | No | 1–60 characters. |
members[].phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
members[].userId | string (usr_… ID) | No | ID (usr_…) |
name | string | Yes | 1–60 characters. |
onlyInsideRepHours | boolean | No | Default: false. |
requireKeyPress | boolean | No | Default: true. |
strategy | enum | No | One of: "all", "in_order", "rotate". Default: "all". |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
ringGroup | RingGroup | Yes | — |
ringGroup.archivedAt | string (date-time) | null | Yes | — |
ringGroup.groupId | string (grp_… ID) | Yes | ID (grp_…) |
ringGroup.id | string (rgp_… ID) | Yes | ID (rgp_…) |
ringGroup.memberSeconds | integer | Yes | — |
ringGroup.members | array<RingGroupMember> | Yes | — |
ringGroup.members[].active | boolean | Yes | — |
ringGroup.members[].email | string | null | Yes | — |
ringGroup.members[].hasPhone | boolean | Yes | — |
ringGroup.members[].id | string (rgm_… ID) | Yes | ID (rgm_…) |
ringGroup.members[].kind | enum | Yes | One of: "rep", "number". |
ringGroup.members[].label | string | null | Yes | — |
ringGroup.members[].name | string | Yes | — |
ringGroup.members[].phone | string | null | Yes | — |
ringGroup.members[].position | integer | Yes | — |
ringGroup.members[].takingCalls | boolean | null | Yes | — |
ringGroup.members[].userId | string (usr_… ID) | null | Yes | — |
ringGroup.name | string | Yes | — |
ringGroup.onlyInsideRepHours | boolean | Yes | — |
ringGroup.requireKeyPress | boolean | Yes | — |
ringGroup.revision | integer | Yes | — |
ringGroup.ringsOnHandoff | boolean | Yes | — |
ringGroup.rotateCursor | integer | null | Yes | — |
ringGroup.strategy | enum | Yes | One of: "all", "in_order", "rotate". |
ringGroup.updatedAt | string (date-time) | Yes | — |
ringGroup.usedBy | array<object> | Yes | — |
ringGroup.usedBy[].e164 | string | Yes | — |
ringGroup.usedBy[].label | string | null | Yes | — |
ringGroup.usedBy[].phoneNumberId | string (pn_… ID) | Yes | ID (pn_…) |
ringGroup.usedBy[].routeName | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/groups/{groupId}/ring-groups" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"members": [
{
"label": "string",
"phone": "string",
"userId": "usr_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}
]
}'A ring group with its members and the numbers that ring it#
GET /v1/account/ring-groups/{ringGroupId}
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 |
|---|---|---|---|
ringGroupId | string (rgp_… ID) | Yes | ID (rgp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
ringGroup | RingGroup | Yes | — |
ringGroup.archivedAt | string (date-time) | null | Yes | — |
ringGroup.groupId | string (grp_… ID) | Yes | ID (grp_…) |
ringGroup.id | string (rgp_… ID) | Yes | ID (rgp_…) |
ringGroup.memberSeconds | integer | Yes | — |
ringGroup.members | array<RingGroupMember> | Yes | — |
ringGroup.members[].active | boolean | Yes | — |
ringGroup.members[].email | string | null | Yes | — |
ringGroup.members[].hasPhone | boolean | Yes | — |
ringGroup.members[].id | string (rgm_… ID) | Yes | ID (rgm_…) |
ringGroup.members[].kind | enum | Yes | One of: "rep", "number". |
ringGroup.members[].label | string | null | Yes | — |
ringGroup.members[].name | string | Yes | — |
ringGroup.members[].phone | string | null | Yes | — |
ringGroup.members[].position | integer | Yes | — |
ringGroup.members[].takingCalls | boolean | null | Yes | — |
ringGroup.members[].userId | string (usr_… ID) | null | Yes | — |
ringGroup.name | string | Yes | — |
ringGroup.onlyInsideRepHours | boolean | Yes | — |
ringGroup.requireKeyPress | boolean | Yes | — |
ringGroup.revision | integer | Yes | — |
ringGroup.ringsOnHandoff | boolean | Yes | — |
ringGroup.rotateCursor | integer | null | Yes | — |
ringGroup.strategy | enum | Yes | One of: "all", "in_order", "rotate". |
ringGroup.updatedAt | string (date-time) | Yes | — |
ringGroup.usedBy | array<object> | Yes | — |
ringGroup.usedBy[].e164 | string | Yes | — |
ringGroup.usedBy[].label | string | null | Yes | — |
ringGroup.usedBy[].phoneNumberId | string (pn_… ID) | Yes | ID (pn_…) |
ringGroup.usedBy[].routeName | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/ring-groups/{ringGroupId}" \
-H "Authorization: Bearer $ACCESS_TOKEN"Save a ring group whole: its settings and its members in ring order. Every number that rings it uses the change on its next call#
PUT /v1/account/ring-groups/{ringGroupId}
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
ringGroupId | string (rgp_… ID) | Yes | ID (rgp_…) |
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
memberSeconds | integer | No | Between 5 and 60. Default: 15. |
members | array<object> | Yes | Up to 25 items. |
members[].label | string | No | 1–60 characters. |
members[].phone | string | No | Pattern: ^\+[1-9]\d\{6,14\}$. |
members[].userId | string (usr_… ID) | No | ID (usr_…) |
name | string | Yes | 1–60 characters. |
onlyInsideRepHours | boolean | No | Default: false. |
requireKeyPress | boolean | No | Default: true. |
strategy | enum | No | One of: "all", "in_order", "rotate". Default: "all". |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
ringGroup | RingGroup | Yes | — |
ringGroup.archivedAt | string (date-time) | null | Yes | — |
ringGroup.groupId | string (grp_… ID) | Yes | ID (grp_…) |
ringGroup.id | string (rgp_… ID) | Yes | ID (rgp_…) |
ringGroup.memberSeconds | integer | Yes | — |
ringGroup.members | array<RingGroupMember> | Yes | — |
ringGroup.members[].active | boolean | Yes | — |
ringGroup.members[].email | string | null | Yes | — |
ringGroup.members[].hasPhone | boolean | Yes | — |
ringGroup.members[].id | string (rgm_… ID) | Yes | ID (rgm_…) |
ringGroup.members[].kind | enum | Yes | One of: "rep", "number". |
ringGroup.members[].label | string | null | Yes | — |
ringGroup.members[].name | string | Yes | — |
ringGroup.members[].phone | string | null | Yes | — |
ringGroup.members[].position | integer | Yes | — |
ringGroup.members[].takingCalls | boolean | null | Yes | — |
ringGroup.members[].userId | string (usr_… ID) | null | Yes | — |
ringGroup.name | string | Yes | — |
ringGroup.onlyInsideRepHours | boolean | Yes | — |
ringGroup.requireKeyPress | boolean | Yes | — |
ringGroup.revision | integer | Yes | — |
ringGroup.ringsOnHandoff | boolean | Yes | — |
ringGroup.rotateCursor | integer | null | Yes | — |
ringGroup.strategy | enum | Yes | One of: "all", "in_order", "rotate". |
ringGroup.updatedAt | string (date-time) | Yes | — |
ringGroup.usedBy | array<object> | Yes | — |
ringGroup.usedBy[].e164 | string | Yes | — |
ringGroup.usedBy[].label | string | null | Yes | — |
ringGroup.usedBy[].phoneNumberId | string (pn_… ID) | Yes | ID (pn_…) |
ringGroup.usedBy[].routeName | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X PUT "$ANSWERSTACK_API_URL/v1/account/ring-groups/{ringGroupId}" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"members": [
{
"label": "string",
"phone": "string",
"userId": "usr_2ZPh7XbT0v9Ao4iJ3qK1mN8sRgE"
}
]
}'Archive a ring group no number rings any more#
POST /v1/account/ring-groups/{ringGroupId}/archive
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
ringGroupId | string (rgp_… ID) | Yes | ID (rgp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
ringGroup | RingGroup | Yes | — |
ringGroup.archivedAt | string (date-time) | null | Yes | — |
ringGroup.groupId | string (grp_… ID) | Yes | ID (grp_…) |
ringGroup.id | string (rgp_… ID) | Yes | ID (rgp_…) |
ringGroup.memberSeconds | integer | Yes | — |
ringGroup.members | array<RingGroupMember> | Yes | — |
ringGroup.members[].active | boolean | Yes | — |
ringGroup.members[].email | string | null | Yes | — |
ringGroup.members[].hasPhone | boolean | Yes | — |
ringGroup.members[].id | string (rgm_… ID) | Yes | ID (rgm_…) |
ringGroup.members[].kind | enum | Yes | One of: "rep", "number". |
ringGroup.members[].label | string | null | Yes | — |
ringGroup.members[].name | string | Yes | — |
ringGroup.members[].phone | string | null | Yes | — |
ringGroup.members[].position | integer | Yes | — |
ringGroup.members[].takingCalls | boolean | null | Yes | — |
ringGroup.members[].userId | string (usr_… ID) | null | Yes | — |
ringGroup.name | string | Yes | — |
ringGroup.onlyInsideRepHours | boolean | Yes | — |
ringGroup.requireKeyPress | boolean | Yes | — |
ringGroup.revision | integer | Yes | — |
ringGroup.ringsOnHandoff | boolean | Yes | — |
ringGroup.rotateCursor | integer | null | Yes | — |
ringGroup.strategy | enum | Yes | One of: "all", "in_order", "rotate". |
ringGroup.updatedAt | string (date-time) | Yes | — |
ringGroup.usedBy | array<object> | Yes | — |
ringGroup.usedBy[].e164 | string | Yes | — |
ringGroup.usedBy[].label | string | null | Yes | — |
ringGroup.usedBy[].phoneNumberId | string (pn_… ID) | Yes | ID (pn_…) |
ringGroup.usedBy[].routeName | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/ring-groups/{ringGroupId}/archive" \
-H "Authorization: Bearer $ACCESS_TOKEN"Every saved state of a ring group, newest first: who was in it, in what order, and how it rang#
GET /v1/account/ring-groups/{ringGroupId}/history
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 |
|---|---|---|---|
ringGroupId | string (rgp_… ID) | Yes | ID (rgp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
revisions | array<RingGroupRevision> | Yes | — |
revisions[].action | enum | Yes | One of: "created", "updated", "archived", "restored". |
revisions[].memberSeconds | integer | Yes | — |
revisions[].members | array<object> | Yes | — |
revisions[].members[].kind | enum | Yes | One of: "rep", "number". |
revisions[].members[].name | string | Yes | — |
revisions[].name | string | Yes | — |
revisions[].onlyInsideRepHours | boolean | Yes | — |
revisions[].requireKeyPress | boolean | Yes | — |
revisions[].revision | integer | Yes | — |
revisions[].savedAt | string (date-time) | Yes | — |
revisions[].savedBy | string (usr_… ID) | string (svc_… ID) | null | Yes | — |
revisions[].strategy | enum | Yes | One of: "all", "in_order", "rotate". |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X GET "$ANSWERSTACK_API_URL/v1/account/ring-groups/{ringGroupId}/history" \
-H "Authorization: Bearer $ACCESS_TOKEN"Bring an archived ring group back#
POST /v1/account/ring-groups/{ringGroupId}/restore
Authentication: Bearer token: Authorization: Bearer <token> (Supabase access token).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
ringGroupId | string (rgp_… ID) | Yes | ID (rgp_…) |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
ringGroup | RingGroup | Yes | — |
ringGroup.archivedAt | string (date-time) | null | Yes | — |
ringGroup.groupId | string (grp_… ID) | Yes | ID (grp_…) |
ringGroup.id | string (rgp_… ID) | Yes | ID (rgp_…) |
ringGroup.memberSeconds | integer | Yes | — |
ringGroup.members | array<RingGroupMember> | Yes | — |
ringGroup.members[].active | boolean | Yes | — |
ringGroup.members[].email | string | null | Yes | — |
ringGroup.members[].hasPhone | boolean | Yes | — |
ringGroup.members[].id | string (rgm_… ID) | Yes | ID (rgm_…) |
ringGroup.members[].kind | enum | Yes | One of: "rep", "number". |
ringGroup.members[].label | string | null | Yes | — |
ringGroup.members[].name | string | Yes | — |
ringGroup.members[].phone | string | null | Yes | — |
ringGroup.members[].position | integer | Yes | — |
ringGroup.members[].takingCalls | boolean | null | Yes | — |
ringGroup.members[].userId | string (usr_… ID) | null | Yes | — |
ringGroup.name | string | Yes | — |
ringGroup.onlyInsideRepHours | boolean | Yes | — |
ringGroup.requireKeyPress | boolean | Yes | — |
ringGroup.revision | integer | Yes | — |
ringGroup.ringsOnHandoff | boolean | Yes | — |
ringGroup.rotateCursor | integer | null | Yes | — |
ringGroup.strategy | enum | Yes | One of: "all", "in_order", "rotate". |
ringGroup.updatedAt | string (date-time) | Yes | — |
ringGroup.usedBy | array<object> | Yes | — |
ringGroup.usedBy[].e164 | string | Yes | — |
ringGroup.usedBy[].label | string | null | Yes | — |
ringGroup.usedBy[].phoneNumberId | string (pn_… ID) | Yes | ID (pn_…) |
ringGroup.usedBy[].routeName | string | null | Yes | — |
Errors: 400, 401, 403, 404, 409, 429, 500, with an ErrorBody body.
Example
curl -X POST "$ANSWERSTACK_API_URL/v1/account/ring-groups/{ringGroupId}/restore" \
-H "Authorization: Bearer $ACCESS_TOKEN"