Skip to main content
POST /api/transcribeVideo returns immediately with a projectId — the actual transcription happens asynchronously in the background and typically takes between a few seconds and several minutes depending on video length and queue load. There are two ways to find out when a transcription is ready: webhook (push) or polling (pull). You can use either, or both.

Project States

Every project moves through a small set of states. The current value is returned in the state field of GET /api/detail/{id}. A typical run looks like: upload → transcription → done. Most videos under 10 minutes complete in 30–90 seconds total. Provide a webhookUrl when you call POST /api/transcribeVideo:
When the project reaches done, we POST the full payload to your URL. See Webhooks for the payload shape, headers, and the (lack of) retry policy.

Pattern 2: Polling

If you don’t have a public webhook endpoint, poll GET /api/detail/{id} periodically until the state is done.
Recommended cadence:
  • Poll every 5–10 seconds for the first 2 minutes (short videos finish fast).
  • Then back off to 30–60 seconds for the next 10 minutes.
  • Give up after ~10 minutes and report a failure — the project will likely be in error state by then.
Polling more frequently than once every 3 seconds wastes both your quota and our rate limits without making the job complete any sooner.

Pattern 3: Both (most robust)

The webhook is single-attempt and not retried (see Webhooks). To make sure you never miss a result:
  1. Submit with a webhookUrl.
  2. Have your webhook handler mark the project as “received” in your own database.
  3. Run a background job every few minutes that lists pending projects via GET /api/list and reconciles any that didn’t get a webhook by calling GET /api/detail/{id}.

Response Shape by State

Note that GET /api/detail/{id} returns different fields depending on state:
Detect “ready” by checking state === "done" or by the presence of the text field.