---
title: "Open a relayed Gladia live-transcription session"
method: POST
path: "/v1/dictation/live"
tags: ["Desktop"]
---

# Open a relayed Gladia live-transcription session

`POST /v1/dictation/live`

## Request

- Base URL: `https://api.quillhub.ai`
- URL: `https://api.quillhub.ai/v1/dictation/live`
- Auth: HTTP bearer

Creates a Gladia live session server-side and returns a WebSocket URL on this API. The client never sees the Gladia key and never contacts api.gladia.io — which is what makes dictation work from networks that block it. Connect to `relay_url` within `expires_in` seconds. The ticket is scoped to this one session and to the calling user, and is NOT single-use: verification is stateless (HMAC only) so that any `api` replica can serve the socket, which means the same ticket opens more than one relay socket while it is still valid. Concurrency is bounded instead — the relay refuses a connection with close code 4429 once a user already holds the per-user maximum of live relay sockets.

## Request body

- object
  - `language` string
  - `workspace_id` integer
  - `idempotency_key` string, uuid

## Response `201`

Session created.

- object
  - `session_id` string, required
  - `relay_url` string, required
  - `poll_token` string, required: Signed, opaque token for GET /v1/dictation/live/{session_id}. Carries the internal key id, never the Gladia key itself. Valid 15 minutes.
  - `expires_in` integer, required

## Other responses

- `401`: Unauthenticated.
- `402`: No minutes left and no active subscription.
- `409`: Idempotency key is in progress, failed, or conflicts with another payload.
- `429`: Too many sessions.
- `503`: Relay unconfigured or Gladia unavailable.

---

[API](https://skmtc.dev/quillhub/apis/quillhub-public-api.md) · [All operations](https://skmtc.dev/quillhub/apis/quillhub-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/quillhub/apis/quillhub-public-api/revisions/5bd42ee9d967?raw)
