Reference

API reference

The public HTTP 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. 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 rather than 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

WSS/v1/stream

Realtime transcription on every plan; API key is sent in the start message

Synchronous multipart fields

FieldTypeDefault / limitAvailability
filebinaryrequired · exactly ≤100,000,000 bytesInline up to 60.000 s; otherwise async
modelstringrequiredomi-medical-1
response_formatenumdiarized_jsontext, json, verbose_json, diarized_json
languageBCP-47 / autodominant-language detection when omittedEight supported language families
language_hintsJSON array string1–8Only with language=auto
dictionarybooleantrueSuppress stored terms with false; availability is model-specific
vocabularyJSON array string≤1,000 termsomi-medical-1; lists above 50 select the 50 most relevant terms; ≤96 chars per term
patternsstring≤32 expressionsEvery plan; omi-medical-1
profileenumdefaultOmit or send default. standard and turbo are deprecated compatibility aliases with identical behavior.
diarizebooleanfalseAttach speaker labels and word timestamps
max_speakersinteger1–4 · default 4Upper speaker-count ceiling when diarize=true; excess identity is never folded into another person
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.
profileflagship JSON response or async jobResolved processing profile: default.
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.
language_detection.modeverbose detected-language responsedominant_probe for omission; per_utterance for explicit auto or a mixed probe.
vocabularyvocabulary usedPublic context mode and safety audit.
patternspatterns usedRequested/applied counts and supporting transcript 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 2 hours100,000,000 bytes200 up to 60.000 s without webhook; otherwise 202 through the asynchronous-optimized pipeline.
Presigned large uploadUp to 2 hours1 GiBResult URL expires after 15 minutes.
RealtimeUp to 30 minutes per sessionBuilder: 2 live / 1 speaker room. Pay as you go: 10 live / 2 speaker rooms. Enterprise: custom or reserved.wss://api.omi.health/v1/stream on every plan; 16 kHz mono PCM16; $0.45/audio-hour after the pooled allowance.
Vocabularyper request1,000 termsLists of ≤50 are considered in full; larger lists select the 50 most relevant. Outcome fields report what was delivered.
Patternsper request32 expressionsNever stored globally.
Auto hintsper request1–8 candidatesSupported families only.

HTTP errors and retry behavior

Every error response uses exactly one envelope — {"error": {"code": "…", "message": "…"}} — on every route. No other top-level keys are returned and the message never reflects request content. Branch on error.code, never on message text.

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.
402Usage is paused for billing: promotional credit and this month's included audio-hours are used up, a spend cap was reached, or a payment failed (billing_blocked).Add a card on Billing to continue at $0.29/batch hour or $0.45/live hour, or wait for the UTC monthly reset. Results remain retrievable.
403Your account is not entitled to a requested feature (entitlement_denied).The key is valid; the feature is not enabled for it. Do not retry unchanged — remove the field or check the console for availability.
404Unknown or non-owned job.Check the job ID and the key that created it.
408The upload timed out or remained below the minimum transfer rate.Retry as a new request; preserve the idempotency key only when the request identity is unchanged.
409The idempotency key is already in progress or was used for different request content.Poll/retry the original request, or use a new key only for genuinely different content.
413File or duration exceeds this route.Move to async or split at a natural silence.
415The multipart body or audio container is unsupported.Send a supported audio file and multipart content type.
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

  • Uploaded audio is deleted when processing completes or fails — inline and asynchronous alike.
  • Async result artifacts are owner-scoped and retained until your configured expiry: default 24 hours, configurable 1–72 hours in the console. Job metadata and expiry tombstones may remain for up to 72 hours so expired jobs return a stable response. Webhook jobs have an effective 9-hour minimum.
  • Operational telemetry stores non-content usage and safety counters, not transcript text.
  • For protected health information (PHI), execute the self-serve Business Associate Agreement in the console before submitting audio. A GDPR Data Processing Agreement applies to all personal-data processing and is accepted at signup.

Availability and support

View independently hosted service probes on the Omi status page. For support, email hello@omi.health and include the request_id.