{
"statusCode": 403,
"message": "Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu].",
"error": true,
"url": "https://api.zebratruth.ai/v1/compliance/check",
"statusMessage": "Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu]."
}
Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses
to PUT video bytes directly to blob storage — bypassing the API
for the upload itself. The returned requestId is the handle for the
subsequent POST /compliance/check-video call.
Why direct upload? Videos can be up to 200 MB. Streaming them
through the API endpoint would add latency, double bandwidth costs,
and hit serverless function timeout limits. Direct-to-blob upload
is the same pattern major cloud object stores use for large files.
Allowed content types:video/mp4, video/webm, video/quicktime.
The duration limits (3–180s) and file-size cap (200 MB) are enforced
by the subsequent check-video call’s probe step — not at upload time.
The PUT must include the returned uploadInstructions.headers
verbatim (they carry ownership tags + the storage x-ms-blob-type header).
{
"statusCode": 403,
"message": "Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu].",
"error": true,
"url": "https://api.zebratruth.ai/v1/compliance/check",
"statusMessage": "Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu]."
}
Unique request identifier to prevent duplicate execution and double-charging.
Generate a new UUID for each distinct request. Reuse the same key to safely retry.
Unique handle for this upload. Pass it verbatim as requestId in the
subsequent POST /compliance/check-video AND use it to poll
GET /compliance/check-video/{requestId} afterward.
Blob index tags that the signed URL enforces at upload time.
Already encoded in uploadInstructions.headers — present here for
inspection / debugging only.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ZebraTruth — Runtime Compliance for AI Agents","colors":{"primary":"#3FB2FE","light":"#3FB2FE","dark":"#3FB2FE"},"logo":{"light":"https://mintcdn.com/zebratruthai/gsHY39_GGp7teBef/logo/light.svg?fit=max\u0026auto=format\u0026n=gsHY39_GGp7teBef\u0026q=85\u0026s=a0210573e206e7c10145de436da1dab1","dark":"https://mintcdn.com/zebratruthai/gsHY39_GGp7teBef/logo/dark.svg?fit=max\u0026auto=format\u0026n=gsHY39_GGp7teBef\u0026q=85\u0026s=43489640c220a2f492f4d203e72392af"},"favicon":"https://mintcdn.com/zebratruthai/53nDj18I-jVMHwMl/favicon.png?fit=max\u0026auto=format\u0026n=53nDj18I-jVMHwMl\u0026q=85\u0026s=d17d051b30e8720f47448f94af058918","api":{"playground":{}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"zebratruthai","hasAudioNarration":false,"actualSubdomain":"zebratruthai","customDomains":["docs.zebratruth.ai"],"gitSource":{"type":"github","owner":"dafstar76","repo":"zebratruth-ai-labs","deployBranch":"master","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ab71fdcbc2c56bfa72d6aca","collectionId":"00df67d9-1f04-4b9c-8e32-28dcda9d3798","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ab71fdcbc2c56bfa72d6aca"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ab71fdcbc2c56bfa72d6aca","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"API Reference","count":44},{"language":"default","tag":"Documentation","count":14},{"language":"default","tag":"Guides","count":9},{"language":"default","tag":"Text, Images \u0026 Integration","count":8},{"language":"default","tag":"Corpus","count":7},{"language":"default","tag":"Concepts","count":6},{"language":"default","tag":"Video","count":6},{"language":"default","tag":"Account \u0026 Usage","count":6},{"language":"default","tag":"Provenance","count":6},{"language":"default","tag":"Jobs \u0026 Reports","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/video-compliance/mint-a-video-upload-url","slug":"/api-reference/video-compliance/mint-a-video-upload-url","pageMetadata":{"title":"Mint a video upload URL","description":"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses\nto PUT video bytes **directly to blob storage** — bypassing the API\nfor the upload itself. The returned `requestId` is the handle for the\nsubsequent `POST /compliance/check-video` call.\n\n**Why direct upload?** Videos can be up to 200 MB. Streaming them\nthrough the API endpoint would add latency, double bandwidth costs,\nand hit serverless function timeout limits. Direct-to-blob upload\nis the same pattern major cloud object stores use for large files.\n\n**Allowed content types:** `video/mp4`, `video/webm`, `video/quicktime`.\nThe duration limits (3–180s) and file-size cap (200 MB) are enforced\nby the subsequent `check-video` call's probe step — not at upload time.\n\n**The PUT must include the returned `uploadInstructions.headers`\nverbatim** (they carry ownership tags + the storage `x-ms-blob-type` header).\n","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/media/upload-url","href":"/api-reference/video-compliance/mint-a-video-upload-url","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses\\nto PUT video bytes \", _jsx(_components.strong, {\n children: \"directly to blob storage\"\n }), \" — bypassing the API\\nfor the upload itself. The returned \", _jsx(_components.code, {\n children: \"requestId\"\n }), \" is the handle for the\\nsubsequent \", _jsx(_components.code, {\n children: \"POST /compliance/check-video\"\n }), \" call.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Why direct upload?\"\n }), \" Videos can be up to 200 MB. Streaming them\\nthrough the API endpoint would add latency, double bandwidth costs,\\nand hit serverless function timeout limits. Direct-to-blob upload\\nis the same pattern major cloud object stores use for large files.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Allowed content types:\"\n }), \" \", _jsx(_components.code, {\n children: \"video/mp4\"\n }), \", \", _jsx(_components.code, {\n children: \"video/webm\"\n }), \", \", _jsx(_components.code, {\n children: \"video/quicktime\"\n }), \".\\nThe duration limits (3–180s) and file-size cap (200 MB) are enforced\\nby the subsequent \", _jsx(_components.code, {\n children: \"check-video\"\n }), \" call’s probe step — not at upload time.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"The PUT must include the returned \", _jsx(_components.code, {\n children: \"uploadInstructions.headers\"\n }), \"\\nverbatim\"]\n }), \" (they carry ownership tags + the storage \", _jsx(_components.code, {\n children: \"x-ms-blob-type\"\n }), \" header).\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Mint a video upload URL","description":"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses\nto PUT video bytes **directly to blob storage** — bypassing the API\nfor the upload itself. The returned `requestId` is the handle for the\nsubsequent `POST /compliance/check-video` call.\n\n**Why direct upload?** Videos can be up to 200 MB. Streaming them\nthrough the API endpoint would add latency, double bandwidth costs,\nand hit serverless function timeout limits. Direct-to-blob upload\nis the same pattern major cloud object stores use for large files.\n\n**Allowed content types:** `video/mp4`, `video/webm`, `video/quicktime`.\nThe duration limits (3–180s) and file-size cap (200 MB) are enforced\nby the subsequent `check-video` call's probe step — not at upload time.\n\n**The PUT must include the returned `uploadInstructions.headers`\nverbatim** (they carry ownership tags + the storage `x-ms-blob-type` header).\n","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/media/upload-url","href":"/api-reference/video-compliance/mint-a-video-upload-url","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createVideoUploadUrl","summary":"Mint a video upload URL","description":"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses\nto PUT video bytes **directly to blob storage** — bypassing the API\nfor the upload itself. The returned `requestId` is the handle for the\nsubsequent `POST /compliance/check-video` call.\n\n**Why direct upload?** Videos can be up to 200 MB. Streaming them\nthrough the API endpoint would add latency, double bandwidth costs,\nand hit serverless function timeout limits. Direct-to-blob upload\nis the same pattern major cloud object stores use for large files.\n\n**Allowed content types:** `video/mp4`, `video/webm`, `video/quicktime`.\nThe duration limits (3–180s) and file-size cap (200 MB) are enforced\nby the subsequent `check-video` call's probe step — not at upload time.\n\n**The PUT must include the returned `uploadInstructions.headers`\nverbatim** (they carry ownership tags + the storage `x-ms-blob-type` header).\n","tags":["Video Compliance"],"parameters":["f6ac550f-2162-4961-b9f1-1912ddce005b"],"requestBody":"e769b36d-7c54-4460-a6b1-c17ed0135d32","responses":{"200":"69ec65c3-eef5-4ff0-a762-39f7ffe350b7","400":"2d150e0f-8156-4197-a9ab-33ccd9a2ee24","401":"d617191e-5382-42c2-ab9f-48df35a341ff","402":"ea9ac637-b741-44ac-883d-01b4c0a083dc","403":"b9ca509f-447c-4a07-bda6-d4473cad6b6f","429":"e77c4b41-8df5-49c2-908f-0e87dc0b645b"},"method":"post","type":"path","servers":["e4860b08-abe2-46de-8ff2-cf13ac5f2eef"],"security":["2150c869-c80e-45b2-aa80-21ce646b4401"],"path":"/compliance/media/upload-url","baseUrlOptions":["https://api.zebratruth.ai/v1"],"title":"Mint a video upload URL","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"f6ac550f-2162-4961-b9f1-1912ddce005b":{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","format":"uuid","isRequired":true,"description":"Unique request identifier to prevent duplicate execution and double-charging.\nGenerate a new UUID for each distinct request. Reuse the same key to safely retry.\n","uniqueKey":"","typeLabel":"string\u003cuuid>"},"description":"Unique request identifier to prevent duplicate execution and double-charging.\nGenerate a new UUID for each distinct request. Reuse the same key to safely retry.\n"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["contentType"],"properties":{"contentType":{"type":"string","description":"MIME type of the video being uploaded","enum":["video/mp4","video/webm","video/quicktime"],"example":"video/mp4","isRequired":true,"uniqueKey":"contentType","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"contentType":"video/mp4"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"69ec65c3-eef5-4ff0-a762-39f7ffe350b7":{"description":"Upload URL minted","content":{"application/json":{"schema":{"type":"object","required":["uploadUrl","blobPath","requestId","requiredTags","uploadInstructions"],"properties":{"uploadUrl":{"type":"string","format":"uri","description":"Short-lived (15 min) SAS URL. PUT the raw video bytes here using\nthe headers from `uploadInstructions`. Do NOT add auth headers.\n","example":"https://zebratruthstorage.blob.core.windows.net/videos/.../source.mp4?...sig=...","isRequired":true,"uniqueKey":"uploadUrl","typeLabel":"string\u003curi>"},"blobPath":{"type":"string","description":"Pass this verbatim as `blobPath` in the subsequent `POST /compliance/check-video`.","example":"videos/kp_abc123.../82b68316-.../source.mp4","isRequired":true,"uniqueKey":"blobPath","typeLabel":"string"},"requestId":{"type":"string","description":"Unique handle for this upload. Pass it verbatim as `requestId` in the\nsubsequent `POST /compliance/check-video` AND use it to poll\n`GET /compliance/check-video/{requestId}` afterward.\n","example":"82b68316-ed85-489c-991e-2ff0f2b95f29","isRequired":true,"uniqueKey":"requestId","typeLabel":"string"},"requiredTags":{"type":"object","description":"Blob index tags that the signed URL enforces at upload time.\nAlready encoded in `uploadInstructions.headers` — present here for\ninspection / debugging only.\n","properties":{"tenantId":{"type":"string","uniqueKey":"requiredTags.tenantId","typeLabel":"string"},"requestId":{"type":"string","uniqueKey":"requiredTags.requestId","typeLabel":"string"},"kind":{"type":"string","enum":["video"],"uniqueKey":"requiredTags.kind","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"requiredTags","typeLabel":"object"},"uploadInstructions":{"type":"object","required":["method","headers"],"properties":{"method":{"type":"string","enum":["PUT"],"isRequired":true,"uniqueKey":"uploadInstructions.method","typeLabel":"enum\u003cstring>"},"headers":{"type":"object","description":"Headers the client MUST include on the PUT to `uploadUrl`. Include verbatim.","additionalProperties":{"type":"string","uniqueKey":"uploadInstructions.headers.additionalProperties","typeLabel":"string"},"isRequired":true,"uniqueKey":"uploadInstructions.headers","typeLabel":"object"}},"isRequired":true,"uniqueKey":"uploadInstructions","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"uploadUrl":"https://zebratruthstorage.blob.core.windows.net/videos/.../source.mp4?...sig=...","blobPath":"videos/kp_abc123.../82b68316-.../source.mp4","requestId":"82b68316-ed85-489c-991e-2ff0f2b95f29","requiredTags":{"tenantId":"\u003cstring>","requestId":"\u003cstring>","kind":"video"},"uploadInstructions":{"method":"PUT","headers":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"2d150e0f-8156-4197-a9ab-33ccd9a2ee24":{"description":"Invalid contentType (must be video/mp4 | video/webm | video/quicktime)","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"d617191e-5382-42c2-ab9f-48df35a341ff":{"description":"Invalid, missing, or expired API key. Standard error envelope —\nread `message` for the human-readable reason.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope.","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","example":401,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","description":"Canonical human-readable reason — pattern-match on this field.","example":"Invalid API key","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"boolean","example":true,"uniqueKey":"error","typeLabel":"boolean"},"url":{"type":"string","format":"uri","example":"https://api.zebratruth.ai/v1/whoami","uniqueKey":"url","typeLabel":"string\u003curi>"},"statusMessage":{"type":"string","example":"Invalid API key","uniqueKey":"statusMessage","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":401,"message":"Invalid API key","error":true,"url":"https://api.zebratruth.ai/v1/whoami","statusMessage":"Invalid API key"}}},"exampleType":"generated"}},"exampleType":"generated"},"ea9ac637-b741-44ac-883d-01b4c0a083dc":{"description":"Not enough credits in the tenant's current period to process this request.\nStandard error envelope plus a `data` object with credit specifics\nand an upgrade URL.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope with a `data` payload.","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","example":402,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Insufficient credits","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"boolean","example":true,"uniqueKey":"error","typeLabel":"boolean"},"url":{"type":"string","format":"uri","uniqueKey":"url","typeLabel":"string\u003curi>"},"statusMessage":{"type":"string","example":"Insufficient credits","uniqueKey":"statusMessage","typeLabel":"string"},"data":{"type":"object","description":"Per-error context. On the wire this is reduced to `{ code }` plus, where documented, a small set of named fields.","properties":{"creditsRemaining":{"type":"number","example":3,"uniqueKey":"data.creditsRemaining","typeLabel":"number"},"creditsNeeded":{"type":"number","uniqueKey":"data.creditsNeeded","typeLabel":"number"},"upgradeUrl":{"type":"string","format":"uri","example":"https://developers.zebratruth.ai/dashboard/billing","uniqueKey":"data.upgradeUrl","typeLabel":"string\u003curi>"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":402,"message":"Insufficient credits","error":true,"url":"\u003cstring>","statusMessage":"Insufficient credits","data":{"creditsRemaining":3,"creditsNeeded":123,"upgradeUrl":"https://developers.zebratruth.ai/dashboard/billing"}}}},"exampleType":"generated"}},"exampleType":"generated"},"b9ca509f-447c-4a07-bda6-d4473cad6b6f":{"description":"The request asks for a jurisdiction or platform not in your subscription, or your\ntenant record is missing / incomplete. The human-readable reason is in the\n`statusMessage` and `message` fields (both carry the same string — `message` is\nthe canonical field in the error envelope). Five possible messages:\n\n- **Not onboarded** — no tenant record exists yet.\n `\"Tenant not onboarded. Complete setup at https://developers.zebratruth.ai before using the API.\"`\n- **Incomplete config** — tenant exists but has no default jurisdictions or platforms set.\n `\"Tenant configuration incomplete. Set default jurisdictions and platforms in your dev portal.\"`\n- **Jurisdiction not subscribed** — request includes jurisdictions outside the subscription.\n `\"Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu].\"`\n- **Platform not subscribed** — request includes platforms outside the subscription.\n `\"Requested platforms [tiktok] are not in your subscription. Allowed: [youtube, instagram].\"`\n- **Scope wider than the plan allows** — carries `data.code:\n \"scope_limit_exceeded_config\"`, the only one of the five that does.\n `\"Your plan allows at most 2 jurisdictions, but your account has 3 selected. Reduce your\n jurisdictions in the developer portal, or request at most 2 on this call.\"`\n Reachable after a plan change, because a scope chosen during the unlimited trial can be\n wider than the plan you end up on.\n\nFix: either adjust the request to stay within the subscribed set, or update your\ndefaults at `https://developers.zebratruth.ai/dashboard/settings`.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope. Read `message` (or `statusMessage`) for the human-readable reason.","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","example":403,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","description":"Canonical human-readable reason — pattern-match on this field in client code.","example":"Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu].","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"boolean","description":"Always `true` for error responses.","example":true,"uniqueKey":"error","typeLabel":"boolean"},"url":{"type":"string","format":"uri","description":"The URL that was requested.","example":"https://api.zebratruth.ai/v1/compliance/check","uniqueKey":"url","typeLabel":"string\u003curi>"},"statusMessage":{"type":"string","description":"Human-readable reason — same content as `message`.","example":"Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu].","uniqueKey":"statusMessage","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":403,"message":"Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu].","error":true,"url":"https://api.zebratruth.ai/v1/compliance/check","statusMessage":"Requested jurisdictions [india, china] are not in your subscription. Allowed: [us, eu]."}}},"exampleType":"generated"}},"exampleType":"generated"},"e77c4b41-8df5-49c2-908f-0e87dc0b645b":{"description":"Per-tenant rate limit exceeded. Read the `Retry-After` header for the\nwait duration. Body is the standard error envelope plus a\n`data` object with limit context.\n","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope with a `data` payload.","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","example":429,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Rate limit exceeded","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"boolean","example":true,"uniqueKey":"error","typeLabel":"boolean"},"url":{"type":"string","format":"uri","uniqueKey":"url","typeLabel":"string\u003curi>"},"statusMessage":{"type":"string","example":"Rate limit exceeded","uniqueKey":"statusMessage","typeLabel":"string"},"data":{"type":"object","description":"Per-error context. On the wire this is reduced to `{ code }` plus, where documented, a small set of named fields.","properties":{"retryAfter":{"type":"integer","description":"Mirrors the `Retry-After` header for clients that prefer body fields.","example":5,"uniqueKey":"data.retryAfter","typeLabel":"integer"},"limit":{"type":"integer","description":"Tenant's requests-per-minute cap.","example":60,"uniqueKey":"data.limit","typeLabel":"integer"},"remaining":{"type":"integer","description":"Requests remaining in the current window.","example":0,"uniqueKey":"data.remaining","typeLabel":"integer"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":429,"message":"Rate limit exceeded","error":true,"url":"\u003cstring>","statusMessage":"Rate limit exceeded","data":{"retryAfter":5,"limit":60,"remaining":0}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"2150c869-c80e-45b2-aa80-21ce646b4401":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key starting with `zt_live_` (production) or `zt_test_` (sandbox).\nGet your key at https://developers.zebratruth.ai\n","scopes":[]}}},"servers":{"e4860b08-abe2-46de-8ff2-cf13ac5f2eef":{"url":"https://api.zebratruth.ai/v1","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"API key starting with `zt_live_` (production) or `zt_test_` (sandbox).\nGet your key at https://developers.zebratruth.ai\n","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"API key starting with `zt_live_` (production) or `zt_test_` (sandbox).\nGet your key at https://developers.zebratruth.ai\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"openapi/zebratruth-v1.yaml"},"subdomain":"zebratruthai","siteName":"ZebraTruth — Runtime Compliance for AI Agents","title":"Mint a video upload URL - ZebraTruth — Runtime Compliance for AI Agents","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-26T01:29:05.812Z","originalFileLocation":"api-reference/video-compliance/mint-a-video-upload-url.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses to PUT video bytes directly to blob storage — bypassing the API for the upload itself. The returned requestId is the handle for the subsequent POST /compliance/check-video call. Why direct upload? Videos can be up to 200 MB. Streaming them through the API endpoint would add latency, double bandwidth costs, and hit serverless function timeout limits. Direct-to-blob upload is the same pattern major cloud object stores use for large files. Allowed content types: video/mp4, video/webm, video/quicktime. The duration limits (3–180s) and file-size cap (200 MB) are enforced by the subsequent check-video call\u0026#x27;s probe step — not at upload time. The PUT must include the returned uploadInstructions.headers verbatim (they carry ownership tags + the storage x-ms-blob-type header).\">\u003cmeta data-mint-head name=\"application-name\" content=\"ZebraTruth — Runtime Compliance for AI Agents\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Mint a video upload URL - ZebraTruth — Runtime Compliance for AI Agents\">\u003cmeta data-mint-head property=\"og:description\" content=\"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses to PUT video bytes directly to blob storage — bypassing the API for the upload itself. The returned requestId is the handle for the subsequent POST /compliance/check-video call. Why direct upload? Videos can be up to 200 MB. Streaming them through the API endpoint would add latency, double bandwidth costs, and hit serverless function timeout limits. Direct-to-blob upload is the same pattern major cloud object stores use for large files. Allowed content types: video/mp4, video/webm, video/quicktime. The duration limits (3–180s) and file-size cap (200 MB) are enforced by the subsequent check-video call\u0026#x27;s probe step — not at upload time. The PUT must include the returned uploadInstructions.headers verbatim (they carry ownership tags + the storage x-ms-blob-type header).\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ZebraTruth — Runtime Compliance for AI Agents\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://zebratruthai.mintlify.app/_mintlify/api/og/v2?division=Video\u0026amp;title=Mint+a+video+upload+URL\u0026amp;description=Returns+a+tenant-scoped%2C+short-lived+%2815+min%29+SAS+URL+the+client+uses%0Ato+PUT+video+bytes+**directly+to+blob+storage**+%E2%80%94+bypassing+the+API%0Afor+the+upload+itself.\u0026amp;theme=a5a701a9b75e19dc4c00f206\u0026amp;signature=7ade519fa7c9f0388b7fba59d16f125de63a668b4e939d976062583f5e6a7362\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Mint a video upload URL - ZebraTruth — Runtime Compliance for AI Agents\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses to PUT video bytes directly to blob storage — bypassing the API for the upload itself. The returned requestId is the handle for the subsequent POST /compliance/check-video call. Why direct upload? Videos can be up to 200 MB. Streaming them through the API endpoint would add latency, double bandwidth costs, and hit serverless function timeout limits. Direct-to-blob upload is the same pattern major cloud object stores use for large files. Allowed content types: video/mp4, video/webm, video/quicktime. The duration limits (3–180s) and file-size cap (200 MB) are enforced by the subsequent check-video call\u0026#x27;s probe step — not at upload time. The PUT must include the returned uploadInstructions.headers verbatim (they carry ownership tags + the storage x-ms-blob-type header).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://zebratruthai.mintlify.app/_mintlify/api/og/v2?division=Video\u0026amp;title=Mint+a+video+upload+URL\u0026amp;description=Returns+a+tenant-scoped%2C+short-lived+%2815+min%29+SAS+URL+the+client+uses%0Ato+PUT+video+bytes+**directly+to+blob+storage**+%E2%80%94+bypassing+the+API%0Afor+the+upload+itself.\u0026amp;theme=a5a701a9b75e19dc4c00f206\u0026amp;signature=7ade519fa7c9f0388b7fba59d16f125de63a668b4e939d976062583f5e6a7362\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/zebratruthai/rTMeP4-q-BuDeEQw/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ZebraTruth — Runtime Compliance for AI Agents\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3FB2FE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/video-compliance/mint-a-video-upload-url.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.zebratruth.ai/#organization\",\"name\":\"ZebraTruth — Runtime Compliance for AI Agents\",\"url\":\"https://docs.zebratruth.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/zebratruthai/gsHY39_GGp7teBef/logo/light.svg?fit=max\u0026auto=format\u0026n=gsHY39_GGp7teBef\u0026q=85\u0026s=a0210573e206e7c10145de436da1dab1\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.zebratruth.ai#website\",\"name\":\"ZebraTruth — Runtime Compliance for AI Agents\",\"url\":\"https://docs.zebratruth.ai\",\"publisher\":{\"@id\":\"https://docs.zebratruth.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url#webpage\",\"url\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url\",\"name\":\"Mint a video upload URL\",\"description\":\"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses to PUT video bytes directly to blob storage — bypassing the API for the upload itself. The returned requestId is the handle for the subsequent POST /compliance/check-video call. Why direct upload? Videos can be up to 200 MB. Streaming them through the API endpoint would add latency, double bandwidth costs, and hit serverless function timeout limits. Direct-to-blob upload is the same pattern major cloud object stores use for large files. Allowed content types: video/mp4, video/webm, video/quicktime. The duration limits (3–180s) and file-size cap (200 MB) are enforced by the subsequent check-video call's probe step — not at upload time. The PUT must include the returned uploadInstructions.headers verbatim (they carry ownership tags + the storage x-ms-blob-type header).\",\"dateModified\":\"2026-09-26T01:29:05.812Z\",\"isPartOf\":{\"@id\":\"https://docs.zebratruth.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"ZebraTruth — Runtime Compliance for AI Agents\",\"item\":\"https://docs.zebratruth.ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mint a video upload URL\",\"item\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url#apireference\",\"headline\":\"Mint a video upload URL\",\"name\":\"Mint a video upload URL\",\"description\":\"Returns a tenant-scoped, short-lived (15 min) SAS URL the client uses to PUT video bytes directly to blob storage — bypassing the API for the upload itself. The returned requestId is the handle for the subsequent POST /compliance/check-video call. Why direct upload? Videos can be up to 200 MB. Streaming them through the API endpoint would add latency, double bandwidth costs, and hit serverless function timeout limits. Direct-to-blob upload is the same pattern major cloud object stores use for large files. Allowed content types: video/mp4, video/webm, video/quicktime. The duration limits (3–180s) and file-size cap (200 MB) are enforced by the subsequent check-video call's probe step — not at upload time. The PUT must include the returned uploadInstructions.headers verbatim (they carry ownership tags + the storage x-ms-blob-type header).\",\"url\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url\",\"mainEntityOfPage\":{\"@id\":\"https://docs.zebratruth.ai/api-reference/video-compliance/mint-a-video-upload-url#webpage\"},\"dateModified\":\"2026-09-26T01:29:05.812Z\",\"publisher\":{\"@id\":\"https://docs.zebratruth.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.zebratruth.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ZebraTruth — Runtime Compliance for AI Agents\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ZebraTruth — Runtime Compliance for AI Agents","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/guides/video-compliance-check"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"API Reference","href":"/api-reference/overview"}]},{"group":"Compliance Checks","pages":[{"title":"Run compliance check","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/check","href":"/api-reference/compliance/run-compliance-check"},{"title":"Check image rights","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/check-image","href":"/api-reference/compliance/check-image-rights"},{"title":"Extract text from a PDF or Word document","description":"Returns the text a compliance check would run on, with word and page counts and the\nlimits that apply to your plan. Use it to preview or trim a document before checking\nit, or to build your own text check. **Not billed.** Extraction is also performed\nimplicitly when you send a `document` part to `POST /compliance/check`.\n\nLimits: 30 MB per file, 100 pages, 400,000 characters, 30 seconds of extraction, one\ndocument per request, and a per-plan word cap returned as `limits.maxWords`. Scanned\nPDFs with no text layer are rejected. A `Content-Length` header is required.\n","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/documents/extract","href":"/api-reference/documents/extract-text-from-a-pdf-or-word-document"}]},{"group":"Video","pages":[{"title":"Mint a video upload URL","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/media/upload-url","href":"/api-reference/video-compliance/mint-a-video-upload-url"},{"title":"Submit a video for compliance analysis","description":"Submits an uploaded video (referenced by `requestId` + `blobPath` from\na prior `POST /compliance/media/upload-url`) for compliance analysis.\n**Asynchronous** — returns 202 immediately with a `jobId`. Poll\n`GET /compliance/check-video/{requestId}` for status + the inlined\nreport when terminal, OR set `webhookUrl` to receive a signed callback.\n\n**Required:** `jurisdictions` + `platforms` (mirror text/image checks —\nsame canonical codes, e.g. `[\"us\", \"eu\"]`, `[\"youtube\", \"instagram\"]`).\nInputs are canonicalized (trim + lowercase + sort) before storage and\nhashed — case-only differences are treated as the same request.\n\n**Idempotency.** The request is keyed on\n`(blobPath, feature, inputHash)`. Re-posting with the same `requestId`\nAND the same inputs returns 202 with `idempotent: true`. Different\ninputs on the same `requestId` returns 409 `idempotency_conflict`\nwith `reason` set to the field that differs.\n\n**Billing.** Credits are reserved at submit time\n(`estimatedCredits` returned). They are committed when the job\ncompletes with a real report, OR released for `insufficient_evidence`\n/ `analysis_failed` / poison-queue failures — tenants only pay for\nvalid reports.\n\n**Latency.** Typical: 8–30 seconds for a 5–30s video. Longer videos\nand dense-content frames take proportionally longer.\n","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/check-video","href":"/api-reference/video-compliance/submit-a-video-for-compliance-analysis"},{"title":"Poll video job status + retrieve report","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /compliance/check-video/{requestId}","href":"/api-reference/video-compliance/poll-video-job-status-+-retrieve-report"},{"title":"Retrieve the tenant's video webhook signing secret","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /compliance/webhooks/video/secret","href":"/api-reference/video-compliance/retrieve-the-tenants-video-webhook-signing-secret"},{"title":"Rotate the tenant's video webhook signing secret","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/webhooks/video/secret/rotate","href":"/api-reference/video-compliance/rotate-the-tenants-video-webhook-signing-secret"}]},{"group":"Agents","pages":[{"title":"List available agents","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /agents","href":"/api-reference/agents/list-available-agents"},{"title":"Invoke a single agent","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /agents/{agentId}","href":"/api-reference/agents/invoke-a-single-agent"}]},{"group":"Jobs \u0026 Reports","pages":[{"title":"Poll job status","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /compliance/jobs/{jobId}","href":"/api-reference/jobs/poll-job-status"},{"title":"Get agent execution trace","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /compliance/jobs/{jobId}/trace","href":"/api-reference/jobs/get-agent-execution-trace"},{"title":"Resume SSE stream","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /compliance/jobs/{jobId}/stream","href":"/api-reference/jobs/resume-sse-stream"},{"title":"Get compliance report","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /reports/{reportId}","href":"/api-reference/reports/get-compliance-report"},{"title":"Replay a compliance check","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /reports/{reportId}/replay","href":"/api-reference/reports/replay-a-compliance-check"}]},{"group":"Check History","pages":[{"title":"List past compliance checks","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /compliance/checks","href":"/api-reference/check-history/list-past-compliance-checks"},{"title":"Get a past check with its full report","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /compliance/checks/{requestId}","href":"/api-reference/check-history/get-a-past-check-with-its-full-report"},{"title":"Query request logs","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /logs","href":"/api-reference/observability/query-request-logs"}]},{"group":"Provenance","pages":[{"title":"Inspect Content Credentials on an image or video","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /media/provenance/inspect","href":"/api-reference/provenance/inspect-content-credentials-on-an-image-or-video"},{"title":"Sign an image or video with Content Credentials","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /media/provenance/sign","href":"/api-reference/provenance/sign-an-image-or-video-with-content-credentials"},{"title":"Poll a video signing job","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /media/provenance/jobs/{jobId}","href":"/api-reference/provenance/poll-a-video-signing-job"},{"title":"List registered signers","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /media/provenance/signers","href":"/api-reference/provenance/list-registered-signers"},{"title":"Register a signer","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /media/provenance/signers","href":"/api-reference/provenance/register-a-signer"},{"title":"Get the keys ZebraTruth signs endpoint requests with","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /media/provenance/signing-keys","href":"/api-reference/provenance/get-the-keys-zebratruth-signs-endpoint-requests-with"}]},{"group":"Account \u0026 Usage","pages":[{"title":"Validate API key","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /whoami","href":"/api-reference/authentication/validate-api-key"},{"title":"Get credit usage","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /usage","href":"/api-reference/authentication/get-credit-usage"},{"title":"Get usage totals by feature","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /usage/summary","href":"/api-reference/billing/get-usage-totals-by-feature"},{"title":"Get usage for one externalId","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /usage/project/{projectId}","href":"/api-reference/billing/get-usage-for-one-externalid"},{"title":"Get subscription status","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /subscription","href":"/api-reference/billing/get-subscription-status"},{"title":"Get engine version","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /version","href":"/api-reference/authentication/get-engine-version"}]},{"group":"Billing","pages":[{"title":"Start a subscription","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /billing/checkout","href":"/api-reference/billing/start-a-subscription"},{"title":"Upgrade Individual to Pro","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /billing/upgrade","href":"/api-reference/billing/upgrade-individual-to-pro"}]},{"group":"Webhooks","pages":[{"title":"List saved webhook endpoints","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /webhooks","href":"/api-reference/webhooks/list-saved-webhook-endpoints"},{"title":"Register a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /webhooks","href":"/api-reference/webhooks/register-a-webhook-endpoint"},{"title":"Remove a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml delete /webhooks/{webhookId}","href":"/api-reference/webhooks/remove-a-webhook-endpoint"},{"title":"Get webhook delivery logs","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /webhooks/deliveries","href":"/api-reference/webhooks/get-webhook-delivery-logs"}]},{"group":"Corpus","pages":[{"title":"Force refresh of legal corpus rows","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /corpus/refresh","href":"/api-reference/compliance/force-refresh-of-legal-corpus-rows"},{"title":"List corpus proposals awaiting review","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /memory/review-queue","href":"/api-reference/corpus/list-corpus-proposals-awaiting-review"},{"title":"Get the review packet for a proposal","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /memory/review-queue/{proposalId}","href":"/api-reference/corpus/get-the-review-packet-for-a-proposal"},{"title":"Approve a proposal","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /memory/review-queue/{proposalId}/approve","href":"/api-reference/corpus/approve-a-proposal"},{"title":"Reject a proposal","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /memory/review-queue/{proposalId}/reject","href":"/api-reference/corpus/reject-a-proposal"},{"title":"Send a proposal back for changes","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /memory/review-queue/{proposalId}/request_changes","href":"/api-reference/corpus/send-a-proposal-back-for-changes"},{"title":"Get the caller's reviewer profile","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml get /memory/reviewer/me","href":"/api-reference/corpus/get-the-callers-reviewer-profile"}]}]}]},"title":"Mint a video upload URL - ZebraTruth — Runtime Compliance for AI Agents","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-BRm_l__d.js","utils-f1l1Oc-G.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BlhqDhJO.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DHCB7rsC.js","snippetPresets-CYXLx6Hv.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-B78P2dEq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C4YLPVAh.js","shallow-vlLnTDkQ.js","getApiPlaygroundDisplay-D_98hhvf.js","CodeSnippet-DtnZHGqq.js","CodeSnippets-CLFb8KJt.js","Page-kQh739Uz.js","getPastedJson-Cq-zlbnU.js","icon-sN3t983t.js","MethodPill-P_YQ2s09.js","DuplicateIcon-BVzyNsGJ.js","createIcon-B3jqgqC6.js","DynamicMarkdown-Crwq6WG_.js","SectionHeading-C7pGS2Bb.js","axios-vUo_bRtp.js","Markdown-BuPH8yuW.js","clsx-CCOYKgaU.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BnkC_6oA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BM4S31-f.js"]}