🔥 Launch sale: 30% off Pro
🔥 Launch sale: Pro for $279

DocsVidNext API

Webhooks

Get video events on your own URL — what is sent, how to check the signature, retries and resending.

Instead of asking whether a video is ready, let VidNext tell you. Add an endpoint in Settings → VidNext API → Webhooks → Add endpoint Show me in the app ↗ — a public https:// URL Show me in the app ↗ — or send callback_url with a single video.

Webhooks: an endpoint with Send test, the per-video callback secret, and the recent deliveries
Webhooks: your endpoints with Send test, the per-video callback secret, and the recent deliveries.

Events

EventWhen
video.completedThe video (and its thumbnails, if asked) is ready. Sent once per video.
video.failedThe video stopped.
video.blockedIt's waiting for something you can fix — credits, plan, storage.
video.canceledIt was canceled before it started.

An endpoint gets every event, or only the ones you tick. Each delivery is a POST with JSON:

{
  "id": "evt_…",
  "type": "video.completed",
  "created_at": "2026-10-21T09:41:05.120Z",
  "data": { "object": { "id": "vid_…", "status": "completed", "result": { "…": "…" } } }
}

data.object is the full video object — a finished video's links are fresh. Send test Show me in the app ↗ sends a test event.

Check the signature

Deliveries are signed with Standard Webhooks headers: webhook-id, webhook-timestamp and webhook-signature. Each endpoint has its own signing secret (whsec_…, Show on the endpoint); callback_url deliveries use the account's callback secret Show me in the app ↗.

import { Webhook } from 'standardwebhooks';

const wh = new Webhook(process.env.VIDNEXT_WEBHOOK_SECRET); // whsec_…
app.post('/hooks/vidnext', express.raw({ type: 'application/json' }), (req, res) => {
  const event = wh.verify(req.body, req.headers); // throws if the signature is wrong
  if (event.type === 'video.completed') saveVideo(event.data.object);
  res.sendStatus(200);
});

Check the signature against the raw body, before parsing it.

Retries

Answer with any 2xx within 15 seconds (redirects are not followed). Anything else is retried — up to 12 attempts over about 19 hours, waiting longer each time. A delivery may arrive more than once: use webhook-id to skip repeats.

Recent deliveries Show me in the app ↗ lists the last ones with their status; Resend sends a failed one again. New secret replaces an endpoint's secret at once, and switching an endpoint Off pauses it.

If a secret leaks

Someone with a signing secret could send your receiver fake events. Under the endpoint, press New secret Show me in the app ↗: the old one stops at once, so put the new one into your receiver right away — deliveries signed with the new secret fail there until you do, and wait to be retried.