callback_url when creating a job. Descript sends a POST request to that URL when the job finishes — with the same payload you’d get from the status endpoint.
This tutorial shows how to build a simple webhook receiver in Express (Node.js) and Flask (Python).
How callbacks work
- Include
callback_urlin your import or agent request - Descript processes the job
- When the job finishes, Descript sends a POST request to your URL
- The POST body contains the complete job status (same as
GET /jobs/{job_id})
Express (Node.js)
A minimal webhook receiver that logs job completions and triggers the next step in your pipeline:Flask (Python)
Making your webhook accessible
Your webhook URL must be reachable from the internet. During development, use a tunneling tool to expose your local server:Chaining jobs with webhooks
A common pattern is to automatically run an agent edit when an import finishes. Your webhook receiver handles the handoff:Best practices
- Return 200 immediately — Do heavy processing after responding. Descript may retry if your endpoint takes too long to respond.
- Handle duplicate deliveries — In rare cases, the same callback may be sent more than once. Use the
job_idto deduplicate. - Log everything — Store the raw webhook payload for debugging.
- Validate the source — In production, verify that webhook requests are actually coming from Descript’s servers.