Voice API
Outbound and inbound voice calling, transcripts, and analytics Base path:/api/v1/voice
Endpoint count: 17
List agent-guided call scripts for a queue
GET /api/v1/voice/queues/{id}/scriptsname ascending. Used by the agent console at call-bridge time to render the scripted-prompts panel.
—
Get one queue script with its sections
GET /api/v1/voice/queues/{id}/scripts/{scriptId}sort_order). The agent console renders this client-side at call-bridge time.
—
—
List tenant skill catalog
GET /api/v1/voice/skill-catalog?includeInactive=true for the admin catalog editor’s tombstone view.
When
true, includes soft-deleted (is_active=false) rows. Default false.List department voicemail boxes
GET /api/v1/voice/voicemail-boxes/name ascending. Each box carries its member roster and optional inbound_route_id back-ref. The list is cursor-paginated: a request returns at most limit boxes (default 50), and meta.pagination reports whether more pages remain.
Opaque cursor for the next page. Pass
meta.pagination.cursor from the previous response to fetch the next page; omit for the first page.Maximum boxes to return per page (1–100, default 50).
Cursor to pass as
cursor to fetch the next page. null on the final page.true when more boxes remain beyond this page (fetch the next page with cursor); false on the final page.Get one department voicemail box
GET /api/v1/voice/voicemail-boxes/{id}:id when it belongs to the caller’s organization. 404 if the id does not exist or belongs to another org.
—
Mint a short-lived transcript SSE ticket
POST /api/v1/voice/calls/{callId}/transcript/ticket?ticket= on /transcript/stream. Removes the need to put a long-lived API key on the SSE URL.
—
Generate AI call summary
POST /api/v1/voice/calls/{id}/summary—
Create a queue script
POST /api/v1/voice/queues/{id}/scripts—
—
—
—
—
Create a tenant skill catalog row
POST /api/v1/voice/skill-catalogSKILL_SLUG_ALREADY_EXISTS.
Lowercased + trimmed at the Zod boundary. UNIQUE per (org, slug) where is_active=TRUE — a duplicate active slug returns 409
SKILL_SLUG_ALREADY_EXISTS.—
—
Create a department voicemail box
POST /api/v1/voice/voicemail-boxes/name MUST be unique within the org and is slug-shaped. Every members[*] id is validated against the org’s user roster — leaked ids from other tenants are rejected with 422. Returns 201 with the created row.
Slug-shape name; UNIQUE within the org.
—
Initial roster of subscribed user ids (max 50).
—
Update a department voicemail box
PUT /api/v1/voice/voicemail-boxes/{id}members (when supplied) replaces the roster (not delta-merged); every id is re-validated against the org. Returns the persisted row.
—
—
—
—
—
Update softphone in-call notes
PATCH /api/v1/voice/calls/{id}/notes—
—
Update queue script metadata and sections
PATCH /api/v1/voice/queues/{id}/scripts/{scriptId}sections is supplied it FULLY REPLACES the existing section tree (delete + insert in one transaction). Empty patch (no fields) returns 400.
—
—
—
—
—
—
Update a tenant skill catalog row
PATCH /api/v1/voice/skill-catalog/{id}label, description, isActive. At least one field MUST be present. description: null clears the field; omission preserves it. Setting isActive: false soft-deletes the row.
—
—
—
—
Delete a queue script
DELETE /api/v1/voice/queues/{id}/scripts/{scriptId}—
—
Soft-delete a tenant skill catalog row
DELETE /api/v1/voice/skill-catalog/{id}is_active=false. The historical row is preserved for analytics + audit; future writes referencing the slug will fail assertSkillsRegistered. Operators may re-create the slug with a fresh row (the partial unique excludes tombstones).
—
Delete a department voicemail box
DELETE /api/v1/voice/voicemail-boxes/{id}box_id pointing at this row are NOT deleted — they surface under the dashboard’s Archived / orphan box group (matches user-deletion semantics for assigned_user_id). Returns 204 on success.
—