Runs

The unit of work, the row you poll, the thing a webhook is about.

POST /v1/runs

Submit a run. Creates a run from one of the three source shapes. A YouTube run is queued; an upload or recording run is receiving until its upload completes. A run served from the cached lane comes back done in this very response with status 200, because no work was created.

Scope: runs:write · accepts Idempotency-Key · Per key, 10 per minute (burst 20) — submission spends GPU seconds.

Parameters

NameInTypeNotes
Idempotency-KeyheaderstringA value you will not reuse by accident — a UUID. A repeat within 24 hours returns the original response with its original status code (07 §3).

Request body

FieldTypeRequiredNotes
sourceobject | object | objectyesExactly one of the three shapes. Two, or none, is 400 invalid_request.
name_speakersbooleanDefault true. What is asked for; a single-speaker recording skips naming and says so in the step detail.
requested_languagestring | nullPin ASR to a language. null (the default) is auto-detect. A pinned language bypasses the cached lane.
forcebooleanDefault false. true skips the cached lane and runs the engine — "transcribe it again" is a real request.
idempotency_keystring | nullAn alternative to the header. If both are present and differ, 400 invalid_request.
{
  "source": {
    "type": "youtube",
    "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  },
  "name_speakers": true,
  "requested_language": null,
  "force": false,
  "idempotency_key": null
}

Responses

201The run was created.

FieldTypeRequiredNotes
iduuidyes
source_typeSourceTypeyes
source_urluri | nullAlways null for upload and recording.
source_upload_iduuid | nullAlways null for youtube; null after the upload row is deleted.
titlestring | nullnull until acquisition learns it. Never invented.
author_namestring | null
author_urluri | null
descriptionstring | null
published_ondate | nullA bare calendar date.
duration_secondsnumber | nullnull until normalize establishes it.
thumbnail_urluri | null
statusRunStatusyes
laneLanenull until a lane takes it. modal_pending is a guard value, not a lane.
enginestring | nullA human string ("whisperx large-v2"), not an enumeration. Do not branch on it.
current_stepStep | null
step_logStepEntry[]yes
languagestring | nullBCP-47-ish; null until ASR detects it.
requested_languagestring | null
name_speakersbooleanyesWhat was asked for, not what happened.
segmentsSegment[] | nullnull until status is done — "not yet", never "there is none". Never present in GET /v1/runs or in a webhook body.
segment_countinteger | null
speaker_countinteger | null0 is a real value: diarization produced nothing.
word_countinteger | null
speaker_labelsobject (free) | nullKeyed by speaker id (SPEAKER_00, …). null until done, and on a done run where nothing was named.
cached_from_run_iduuid | nullSet only when lane is cached.
media_fingerprintstring | nullThe canonical video id, or the media sha256.
errorstring | nullA sentence for a person. Programs branch on error_class.
error_classErrorClass | null
retry_afterdate-time | nullSet on error_class premiere: when to submit a NEW run.
idempotency_keystring | null
created_atdate-timeyes
updated_atdate-timeyes
completed_atdate-time | nullNon-null on every terminal status.
transcript_urluri | nullDerived. The absolute GET /v1/runs/{id}/transcript URL; null unless done.
expected_stepsStep[] | nullDerived. null while lane is null or modal_pending — draw no checklist.
seconds_until_modalinteger | nullDerived. null unless queued with no lane and the countdown is running.
live_workersobject | nullDerived. null unless the countdown is running.
worker_labelstring | nullDerived. The machine's display label; null unless a fleet worker holds the run. claimed_by is never sent.
machine_quietbooleanyesDerived, never null. True only for a fleet run whose worker has stopped heartbeating; always false for modal.
{
  "id": "0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b",
  "source_type": "youtube",
  "source_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "source_upload_id": null,
  "title": null,
  "author_name": null,
  "author_url": null,
  "description": null,
  "published_on": null,
  "duration_seconds": null,
  "thumbnail_url": null,
  "status": "queued",
  "lane": null,
  "engine": null,
  "current_step": null,
  "step_log": [],
  "language": null,
  "requested_language": null,
  "name_speakers": true,
  "segments": null,
  "segment_count": null,
  "speaker_count": null,
  "word_count": null,
  "speaker_labels": null,
  "cached_from_run_id": null,
  "media_fingerprint": "dQw4w9WgXcQ",
  "error": null,
  "error_class": null,
  "retry_after": null,
  "idempotency_key": "4f0a9e21-59f2-4d64-8e18-7d9b0b1c66aa",
  "created_at": "2026-03-11T18:04:11Z",
  "updated_at": "2026-03-11T18:04:11Z",
  "completed_at": null,
  "transcript_url": null,
  "expected_steps": null,
  "seconds_until_modal": 79,
  "live_workers": {
    "count": 2,
    "kind": "utility"
  },
  "worker_label": null,
  "machine_quiet": false
}

200Served from the cached lane — done already, lane cached, cached_from_run_id naming the source. Or an idempotent repeat of a cached submission.

FieldTypeRequiredNotes
iduuidyes
source_typeSourceTypeyes
source_urluri | nullAlways null for upload and recording.
source_upload_iduuid | nullAlways null for youtube; null after the upload row is deleted.
titlestring | nullnull until acquisition learns it. Never invented.
author_namestring | null
author_urluri | null
descriptionstring | null
published_ondate | nullA bare calendar date.
duration_secondsnumber | nullnull until normalize establishes it.
thumbnail_urluri | null
statusRunStatusyes
laneLanenull until a lane takes it. modal_pending is a guard value, not a lane.
enginestring | nullA human string ("whisperx large-v2"), not an enumeration. Do not branch on it.
current_stepStep | null
step_logStepEntry[]yes
languagestring | nullBCP-47-ish; null until ASR detects it.
requested_languagestring | null
name_speakersbooleanyesWhat was asked for, not what happened.
segmentsSegment[] | nullnull until status is done — "not yet", never "there is none". Never present in GET /v1/runs or in a webhook body.
segment_countinteger | null
speaker_countinteger | null0 is a real value: diarization produced nothing.
word_countinteger | null
speaker_labelsobject (free) | nullKeyed by speaker id (SPEAKER_00, …). null until done, and on a done run where nothing was named.
cached_from_run_iduuid | nullSet only when lane is cached.
media_fingerprintstring | nullThe canonical video id, or the media sha256.
errorstring | nullA sentence for a person. Programs branch on error_class.
error_classErrorClass | null
retry_afterdate-time | nullSet on error_class premiere: when to submit a NEW run.
idempotency_keystring | null
created_atdate-timeyes
updated_atdate-timeyes
completed_atdate-time | nullNon-null on every terminal status.
transcript_urluri | nullDerived. The absolute GET /v1/runs/{id}/transcript URL; null unless done.
expected_stepsStep[] | nullDerived. null while lane is null or modal_pending — draw no checklist.
seconds_until_modalinteger | nullDerived. null unless queued with no lane and the countdown is running.
live_workersobject | nullDerived. null unless the countdown is running.
worker_labelstring | nullDerived. The machine's display label; null unless a fleet worker holds the run. claimed_by is never sent.
machine_quietbooleanyesDerived, never null. True only for a fleet run whose worker has stopped heartbeating; always false for modal.

Errors: invalid_request (400), unauthenticated (401), forbidden (403), rate_limited (429), internal_error (500), unprocessable_source (422), quota_exceeded (429), engine_unavailable (503)

cURL

curl -sS -X POST https://<host>/v1/runs \
  -H "Authorization: Bearer $SCRIPTRIP_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"source":{"type":"youtube","url":"https://youtu.be/dQw4w9WgXcQ"},"name_speakers":true}'

GET /v1/runs

List runs. Cursor-paginated, newest first, scoped to your account. segments is absent from every element in every status — fetch one run, or fetch its transcript.

Scope: runs:read

Parameters

NameInTypeNotes
limitqueryintegerDefault 25, in [1, 100]. Outside the range is 400 invalid_request, never clamped.
cursorquerystringOpaque, from the previous page's next_cursor. Never construct one.
status (repeatable)queryRunStatusRepeatable; values union. A value outside 02 §4.2 is 400.
source_typequerySourceType

Responses

200A page.

FieldTypeRequiredNotes
dataRun[]yessegments is absent from every element, in every status.
has_morebooleanyesAuthoritative. Loop on this, not on whether data is empty.
next_cursorstring | nullyesOpaque. null when has_more is false.
{
  "data": [
    {
      "id": "0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b",
      "source_type": "youtube",
      "source_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "source_upload_id": null,
      "title": "The Long Way South — Part 4",
      "author_name": "Sailing Somewhere",
      "author_url": "https://www.youtube.com/@sailingsomewhere",
      "description": null,
      "published_on": "2026-03-04",
      "duration_seconds": 2711.5,
      "thumbnail_url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg",
      "status": "done",
      "lane": "modal",
      "engine": "whisperx large-v2",
      "current_step": null,
      "step_log": [
        {
          "step": "fetch",
          "started_at": "2026-03-11T18:04:22Z",
          "ended_at": "2026-03-11T18:05:09Z",
          "ok": true,
          "detail": "45.2 MB in 47 s"
        },
        {
          "step": "normalize",
          "started_at": "2026-03-11T18:05:09Z",
          "ended_at": "2026-03-11T18:05:18Z",
          "ok": true,
          "detail": "2711.5 s · 16 kHz mono"
        },
        {
          "step": "transcribe",
          "started_at": "2026-03-11T18:05:18Z",
          "ended_at": "2026-03-11T18:07:44Z",
          "ok": true,
          "detail": "412 segments · language en"
        },
        {
          "step": "align",
          "started_at": "2026-03-11T18:07:44Z",
          "ended_at": "2026-03-11T18:08:31Z",
          "ok": true,
          "detail": "word-level timestamps for 412 segments"
        },
        {
          "step": "diarize",
          "started_at": "2026-03-11T18:08:31Z",
          "ended_at": "2026-03-11T18:09:40Z",
          "ok": true,
          "detail": "2 speakers over 412 segments"
        },
        {
          "step": "name_speakers",
          "started_at": "2026-03-11T18:09:40Z",
          "ended_at": "2026-03-11T18:09:55Z",
          "ok": true,
          "detail": "named 2 of 2"
        },
        {
          "step": "finalize",
          "started_at": "2026-03-11T18:09:55Z",
          "ended_at": "2026-03-11T18:09:57Z",
          "ok": true,
          "detail": "412 segments · 6841 words"
        }
      ],
      "language": "en",
      "requested_language": null,
      "name_speakers": true,
      "segment_count": 412,
      "speaker_count": 2,
      "word_count": 6841,
      "speaker_labels": {
        "SPEAKER_00": {
          "name": "Matt",
          "role": "host"
        },
        "SPEAKER_01": {
          "name": "Amy",
          "role": "guest"
        }
      },
      "cached_from_run_id": null,
      "media_fingerprint": "dQw4w9WgXcQ",
      "error": null,
      "error_class": null,
      "retry_after": null,
      "idempotency_key": "4f0a9e21-59f2-4d64-8e18-7d9b0b1c66aa",
      "created_at": "2026-03-11T18:04:11Z",
      "updated_at": "2026-03-11T18:09:57Z",
      "completed_at": "2026-03-11T18:09:57Z",
      "transcript_url": "https://<host>/v1/runs/0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b/transcript",
      "expected_steps": [
        "fetch",
        "normalize",
        "transcribe",
        "align",
        "diarize",
        "name_speakers",
        "finalize"
      ],
      "seconds_until_modal": null,
      "live_workers": null,
      "worker_label": null,
      "machine_quiet": false
    }
  ],
  "has_more": true,
  "next_cursor": "eyJjIjoiMjAyNi0wMy0xMVQxODowNDoxMVoiLCJpIjoiMDE5NWM4ZTQtOGQwMi03YzE5LWIzZTctNWExZjlkMjBjNjhiIn0"
}

Errors: invalid_request (400), unauthenticated (401), forbidden (403), rate_limited (429), internal_error (500)

cURL

curl -sS "https://<host>/v1/runs?status=done&limit=10" -H "Authorization: Bearer $SCRIPTRIP_KEY"

GET /v1/runs/{id}

One run. The polling endpoint. segments and speaker_labels are populated only when status is done. Poll no faster than every 2 seconds, back off to 10 seconds after a minute — or register a destination and do not poll at all.

Scope: runs:read

This read writes. Runs the stale sweep and the Modal fallback clock — age-guarded, idempotent, and only while somebody is actually waiting (02 §8.1).

Parameters

NameInTypeNotes
idpathuuidThe run id.

Responses

200The run.

FieldTypeRequiredNotes
iduuidyes
source_typeSourceTypeyes
source_urluri | nullAlways null for upload and recording.
source_upload_iduuid | nullAlways null for youtube; null after the upload row is deleted.
titlestring | nullnull until acquisition learns it. Never invented.
author_namestring | null
author_urluri | null
descriptionstring | null
published_ondate | nullA bare calendar date.
duration_secondsnumber | nullnull until normalize establishes it.
thumbnail_urluri | null
statusRunStatusyes
laneLanenull until a lane takes it. modal_pending is a guard value, not a lane.
enginestring | nullA human string ("whisperx large-v2"), not an enumeration. Do not branch on it.
current_stepStep | null
step_logStepEntry[]yes
languagestring | nullBCP-47-ish; null until ASR detects it.
requested_languagestring | null
name_speakersbooleanyesWhat was asked for, not what happened.
segmentsSegment[] | nullnull until status is done — "not yet", never "there is none". Never present in GET /v1/runs or in a webhook body.
segment_countinteger | null
speaker_countinteger | null0 is a real value: diarization produced nothing.
word_countinteger | null
speaker_labelsobject (free) | nullKeyed by speaker id (SPEAKER_00, …). null until done, and on a done run where nothing was named.
cached_from_run_iduuid | nullSet only when lane is cached.
media_fingerprintstring | nullThe canonical video id, or the media sha256.
errorstring | nullA sentence for a person. Programs branch on error_class.
error_classErrorClass | null
retry_afterdate-time | nullSet on error_class premiere: when to submit a NEW run.
idempotency_keystring | null
created_atdate-timeyes
updated_atdate-timeyes
completed_atdate-time | nullNon-null on every terminal status.
transcript_urluri | nullDerived. The absolute GET /v1/runs/{id}/transcript URL; null unless done.
expected_stepsStep[] | nullDerived. null while lane is null or modal_pending — draw no checklist.
seconds_until_modalinteger | nullDerived. null unless queued with no lane and the countdown is running.
live_workersobject | nullDerived. null unless the countdown is running.
worker_labelstring | nullDerived. The machine's display label; null unless a fleet worker holds the run. claimed_by is never sent.
machine_quietbooleanyesDerived, never null. True only for a fleet run whose worker has stopped heartbeating; always false for modal.
{
  "id": "0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b",
  "source_type": "youtube",
  "source_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "source_upload_id": null,
  "title": "The Long Way South — Part 4",
  "author_name": "Sailing Somewhere",
  "author_url": "https://www.youtube.com/@sailingsomewhere",
  "description": null,
  "published_on": "2026-03-04",
  "duration_seconds": 2711.5,
  "thumbnail_url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg",
  "status": "done",
  "lane": "modal",
  "engine": "whisperx large-v2",
  "current_step": null,
  "step_log": [
    {
      "step": "fetch",
      "started_at": "2026-03-11T18:04:22Z",
      "ended_at": "2026-03-11T18:05:09Z",
      "ok": true,
      "detail": "45.2 MB in 47 s"
    },
    {
      "step": "normalize",
      "started_at": "2026-03-11T18:05:09Z",
      "ended_at": "2026-03-11T18:05:18Z",
      "ok": true,
      "detail": "2711.5 s · 16 kHz mono"
    },
    {
      "step": "transcribe",
      "started_at": "2026-03-11T18:05:18Z",
      "ended_at": "2026-03-11T18:07:44Z",
      "ok": true,
      "detail": "412 segments · language en"
    },
    {
      "step": "align",
      "started_at": "2026-03-11T18:07:44Z",
      "ended_at": "2026-03-11T18:08:31Z",
      "ok": true,
      "detail": "word-level timestamps for 412 segments"
    },
    {
      "step": "diarize",
      "started_at": "2026-03-11T18:08:31Z",
      "ended_at": "2026-03-11T18:09:40Z",
      "ok": true,
      "detail": "2 speakers over 412 segments"
    },
    {
      "step": "name_speakers",
      "started_at": "2026-03-11T18:09:40Z",
      "ended_at": "2026-03-11T18:09:55Z",
      "ok": true,
      "detail": "named 2 of 2"
    },
    {
      "step": "finalize",
      "started_at": "2026-03-11T18:09:55Z",
      "ended_at": "2026-03-11T18:09:57Z",
      "ok": true,
      "detail": "412 segments · 6841 words"
    }
  ],
  "language": "en",
  "requested_language": null,
  "name_speakers": true,
  "segments": [
    {
      "start": 0.48,
      "end": 4.02,
      "text": "Right, so this is day nine.",
      "speaker": "SPEAKER_00"
    },
    {
      "start": 4.02,
      "end": 7.61,
      "text": "Day nine and we still haven't seen land.",
      "speaker": "SPEAKER_00"
    },
    {
      "start": 8.1,
      "end": 11.44,
      "text": "I keep telling him that's the point.",
      "speaker": "SPEAKER_01"
    }
  ],
  "segment_count": 412,
  "speaker_count": 2,
  "word_count": 6841,
  "speaker_labels": {
    "SPEAKER_00": {
      "name": "Matt",
      "role": "host"
    },
    "SPEAKER_01": {
      "name": "Amy",
      "role": "guest"
    }
  },
  "cached_from_run_id": null,
  "media_fingerprint": "dQw4w9WgXcQ",
  "error": null,
  "error_class": null,
  "retry_after": null,
  "idempotency_key": "4f0a9e21-59f2-4d64-8e18-7d9b0b1c66aa",
  "created_at": "2026-03-11T18:04:11Z",
  "updated_at": "2026-03-11T18:09:57Z",
  "completed_at": "2026-03-11T18:09:57Z",
  "transcript_url": "https://<host>/v1/runs/0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b/transcript",
  "expected_steps": [
    "fetch",
    "normalize",
    "transcribe",
    "align",
    "diarize",
    "name_speakers",
    "finalize"
  ],
  "seconds_until_modal": null,
  "live_workers": null,
  "worker_label": null,
  "machine_quiet": false
}

Errors: unauthenticated (401), forbidden (403), rate_limited (429), internal_error (500), not_found (404)

cURL

curl -sS "https://<host>/v1/runs/$RUN_ID" -H "Authorization: Bearer $SCRIPTRIP_KEY"

DELETE /v1/runs/{id}

Delete a run and its media. Deletes the row and purges its media immediately. A run in flight is cancelled first, in the same transaction, so run.canceled fires before the row disappears. Always 200 with a receipt, never 204; a second delete is 404.

Scope: runs:write

Parameters

NameInTypeNotes
idpathuuidThe run id.

Responses

200A receipt.

FieldTypeRequiredNotes
iduuidyes
deletedbooleanyes
media_objects_purgedintegeryes
messagestringyes
{
  "id": "0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b",
  "deleted": true,
  "media_objects_purged": 1,
  "message": "The run and 1 media object were deleted."
}

Errors: unauthenticated (401), forbidden (403), rate_limited (429), internal_error (500), not_found (404)

cURL

curl -sS -X DELETE "https://<host>/v1/runs/$RUN_ID" -H "Authorization: Bearer $SCRIPTRIP_KEY"

POST /v1/runs/{id}/cancel

Stop a run in flight. Empty body. Cancellation is cooperative at the worker's next step boundary; a step in flight is not interrupted. run.canceled is enqueued in the same transaction. A run already terminal is 409 conflict with its actual status in detail.

Scope: runs:write

Parameters

NameInTypeNotes
idpathuuidThe run id.

Responses

200The run, now terminal, plus a sentence naming what to expect.

FieldTypeRequiredNotes
iduuidyes
source_typeSourceType
source_urluri | nullAlways null for upload and recording.
source_upload_iduuid | nullAlways null for youtube; null after the upload row is deleted.
titlestring | nullnull until acquisition learns it. Never invented.
author_namestring | null
author_urluri | null
descriptionstring | null
published_ondate | nullA bare calendar date.
duration_secondsnumber | nullnull until normalize establishes it.
thumbnail_urluri | null
statusRunStatusyes
laneLanenull until a lane takes it. modal_pending is a guard value, not a lane.
enginestring | nullA human string ("whisperx large-v2"), not an enumeration. Do not branch on it.
current_stepStep | null
step_logStepEntry[]
languagestring | nullBCP-47-ish; null until ASR detects it.
requested_languagestring | null
name_speakersbooleanWhat was asked for, not what happened.
segmentsSegment[] | nullnull until status is done — "not yet", never "there is none". Never present in GET /v1/runs or in a webhook body.
segment_countinteger | null
speaker_countinteger | null0 is a real value: diarization produced nothing.
word_countinteger | null
speaker_labelsobject (free) | nullKeyed by speaker id (SPEAKER_00, …). null until done, and on a done run where nothing was named.
cached_from_run_iduuid | nullSet only when lane is cached.
media_fingerprintstring | nullThe canonical video id, or the media sha256.
errorstring | nullA sentence for a person. Programs branch on error_class.
error_classErrorClass | nullyes
retry_afterdate-time | nullSet on error_class premiere: when to submit a NEW run.
idempotency_keystring | null
created_atdate-time
updated_atdate-time
completed_atdate-time | nullNon-null on every terminal status.
transcript_urluri | nullDerived. The absolute GET /v1/runs/{id}/transcript URL; null unless done.
expected_stepsStep[] | nullDerived. null while lane is null or modal_pending — draw no checklist.
seconds_until_modalinteger | nullDerived. null unless queued with no lane and the countdown is running.
live_workersobject | nullDerived. null unless the countdown is running.
worker_labelstring | nullDerived. The machine's display label; null unless a fleet worker holds the run. claimed_by is never sent.
machine_quietbooleanDerived, never null. True only for a fleet run whose worker has stopped heartbeating; always false for modal.
messagestringyes
{
  "id": "0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b",
  "source_type": "youtube",
  "source_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "source_upload_id": null,
  "title": null,
  "author_name": null,
  "author_url": null,
  "description": null,
  "published_on": null,
  "duration_seconds": null,
  "thumbnail_url": null,
  "status": "canceled",
  "lane": "modal",
  "engine": "whisperx large-v2",
  "current_step": null,
  "step_log": [],
  "language": null,
  "requested_language": null,
  "name_speakers": true,
  "segments": null,
  "segment_count": null,
  "speaker_count": null,
  "word_count": null,
  "speaker_labels": null,
  "cached_from_run_id": null,
  "media_fingerprint": "dQw4w9WgXcQ",
  "error": "Stopped by a person.",
  "error_class": "canceled",
  "retry_after": null,
  "idempotency_key": "4f0a9e21-59f2-4d64-8e18-7d9b0b1c66aa",
  "created_at": "2026-03-11T18:04:11Z",
  "updated_at": "2026-03-11T18:06:02Z",
  "completed_at": "2026-03-11T18:06:02Z",
  "transcript_url": null,
  "expected_steps": [
    "fetch",
    "normalize",
    "transcribe",
    "align",
    "diarize",
    "name_speakers",
    "finalize"
  ],
  "seconds_until_modal": null,
  "live_workers": null,
  "worker_label": null,
  "machine_quiet": false,
  "message": "Stopped. The GPU finishes what it is in the middle of and shuts down; you are not charged for the rest."
}

Errors: unauthenticated (401), forbidden (403), rate_limited (429), internal_error (500), not_found (404), conflict (409)

cURL

curl -sS -X POST "https://<host>/v1/runs/$RUN_ID/cancel" -H "Authorization: Bearer $SCRIPTRIP_KEY"

GET /v1/runs/{id}/transcript

The transcript, in one format, as text. Six renderings of one segments array. A run that is not done is 409 conflict with its status in detail. ?download=1 adds a Content-Disposition attachment header.

Scope: runs:read

Parameters

NameInTypeNotes
idpathuuidThe run id.
formatqueryOutputFormatDefault speakers.
downloadqueryinteger1 to receive it as an attachment named after the title.

Responses

200text/plain for prose, speakers and timestamped; application/x-subrip for srt; text/vtt for vtt; application/json for json.

Matt: Right, so this is day nine. Day nine and we still haven't seen land.

Amy: I keep telling him that's the point.

Errors: invalid_request (400), unauthenticated (401), forbidden (403), rate_limited (429), internal_error (500), not_found (404), conflict (409)

cURL

curl -sS "https://<host>/v1/runs/$RUN_ID/transcript?format=srt" \
  -H "Authorization: Bearer $SCRIPTRIP_KEY" -o transcript.srt

POST /v1/runs/{id}/deliver

Send this run to a destination now. Re-delivery for a program: enqueues a delivery on the same retry ladder as the one the terminal transition enqueued. Requires runs:read AND destinations:write together (02 §8). A run that is not terminal, or a destination that is disabled, is 409 conflict.

Scope: runs:read and destinations:write

Parameters

NameInTypeNotes
idpathuuidThe run id.

Request body

FieldTypeRequiredNotes
destination_iduuidyesMust belong to your account; one that does not is 404.
eventWebhookEventDefaults to the event the run's terminal status implies.
{
  "destination_id": "6d2b8a10-1f47-4c8e-a2f0-cb9e4d3a7711"
}

Responses

202Queued.

FieldTypeRequiredNotes
delivery_iduuidyes
destination_iduuidyes
run_iduuidyes
eventWebhookEventyes
statusDeliveryStatusyes
messagestringyes
{
  "delivery_id": "8c41d0aa-63e2-4a52-9f77-2b1c0e8d4a90",
  "destination_id": "6d2b8a10-1f47-4c8e-a2f0-cb9e4d3a7711",
  "run_id": "0195c8e4-8d02-7c19-b3e7-5a1f9d20c68b",
  "event": "run.completed",
  "status": "pending",
  "created": true,
  "message": "Queued for delivery. The sender runs every minute; the first attempt goes out on its next pass."
}

Errors: invalid_request (400), unauthenticated (401), forbidden (403), rate_limited (429), internal_error (500), not_found (404), conflict (409)

cURL

curl -sS -X POST "https://<host>/v1/runs/$RUN_ID/deliver" \
  -H "Authorization: Bearer $SCRIPTRIP_KEY" \
  -H "Content-Type: application/json" \
  -d '{"destination_id":"$DEST_ID"}'