Reference

API reference

The public HTTP and WebSocket contract in one place. This reference lists customer-facing endpoints; internal and administrative endpoints are not part of the public contract.

Authentication

Use Authorization: Bearer <OMI_API_KEY> on every HTTP request and native WebSocket handshake. API keys are tenant credentials; keep them server-side and rotate them from the console.

Do not ship API keys in browser bundles

Browser applications should call a trusted backend or use a scoped access mechanism. The realtime demo’s preview ticket/query path is for controlled access, not for publishing a long-lived tenant key.

Public endpoints

POST/v1/audio/transcriptions

Direct upload: inline result or async job

POST/v1/jobs

Create a presigned large-upload slot

POST/v1/jobs/{job_id}/complete

Freeze upload and enqueue

GET/v1/jobs/{job_id}

Poll job and obtain result URL

DELETE/v1/jobs/{job_id}

Reserved; cancellation is unsupported in v1

WSSwss://rt.omi.health/v1/realtime

Invited realtime preview

Synchronous multipart fields

FieldTypeDefault / limitAvailability
filebinaryrequired · exactly ≤100,000,000 bytesInline below 30.000 s; otherwise async
modelstringrequiredomi-medical-1, omi-medical-edge-1
response_formatenumdiarized_jsontext, json, verbose_json, diarized_json
languageBCP-47 / autostored default, then enEight supported families; auto on omi-medical-1
language_hintsJSON array string1–8Only with language=auto
dictionarybooleantrueSuppress stored terms with false
vocabularyJSON array string≤1,000 termsAuto/AR/HI ≤30; ≤96 chars per term
patternsstring≤32 expressionsInvited preview; omi-medical-1
diarizebooleanfalseSpeaker and word decoration
webhook_urlHTTPS URLoptional · port 443Forces async; requires signing secret

Optional header Idempotency-Key applies only when this request creates an async job. Inline 200 requests accept and ignore it.

Verbose response

{
  "text": "The patient takes metformin 500 mg twice daily.",
  "language": "en",
  "duration": 4.82,
  "model": "omi-medical-1",
  "request_id": "0b0e…",
  "segments": [
    {
      "id": "seg_0001",
      "speaker": "A",
      "text": "The patient takes metformin 500 mg twice daily.",
      "start": 0.22,
      "end": 4.60,
      "confidence": null,
      "language": "en"
    }
  ],
  "words": [
    {"word":"The","start":0.22,"end":0.36,"speaker":"A"}
  ],
  "speakers": [{"speaker":"A"}],
  "metadata": {
    "api_version": "2026-07-01",
    "runtime": "omi-runtime",
    "processing_ms": {"asr": 640, "diarization": 0}
  }
}
FieldPresent whenMeaning
textalwaysFinal normalized transcript.
languagenon-text JSONEffective language; mixed for multilingual auto; und for silence.
durationverbose_jsonInput duration in seconds.
request_idverbose_jsonAlso available as x-request-id; include it in support requests.
segmentsverbose_json / diarized_jsonTime-ordered transcript segments.
wordsalignment availableAcoustic word boundaries; speaker included when diarized.
language_detectionverbose auto responseCandidates, selected languages, utterance count, and fallbacks.
vocabularyvocabulary usedPublic context mode and safety audit.
patternspatterns usedRequested/applied counts and writer evidence.
metadataverbose_jsonAPI version, public runtime label, and processing timing.

Async job objects

{
  "id": "job_…",
  "object": "transcription.job",
  "status": "accepted",
  "created_at": "2026-07-26T01:02:03Z",
  "model": "omi-medical-1",
  "poll_url": "https://api.omi.health/v1/jobs/job_…",
  "webhook": {"requested": false}
}

Direct-upload jobs use accepted, running, succeeded, or failed. The presigned large-upload path also starts in awaiting_upload. A succeeded job contains result.download_url; a failed job contains a stable error.code and safe message.

Limits

SurfaceDurationUpload / capacityNotes
Direct uploadUp to 30 minutes100,000,000 bytes200 below 30.000 s without webhook; otherwise 202 through the asynchronous-optimized pipeline.
Presigned large uploadUp to 30 minutes1 GiBResult URL expires after 15 minutes.
Realtime (invited preview)30 minutes/sessionStrict concurrency capCapacity rejection includes retry_after.
Vocabularyper request1,000 terms5–30 recommended; auto/AR/HI max 30.
Patternsper request32 expressionsNever stored globally.
Auto hintsper request1–8 candidatesSupported families only.

HTTP errors and retry behavior

StatusMeaningWhat your client should do
400Malformed request, unsupported model option, or mismatched content type.Fix the request; do not retry unchanged.
401Missing or invalid API key.Verify the bearer token and replace or rotate the credential if needed.
404Unknown or non-owned job.Check the job ID and the key that created it.
413File or duration exceeds this route.Move to async or split at a natural silence.
422Unsupported/detected language, invalid vocabulary, pattern, hints, or speaker count.Correct the field value or candidate set.
429Rate, queue, or capacity limit.Honor Retry-After with exponential backoff and jitter.
503Temporary backend, detector, storage, or processing-capacity issue.Honor Retry-After. Do not silently switch language or processing path.
410An Omi-served result surface has expired.The transcript must be regenerated; an expired signed storage URL uses the storage provider’s native response.

Data handling

  • Direct uploads that resolve inline are deleted immediately on completion or failure.
  • Job audio, results, and metadata are owner-scoped and retained for 72 hours.
  • Operational telemetry stores non-content usage and safety counters, not transcript text.
  • Use de-identified/test audio during the research preview unless a separate production data agreement is in place.

Availability and support

View independently hosted service probes on the Omi status page. For support, email [email protected] and include the request_id.