API Reference
Queues

Delete a queue

DELETE
/v1/queues/{name}

Deletes the queue and the bindings between it and its agents, then pushes the workspace to the phone system.

API-key scope: queues.manage. Viewer members are refused (accounts.write_denied).

The AGENTS SURVIVE: a person belongs to the workspace, not to one queue, and may still serve others.

NOT idempotent: deleting a queue that is already gone is a 404.

Any number whose routing still points at this queue keeps pointing at a name that no longer exists — repoint it with PUT /v1/numbers/{id}/routing before deleting, or the next save will recreate the queue from that number's queue block.

Authorization

bearerAuth
AuthorizationBearer <token>

Long-lived ES256 JWT minted from the dashboard (https://app.sautikit.com/developers/api-keys). Signed by the platform keyring. Carries workspace_id and scopes claims; revoked via the platform deny-list.

In: header

Path Parameters

name*string
Match^[A-Za-z0-9._-]{1,64}$

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/v1/queues/string"
Empty
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ],    "resolution": "string",    "reason": "invalid_characters",    "suggested_e164": "+254727524723"  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ],    "resolution": "string",    "reason": "invalid_characters",    "suggested_e164": "+254727524723"  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ],    "resolution": "string",    "reason": "invalid_characters",    "suggested_e164": "+254727524723"  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ],    "resolution": "string",    "reason": "invalid_characters",    "suggested_e164": "+254727524723"  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ],    "resolution": "string",    "reason": "invalid_characters",    "suggested_e164": "+254727524723"  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ],    "resolution": "string",    "reason": "invalid_characters",    "suggested_e164": "+254727524723"  }}

Replace a queue's settings PUT

**API-key scope:** `queues.manage`. Viewer members are refused (`accounts.write_denied`). ## This is a FULL REPLACE, not a patch An omitted setting RETURNS TO ITS DEFAULT — it does not keep the value the previous save left. The body you send is the queue you get. To change one setting, send every setting you want to keep along with it; `GET /v1/queues/{name}` first if you do not have them to hand. Concretely: a queue saved with `max_wait_seconds: 600` and then updated with a body of `{"sharing_mode": "take_turns"}` comes back with `max_wait_seconds: 0` (hold indefinitely) and `announce_position: false`. The ROSTER is the exception, because it is not part of this body at all: agents are untouched by an update and are replaced only through `PUT /v1/queues/{name}/agents`. Queues cannot be renamed. `name` may be omitted from the body; if it is present it must equal the name in the path, and a mismatch is a `400` rather than a silently ignored rename. Update-only: an unknown name is a `404`, not an implicit create.

Replace a queue's agent roster PUT

Replaces the queue's roster with the supplied extensions, IN ORDER, and pushes the workspace to the phone system. **API-key scope:** `queues.manage`. Viewer members are refused (`accounts.write_denied`). A LIST, not a set: the order is what `chosen_order` means. It is always stored, whatever the sharing mode, so switching modes later keeps the order you set. Positions come back 1-based; every agent is at level 1 (preference bands are not offered yet). WHOLESALE REPLACE: an extension left out is unbound from this queue and stops receiving its calls. The person is not deleted — they belong to the workspace and may serve other queues. Sending `{"agents": []}` empties the queue. All-or-nothing: every extension is resolved BEFORE anything is written, so a typo in the fourth name leaves the roster exactly as it was rather than half-applied. Each extension must be one with a LIVE LINE in this workspace — the devices that ring for it are resolved from your current records at save time, never taken from the request, so a re-enrolled app keeps ringing without a roster edit. A PSTN number is not an extension and cannot be a roster entry. Setting somebody's roster does not change their ACD status: a person the switch has on a break stays on it.