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 | 10 seconds per attempt — your server must respond within 10 seconds |
| Retries | 3 attempts with exponential backoff (immediate → 10s → 60s) |
| Attempt header | X-Nouvel-Attempt — indicates which attempt number (1, 2, or 3) |
| Rate limits | Webhook deliveries do not count toward your API rate limit |
Retry Logic
If your endpoint is temporarily unreachable or returns a server error (5xx), Nouvel retries with exponential backoff:| Attempt | Delay | Total elapsed |
|---|---|---|
| 1 | Immediate | 0s |
| 2 | 10 seconds | ~10s |
| 3 | 60 seconds | ~70s |
200 on success.
While retries cover most transient failures, we still recommend periodic polling of the jobs endpoint as a safety net for mission-critical workflows.
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 10 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. Since webhooks retry up to 3 times, your endpoint may receive the same event multiple times. Use the
jobId as a deduplication key.Use polling as fallback
Use polling as fallback
While webhooks now retry up to 3 times, implement periodic polling of the jobs endpoint as a safety net for mission-critical workflows. Check for completed jobs that may have been missed if all retry attempts fail.

