Understand the async job model, polling patterns, job states, webhook callbacks, and job retention.
Video processing takes time. You’re not going to get a response in 200ms. So the API is built around jobs — you submit a request, get back a job_id, and either poll for the result or hand off a callback URL and move on.
Created → Running → Stopped (success or failure) → Cancelled (if you cancel it) → Failed (if something goes wrong)
When you submit an import or agent request, the API returns immediately with a job_id and basic metadata. The actual processing happens in the background.
Instead of polling, pass a callback_url when creating a job. Descript sends a POST request to that URL when the job finishes, with the same payload as the status endpoint.
Use webhook callbacks for production systems. Polling is fine for development and testing, but callbacks avoid unnecessary API calls and respond faster.
A successful cancellation returns 204 No Content with no response body. If you check the job status afterwards via GET /jobs/{job_id}, it will show job_state: "cancelled".Cancelled jobs stop processing immediately. Any partial work (e.g., a partially imported project) remains in Descript but may be incomplete.
Jobs are retained for 30 days. After that, the job metadata is no longer accessible through the API. The Descript projects created by those jobs are unaffected — only the job status records expire.
Agent edits may also report success while some operations are still processing internally. If the result doesn’t look right, wait a minute and check the project in Descript — some visual updates take a moment to propagate.
Don’t open projects during processing. Wait for the job to complete before opening in Descript. Making changes while a job is running can cause conflicts.
Use callbacks in production. Polling works for development but wastes API calls at scale.
Check for partial failures. Multi-file imports can partially succeed — always check individual file statuses.
Respect rate limits. Don’t poll faster than every 3 seconds. Use exponential backoff if you hit 429 errors.