codai docs
API referenceGateway

Transcripts

Record meetings and calls on any device, get a diarized Romanian/English transcript with word timings, then a summary, key points, actions and ready-to-run agent prompts.

Transcripts turns a recording into searchable text and something you can act on. The desktop app, the phone and the watch record locally and upload in the background; the gateway transcribes with speaker labels and word timings (Romanian and English, mixed in one recording too), then writes the insights: a title, a summary, cited key points, actions, decisions, open questions and agent prompts you can launch.

Transcripts is enabled per account while it is in preview. When it is off for your key, every endpoint below answers 404.

How a recording flows

  1. Create. POST /v1/transcripts with a client-generated client_id (a retry after a crash returns the same transcript) and started_at. Status recording.
  2. Upload. Each track (mic, system loopback, or one mixed track) goes up with tus 1.0 at /v1/uploads: resumable, at most 8 MB per PATCH, so a dropped connection or a restart continues from the last byte the server holds (HEAD /v1/uploads/{id}). Upload ids belong to your account; another key cannot append to them.
  3. Finalize. POST /v1/transcripts/{id}/finalize with the upload ids, the duration, bookmarks and (optionally) the live preview text. Status queued.
  4. Transcribe. The worker cuts the audio into windows of up to 15 minutes (diarization limit) and sends them to Gemini 3.5 Transcribe. Speakers are matched across windows. Status transcribing, then analyzing.
  5. Insights. A model writes the insights from the transcript (prompt caching on). Status ready. A failure after 5 attempts ends in failed with error; POST …/retranscribe and …/reanalyze re-run a step.

While a step retries, status does not change; GET /v1/transcripts/{id} returns processing with attempts, max_attempts, last_error and next_attempt_at, so a client can say "retrying" instead of looking stuck. GET /v1/transcripts/stream (server-sent events) sends a transcript event on every status change.

Live view. While recording, the device can POST /v1/transcripts/{id}/live with its rolling caption (finals, partial, level, device, elapsed_ms, paused) about once a second. Every viewer of the stream (the hub detail page, desktop, phone, watch) receives it as op: live; nothing is stored, and frames closer than 250 ms are dropped.

import { readFile } from 'node:fs/promises';
import { Codai } from 'codai-sdk';

const codai = new Codai({ apiKey: process.env.CODAI_API_KEY! });
const t = await codai.transcripts.create({
  client_id: crypto.randomUUID(),
  source: 'desktop',
  started_at: new Date().toISOString(),
});
const uploadId = await codai.transcripts.uploadAudio(await readFile('meeting.ogg'), {
  transcriptId: t.id,
  onProgress: (sent, total) => console.log(`${sent}/${total}`),
});
await codai.transcripts.finalize(t.id, {
  duration_ms: 1_800_000,
  uploads: [{ track: 'mic', upload_id: uploadId }],
});
for await (const e of codai.transcripts.stream()) if (e.id === t.id && e.status === 'ready') break;
const done = await codai.transcripts.get(t.id);
console.log(done.insights?.summary);
from codai import Codai

codai = Codai(api_key="codai_...")
t = codai.transcripts.create({"client_id": "rec-2026-10-06-1", "source": "desktop", "started_at": "2026-10-06T09:00:00Z"})
upload_id = codai.transcripts.upload_audio(open("meeting.ogg", "rb").read(), transcript_id=t["id"])
codai.transcripts.finalize(t["id"], {"duration_ms": 1_800_000, "uploads": [{"track": "mic", "upload_id": upload_id}]})
srt = codai.transcripts.export(t["id"], "srt")["text"]

Working with a transcript

  • Read. GET /v1/transcripts/{id}: speakers (rename one, or mark yourself, with PATCH …/speakers/{label}), utterances with word timings (correct one with PATCH …/utterances/{seq}), bookmarks and the latest insights.
  • Search and ask. GET /v1/transcripts/search is full-text plus semantic (mode=hybrid, the default). POST /v1/transcripts/ask answers a question across your recordings with [n] citations to the transcript, speaker and time.
  • Act. Insights carry suggested agent prompts; POST …/prompts/{index}/accept turns one into a pending prompt with source: transcript, ready to launch on a device.
  • Export and play. GET …/export?format=md|txt|srt|vtt|json|pdf|docx (see below); GET …/audio returns short-lived signed playback URLs per track.
  • Organise. Folders (/v1/transcript-folders), tags and pins; a personal vocabulary (PUT /v1/transcript-vocabulary) for names and jargon the transcriber should spell right.

