API reference/Read a job

GET /v1/{job_id}

Read job results with GET /v1/{job_id}: job status, each video's status and its extracted rows once every video has settled. Results are handed over once.

Request

No body. The key must belong to the workspace that created the job; anything else returns 404, including an id that does not exist — this endpoint never confirms that someone else’s job is real.

Response

200 · still running
{
"job_id": "8f2c1e40-91a3-4b7e",
"status": "processing",
"counts": {
"queued": 1,
"processing": 1,
"done": 1,
"failed": 0
},
"videos": [
{
"url": "https://youtu.be/dQ8x2Kp",
"video_id": "dQ8x2Kp",
"status": "done",
"rows": null
},
{
"url": "https://youtu.be/kJQP7kiw5Fk",
"video_id": "kJQP7kiw5Fk",
"status": "processing",
"rows": null
},
{
"url": "https://youtu.be/9bZkp7q19f0",
"video_id": "9bZkp7q19f0",
"status": "queued",
"rows": null
}
]
}

videos lists every video in the job, each with its own status. rows stays null until every video in the job has settled. Poll status or counts to watch progress; polling never consumes anything.

200 · settled
{
"job_id": "8f2c1e40-91a3-4b7e",
"status": "partial",
"credits_charged": 140,
"counts": {
"queued": 0,
"processing": 0,
"done": 1,
"failed": 1
},
"videos": [
{
"url": "https://youtu.be/dQ8x2Kp",
"video_id": "dQ8x2Kp",
"status": "done",
"rows": [
{
"restaurant_name": "Corner Butcher",
"food_ordered": [
"lamb gyro"
]
},
{
"restaurant_name": "Blue Door",
"food_ordered": [
"baklava",
"espresso"
]
}
],
"usage": {
"credits_charged": 140,
"row_count": 2,
"duration_seconds": 782,
"chunk_count": 3
}
},
{
"url": "https://youtu.be/kJQP7kiw5Fk",
"video_id": "kJQP7kiw5Fk",
"status": "failed",
"error": {
"code": "no_captions",
"message": "no caption track",
"retryable": false
},
"credits_charged": 0
}
]
}

status is done when every video succeeded, failed when every one failed, and partial when it was a mix. A failed video carries an error and is never charged. A video’s rows is an array when the schema has multiple: true, and a single object otherwise.

Results are returned once

The first read that finds the job settled returns the rows and deletes them here, along with the URLs you submitted. A later read returns the same envelope with rows: null and url: null on every video.

Reads while the job is still running are safe: nothing is handed over, so nothing is deleted. The handover happens on one read and one only — the first one that finds nothing left queued or processing.

CAREFUL
Persist in the same code path that reads. If your process dies between the response arriving and your write committing, the rows are gone and the videos have to be run again.
Was this page useful?Tell us what was missing