Skip to main content

Overview

Webhooks allow you to receive HTTP notifications when jobs complete, eliminating the need for polling.

Setup

Include a webhook_url in your job request:

Webhook Payload

When a job completes, Tornado sends a POST request to your webhook_url with a JSON payload. Here’s what your server will receive:

Job Started (Processing)

Sent when a worker picks up the job and begins processing:

Single Job Completion

s3_url/subtitle_url/thumbnail_url are generated the same way (and with the same 24h validity) as the s3_url field returned by GET /jobs/{id} — added 2026-07-08 so you don’t need a second API call just to get something downloadable. key/subtitle_key/thumbnail_key are unchanged and still sent, for backwards compatibility.

Job Failed

Sent when a job fails due to a technical error (bot detection, rate limit, connection issues). Not sent for content warnings (private/members-only/geo-blocked videos) — those are handled silently.

Job Skipped

Sent when a job is skipped because the content cannot be processed. This happens for audio-only Spotify episodes that are protected by Widevine DRM and have no video stream available. Skipped jobs are classified as warnings, not errors — they represent content limitations, not technical failures.
In batch downloads, skipped episodes count toward the batch failed counter for completion tracking purposes. The batch webhook fires once all episodes are either completed, failed, or skipped.

Batch Completion

When all episodes in a batch are done:

Progress Webhooks

When enable_progress_webhook: true is set, you’ll receive updates at each processing stage:
Progress stages and percentages: To enable progress webhooks:

Webhook Behavior

Handling Webhooks

Node.js (Express)

Python (Flask)

Best Practices

Return a 2xx status code within 30 seconds. Process the webhook data asynchronously if needed.
Webhooks come from our servers. Consider IP whitelisting or signature verification for production.
Handle duplicate webhooks gracefully. Store the job_id and check for duplicates before processing.
If your endpoint fails, we retry 3 times. Ensure your handler can process the same event multiple times.

Testing Webhooks

Use a service like webhook.site or ngrok to test webhooks locally: