Signed PASS/BLOCK receipts
A receipt turns a QC verdict into a required check a CI step or agent gates its publish on — the leap from "here is a report a human reads" to "this blocks the deploy," the way a signed CI status check gates a merge. Fetch it after a job completes; gate your publish on verdict === "PASS".
What a receipt guarantees
- Bound to the exact file. The receipt carries the media's
sha256. Swap the file, and the signature no longer matches — a receipt can never be reused for different content. - Bound to a named target.
profilerecords which delivery spec the file was checked against, so a green receipt reads "PASS foryoutube_shorts", not an abstract gate list. - Tamper-evident. The whole payload is HMAC-SHA256 signed. Any change to the verdict, hash, profile, or gate list is caught on verify.
- Verifiable by anyone, offline of your account. A third party (a CI system, an auditor, a client) confirms authenticity with a single no-auth call — no login, no access to your workspace.
Get a receipt
GET /v1/qc/jobs/{job_id}/receipt (or the qc_get_receipt MCP tool) once the job is completed. A BLOCK receipt lists the failed gates in blocked.
{
"schema": "uploadcheck-receipt/1",
"verdict": "PASS",
"sha256": "<the checked file's hash>",
"profile": "youtube_shorts",
"gates": ["av_sync", "canvas_fill", "loudness", "shorts_format"],
"blocked": [],
"jobId": "job_...",
"issuedAt": "2026-07-20T00:00:00.000Z",
"issuer": "uploadcheck.app",
"signature": "sha256=..."
}
Verify a receipt
POST /v1/public/receipts/verify — no auth. POST the receipt JSON; the response confirms whether the signature is authentic and unaltered. Always confirm the receipt's sha256 matches your file before trusting the verdict.
Gate a CI job on the receipt
The CLI and GitHub Action already exit non-zero on BLOCK. Add --receipt <path> (CLI) or receipt-path: (Action) to also write the signed receipt as a build artifact:
uploadcheck check final.mp4 --profile youtube_shorts --fail-on block --receipt uploadcheck-receipt.json
Named delivery profiles
Check against a recognizable target so the receipt names a spec your pipeline trusts:
| Profile | Delivery target |
|---|---|
youtube_shorts | YouTube Shorts (9:16, hook, caption-safe, loudness) |
youtube_longform | YouTube long-form upload (pacing, levels, end screen) |
meta_reels_ad | Meta Reels / Instagram ad (9:16, safe-area, ad-review basics) |
tiktok_post | TikTok post (9:16, hook, caption-safe) |
broadcast_r128 | Broadcast delivery (EBU R128 loudness + legal levels + fields) |
podcast_delivery | Podcast delivery (loudness, LRA, hum, dropouts, balance) |
ai_render_gate | AI-render publish gate (temporal artifacts + technical readiness) |