Webhook Video Captioning API
Fire a render task, get a signed event when it lands
Stop polling for render status. Attach a notification webhook to a captioning task and ZapCap POSTs a signed event to your endpoint the moment the render completes — with the renderUrl and transcriptUrl ready to fetch. Built for async pipelines that need to react, not wait.
How you find out a render is done
Caption rendering is asynchronous. The difference between a fragile integration and a robust one is how your system learns the job finished.
OPTION 01
- Simple to start
- Wasted requests while queued
- Latency between polls
- You build the scheduler
OPTION 02
- Fine for one-offs
- Doesn't scale
- No pipeline automation
- Slow hand-offs
OPTION 03 · YOU ARE HERE
- Event POSTed on completion
- HMAC-signed, dedupe on eventId
- Automatic retries on failure
- No polling loop to maintain
OPTION 04
- Least code
- No idea when it is ready
- No failure handling
- Unfit for production
How the Webhook Video Captioning API works
Upload the video, create a task with a notification object on the body, and ZapCap POSTs a signed event to your recipient URL when the render completes. The event carries renderUrl and transcriptUrl — fetch them and move on.
- 1
Upload your video
POST the file to /videos. We stream it to storage and hand you back a videoId.
POSTPOST /videos - 2
Create the captioning task
One POST starts transcription, styling and rendering with your chosen template. Add a notification webhook to skip polling.
POSTPOST /videos/:id/task - 3
Receive the webhook
We POST status updates to your endpoint as the render moves through transcribing → rendering → completed.
HOOKPOST → your URL - 4
Download the finished render
Burned-in subtitles, served from a global CDN. No watermark. MP4 ready for any social platform.
GETGET renderUrl
POST /videos·Upload your video
Webhook Video Captioning API transcript options
Auto-transcribe
Let ZapCap transcribe and time the captions as part of the task. You can also subscribe to transcription events so your pipeline reacts before the render even starts.
- Set notificationsFor on the task to choose which events you receive
- Inspect / edit the transcript via PUT /videos/:id/task/:taskId/transcript
- React to a render event to fetch the finished MP4
Bring your own transcript
Send approved cues and skip transcription — the render event still fires on completion exactly the same way, so your async flow is identical.
- Supported via the SRT-to-burned-in workflow
- Same signed render event, same eventId dedupe
- Preserve approved wording all the way to the webhook payload
Webhook Video Captioning API output modes
Burned-in MP4
The completed render event carries a presigned renderUrl for the captioned h264 MP4 — fetch it the moment the event lands.
Transparent overlay
Request an alpha overlay and the render event delivers a presigned link to the ProRes 4444 or VP9 output the same way.
Green-screen layer
Green-screen renders deliver through the same webhook event — a presigned link to the #04F404-backed MP4.
The renderUrl in the webhook payload is a presigned link with a 60-minute TTL — download promptly or re-fetch the task status for a fresh URL. The transcriptUrl is delivered alongside it.
Per-minute, usage-based credits
Webhooks are part of the API at no extra cost — you pay only for the minutes you render. See pricing for the full multiplier table.
- Webhook notifications included, no add-on fee
- Top up credits to keep tasks flowing in production
- Volume credits available at scale
Indicative starting rate. Final pricing depends on render mode and output format. API access requires a Pro plan plus credits.
A video platform replaced a polling scheduler with notification webhooks and let captioned renders flow straight into their pipeline on completion
Each task carries a recipient URL; the signed render event triggers the next step automatically. Dedupe on eventId makes retries safe, so duplicate deliveries never double-process a render.
Attach a webhook when you create the task
The webhook configuration lives on the task request. ZapCap signs each POST to your recipient URL; verify the x-signature header and dedupe by eventId before storing the renderUrl.
- notification.type is webhook and recipient is your public HTTPS endpoint
- notificationsFor controls transcript, render, and render-progress events
- Return a 2xx response only after the event is accepted or safely deduped
{
"templateId": "d46bb0da-cce0-4507-909d-fa8904fb8ed7",
"autoApprove": true,
"language": "en",
"notification": {
"type": "webhook",
"notificationsFor": ["render"],
"recipient": "https://your.app/api/zapcap-webhook"
}
}About webhook video captioning
Add a notification object to the task body when you create the render task: an object with type "webhook", a notificationsFor array (for example ["render"]), and your recipient URL. ZapCap then POSTs a JSON event to that URL when the events you subscribed to occur. Webhooks are how every render on ZapCap’s video captioning API reports completion.
The render event payload includes eventId, event (either "completed" or "failed"), taskId, notificationFor set to "render", a transcriptUrl, and a renderUrl. The renderUrl and transcriptUrl are presigned links you fetch directly.
Each delivery includes an x-signature header — an HMAC-SHA256 signature computed over the payload with your shared secret. Recompute the HMAC on your side and compare; reject the request if it does not match.
Dedupe on eventId. Because webhooks can be retried, the same render event may be delivered more than once. Record the eventId of every event you handle and ignore any eventId you have already processed, so retries are idempotent.
Failed webhook deliveries are retried automatically. Combined with eventId dedupe, that means a transient outage on your side does not lose the event — you receive it on a later retry and skip it if you somehow already handled it.
The renderUrl in the payload is a presigned link with a 60-minute TTL. Download the file promptly when the event arrives; if it expires, fetch the task status again with GET /videos/{videoId}/task/{taskId} to get a fresh downloadUrl.
Yes. Webhooks are optional. You can poll GET /videos/{videoId}/task/{taskId} until the status reports completed, which returns the downloadUrl. Webhooks simply remove the polling loop for production pipelines.
Related caption rendering APIs
Subtitle API
The umbrella styled subtitle rendering API: video in, captioned video out.
SRT to Burned-In Subtitles API
Render an existing, approved SRT into a styled MP4 — no retranscription.
Transparent Subtitle Overlays API
The alpha-overlay output the render event can deliver — ProRes 4444 or VP9 for editing pipelines.
Green-Screen Subtitles API
The keyable #04F404 layer the same webhook can deliver, for tools that cannot read alpha.
Animated Captions API
TikTok / Reels / Shorts caption styles at scale — animation rendered into the frames.
Build event-driven captioning through the API
Create a key on a Pro plan and buy credits in the dashboard.