POST request to your registered URL with the job details.
How It Works
Register a Webhook URL
Include a
webhookUrl in your POST /api/v1/generate request body. The URL is stored with the job and will receive a notification when the job finishes.Job Runs
Video generation proceeds as normal. You can still poll the jobs endpoint if desired — webhooks and polling are not mutually exclusive.
Registration
Register a webhook by includingwebhookUrl in your generate request:
URL Requirements
Your webhook URL must meet the following requirements:| Requirement | Details |
|---|---|
| Protocol | HTTPS only (HTTP is rejected) |
| No localhost | localhost, 127.0.0.1, 0.0.0.0, ::1 are rejected |
| No private IPs | 10.*, 192.168.*, 172.16-31.* ranges are rejected |
| Publicly accessible | Your server must be reachable from the public internet |
Webhook Payload
When a job reaches a terminal state, Nouvel sends the followingPOST request to your URL:
Payload Fields
Event type. Currently always
job.completed (covers completed, partial, and failed terminal states).UUID of the generation job.
Terminal job status. One of:
completed— all projects finished successfullypartial— some projects completed, some failedfailed— all projects failed
Total number of projects in the job.
Number of projects that completed successfully.
Number of projects that failed.
Details for each project in the job.
Signature Verification
Every webhook request includes anX-Nouvel-Signature header containing an HMAC-SHA256 signature of the request body. Always verify this signature to ensure the request is genuinely from Nouvel.
Delivery Behavior
| Property | Details |
|---|---|
| Method | POST |
| Content-Type | application/json |
| Timeout | 5 seconds — your server must respond within 5 seconds |
| Retries | None (v1) — if delivery fails, the webhook is not retried |
| Rate limits | Webhook deliveries do not count toward your API rate limit |
Since webhooks are not retried in v1, we recommend using both webhooks and periodic polling as a fallback. Poll the jobs endpoint every few minutes to catch any missed webhook deliveries.
Timing
The webhook fires when the job status endpoint detects that a job has transitioned to a terminal state. This happens during a status poll — not at the exact moment of completion. In practice, this means:- If you’re polling the job status endpoint, the webhook fires during one of your polls
- If you’re not polling, the webhook fires when any poll (including internal monitoring) checks the job
Best Practices
Respond quickly
Respond quickly
Your webhook endpoint should return a
200 status code within 5 seconds. If you need to do heavy processing, accept the webhook immediately and process asynchronously.Always verify signatures
Always verify signatures
Never trust webhook payloads without verifying the
X-Nouvel-Signature header. This prevents attackers from sending fake webhook events to your endpoint.Handle idempotency
Handle idempotency
Design your webhook handler to be idempotent. While webhooks are not retried in v1, future versions may add retry logic. Use the
jobId as a deduplication key.Use polling as fallback
Use polling as fallback
Since v1 webhooks have no retry mechanism, implement periodic polling of the jobs endpoint as a safety net. Check for completed jobs that may have been missed due to webhook delivery failures.