Export as PDF or Word

GET /v1/transcripts/{id}/export?format=pdf and format=docx return a binary attachment named after the title (an ASCII filename plus the exact title in filename*). The document holds the title, date, duration and speakers, then the summary, key points and actions when the insights exist, then the speaker-labelled transcript with [hh:mm:ss] timestamps. The PDF embeds a Unicode font, so Romanian diacritics (ș, ț, ă, î, â) print correctly. Labels follow the transcript language (Romanian or English).

import { writeFile } from 'node:fs/promises';

const pdf = await codai.transcripts.export(t.id, 'pdf'); // { bytes, filename, contentType }
await writeFile(pdf.filename ?? 'transcript.pdf', pdf.bytes);
docx = codai.transcripts.export(t["id"], "docx")  # {"bytes", "filename", "content_type"}
open(docx["filename"] or "transcript.docx", "wb").write(docx["bytes"])

POST /v1/transcripts/{id}/shares with an optional expiresInDays (1–365; omit it for a link that never expires) returns { id, token, url, expiresAt }, where url is https://hub.codai.ro/t/<token>. Anyone with the link can read the title, speakers, transcript, summary, key points and actions, never the audio, and nothing that identifies your account. Decisions, open questions and suggested agent prompts stay private.

  • The token is 32 random bytes and is shown once: only its SHA-256 is stored, so GET …/shares lists the active links with url: null.
  • DELETE …/shares/{shareId} revokes a link immediately; deleting the transcript removes all its links.
  • The page behind the link reads GET /v1/public/transcripts/{token}, which needs no API key, is rate-limited per visitor and answers 404 for an unknown, expired or revoked link.
const link = await codai.transcripts.shares.create(t.id, { expiresInDays: 30 });
console.log(link.url); // copy it now; it cannot be shown again
const active = await codai.transcripts.shares.list(t.id);
await codai.transcripts.shares.revoke(t.id, active[0]!.id);

Privacy, retention and limits

  • Audio lives in an EU bucket encrypted with a dedicated key and is deleted after 30 days; the transcript text and insights stay until you delete them. After the audio is gone, audio_purged_at is set and playback and re-transcription are no longer offered.
  • DELETE /v1/transcripts/{id} removes the transcript and its audio. Account deletion removes all recordings; the account export includes every transcript table (not the audio).
  • Up to 3 hours per recording and 20 hours a month per account (GET /v1/transcripts/usage).

MCP tools

The MCP server exposes list_transcripts, get_transcript, search_transcripts, ask_transcripts, export_transcript (text formats only; PDF and Word are binary files), accept_transcript_prompt and transcript_share_create, called with your API key (OAuth tokens are refused). Deleting, revoking links, re-running and editing stay in the apps.

GET
/v1/transcripts

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Query Parameters

status?string

Only transcripts in this status.

Value in"recording""uploading""queued""transcribing""analyzing""ready""failed"
folder_id?string

Only transcripts in this folder.

Formatuuid
pinned?boolean

Filter by pinned state: true/1 only pinned, false/0 only unpinned.

tag?string

Only transcripts carrying this tag.

Lengthlength <= 40
cursor?string

next_cursor of the previous page (an ISO datetime); returns older transcripts.

Lengthlength <= 200
limit?integer

Page size (1–100).

Range1 <= value <= 100
Default30

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

One page of transcripts.

application/json
  1. response
transcripts*array<>
next_cursor*|

Cursor for the next page; null on the last page.

Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts'
Example Response
{  "transcripts": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "client_id": "string",      "title": "string",      "status": "recording",      "source": "desktop",      "template": "auto",      "language_hint": "string",      "language": "string",      "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",      "pinned": true,      "tags": [        "string"      ],      "feed_memory": true,      "started_at": "2019-08-24T14:15:22Z",      "duration_ms": 0,      "error": "string",      "audio_available": true,      "ready_at": "2019-08-24T14:15:22Z",      "created_at": "2019-08-24T14:15:22Z",      "updated_at": "2019-08-24T14:15:22Z"    }  ],  "next_cursor": "string"}
POST
/v1/transcripts

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
title?string
Lengthlength <= 200
source*string
Value in"desktop""phone""wear""web""vscode""tv""api"
template?TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
language_hint?string
Length2 <= length <= 12
Default"auto"
tracks?array<>
Items1 <= items <= 2
folder_id?|
Formatuuid
client_id*string

Client-generated id; a create retried after a crash returns the same transcript.

Length8 <= length <= 64
started_at*string
Formatdate-time
feed_memory?boolean
Defaultfalse

Response Body

The transcript (new, or the existing one for this client_id).

application/json
  1. response
id*string
Formatuuid
client_id*string
title*string
status*TranscriptStatus

Lifecycle: recording → uploading → queued → transcribing → analyzing → ready, or failed.

Value in"recording""uploading""queued""transcribing""analyzing""ready""failed"
source*string
Value in"desktop""phone""wear""web""vscode""tv""api"
template*TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
language_hint*string

auto, ro, en or another BCP-47 tag passed to the recognizer.

language*|

Detected language, once transcribed.

folder_id*|
Formatuuid
pinned*boolean
tags*array<string>
feed_memory*boolean

Opt-in for extracted facts to feed codai memory.

started_at*string
Formatdate-time
duration_ms*integer
Range0 <= value
error*string|null
audio_available*boolean

false once the 30-day retention deleted the audio.

ready_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts' \  -H 'Content-Type: application/json' \  -d '{  "source": "desktop",  "client_id": "stringst",  "started_at": "2019-08-24T14:15:22Z"}'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "client_id": "string",  "title": "string",  "status": "recording",  "source": "desktop",  "template": "auto",  "language_hint": "string",  "language": "string",  "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",  "pinned": true,  "tags": [    "string"  ],  "feed_memory": true,  "started_at": "2019-08-24T14:15:22Z",  "duration_ms": 0,  "error": "string",  "audio_available": true,  "ready_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}
GET
/v1/transcripts/usage

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Allowance used and remaining.

application/json
  1. response
used_ms*integer
Range0 <= value
cap_ms*integer
Range0 <= value
remaining_ms*integer
Range0 <= value
period_start*string
Formatdate-time
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts/usage'
Example Response
{  "used_ms": 0,  "cap_ms": 0,  "remaining_ms": 0,  "period_start": "2019-08-24T14:15:22Z"}
GET
/v1/transcripts/stream

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

SSE stream (text/event-stream, cache-control: no-cache).

response?stringtext/event-stream
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts/stream'
Example Response
"string"
GET
/v1/transcripts/search

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Query Parameters

q*string

Search query.

Length1 <= length <= 500
mode?string

Search mode.

Default"hybrid"
Value in"hybrid""text""semantic"
limit?integer

Maximum utterance hits (1–50).

Range1 <= value <= 50
Default20

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Utterance hits and title hits.

application/json
  1. response
hits*array<>
titles*array<>
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts/search?q=string'
Example Response
{  "hits": [    {      "transcript_id": "215670dc-b708-4c27-9393-0b9ca7d8935d",      "title": "string",      "start_ms": 0,      "end_ms": 0,      "speaker": "string",      "snippet": "string"    }  ],  "titles": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "title": "string"    }  ]}
POST
/v1/transcripts/ask

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
question*string
Length3 <= length <= 2000
transcript_ids?array<>

Restrict retrieval to these transcripts.

Itemsitems <= 50

Response Body

The answer and its numbered sources.

application/json
  1. response
answer*string
sources*array<>
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/ask' \  -H 'Content-Type: application/json' \  -d '{  "question": "string"}'
Example Response
{  "answer": "string",  "sources": [    {      "n": 1,      "transcript_id": "215670dc-b708-4c27-9393-0b9ca7d8935d",      "title": "string",      "start_ms": 0,      "end_ms": 0,      "text": "string"    }  ]}
GET
/v1/transcripts/{id}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

