Quickstart
Submit your first video analysis in under a minute.
1. Get an API key
Sign up, create a workspace, and create a key in the console under API keys. Keep it in an environment variable: it can spend credits.
2. Submit a video
curl -X POST https://api.netraflow.com/v1/jobs \
-H "Content-Type: application/json" \
-H "X-Api-Key: sk_live_your_key_here" \
-d '{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"capabilities": ["transcription"]
}'{
"data": {
"job_id": "job_abcdefghij123456",
"status": "pending",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"platform": "youtube",
"capabilities": ["transcription"],
"language": null,
"video_title": null,
"video_duration_seconds": null,
"video_thumbnail_url": null,
"credits_estimated": 2,
"credits_charged": null,
"processing_seconds": null,
"return_proof": true,
"follow_id": null,
"created_at": "2026-04-03T12:00:00.000Z",
"started_at": null,
"completed_at": null
},
"meta": { "request_id": "req_xyz789" }
}The 202 also carries Location (the job's URL) and Retry-After: 30.
On Free, a job that watches the video is capped at 3 minutes. Transcription alone allows 20, which is why this example starts there. See Limits.
3. Retrieve results
Poll the job every 30 seconds until status is "completed", or let a webhook tell you.
curl https://api.netraflow.com/v1/jobs/job_abcdefghij123456 \
-H "X-Api-Key: sk_live_your_key_here"{
"data": {
"job_id": "job_abcdefghij123456",
"status": "completed",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"platform": "youtube",
"capabilities": ["transcription"],
"language": null,
"video_title": "Rick Astley - Never Gonna Give You Up (Official Video)",
"video_duration_seconds": 212,
"video_thumbnail_url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg",
"credits_estimated": 2,
"credits_charged": 1,
"processing_seconds": 37,
"results": {
"transcription": {
"text": "We're no strangers to love, you know the rules...",
"segments": [
{ "start": 0.0, "end": 4.8, "text": "We're no strangers to love" },
{ "start": 4.8, "end": 8.2, "text": "You know the rules and so do I" }
],
"language": "en",
"duration_seconds": 212.0,
"word_count": 423
}
},
"return_proof": true,
"follow_id": null,
"created_at": "2026-04-03T12:00:00.000Z",
"started_at": "2026-04-03T12:00:01.000Z",
"completed_at": "2026-04-03T12:00:38.000Z"
},
"meta": { "request_id": "req_abc456" }
}credits_estimated assumes your plan's longest video until the real length is known, so it usually drops. A failed
job has error: { code, message } instead of results, and is not charged.
Next steps
- Jobs: every request field, status and error
- Capabilities: what each result holds
- Webhooks: results without polling
- Limits: what each plan allows