Worked request and response samples
Copy a request as written, substitute your own team and member ids, and compare the response envelope. Successful writes return{ data, meta }; failures return the { error, meta } envelope. The retry-vs-surface matrix for every class sits at the bottom of this page.
Teams back the routing-rule assign_team action: inbox and voice routing rules resolve a group to a load-balanced member from this roster. Reads below list the roster and its members; writes create and tune the group new rules point at.
Create a team
POST /api/v1/teams201 envelope. name must be unique within your workspace; active: false keeps the group out of routing assignment while you populate its members.
Request
name returns a 409 CONFLICT telling you the name is taken — pick a new name or PATCH the existing team instead of blind-retrying:
409
List members of a team
GET /api/v1/teams/{id}/memberslimit defaults to 25 and caps at 100; when meta.pagination.has_more is true, pass meta.pagination.cursor back as the cursor query parameter for the next page. total counts the whole team regardless of the cursor.
Request
(created_at, id), and active: false members stay listed but are skipped by load-balanced assignment. When total saturates the display cap (1,000), meta.pagination.total_capped: true is set so a UI can render “1,000+” — paging still walks every member via the cursor.
Update routing assignment availability
PATCH /api/v1/teams/{id}active: false pulls the team out of routing-rule assign_team resolution without deleting it or its roster; flip it back to true to resume. Any subset of name, description, and active is accepted — unset fields are untouched.
Request
Errors worth branching on
These failures cover the create, member-list, and update calls above plus the invite (POST /api/v1/teams//members) they feed. Each block below is a full{ error, meta } envelope as the API returns it, and the matrix at the bottom answers retry vs surface for the same classes. For the platform-wide decision table these branches plug into, see the error handling guide.
401 — Unauthorized
401 on this page is the bearer key failing before the route ran — it never means the resource is wrong. Rotate the key or re-mint the scoped token; retrying the same request changes nothing.
403 — Forbidden
403 means the key authenticated but the operation is gated by scope — check the key’s scopes on the developer page; a 403 is never a data-not-found shape. Team writes require the team:invite grant, which built-in roles hand to owners and admins.
422 — Schema
422 means the payload did not match the request schema — branch on error.details.field and resend a corrected body instead of blind-retrying the same one.
429 — Rate
Retry-After header and error.details.retry_after are both set on every 429 — resend the SAME request after the lower of the two.
404 — Not found
404 on PATCH / DELETE means the team_* id does not exist in your workspace — re-list teams and branch on the current id rather than retrying the stale one.