The transcript detail.

application/json
  1. response
id*string
Formatuuid
client_id*string
title*string
status*TranscriptStatus

Lifecycle: recording → uploading → queued → transcribing → analyzing → ready, or failed.

Value in"recording""uploading""queued""transcribing""analyzing""ready""failed"
source*string
Value in"desktop""phone""wear""web""vscode""tv""api"
template*TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
language_hint*string

auto, ro, en or another BCP-47 tag passed to the recognizer.

language*|

Detected language, once transcribed.

folder_id*|
Formatuuid
pinned*boolean
tags*array<string>
feed_memory*boolean

Opt-in for extracted facts to feed codai memory.

started_at*string
Formatdate-time
duration_ms*integer
Range0 <= value
error*string|null
audio_available*boolean

false once the 30-day retention deleted the audio.

ready_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
live_preview*|

On-device live text, kept as a fallback until the final transcript lands.

processing*|

The pending background job, or null when none is pending. While a job retries, status stays transcribing / analyzing; last_error and next_attempt_at say why and when it runs again. After max_attempts the transcript becomes failed.

tracks*array<>
speakers*array<>
utterances*array<>
bookmarks*array<>
insights*|null
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "client_id": "string",  "title": "string",  "status": "recording",  "source": "desktop",  "template": "auto",  "language_hint": "string",  "language": "string",  "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",  "pinned": true,  "tags": [    "string"  ],  "feed_memory": true,  "started_at": "2019-08-24T14:15:22Z",  "duration_ms": 0,  "error": "string",  "audio_available": true,  "ready_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z",  "live_preview": "string",  "processing": {    "kind": "transcribe",    "attempts": 0,    "max_attempts": 1,    "last_error": "string",    "next_attempt_at": "2019-08-24T14:15:22Z"  },  "tracks": [    {      "kind": "mic",      "bytes": 0    }  ],  "speakers": [    {      "label": "string",      "name": "string",      "is_owner": true,      "talk_ms": 0    }  ],  "utterances": [    {      "seq": 0,      "speaker": "string",      "start_ms": 0,      "end_ms": 0,      "text": "string",      "language": "string",      "words": [        {          "w": "string",          "s": 0,          "e": 0,          "c": 0        }      ],      "edited": true    }  ],  "bookmarks": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "at_ms": 0,      "label": "string"    }  ],  "insights": {    "version": 0,    "model": "string",    "created_at": "2019-08-24T14:15:22Z",    "accepted_prompts": {      "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"    },    "title": "string",    "summary": "string",    "template": "auto",    "language": "string",    "keyPoints": [      {        "text": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "actions": [      {        "text": "string",        "owner": "string",        "due": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "decisions": [      {        "text": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "openQuestions": [      {        "text": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "tags": [      "string"    ],    "project": "string",    "prompts": [      {        "title": "string",        "prompt": "string",        "repo": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ]  }}
PATCH
/v1/transcripts/{id}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
Properties1 <= properties
title?string
Length1 <= length <= 200
folder_id?|
Formatuuid
pinned?boolean
tags?array<>
Itemsitems <= 30
template?TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
feed_memory?boolean

Response Body

The updated transcript.

application/json
  1. response
id*string
Formatuuid
client_id*string
title*string
status*TranscriptStatus

Lifecycle: recording → uploading → queued → transcribing → analyzing → ready, or failed.

Value in"recording""uploading""queued""transcribing""analyzing""ready""failed"
source*string
Value in"desktop""phone""wear""web""vscode""tv""api"
template*TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
language_hint*string

auto, ro, en or another BCP-47 tag passed to the recognizer.

language*|

Detected language, once transcribed.

folder_id*|
Formatuuid
pinned*boolean
tags*array<string>
feed_memory*boolean

Opt-in for extracted facts to feed codai memory.

started_at*string
Formatdate-time
duration_ms*integer
Range0 <= value
error*string|null
audio_available*boolean

false once the 30-day retention deleted the audio.

ready_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
Example Request
curl -X PATCH 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "client_id": "string",  "title": "string",  "status": "recording",  "source": "desktop",  "template": "auto",  "language_hint": "string",  "language": "string",  "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",  "pinned": true,  "tags": [    "string"  ],  "feed_memory": true,  "started_at": "2019-08-24T14:15:22Z",  "duration_ms": 0,  "error": "string",  "audio_available": true,  "ready_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}
DELETE
/v1/transcripts/{id}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Deleted.

Example Request
curl -X DELETE 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Example Response
Empty
POST
/v1/transcripts/{id}/finalize

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
duration_ms*integer
Range1 <= value <= 10860000
uploads*array<>
Items1 <= items <= 2
bookmarks?array<>
Itemsitems <= 500
live_preview?string
Lengthlength <= 400000

Response Body

Already finalized; the transcript as it is.

application/json
  1. response
id*string
Formatuuid
client_id*string
title*string
status*TranscriptStatus

Lifecycle: recording → uploading → queued → transcribing → analyzing → ready, or failed.

Value in"recording""uploading""queued""transcribing""analyzing""ready""failed"
source*string
Value in"desktop""phone""wear""web""vscode""tv""api"
template*TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
language_hint*string

auto, ro, en or another BCP-47 tag passed to the recognizer.

language*|

Detected language, once transcribed.

folder_id*|
Formatuuid
pinned*boolean
tags*array<string>
feed_memory*boolean

Opt-in for extracted facts to feed codai memory.

started_at*string
Formatdate-time
duration_ms*integer
Range0 <= value
error*string|null
audio_available*boolean

false once the 30-day retention deleted the audio.

ready_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/finalize' \  -H 'Content-Type: application/json' \  -d '{  "duration_ms": 1,  "uploads": [    {      "track": "mic",      "upload_id": "stringst"    }  ]}'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "client_id": "string",  "title": "string",  "status": "recording",  "source": "desktop",  "template": "auto",  "language_hint": "string",  "language": "string",  "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",  "pinned": true,  "tags": [    "string"  ],  "feed_memory": true,  "started_at": "2019-08-24T14:15:22Z",  "duration_ms": 0,  "error": "string",  "audio_available": true,  "ready_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}
POST
/v1/transcripts/{id}/retranscribe

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Queued for transcription.

application/json
  1. response
id*string
Formatuuid
client_id*string
title*string
status*TranscriptStatus

Lifecycle: recording → uploading → queued → transcribing → analyzing → ready, or failed.

Value in"recording""uploading""queued""transcribing""analyzing""ready""failed"
source*string
Value in"desktop""phone""wear""web""vscode""tv""api"
template*TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
language_hint*string

auto, ro, en or another BCP-47 tag passed to the recognizer.

language*|

Detected language, once transcribed.

folder_id*|
Formatuuid
pinned*boolean
tags*array<string>
feed_memory*boolean

Opt-in for extracted facts to feed codai memory.

started_at*string
Formatdate-time
duration_ms*integer
Range0 <= value
error*string|null
audio_available*boolean

false once the 30-day retention deleted the audio.

ready_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/retranscribe'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "client_id": "string",  "title": "string",  "status": "recording",  "source": "desktop",  "template": "auto",  "language_hint": "string",  "language": "string",  "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",  "pinned": true,  "tags": [    "string"  ],  "feed_memory": true,  "started_at": "2019-08-24T14:15:22Z",  "duration_ms": 0,  "error": "string",  "audio_available": true,  "ready_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}
POST
/v1/transcripts/{id}/reanalyze

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Queued for analysis.

application/json
  1. response
id*string
Formatuuid
client_id*string
title*string
status*TranscriptStatus

Lifecycle: recording → uploading → queued → transcribing → analyzing → ready, or failed.

Value in"recording""uploading""queued""transcribing""analyzing""ready""failed"
source*string
Value in"desktop""phone""wear""web""vscode""tv""api"
template*TranscriptTemplate

Shapes the insights; auto lets the model choose.

Value in"auto""meeting""brainstorm""journal""interview""lecture"
language_hint*string

auto, ro, en or another BCP-47 tag passed to the recognizer.

language*|

Detected language, once transcribed.

folder_id*|
Formatuuid
pinned*boolean
tags*array<string>
feed_memory*boolean

Opt-in for extracted facts to feed codai memory.

started_at*string
Formatdate-time
duration_ms*integer
Range0 <= value
error*string|null
audio_available*boolean

false once the 30-day retention deleted the audio.

ready_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/reanalyze'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "client_id": "string",  "title": "string",  "status": "recording",  "source": "desktop",  "template": "auto",  "language_hint": "string",  "language": "string",  "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",  "pinned": true,  "tags": [    "string"  ],  "feed_memory": true,  "started_at": "2019-08-24T14:15:22Z",  "duration_ms": 0,  "error": "string",  "audio_available": true,  "ready_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z"}
POST
/v1/transcripts/{id}/live

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
finals?string
Lengthlength <= 4000
partial?string
Lengthlength <= 1000
level?number
Range0 <= value <= 1
device*string
Value in"phone""wear""desktop"
elapsed_ms*integer
Range0 <= value
paused?boolean

Response Body

Accepted (or dropped by the rate limit).

Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/live' \  -H 'Content-Type: application/json' \  -d '{  "device": "phone",  "elapsed_ms": 0}'
Example Response
Empty
POST
/v1/transcripts/{id}/bookmarks

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
at_ms*integer
Range0 <= value <= 10860000
label?string
Lengthlength <= 120

Response Body

The bookmark.

application/json
  1. response
id*string
Formatuuid
at_ms*integer
Range0 <= value
label*string|null
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/bookmarks' \  -H 'Content-Type: application/json' \  -d '{  "at_ms": 0}'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "at_ms": 0,  "label": "string"}
PATCH
/v1/transcripts/{id}/speakers/{label}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid
label*string

Diarization label of the speaker (for example A).

Lengthlength <= 40

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
name*string
Length1 <= length <= 80
is_owner?boolean

Response Body

The renamed speaker.

application/json
  1. response
label*string
name*string
is_owner*boolean
Example Request
curl -X PATCH 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/speakers/string' \  -H 'Content-Type: application/json' \  -d '{  "name": "string"}'
Example Response
{  "label": "string",  "name": "string",  "is_owner": true}
PATCH
/v1/transcripts/{id}/utterances/{seq}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid
seq*integer

Position of the utterance in the transcript (0-based).

Range0 <= value

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
text*string
Length1 <= length <= 20000

Response Body

The corrected utterance.

application/json
  1. response
seq*integer
text*string
edited*boolean
Example Request
curl -X PATCH 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/utterances/0' \  -H 'Content-Type: application/json' \  -d '{  "text": "string"}'
Example Response
{  "seq": 0,  "text": "string",  "edited": true}
GET
/v1/transcripts/{id}/audio

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Signed URLs (cache-control: private, no-store).

application/json
  1. response
tracks*array<>
expires_in?integer

Seconds the URLs stay valid; absent when tracks is empty.

Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/audio'
Example Response
{  "tracks": [    {      "kind": "mic",      "mime": "string",      "url": "http://example.com"    }  ],  "expires_in": 0}
GET
/v1/transcripts/{id}/export

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Query Parameters

format?string

File format.

Default"md"
Value in"md""txt""srt""vtt""json""pdf""docx"

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

The exported file (UTF-8 text, or binary for pdf / docx).

response?string
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/export'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "client_id": "string",  "title": "string",  "status": "recording",  "source": "desktop",  "template": "auto",  "language_hint": "string",  "language": "string",  "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",  "pinned": true,  "tags": [    "string"  ],  "feed_memory": true,  "started_at": "2019-08-24T14:15:22Z",  "duration_ms": 0,  "error": "string",  "audio_available": true,  "ready_at": "2019-08-24T14:15:22Z",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z",  "live_preview": "string",  "processing": {    "kind": "transcribe",    "attempts": 0,    "max_attempts": 1,    "last_error": "string",    "next_attempt_at": "2019-08-24T14:15:22Z"  },  "tracks": [    {      "kind": "mic",      "bytes": 0    }  ],  "speakers": [    {      "label": "string",      "name": "string",      "is_owner": true,      "talk_ms": 0    }  ],  "utterances": [    {      "seq": 0,      "speaker": "string",      "start_ms": 0,      "end_ms": 0,      "text": "string",      "language": "string",      "words": [        {          "w": "string",          "s": 0,          "e": 0,          "c": 0        }      ],      "edited": true    }  ],  "bookmarks": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "at_ms": 0,      "label": "string"    }  ],  "insights": {    "version": 0,    "model": "string",    "created_at": "2019-08-24T14:15:22Z",    "accepted_prompts": {      "property1": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "property2": "497f6eca-6276-4993-bfeb-53cbbbba6f08"    },    "title": "string",    "summary": "string",    "template": "auto",    "language": "string",    "keyPoints": [      {        "text": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "actions": [      {        "text": "string",        "owner": "string",        "due": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "decisions": [      {        "text": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "openQuestions": [      {        "text": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ],    "tags": [      "string"    ],    "project": "string",    "prompts": [      {        "title": "string",        "prompt": "string",        "repo": "string",        "cite": {          "startMs": 0,          "endMs": 0        }      }    ]  }}
POST
/v1/transcripts/{id}/prompts/{index}/accept

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid
index*integer

Index into insights.prompts (0–20).

Range0 <= value <= 20

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Already accepted; the existing prompt.

application/json
  1. response
prompt_id*string
Formatuuid
created*boolean
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/prompts/0/accept'
Example Response
{  "prompt_id": "24783230-27c2-455c-9de9-95bbdbb78c3d",  "created": true}
POST
/v1/transcripts/{id}/shares

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
expiresInDays?integer

Link lifetime in days; omit for a link that never expires.

Range1 <= value <= 365

Response Body

Link created; keep the token/url, it is not recoverable.

application/json
  1. response
id*string
Formatuuid
token*string

32 random bytes, base64url. Shown only in this response.

url*string

Public read-only page, https://hub.codai.ro/t/<token>.

Formaturi
expiresAt*|
Formatdate-time
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/shares' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "token": "string",  "url": "http://example.com",  "expiresAt": "2019-08-24T14:15:22Z"}
GET
/v1/transcripts/{id}/shares

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

The active links.

application/json
  1. response
data*array<>
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/shares'
Example Response
{  "data": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "url": null,      "createdAt": "2019-08-24T14:15:22Z",      "expiresAt": "2019-08-24T14:15:22Z"    }  ]}
DELETE
/v1/transcripts/{id}/shares/{shareId}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Transcript id (uuid). A foreign or malformed id is 404.

Formatuuid
shareId*string

Share id (uuid) from the create or list response.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Revoked.

Example Request
curl -X DELETE 'https://ai.codai.ro/v1/transcripts/497f6eca-6276-4993-bfeb-53cbbbba6f08/shares/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Example Response
Empty
GET
/v1/public/transcripts/{token}

Path Parameters

token*string

The share token (43 base64url characters).

Match^[A-Za-z0-9_-]{43}$

Response Body

The shared transcript.

application/json
  1. response
title*string
createdAt*string
Formatdate-time
durationMs*integer
Range0 <= value
speakers*array<>
utterances*array<>
insights*null|
Example Request
curl -X GET 'https://ai.codai.ro/v1/public/transcripts/string'
Example Response
{  "title": "string",  "createdAt": "2019-08-24T14:15:22Z",  "durationMs": 0,  "speakers": [    {      "label": "string",      "name": "string"    }  ],  "utterances": [    {      "speaker": "string",      "startMs": 0,      "endMs": 0,      "text": "string"    }  ],  "insights": null}
GET
/v1/transcript-folders

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

The folders.

application/json
  1. response
folders*array<>
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcript-folders'
Example Response
{  "folders": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "name": "string",      "color": "string",      "position": 0    }  ]}
POST
/v1/transcript-folders

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
name*string
Length1 <= length <= 80
color?string
Match^[a-z]{3,16}$

Response Body

The folder.

application/json
  1. response
id*string
Formatuuid
name*string
color*string|null
position*integer
Example Request
curl -X POST 'https://ai.codai.ro/v1/transcript-folders' \  -H 'Content-Type: application/json' \  -d '{  "name": "string"}'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "name": "string",  "color": "string",  "position": 0}
PATCH
/v1/transcript-folders/{id}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Folder id (uuid). A malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
name?string
Length1 <= length <= 80
color?string
Match^[a-z]{3,16}$
position?integer
Range0 <= value <= 10000

Response Body

The updated folder.

application/json
  1. response
id*string
Formatuuid
name*string
color*string|null
position*integer
Example Request
curl -X PATCH 'https://ai.codai.ro/v1/transcript-folders/497f6eca-6276-4993-bfeb-53cbbbba6f08' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "name": "string",  "color": "string",  "position": 0}
DELETE
/v1/transcript-folders/{id}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

Folder id (uuid). A malformed id is 404.

Formatuuid

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Deleted.

Example Request
curl -X DELETE 'https://ai.codai.ro/v1/transcript-folders/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Example Response
Empty
GET
/v1/transcript-vocabulary

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Response Body

Your terms.

application/json
  1. response
terms*array<>
Itemsitems <= 1000
Example Request
curl -X GET 'https://ai.codai.ro/v1/transcript-vocabulary'
Example Response
{  "terms": [    "string"  ]}
PUT
/v1/transcript-vocabulary

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

x-request-id?string

Client correlation id; echoed back as x-codai-trace-id and persisted on the usage row.

Lengthlength <= 128

Request Body

application/json
  1. body
terms*array<>
Itemsitems <= 1000

Response Body

The stored terms.

application/json
  1. response
terms*array<>
Itemsitems <= 1000
Example Request
curl -X PUT 'https://ai.codai.ro/v1/transcript-vocabulary' \  -H 'Content-Type: application/json' \  -d '{  "terms": [    "string"  ]}'
Example Response
{  "terms": [    "string"  ]}
POST
/v1/uploads

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Header Parameters

tus-resumable*"1.0.0"

Protocol version.

Value in"1.0.0"
upload-length?integer

Total size in bytes, when known.

Range0 <= value <= 209715200
upload-defer-length?1

1 when the size is not known yet.

Value in1
upload-metadata?string

Comma-separated key base64value pairs (transcript, track, durationMs; or purpose=list with mime).

Response Body

Upload created.

Example Request
curl -X POST 'https://ai.codai.ro/v1/uploads' \  -H 'tus-resumable: 1.0.0'
Example Response
Empty
OPTIONS
/v1/uploads

Response Body

Capabilities in the response headers.

Example Request
curl -X OPTIONS 'https://ai.codai.ro/v1/uploads'
Example Response
Empty
GET
/v1/uploads/{id}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

tus upload id from Location (bound to your account). A foreign or malformed id is 404.

Header Parameters

tus-resumable*"1.0.0"

Protocol version.

Value in"1.0.0"

Response Body

Current offset (cache-control: no-store), no body.

Example Request
curl -X GET 'https://ai.codai.ro/v1/uploads/string' \  -H 'tus-resumable: 1.0.0'
Example Response
Empty
PATCH
/v1/uploads/{id}

Authorization

bearerAuth
headerAuthorizationBearer <codai_…>

A codai API key (codai_ prefix). Ephemeral tokens from POST /v1/tokens are accepted only by the media surfaces matching their scope (/v1/realtime, /v1/audio/*, /v1/embeddings).

Path Parameters

id*string

tus upload id from Location (bound to your account). A foreign or malformed id is 404.

Header Parameters

tus-resumable*"1.0.0"

Protocol version.

Value in"1.0.0"
upload-offset*integer

Offset this chunk starts at.

Range0 <= value

Request Body

body*fileapplication/offset+octet-stream
Formatbinary
Lengthlength <= 8388608

Response Body

Chunk stored.

Example Request
curl -X PATCH 'https://ai.codai.ro/v1/uploads/string' \  -H 'tus-resumable: 1.0.0' \  -H 'upload-offset: 0' \  -H 'Content-Type: application/offset+octet-stream' \  -d 'string'
Example Response
Empty

On this page