UploadCheck.app

← UploadCheck docs

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. profile records which delivery spec the file was checked against, so a green receipt reads "PASS for youtube_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:

ProfileDelivery target
youtube_shortsYouTube Shorts (9:16, hook, caption-safe, loudness)
youtube_longformYouTube long-form upload (pacing, levels, end screen)
meta_reels_adMeta Reels / Instagram ad (9:16, safe-area, ad-review basics)
tiktok_postTikTok post (9:16, hook, caption-safe)
broadcast_r128Broadcast delivery (EBU R128 loudness + legal levels + fields)
podcast_deliveryPodcast delivery (loudness, LRA, hum, dropouts, balance)
ai_render_gateAI-render publish gate (temporal artifacts + technical readiness)