Video Compliance Check — Full Guide
ZebraTruth runs compliance analysis on video ads through a server-side async pipeline. Your client uploads the video to managed blob storage, submits a job, then either polls or receives a webhook when the report is ready.Primary endpoint
POST
https://api.zebratruth.ai/v1/compliance/check-videoNo client-side ffmpeg. ZebraTruth handles video probing, audio transcription, frame extraction, OCR, visual signals, and Stage A→C compliance analysis server-side.
Supported inputs
The 3-step flow
POST /v1/compliance/media/upload-url— get a 15-min signed Azure Blob upload URLPUT <uploadUrl>— upload your video bytes directly to managed storagePOST /v1/compliance/check-video— submit the uploaded video for analysis (returns 202)- Poll
GET /v1/compliance/check-video/{requestId}OR receive an HMAC-signed webhook
Step 1 — Request an upload URL
Response
uploadUrl is valid for 15 minutes. Save requestId + blobPath — you’ll pass blobPath back in step 3 + use requestId to poll.
Step 2 — Upload the video
PUT your video bytes directly touploadUrl. Use exactly the headers from uploadInstructions.headers — x-ms-tags is required by Azure for the integrity check.
Step 3 — Submit for analysis
Response (HTTP 202)
Request body fields
Possible error responses
Step 4 — Poll for results
Response (in-flight)
Response (terminal)
Status state machine
Terminal report statuses
Webhooks (recommended for production)
Instead of polling, configure a webhook URL once at the account level and submit videos withwebhookUrl set.
Get / create your tenant webhook secret
Response
Verify webhook signatures
Each delivery is HMAC-SHA256-signed. Signature is stable across retries (computed once at enqueue + cached on the row). Headers:x-zt-timestamp: <unix-seconds>x-zt-signature: <hex-signature>
Retry semantics
After 5 failures, the delivery is marked
failed and dropped. Webhook failures do NOT mutate the compliance job row — the job stays completed_committed. The webhook delivery has its own retry state in videoWebhookDeliveries.
Rotate the secret
Idempotency
Same(requestId, blobPath, jurisdictions, platforms, mode) → 202 with idempotent: true, no extra charge.
Same requestId with different blobPath / jurisdictions / platforms / mode → 409 idempotency_conflict:
blobPath > feature > inputHash (deterministic order for stable error messages).
Cost
Per-second pricing. A 60-second video costs ~600 credits.
Credits are reserved at submit + committed on
reportStatus: complete. insufficient_evidence and analysis_failed release the reservation (no charge).
See Cost & Credits for tier multipliers + billing lifecycle.
Common errors
Next
Cost & credits
Per-second pricing math, tier multipliers, credit lifecycle.
Async + Webhooks
HMAC verification deep dive, retry semantics.
Interpreting reports
How to read scores + decisions + agent breakdowns.
LLM Skill
Install the skill so your LLM agent runs video checks autonomously.