Check content against jurisdiction laws, platform policies, and rights clearance.
Supports three response modes: sync (block until complete), stream (SSE events per agent),
and async (webhook callback on completion).
Request formats. Accepts either application/json (the canonical format, full feature
set including streaming and webhooks) or multipart/form-data (for uploading image binaries
directly from a local file system). The multipart form is sync-only and bypasses the
response cache (cache is keyed on text, so mixing image sets would return wrong results).
Latency. Sync checks typically complete in 15–120 seconds depending on mode, number
of jurisdictions/platforms, and content length. Cached hits return in ≤1s. Set client
timeouts to at least 2.5 minutes (150s). For long-running or batched workflows, prefer
responseMode: "async" with a webhook to avoid long-held connections.
Tenant scoping. Every request is scoped to your account’s subscribed jurisdictions
and platforms (set during onboarding at https://developers.zebratruth.ai). Requesting
a jurisdiction or platform outside that set returns 403. See the
Tenant Onboarding and Scoping guide.
Financial services. Workspaces on the financial_services industry select the
specialist review scopes a check should run with reviewScopes, describe the artifact
with contentKind, and may narrow the regulated actors with regulatedActors.
Admission is checked in this order, all before any credits are reserved: unknown or
disabled scope (400 review_scope_not_enabled), scope without corpus coverage for a
requested jurisdiction (400 review_scope_jurisdiction_unsupported), actor not enabled
on the workspace (400 regulated_actor_not_enabled), scope not in the plan
(403 review_scope_not_entitled). Successful responses then carry agentsRun and
decisionReasons. At most 6 specialist agents run per request.
Documents. The multipart form accepts a single document part (PDF or Word .docx)
in place of text. The document is extracted server-side and checked as text. To inspect
the extracted text first, call POST /compliance/documents/extract.
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.
Narrow the industry rule sets applied to this request to a subset of the
workspace's industries. Omit to apply every industry the workspace has selected.
Financial-services review scopes to run. Each scope maps to one specialist agent.
Must be a subset of the scopes enabled on the workspace and covered for every
requested jurisdiction. Omit to run the workspace's enabled scopes.
Maximum array length: 6
A financial-services review scope. Each maps to one specialist agent:
financial promotions, disclosures and conduct; investment advice and suitability;
credit origination, servicing and collections; order execution, transaction reporting
and market abuse; KYC, AML/CFT, fraud and sanctions; AI governance, model risk and
automated decisions. Coverage is US, EU and UK for every scope, plus China and India
for financial_promotion.
What kind of artifact the check is looking at. Adds applicability triggers and ranks
the obligations the specialists cite. It never removes a selected review scope.
Narrow the regulated actors this check evaluates to a subset of the workspace's
actor set. Rules that bind an incompatible actor cannot drive blocking findings.
Must be a subset of the workspace set (400 regulated_actor_not_enabled).
Maximum array length: 17
The regulated party a check is evaluating. Corpus rules tagged with an incompatible
actor are excluded from asserted citations and cannot drive blocking findings.
All compliance findings. Each check has structured classification
metadata (id, jurisdictions, platforms, scope, primaryCategory,
categories) added inline. Combine bySeverity + byJurisdiction
etc. via the indexes field for filtered views.
O(1) lookup map keyed by stable id. Same data as checks[],
indexed for direct access (e.g. when resolving an annotation's
checkId to its parent check).
Pre-computed reference indexes — pure ID lists, no content duplication.
Tenants pick whichever organization fits their UI. Combine via set
intersection (e.g., critical EU findings = bySeverity.critical ∩
byJurisdiction.eu). All seven dimensions always present; empty buckets
are included so client code can do indexes.byJurisdiction.us ?? []
without optional-chaining on the bucket itself.
Present when the check was evaluated for specific regulated actors.
The regulated party a check is evaluating. Corpus rules tagged with an incompatible
actor are excluded from asserted citations and cannot drive blocking findings.
One record per financial-services specialist selected for this check, with how it
finished. Absent on checks that ran no specialist and on cached results produced
before this field existed.
Every rule that contributed to decision, in evaluation order. Present on checks
that ran a financial-services specialist.
Why the decision is what it is. blocking_check: a blocking finding forced BLOCK.
required_review_incomplete: a required specialist did not complete, so the check is
HOLD. legal_context_overflow: the applicable rule set exceeded what one run can
evaluate. flagged_check: a flagged finding produced HOLD.
{"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/compliance/run-compliance-check","slug":"/api-reference/compliance/run-compliance-check","pageMetadata":{"title":"Run compliance check","description":"Check content against jurisdiction laws, platform policies, and rights clearance.\nSupports three response modes: sync (block until complete), stream (SSE events per agent),\nand async (webhook callback on completion).\n\n**Request formats.** Accepts either `application/json` (the canonical format, full feature\nset including streaming and webhooks) or `multipart/form-data` (for uploading image binaries\ndirectly from a local file system). The multipart form is sync-only and bypasses the\nresponse cache (cache is keyed on text, so mixing image sets would return wrong results).\n\n**Latency.** Sync checks typically complete in **15–120 seconds** depending on mode, number\nof jurisdictions/platforms, and content length. Cached hits return in ≤1s. **Set client\ntimeouts to at least 2.5 minutes (150s).** For long-running or batched workflows, prefer\n`responseMode: \"async\"` with a webhook to avoid long-held connections.\n\n**Tenant scoping.** Every request is scoped to your account's subscribed jurisdictions\nand platforms (set during onboarding at `https://developers.zebratruth.ai`). Requesting\na jurisdiction or platform outside that set returns 403. See the\n[Tenant Onboarding and Scoping guide](/guides/tenant-onboarding-and-scoping).\n\n**Financial services.** Workspaces on the `financial_services` industry select the\nspecialist review scopes a check should run with `reviewScopes`, describe the artifact\nwith `contentKind`, and may narrow the regulated actors with `regulatedActors`.\nAdmission is checked in this order, all before any credits are reserved: unknown or\ndisabled scope (400 `review_scope_not_enabled`), scope without corpus coverage for a\nrequested jurisdiction (400 `review_scope_jurisdiction_unsupported`), actor not enabled\non the workspace (400 `regulated_actor_not_enabled`), scope not in the plan\n(403 `review_scope_not_entitled`). Successful responses then carry `agentsRun` and\n`decisionReasons`. At most 6 specialist agents run per request.\n\n**Documents.** The multipart form accepts a single `document` part (PDF or Word `.docx`)\nin place of `text`. The document is extracted server-side and checked as text. To inspect\nthe extracted text first, call `POST /compliance/documents/extract`.\n","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/check","href":"/api-reference/compliance/run-compliance-check","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 a: \"a\",\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Check content against jurisdiction laws, platform policies, and rights clearance.\\nSupports three response modes: sync (block until complete), stream (SSE events per agent),\\nand async (webhook callback on completion).\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Request formats.\"\n }), \" Accepts either \", _jsx(_components.code, {\n children: \"application/json\"\n }), \" (the canonical format, full feature\\nset including streaming and webhooks) or \", _jsx(_components.code, {\n children: \"multipart/form-data\"\n }), \" (for uploading image binaries\\ndirectly from a local file system). The multipart form is sync-only and bypasses the\\nresponse cache (cache is keyed on text, so mixing image sets would return wrong results).\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Latency.\"\n }), \" Sync checks typically complete in \", _jsx(_components.strong, {\n children: \"15–120 seconds\"\n }), \" depending on mode, number\\nof jurisdictions/platforms, and content length. Cached hits return in ≤1s. \", _jsx(_components.strong, {\n children: \"Set client\\ntimeouts to at least 2.5 minutes (150s).\"\n }), \" For long-running or batched workflows, prefer\\n\", _jsx(_components.code, {\n children: \"responseMode: \\\"async\\\"\"\n }), \" with a webhook to avoid long-held connections.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Tenant scoping.\"\n }), \" Every request is scoped to your account’s subscribed jurisdictions\\nand platforms (set during onboarding at \", _jsx(_components.code, {\n children: \"https://developers.zebratruth.ai\"\n }), \"). Requesting\\na jurisdiction or platform outside that set returns 403. See the\\n\", _jsx(_components.a, {\n href: \"/guides/tenant-onboarding-and-scoping\",\n children: \"Tenant Onboarding and Scoping guide\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Financial services.\"\n }), \" Workspaces on the \", _jsx(_components.code, {\n children: \"financial_services\"\n }), \" industry select the\\nspecialist review scopes a check should run with \", _jsx(_components.code, {\n children: \"reviewScopes\"\n }), \", describe the artifact\\nwith \", _jsx(_components.code, {\n children: \"contentKind\"\n }), \", and may narrow the regulated actors with \", _jsx(_components.code, {\n children: \"regulatedActors\"\n }), \".\\nAdmission is checked in this order, all before any credits are reserved: unknown or\\ndisabled scope (400 \", _jsx(_components.code, {\n children: \"review_scope_not_enabled\"\n }), \"), scope without corpus coverage for a\\nrequested jurisdiction (400 \", _jsx(_components.code, {\n children: \"review_scope_jurisdiction_unsupported\"\n }), \"), actor not enabled\\non the workspace (400 \", _jsx(_components.code, {\n children: \"regulated_actor_not_enabled\"\n }), \"), scope not in the plan\\n(403 \", _jsx(_components.code, {\n children: \"review_scope_not_entitled\"\n }), \"). Successful responses then carry \", _jsx(_components.code, {\n children: \"agentsRun\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"decisionReasons\"\n }), \". At most 6 specialist agents run per request.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Documents.\"\n }), \" The multipart form accepts a single \", _jsx(_components.code, {\n children: \"document\"\n }), \" part (PDF or Word \", _jsx(_components.code, {\n children: \".docx\"\n }), \")\\nin place of \", _jsx(_components.code, {\n children: \"text\"\n }), \". The document is extracted server-side and checked as text. To inspect\\nthe extracted text first, call \", _jsx(_components.code, {\n children: \"POST /compliance/documents/extract\"\n }), \".\"]\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":"Run compliance check","description":"Check content against jurisdiction laws, platform policies, and rights clearance.\nSupports three response modes: sync (block until complete), stream (SSE events per agent),\nand async (webhook callback on completion).\n\n**Request formats.** Accepts either `application/json` (the canonical format, full feature\nset including streaming and webhooks) or `multipart/form-data` (for uploading image binaries\ndirectly from a local file system). The multipart form is sync-only and bypasses the\nresponse cache (cache is keyed on text, so mixing image sets would return wrong results).\n\n**Latency.** Sync checks typically complete in **15–120 seconds** depending on mode, number\nof jurisdictions/platforms, and content length. Cached hits return in ≤1s. **Set client\ntimeouts to at least 2.5 minutes (150s).** For long-running or batched workflows, prefer\n`responseMode: \"async\"` with a webhook to avoid long-held connections.\n\n**Tenant scoping.** Every request is scoped to your account's subscribed jurisdictions\nand platforms (set during onboarding at `https://developers.zebratruth.ai`). Requesting\na jurisdiction or platform outside that set returns 403. See the\n[Tenant Onboarding and Scoping guide](/guides/tenant-onboarding-and-scoping).\n\n**Financial services.** Workspaces on the `financial_services` industry select the\nspecialist review scopes a check should run with `reviewScopes`, describe the artifact\nwith `contentKind`, and may narrow the regulated actors with `regulatedActors`.\nAdmission is checked in this order, all before any credits are reserved: unknown or\ndisabled scope (400 `review_scope_not_enabled`), scope without corpus coverage for a\nrequested jurisdiction (400 `review_scope_jurisdiction_unsupported`), actor not enabled\non the workspace (400 `regulated_actor_not_enabled`), scope not in the plan\n(403 `review_scope_not_entitled`). Successful responses then carry `agentsRun` and\n`decisionReasons`. At most 6 specialist agents run per request.\n\n**Documents.** The multipart form accepts a single `document` part (PDF or Word `.docx`)\nin place of `text`. The document is extracted server-side and checked as text. To inspect\nthe extracted text first, call `POST /compliance/documents/extract`.\n","deprecated":null,"version":null,"openapi":"/openapi/zebratruth-v1.yaml post /compliance/check","href":"/api-reference/compliance/run-compliance-check","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"runComplianceCheck","summary":"Run compliance check","description":"Check content against jurisdiction laws, platform policies, and rights clearance.\nSupports three response modes: sync (block until complete), stream (SSE events per agent),\nand async (webhook callback on completion).\n\n**Request formats.** Accepts either `application/json` (the canonical format, full feature\nset including streaming and webhooks) or `multipart/form-data` (for uploading image binaries\ndirectly from a local file system). The multipart form is sync-only and bypasses the\nresponse cache (cache is keyed on text, so mixing image sets would return wrong results).\n\n**Latency.** Sync checks typically complete in **15–120 seconds** depending on mode, number\nof jurisdictions/platforms, and content length. Cached hits return in ≤1s. **Set client\ntimeouts to at least 2.5 minutes (150s).** For long-running or batched workflows, prefer\n`responseMode: \"async\"` with a webhook to avoid long-held connections.\n\n**Tenant scoping.** Every request is scoped to your account's subscribed jurisdictions\nand platforms (set during onboarding at `https://developers.zebratruth.ai`). Requesting\na jurisdiction or platform outside that set returns 403. See the\n[Tenant Onboarding and Scoping guide](/guides/tenant-onboarding-and-scoping).\n\n**Financial services.** Workspaces on the `financial_services` industry select the\nspecialist review scopes a check should run with `reviewScopes`, describe the artifact\nwith `contentKind`, and may narrow the regulated actors with `regulatedActors`.\nAdmission is checked in this order, all before any credits are reserved: unknown or\ndisabled scope (400 `review_scope_not_enabled`), scope without corpus coverage for a\nrequested jurisdiction (400 `review_scope_jurisdiction_unsupported`), actor not enabled\non the workspace (400 `regulated_actor_not_enabled`), scope not in the plan\n(403 `review_scope_not_entitled`). Successful responses then carry `agentsRun` and\n`decisionReasons`. At most 6 specialist agents run per request.\n\n**Documents.** The multipart form accepts a single `document` part (PDF or Word `.docx`)\nin place of `text`. The document is extracted server-side and checked as text. To inspect\nthe extracted text first, call `POST /compliance/documents/extract`.\n","tags":["Compliance"],"parameters":["af87985a-582c-4091-b4bc-98a2aabf3b8f"],"requestBody":"2fa84d73-31d4-4ad3-9202-f9e151d7ad97","responses":{"200":"456cbe78-4f6a-4927-af5d-eb18ebf08ba1","400":"88a0be1d-3aee-43b4-94d4-bd7760073650","401":"1a332f40-bdf1-449c-8375-92c61126416b","402":"69aaf7d6-c330-4264-b149-1614feaec226","403":"7db94dfa-7e8c-4749-bd3b-157af44ef90c","413":"9308afb6-6126-4378-b868-05c54a956e42","415":"8d4a9908-ee49-42ed-8b75-ff89134359b5","422":"7ea696c7-6163-491b-8146-6733d3176f0f","429":"34f8ac09-0df8-4df3-a06f-1b005104cffd"},"method":"post","type":"path","servers":["e4860b08-abe2-46de-8ff2-cf13ac5f2eef"],"security":["2150c869-c80e-45b2-aa80-21ce646b4401"],"path":"/compliance/check","baseUrlOptions":["https://api.zebratruth.ai/v1"],"title":"Run compliance check","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"af87985a-582c-4091-b4bc-98a2aabf3b8f":{"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":["jurisdictions","platforms","content"],"properties":{"jurisdictions":{"type":"array","items":{"type":"string","enum":["us","eu","uk","india","china"],"uniqueKey":"jurisdictions.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Which jurisdiction laws to check against","example":["us","eu"],"isRequired":true,"uniqueKey":"jurisdictions","typeLabel":"enum\u003cstring>[]"},"platforms":{"type":"array","items":{"type":"string","enum":["youtube","instagram","facebook","tiktok","linkedin"],"uniqueKey":"platforms.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Which platform policies to check","example":["youtube","instagram"],"isRequired":true,"uniqueKey":"platforms","typeLabel":"enum\u003cstring>[]"},"content":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"The content to check (ad script, copy, description)","example":"Try our guaranteed weight loss solution!","isRequired":true,"uniqueKey":"content.text","typeLabel":"string"},"imageUrls":{"type":"array","items":{"type":"string","format":"uri","uniqueKey":"content.imageUrls.items.[INDEX]","typeLabel":"string\u003curi>"},"description":"Image URLs for rights clearance (max 2). For image-only checks, use POST /compliance/check-image.","uniqueKey":"content.imageUrls","typeLabel":"string\u003curi>[]"}},"isRequired":true,"uniqueKey":"content","typeLabel":"object"},"mode":{"type":"string","enum":["fast","full"],"description":"- `fast` — All agents run in parallel\n- `full` — 4-phase pipeline with content enrichment\n","example":"fast","uniqueKey":"mode","typeLabel":"enum\u003cstring>"},"responseMode":{"type":"string","enum":["sync","stream","async"],"default":"sync","description":"- `sync` — Block until complete, return full report\n- `stream` — SSE events per agent (progressive results)\n- `async` — Return immediately, deliver result via webhook\n","uniqueKey":"responseMode","typeLabel":"enum\u003cstring>"},"webhookUrl":{"type":"string","format":"uri","description":"Required for async mode — where to POST results","uniqueKey":"webhookUrl","typeLabel":"string\u003curi>"},"callbackId":{"type":"string","description":"Your correlation ID, echoed back in webhook payload","uniqueKey":"callbackId","typeLabel":"string"},"externalId":{"type":"string","description":"Your own reference ID, queryable in request logs","uniqueKey":"externalId","typeLabel":"string"},"industryOverlays":{"type":"array","items":{"type":"string","enum":["financial_services","pharma_healthcare"],"uniqueKey":"industryOverlays.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Narrow the industry rule sets applied to this request to a subset of the\nworkspace's industries. Omit to apply every industry the workspace has selected.\n","uniqueKey":"industryOverlays","typeLabel":"enum\u003cstring>[]"},"reviewScopes":{"type":"array","maxItems":6,"items":{"type":"string","enum":["financial_promotion","advisory_suitability","credit_servicing","markets_trading","financial_crime","ai_governance"],"description":"A financial-services review scope. Each maps to one specialist agent:\nfinancial promotions, disclosures and conduct; investment advice and suitability;\ncredit origination, servicing and collections; order execution, transaction reporting\nand market abuse; KYC, AML/CFT, fraud and sanctions; AI governance, model risk and\nautomated decisions. Coverage is US, EU and UK for every scope, plus China and India\nfor `financial_promotion`.\n","uniqueKey":"reviewScopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Financial-services review scopes to run. Each scope maps to one specialist agent.\nMust be a subset of the scopes enabled on the workspace and covered for every\nrequested jurisdiction. Omit to run the workspace's enabled scopes.\n","example":["advisory_suitability"],"uniqueKey":"reviewScopes","typeLabel":"enum\u003cstring>[]"},"contentKind":{"type":"string","enum":["marketing","suitability_report","advice_letter","precontract_disclosure","adverse_action_notice","collections_communication","arrears_notice","fund_factsheet","research_note","trader_communication","best_execution_disclosure","kyc_onboarding","scam_warning","aml_policy","ai_policy","model_documentation","other"],"description":"What kind of artifact the check is looking at. Adds applicability triggers and ranks\nthe obligations the specialists cite. It never removes a selected review scope.\n","uniqueKey":"contentKind","typeLabel":"enum\u003cstring>"},"regulatedActors":{"type":"array","maxItems":17,"items":{"type":"string","enum":["advertiser","manufacturer","platform","provider","payer","pharmacy","HCP","telehealth_provider","adviser","broker_dealer","bank","lender","servicer","debt_collector","fund_manager","payment_service_provider","insurer"],"description":"The regulated party a check is evaluating. Corpus rules tagged with an incompatible\nactor are excluded from asserted citations and cannot drive blocking findings.\n","uniqueKey":"regulatedActors.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Narrow the regulated actors this check evaluates to a subset of the workspace's\nactor set. Rules that bind an incompatible actor cannot drive blocking findings.\nMust be a subset of the workspace set (400 `regulated_actor_not_enabled`).\n","uniqueKey":"regulatedActors","typeLabel":"enum\u003cstring>[]"},"regulatedActor":{"type":"string","description":"Single-actor form of `regulatedActors`, kept for older clients. Prefer `regulatedActors`.","enum":["advertiser","manufacturer","platform","provider","payer","pharmacy","HCP","telehealth_provider","adviser","broker_dealer","bank","lender","servicer","debt_collector","fund_manager","payment_service_provider","insurer"],"uniqueKey":"regulatedActor","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"jurisdictions":["us","eu"],"platforms":["youtube","instagram"],"content":{"text":"Try our guaranteed weight loss solution!","imageUrls":["\u003cstring>"]},"mode":"fast","responseMode":"sync","webhookUrl":"\u003cstring>","callbackId":"\u003cstring>","externalId":"\u003cstring>","industryOverlays":[],"reviewScopes":["advisory_suitability"],"regulatedActors":[]}}},"exampleType":"generated"},"multipart/form-data":{"schema":{"type":"object","description":"Flat-field multipart form. Send `jurisdictions` and `platforms`\nas repeated fields (one value per occurrence) — NOT as JSON arrays or comma-separated\nstrings. The multipart path is sync-only: `responseMode`, `webhookUrl`, and\n`callbackId` are ignored. Cache is bypassed when `image` parts are present.\n","required":["jurisdictions","platforms"],"properties":{"jurisdictions":{"type":"array","description":"Send as repeated fields — `-F \"jurisdictions=us\" -F \"jurisdictions=eu\"`","items":{"type":"string","enum":["us","eu","uk","india","china"],"uniqueKey":"jurisdictions.items.[INDEX]","typeLabel":"enum\u003cstring>"},"isRequired":true,"uniqueKey":"jurisdictions","typeLabel":"enum\u003cstring>[]"},"platforms":{"type":"array","description":"Send as repeated fields — `-F \"platforms=youtube\" -F \"platforms=instagram\"`","items":{"type":"string","enum":["youtube","instagram","facebook","tiktok","linkedin"],"uniqueKey":"platforms.items.[INDEX]","typeLabel":"enum\u003cstring>"},"isRequired":true,"uniqueKey":"platforms","typeLabel":"enum\u003cstring>[]"},"text":{"type":"string","description":"The content to check (ad script, copy, description). Send exactly one of\n`text` or `document`; sending both returns 400 `document_and_text_conflict`.\n","example":"Try our guaranteed weight loss solution!","uniqueKey":"text","typeLabel":"string"},"document":{"type":"string","format":"binary","description":"A single PDF or Word (`.docx`) file to check in place of `text`. The file is\nsniffed by signature, extracted server-side and checked as text; scanned PDFs with\nno extractable text are rejected with 422 `document_no_extractable_text`. Legacy\n`.doc` is not accepted. One `document` part per request\n(400 `document_count_exceeded`). Limits and error codes are listed on\n`POST /compliance/documents/extract`.\n","uniqueKey":"document","typeLabel":"file"},"image":{"type":"array","maxItems":2,"description":"Image binary, 0 to 2 parts. Repeat the `image` field for each file\n(e.g., `-F \"image=@ad-1.png\" -F \"image=@ad-2.png\"`). Total request body\nis capped at 4.5 MB.\n","items":{"type":"string","format":"binary","uniqueKey":"image.items.[INDEX]","typeLabel":"file"},"uniqueKey":"image","typeLabel":"file[]"},"mode":{"type":"string","enum":["fast","full"],"default":"fast","description":"Execution mode. Streaming and async are not available on the multipart path.","uniqueKey":"mode","typeLabel":"enum\u003cstring>"},"externalId":{"type":"string","description":"Your own reference ID, queryable in request logs.","uniqueKey":"externalId","typeLabel":"string"},"industryOverlays":{"type":"array","description":"Send as repeated fields. Same semantics as the JSON body.","items":{"type":"string","enum":["financial_services","pharma_healthcare"],"uniqueKey":"industryOverlays.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"industryOverlays","typeLabel":"enum\u003cstring>[]"},"reviewScopes":{"type":"array","maxItems":6,"description":"Send as repeated fields, or as one field holding a JSON array of strings.","items":{"type":"string","enum":["financial_promotion","advisory_suitability","credit_servicing","markets_trading","financial_crime","ai_governance"],"description":"A financial-services review scope. Each maps to one specialist agent:\nfinancial promotions, disclosures and conduct; investment advice and suitability;\ncredit origination, servicing and collections; order execution, transaction reporting\nand market abuse; KYC, AML/CFT, fraud and sanctions; AI governance, model risk and\nautomated decisions. Coverage is US, EU and UK for every scope, plus China and India\nfor `financial_promotion`.\n","uniqueKey":"reviewScopes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"reviewScopes","typeLabel":"enum\u003cstring>[]"},"contentKind":{"type":"string","description":"At most one occurrence.","enum":["marketing","suitability_report","advice_letter","precontract_disclosure","adverse_action_notice","collections_communication","arrears_notice","fund_factsheet","research_note","trader_communication","best_execution_disclosure","kyc_onboarding","scam_warning","aml_policy","ai_policy","model_documentation","other"],"uniqueKey":"contentKind","typeLabel":"enum\u003cstring>"},"regulatedActors":{"type":"array","description":"Send as repeated fields, or as one field holding a JSON array of strings.","items":{"type":"string","enum":["advertiser","manufacturer","platform","provider","payer","pharmacy","HCP","telehealth_provider","adviser","broker_dealer","bank","lender","servicer","debt_collector","fund_manager","payment_service_provider","insurer"],"description":"The regulated party a check is evaluating. Corpus rules tagged with an incompatible\nactor are excluded from asserted citations and cannot drive blocking findings.\n","uniqueKey":"regulatedActors.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"regulatedActors","typeLabel":"enum\u003cstring>[]"},"regulatedActor":{"type":"string","description":"At most one occurrence. Prefer `regulatedActors`.","enum":["advertiser","manufacturer","platform","provider","payer","pharmacy","HCP","telehealth_provider","adviser","broker_dealer","bank","lender","servicer","debt_collector","fund_manager","payment_service_provider","insurer"],"uniqueKey":"regulatedActor","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"encoding":{"image":{"contentType":"image/png, image/jpeg, image/webp, image/gif"}},"examples":{"Example":{"title":"Example","value":{"jurisdictions":[],"platforms":[],"text":"Try our guaranteed weight loss solution!","document":"\u003cstring>","image":["\u003cstring>"],"mode":"fast","externalId":"\u003cstring>","industryOverlays":[],"reviewScopes":[],"regulatedActors":[]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"456cbe78-4f6a-4927-af5d-eb18ebf08ba1":{"description":"Compliance report (sync mode). For stream mode, returns `text/event-stream`.\nFor async mode, returns job info with poll URL.\n","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"requestId":{"type":"string","description":"Identifier of this check, usable with `GET /compliance/checks/{requestId}` and in request logs.","uniqueKey":"oneOf.0.requestId","typeLabel":"string"},"reportId":{"type":"string","example":"rpt_abc123","uniqueKey":"oneOf.0.reportId","typeLabel":"string"},"score":{"type":"integer","minimum":0,"maximum":100,"example":72,"uniqueKey":"oneOf.0.score","typeLabel":"integer"},"decision":{"type":"string","enum":["PUBLISH","HOLD","BLOCK"],"description":"- `PUBLISH` — Score 80-100, safe to publish\n- `HOLD` — Score 60-79, or any high-severity flag\n- `BLOCK` — Score 0-59, or any critical-severity check\n","uniqueKey":"oneOf.0.decision","typeLabel":"enum\u003cstring>"},"checks":{"type":"array","items":{"type":"object","description":"A single compliance finding. Includes both the raw finding fields\n(checkName, severity, message, recommendation, citation) and structured\nclassification metadata added by the engine (id, jurisdictions, platforms,\nscope, primaryCategory, categories).\n","properties":{"id":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.checks.items.[INDEX].id","typeLabel":"string"},"agentId":{"type":"string","enum":["ai-laws","jurisdiction-detection","advertising-law","platform-policy","metadata-labeling","rights-clearance","rights-clearance-text","rights-clearance-image","compliance-score","fs-compliance-financial-promotion","fs-compliance-advisory-suitability","fs-compliance-credit-servicing","fs-compliance-markets-trading","fs-compliance-financial-crime","fs-compliance-ai-governance","financial-services-compliance","pharma-healthcare-compliance"],"description":"Agent identifier. Use `GET /agents` to discover all available agents dynamically.\nThe list is filtered to the industries your workspace has selected.\n\n**Financial services.** The six `fs-compliance-*` agents correspond one-to-one to the\nreview scopes (`financial_promotion` → `fs-compliance-financial-promotion`, and so on).\nIn a full check they are selected with `reviewScopes`. Via `POST /agents/{agentId}`\nonly `fs-compliance-financial-promotion` can be invoked directly today; the other five\nreturn 400 `review_scope_not_enabled` on direct invocation and must run through\n`POST /compliance/check`. `financial-services-compliance` is a read-only alias of\n`fs-compliance-financial-promotion` accepted for older clients.\n\n**Pharma and healthcare.** `pharma-healthcare-compliance` runs for workspaces on the\n`pharma_healthcare` industry and honours `regulatedActor`.\n\n`ai-laws` is the canonical id; `jurisdiction-detection` is accepted as an\ninput alias for backward compatibility with historical clients. New\nintegrations should use `ai-laws`.\n\n**Note on rights-clearance variants.** `GET /agents` exposes two registered agents\nfor rights clearance: `rights-clearance-text` and `rights-clearance-image` — invoke\nthem via `POST /agents/{agentId}` using those qualified IDs. On **check response\nobjects**, however, text rights-clearance findings carry the bare `agentId:\n\"rights-clearance\"`. Treat bare `rights-clearance` and `rights-clearance-text` as\nthe same logical pipeline — the bare form is the value that appears on `checks[]`\nentries from that agent.\n","uniqueKey":"oneOf.0.checks.items.[INDEX].agentId","typeLabel":"enum\u003cstring>"},"checkName":{"type":"string","description":"Human-readable check name","example":"Unsubstantiated Health Claim - 'Cure Cancer'","uniqueKey":"oneOf.0.checks.items.[INDEX].checkName","typeLabel":"string"},"status":{"type":"string","enum":["pass","flag","block","escalate"],"description":"- `pass` — No issue found\n- `flag` — Issue found, review recommended\n- `block` — Critical issue, must fix\n- `escalate` — Needs human review\n","uniqueKey":"oneOf.0.checks.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"severity":{"type":"string","enum":["critical","high","medium","low","info"],"description":"- `critical` — Legal liability risk (-25 points)\n- `high` — Likely violation (-15 points)\n- `medium` — Potential issue (-8 points)\n- `low` — Minor concern (-3 points)\n- `info` — Informational only (0 points)\n","uniqueKey":"oneOf.0.checks.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable description of the issue","example":"'Guaranteed to cure cancer' is an unsubstantiated health claim under FTC and EU UCPD.","uniqueKey":"oneOf.0.checks.items.[INDEX].message","typeLabel":"string"},"recommendation":{"type":"string","description":"Specific action to fix the issue","example":"Remove the guarantee or substantiate with peer-reviewed clinical evidence.","uniqueKey":"oneOf.0.checks.items.[INDEX].recommendation","typeLabel":"string"},"citation":{"type":"string","description":"Legal or policy reference","example":"FTC Endorsement Guides, 16 CFR Part 255","uniqueKey":"oneOf.0.checks.items.[INDEX].citation","typeLabel":"string"},"metadata":{"type":"string","description":"Optional JSON string with agent-specific data","uniqueKey":"oneOf.0.checks.items.[INDEX].metadata","typeLabel":"string"},"jurisdictions":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.checks.items.[INDEX].jurisdictions.items.[INDEX]","typeLabel":"string"},"description":"Canonical jurisdiction codes (us, eu, uk, india, china) this check\napplies to. May be empty when `scope` is `global` or `platform-specific`.\nAlways a subset of the request's jurisdiction list.\n","example":["us","eu"],"uniqueKey":"oneOf.0.checks.items.[INDEX].jurisdictions","typeLabel":"string[]"},"platforms":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.checks.items.[INDEX].platforms.items.[INDEX]","typeLabel":"string"},"description":"Canonical platform codes (youtube, instagram, facebook, tiktok, linkedin)\nthis check applies to. May be empty when `scope` is `global` or\n`jurisdiction-specific`. Always a subset of the request's platform list.\n","example":["youtube","instagram"],"uniqueKey":"oneOf.0.checks.items.[INDEX].platforms","typeLabel":"string[]"},"scope":{"type":"string","enum":["global","jurisdiction-specific","platform-specific","cross-cutting"],"description":"Disambiguates the empty-array case for `jurisdictions` and `platforms`:\n- `global` — universal; both arrays empty\n- `jurisdiction-specific` — jurisdictions populated, platforms empty\n- `platform-specific` — platforms populated, jurisdictions empty\n- `cross-cutting` — both populated; check applies at the intersection\n","uniqueKey":"oneOf.0.checks.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"primaryCategory":{"type":"string","enum":["celebrity-endorsement","expert-authority","fabricated-testimonial","material-connection-disclosure","unsubstantiated-health-claim","medical-efficacy-claim","safety-claim","performance-claim","comparative-advertising","right-of-publicity","trademark-infringement","copyright-infringement","music-licensing","ai-disclosure-missing","watermark-missing","c2pa-missing","deepfake-impersonation","disguised-advertising","sponsored-content-labeling","consumer-information-disclosure","scarcity-urgency","aggressive-practice","algorithmic-amplification","minor-targeting","vulnerable-audience","platform-policy-violation","data-privacy","jurisdiction-coverage-gap","other"],"description":"Top-level breach taxonomy. New categories may be added in minor versions\n(additive only); renaming and removal are forbidden. Clients MUST accept\nunknown enum values gracefully (forward-compat). `other` is the fallback\nbucket for findings that don't fit any specific category.\n","uniqueKey":"oneOf.0.checks.items.[INDEX].primaryCategory","typeLabel":"enum\u003cstring>"},"categories":{"type":"array","minItems":1,"items":{"type":"string","enum":["celebrity-endorsement","expert-authority","fabricated-testimonial","material-connection-disclosure","unsubstantiated-health-claim","medical-efficacy-claim","safety-claim","performance-claim","comparative-advertising","right-of-publicity","trademark-infringement","copyright-infringement","music-licensing","ai-disclosure-missing","watermark-missing","c2pa-missing","deepfake-impersonation","disguised-advertising","sponsored-content-labeling","consumer-information-disclosure","scarcity-urgency","aggressive-practice","algorithmic-amplification","minor-targeting","vulnerable-audience","platform-policy-violation","data-privacy","jurisdiction-coverage-gap","other"],"description":"Top-level breach taxonomy. New categories may be added in minor versions\n(additive only); renaming and removal are forbidden. Clients MUST accept\nunknown enum values gracefully (forward-compat). `other` is the fallback\nbucket for findings that don't fit any specific category.\n","uniqueKey":"oneOf.0.checks.items.[INDEX].categories.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"All matched categories, with `primaryCategory` first. A finding may\napply to multiple categories (e.g. a deepfake celebrity check matches\nboth `deepfake-impersonation` and `right-of-publicity`).\n","example":["unsubstantiated-health-claim","performance-claim"],"uniqueKey":"oneOf.0.checks.items.[INDEX].categories","typeLabel":"enum\u003cstring>[]"}},"uniqueKey":"oneOf.0.checks.items.[INDEX]","typeLabel":"object"},"description":"All compliance findings. Each check has structured classification\nmetadata (id, jurisdictions, platforms, scope, primaryCategory,\ncategories) added inline. Combine `bySeverity` + `byJurisdiction`\netc. via the `indexes` field for filtered views.\n","uniqueKey":"oneOf.0.checks","typeLabel":"object[]"},"checksById":{"type":"object","additionalProperties":{"type":"object","description":"A single compliance finding. Includes both the raw finding fields\n(checkName, severity, message, recommendation, citation) and structured\nclassification metadata added by the engine (id, jurisdictions, platforms,\nscope, primaryCategory, categories).\n","properties":{"id":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.checksById.additionalProperties.id","typeLabel":"string"},"agentId":{"type":"string","enum":["ai-laws","jurisdiction-detection","advertising-law","platform-policy","metadata-labeling","rights-clearance","rights-clearance-text","rights-clearance-image","compliance-score","fs-compliance-financial-promotion","fs-compliance-advisory-suitability","fs-compliance-credit-servicing","fs-compliance-markets-trading","fs-compliance-financial-crime","fs-compliance-ai-governance","financial-services-compliance","pharma-healthcare-compliance"],"description":"Agent identifier. Use `GET /agents` to discover all available agents dynamically.\nThe list is filtered to the industries your workspace has selected.\n\n**Financial services.** The six `fs-compliance-*` agents correspond one-to-one to the\nreview scopes (`financial_promotion` → `fs-compliance-financial-promotion`, and so on).\nIn a full check they are selected with `reviewScopes`. Via `POST /agents/{agentId}`\nonly `fs-compliance-financial-promotion` can be invoked directly today; the other five\nreturn 400 `review_scope_not_enabled` on direct invocation and must run through\n`POST /compliance/check`. `financial-services-compliance` is a read-only alias of\n`fs-compliance-financial-promotion` accepted for older clients.\n\n**Pharma and healthcare.** `pharma-healthcare-compliance` runs for workspaces on the\n`pharma_healthcare` industry and honours `regulatedActor`.\n\n`ai-laws` is the canonical id; `jurisdiction-detection` is accepted as an\ninput alias for backward compatibility with historical clients. New\nintegrations should use `ai-laws`.\n\n**Note on rights-clearance variants.** `GET /agents` exposes two registered agents\nfor rights clearance: `rights-clearance-text` and `rights-clearance-image` — invoke\nthem via `POST /agents/{agentId}` using those qualified IDs. On **check response\nobjects**, however, text rights-clearance findings carry the bare `agentId:\n\"rights-clearance\"`. Treat bare `rights-clearance` and `rights-clearance-text` as\nthe same logical pipeline — the bare form is the value that appears on `checks[]`\nentries from that agent.\n","uniqueKey":"oneOf.0.checksById.additionalProperties.agentId","typeLabel":"enum\u003cstring>"},"checkName":{"type":"string","description":"Human-readable check name","example":"Unsubstantiated Health Claim - 'Cure Cancer'","uniqueKey":"oneOf.0.checksById.additionalProperties.checkName","typeLabel":"string"},"status":{"type":"string","enum":["pass","flag","block","escalate"],"description":"- `pass` — No issue found\n- `flag` — Issue found, review recommended\n- `block` — Critical issue, must fix\n- `escalate` — Needs human review\n","uniqueKey":"oneOf.0.checksById.additionalProperties.status","typeLabel":"enum\u003cstring>"},"severity":{"type":"string","enum":["critical","high","medium","low","info"],"description":"- `critical` — Legal liability risk (-25 points)\n- `high` — Likely violation (-15 points)\n- `medium` — Potential issue (-8 points)\n- `low` — Minor concern (-3 points)\n- `info` — Informational only (0 points)\n","uniqueKey":"oneOf.0.checksById.additionalProperties.severity","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable description of the issue","example":"'Guaranteed to cure cancer' is an unsubstantiated health claim under FTC and EU UCPD.","uniqueKey":"oneOf.0.checksById.additionalProperties.message","typeLabel":"string"},"recommendation":{"type":"string","description":"Specific action to fix the issue","example":"Remove the guarantee or substantiate with peer-reviewed clinical evidence.","uniqueKey":"oneOf.0.checksById.additionalProperties.recommendation","typeLabel":"string"},"citation":{"type":"string","description":"Legal or policy reference","example":"FTC Endorsement Guides, 16 CFR Part 255","uniqueKey":"oneOf.0.checksById.additionalProperties.citation","typeLabel":"string"},"metadata":{"type":"string","description":"Optional JSON string with agent-specific data","uniqueKey":"oneOf.0.checksById.additionalProperties.metadata","typeLabel":"string"},"jurisdictions":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.checksById.additionalProperties.jurisdictions.items.[INDEX]","typeLabel":"string"},"description":"Canonical jurisdiction codes (us, eu, uk, india, china) this check\napplies to. May be empty when `scope` is `global` or `platform-specific`.\nAlways a subset of the request's jurisdiction list.\n","example":["us","eu"],"uniqueKey":"oneOf.0.checksById.additionalProperties.jurisdictions","typeLabel":"string[]"},"platforms":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.checksById.additionalProperties.platforms.items.[INDEX]","typeLabel":"string"},"description":"Canonical platform codes (youtube, instagram, facebook, tiktok, linkedin)\nthis check applies to. May be empty when `scope` is `global` or\n`jurisdiction-specific`. Always a subset of the request's platform list.\n","example":["youtube","instagram"],"uniqueKey":"oneOf.0.checksById.additionalProperties.platforms","typeLabel":"string[]"},"scope":{"type":"string","enum":["global","jurisdiction-specific","platform-specific","cross-cutting"],"description":"Disambiguates the empty-array case for `jurisdictions` and `platforms`:\n- `global` — universal; both arrays empty\n- `jurisdiction-specific` — jurisdictions populated, platforms empty\n- `platform-specific` — platforms populated, jurisdictions empty\n- `cross-cutting` — both populated; check applies at the intersection\n","uniqueKey":"oneOf.0.checksById.additionalProperties.scope","typeLabel":"enum\u003cstring>"},"primaryCategory":{"type":"string","enum":["celebrity-endorsement","expert-authority","fabricated-testimonial","material-connection-disclosure","unsubstantiated-health-claim","medical-efficacy-claim","safety-claim","performance-claim","comparative-advertising","right-of-publicity","trademark-infringement","copyright-infringement","music-licensing","ai-disclosure-missing","watermark-missing","c2pa-missing","deepfake-impersonation","disguised-advertising","sponsored-content-labeling","consumer-information-disclosure","scarcity-urgency","aggressive-practice","algorithmic-amplification","minor-targeting","vulnerable-audience","platform-policy-violation","data-privacy","jurisdiction-coverage-gap","other"],"description":"Top-level breach taxonomy. New categories may be added in minor versions\n(additive only); renaming and removal are forbidden. Clients MUST accept\nunknown enum values gracefully (forward-compat). `other` is the fallback\nbucket for findings that don't fit any specific category.\n","uniqueKey":"oneOf.0.checksById.additionalProperties.primaryCategory","typeLabel":"enum\u003cstring>"},"categories":{"type":"array","minItems":1,"items":{"type":"string","enum":["celebrity-endorsement","expert-authority","fabricated-testimonial","material-connection-disclosure","unsubstantiated-health-claim","medical-efficacy-claim","safety-claim","performance-claim","comparative-advertising","right-of-publicity","trademark-infringement","copyright-infringement","music-licensing","ai-disclosure-missing","watermark-missing","c2pa-missing","deepfake-impersonation","disguised-advertising","sponsored-content-labeling","consumer-information-disclosure","scarcity-urgency","aggressive-practice","algorithmic-amplification","minor-targeting","vulnerable-audience","platform-policy-violation","data-privacy","jurisdiction-coverage-gap","other"],"description":"Top-level breach taxonomy. New categories may be added in minor versions\n(additive only); renaming and removal are forbidden. Clients MUST accept\nunknown enum values gracefully (forward-compat). `other` is the fallback\nbucket for findings that don't fit any specific category.\n","uniqueKey":"oneOf.0.checksById.additionalProperties.categories.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"All matched categories, with `primaryCategory` first. A finding may\napply to multiple categories (e.g. a deepfake celebrity check matches\nboth `deepfake-impersonation` and `right-of-publicity`).\n","example":["unsubstantiated-health-claim","performance-claim"],"uniqueKey":"oneOf.0.checksById.additionalProperties.categories","typeLabel":"enum\u003cstring>[]"}},"uniqueKey":"oneOf.0.checksById.additionalProperties","typeLabel":"object"},"description":"O(1) lookup map keyed by stable `id`. Same data as `checks[]`,\nindexed for direct access (e.g. when resolving an annotation's\n`checkId` to its parent check).\n","uniqueKey":"oneOf.0.checksById","typeLabel":"object"},"indexes":{"type":"object","description":"Pre-computed reference indexes — pure ID lists, no content duplication.\nTenants pick whichever organization fits their UI. Combine via set\nintersection (e.g., critical EU findings = bySeverity.critical ∩\nbyJurisdiction.eu). All seven dimensions always present; empty buckets\nare included so client code can do `indexes.byJurisdiction.us ?? []`\nwithout optional-chaining on the bucket itself.\n","properties":{"byJurisdiction":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.indexes.byJurisdiction.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.indexes.byJurisdiction.additionalProperties","typeLabel":"string[]"},"description":"Keyed by jurisdiction code (us, eu, uk, india, china).","uniqueKey":"oneOf.0.indexes.byJurisdiction","typeLabel":"object"},"byPlatform":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.indexes.byPlatform.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.indexes.byPlatform.additionalProperties","typeLabel":"string[]"},"description":"Keyed by platform code (youtube, instagram, facebook, tiktok, linkedin).","uniqueKey":"oneOf.0.indexes.byPlatform","typeLabel":"object"},"bySeverity":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.indexes.bySeverity.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.indexes.bySeverity.additionalProperties","typeLabel":"string[]"},"description":"Keyed by severity (info, low, medium, high, critical).","uniqueKey":"oneOf.0.indexes.bySeverity","typeLabel":"object"},"byStatus":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.indexes.byStatus.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.indexes.byStatus.additionalProperties","typeLabel":"string[]"},"description":"Keyed by status (pass, flag, block, escalate).","uniqueKey":"oneOf.0.indexes.byStatus","typeLabel":"object"},"byCategory":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.indexes.byCategory.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.indexes.byCategory.additionalProperties","typeLabel":"string[]"},"description":"Keyed by `primaryCategory` only — each check appears in exactly one bucket.","uniqueKey":"oneOf.0.indexes.byCategory","typeLabel":"object"},"byCategoryAll":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.indexes.byCategoryAll.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.indexes.byCategoryAll.additionalProperties","typeLabel":"string[]"},"description":"Keyed by every category in `categories[]` — a check may appear in multiple buckets.","uniqueKey":"oneOf.0.indexes.byCategoryAll","typeLabel":"object"},"byAgent":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.indexes.byAgent.additionalProperties.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.indexes.byAgent.additionalProperties","typeLabel":"string[]"},"description":"Keyed by agentId.","uniqueKey":"oneOf.0.indexes.byAgent","typeLabel":"object"}},"uniqueKey":"oneOf.0.indexes","typeLabel":"object"},"annotations":{"type":"array","items":{"type":"object","required":["type","agentId","severity","message"],"properties":{"type":{"type":"string","enum":["text-span","timeline","image-region","global"],"isRequired":true,"uniqueKey":"oneOf.0.annotations.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"agentId":{"type":"string","enum":["ai-laws","jurisdiction-detection","advertising-law","platform-policy","metadata-labeling","rights-clearance","rights-clearance-text","rights-clearance-image","compliance-score","fs-compliance-financial-promotion","fs-compliance-advisory-suitability","fs-compliance-credit-servicing","fs-compliance-markets-trading","fs-compliance-financial-crime","fs-compliance-ai-governance","financial-services-compliance","pharma-healthcare-compliance"],"description":"Agent identifier. Use `GET /agents` to discover all available agents dynamically.\nThe list is filtered to the industries your workspace has selected.\n\n**Financial services.** The six `fs-compliance-*` agents correspond one-to-one to the\nreview scopes (`financial_promotion` → `fs-compliance-financial-promotion`, and so on).\nIn a full check they are selected with `reviewScopes`. Via `POST /agents/{agentId}`\nonly `fs-compliance-financial-promotion` can be invoked directly today; the other five\nreturn 400 `review_scope_not_enabled` on direct invocation and must run through\n`POST /compliance/check`. `financial-services-compliance` is a read-only alias of\n`fs-compliance-financial-promotion` accepted for older clients.\n\n**Pharma and healthcare.** `pharma-healthcare-compliance` runs for workspaces on the\n`pharma_healthcare` industry and honours `regulatedActor`.\n\n`ai-laws` is the canonical id; `jurisdiction-detection` is accepted as an\ninput alias for backward compatibility with historical clients. New\nintegrations should use `ai-laws`.\n\n**Note on rights-clearance variants.** `GET /agents` exposes two registered agents\nfor rights clearance: `rights-clearance-text` and `rights-clearance-image` — invoke\nthem via `POST /agents/{agentId}` using those qualified IDs. On **check response\nobjects**, however, text rights-clearance findings carry the bare `agentId:\n\"rights-clearance\"`. Treat bare `rights-clearance` and `rights-clearance-text` as\nthe same logical pipeline — the bare form is the value that appears on `checks[]`\nentries from that agent.\n","isRequired":true,"uniqueKey":"oneOf.0.annotations.items.[INDEX].agentId","typeLabel":"enum\u003cstring>"},"severity":{"type":"string","enum":["critical","high","medium","low","info"],"description":"- `critical` — Legal liability risk (-25 points)\n- `high` — Likely violation (-15 points)\n- `medium` — Potential issue (-8 points)\n- `low` — Minor concern (-3 points)\n- `info` — Informational only (0 points)\n","isRequired":true,"uniqueKey":"oneOf.0.annotations.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"message":{"type":"string","example":"'Guaranteed results' may violate FTC endorsement guides","isRequired":true,"uniqueKey":"oneOf.0.annotations.items.[INDEX].message","typeLabel":"string"},"checkRef":{"type":"string","description":"DEPRECATED. Legacy link to `ComplianceCheck.checkName`. Use `checkId`\ninstead — it's a stable hash that survives prompt wording changes.\nRetained for backward compatibility; will be removed in a future\nmajor version.\n","uniqueKey":"oneOf.0.annotations.items.[INDEX].checkRef","typeLabel":"string"},"checkId":{"type":"string","pattern":"^chk_[0-9a-f]{8}$","description":"Stable check identifier. Format: `chk_\u003c8 lowercase hex>`. Generated as a\nSHA-256 hash of (agentId, checkName, citation, sorted jurisdictions,\nsorted platforms, primaryCategory) — stable across reruns of identical\ncontent + scope + engine version. NOT stable across taxonomy\nreclassifications (primaryCategory change) or content/scope changes.\n","example":"chk_a1b2c3d4","uniqueKey":"oneOf.0.annotations.items.[INDEX].checkId","typeLabel":"string"},"suggestion":{"type":"string","description":"Actionable fix","example":"Consider 'may help' instead of 'guaranteed'","uniqueKey":"oneOf.0.annotations.items.[INDEX].suggestion","typeLabel":"string"},"textLocation":{"type":"object","description":"For text-span annotations","properties":{"start":{"type":"integer","description":"Character offset (0-indexed)","example":120,"uniqueKey":"oneOf.0.annotations.items.[INDEX].textLocation.start","typeLabel":"integer"},"end":{"type":"integer","example":138,"uniqueKey":"oneOf.0.annotations.items.[INDEX].textLocation.end","typeLabel":"integer"},"matchedText":{"type":"string","example":"guaranteed results","uniqueKey":"oneOf.0.annotations.items.[INDEX].textLocation.matchedText","typeLabel":"string"}},"uniqueKey":"oneOf.0.annotations.items.[INDEX].textLocation","typeLabel":"object"},"timelineLocation":{"type":"object","description":"For timeline annotations (video)","properties":{"startMs":{"type":"integer","example":15000,"uniqueKey":"oneOf.0.annotations.items.[INDEX].timelineLocation.startMs","typeLabel":"integer"},"endMs":{"type":"integer","example":28000,"uniqueKey":"oneOf.0.annotations.items.[INDEX].timelineLocation.endMs","typeLabel":"integer"},"track":{"type":"string","enum":["audio","video","subtitle"],"uniqueKey":"oneOf.0.annotations.items.[INDEX].timelineLocation.track","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0.annotations.items.[INDEX].timelineLocation","typeLabel":"object"},"imageLocation":{"type":"object","description":"For image-region annotations","properties":{"imageUrl":{"type":"string","format":"uri","uniqueKey":"oneOf.0.annotations.items.[INDEX].imageLocation.imageUrl","typeLabel":"string\u003curi>"},"boundingBox":{"type":"object","properties":{"x":{"type":"number","uniqueKey":"oneOf.0.annotations.items.[INDEX].imageLocation.boundingBox.x","typeLabel":"number"},"y":{"type":"number","uniqueKey":"oneOf.0.annotations.items.[INDEX].imageLocation.boundingBox.y","typeLabel":"number"},"width":{"type":"number","uniqueKey":"oneOf.0.annotations.items.[INDEX].imageLocation.boundingBox.width","typeLabel":"number"},"height":{"type":"number","uniqueKey":"oneOf.0.annotations.items.[INDEX].imageLocation.boundingBox.height","typeLabel":"number"}},"uniqueKey":"oneOf.0.annotations.items.[INDEX].imageLocation.boundingBox","typeLabel":"object"}},"uniqueKey":"oneOf.0.annotations.items.[INDEX].imageLocation","typeLabel":"object"}},"uniqueKey":"oneOf.0.annotations.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.annotations","typeLabel":"object[]"},"profile":{"type":"object","properties":{"detectedJurisdictions":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.profile.detectedJurisdictions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.profile.detectedJurisdictions","typeLabel":"string[]"},"applicableRules":{"type":"array","items":{"type":"object","uniqueKey":"oneOf.0.profile.applicableRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.profile.applicableRules","typeLabel":"object[]"},"targetPlatforms":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.profile.targetPlatforms.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.profile.targetPlatforms","typeLabel":"string[]"},"confidence":{"type":"number","minimum":0,"maximum":1,"uniqueKey":"oneOf.0.profile.confidence","typeLabel":"number"},"reasoning":{"type":"string","uniqueKey":"oneOf.0.profile.reasoning","typeLabel":"string"}},"uniqueKey":"oneOf.0.profile","typeLabel":"object"},"agentSummaries":{"type":"object","additionalProperties":{"type":"object","properties":{"status":{"type":"string","enum":["pass","flag","block","escalate"],"description":"- `pass` — No issue found\n- `flag` — Issue found, review recommended\n- `block` — Critical issue, must fix\n- `escalate` — Needs human review\n","uniqueKey":"oneOf.0.agentSummaries.additionalProperties.status","typeLabel":"enum\u003cstring>"},"checkCount":{"type":"integer","uniqueKey":"oneOf.0.agentSummaries.additionalProperties.checkCount","typeLabel":"integer"},"passCount":{"type":"integer","uniqueKey":"oneOf.0.agentSummaries.additionalProperties.passCount","typeLabel":"integer"},"flagCount":{"type":"integer","uniqueKey":"oneOf.0.agentSummaries.additionalProperties.flagCount","typeLabel":"integer"},"blockCount":{"type":"integer","uniqueKey":"oneOf.0.agentSummaries.additionalProperties.blockCount","typeLabel":"integer"},"summary":{"type":"string","example":"2 advertising claim issues found","uniqueKey":"oneOf.0.agentSummaries.additionalProperties.summary","typeLabel":"string"}},"uniqueKey":"oneOf.0.agentSummaries.additionalProperties","typeLabel":"object"},"uniqueKey":"oneOf.0.agentSummaries","typeLabel":"object"},"versionInfo":{"type":"object","properties":{"engineVersion":{"type":"string","example":"1.3.2","uniqueKey":"oneOf.0.versionInfo.engineVersion","typeLabel":"string"},"rulesVersion":{"type":"string","description":"Timestamp of last rules update. Bumps when the compiled law set changes.","example":"2026-04-01","uniqueKey":"oneOf.0.versionInfo.rulesVersion","typeLabel":"string"},"agentVersions":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.0.versionInfo.agentVersions.additionalProperties","typeLabel":"string"},"description":"Version per compliance agent. Bumps when an agent's logic changes.","example":{"advertising-law":"1.1.0","ai-laws":"1.3.0"},"uniqueKey":"oneOf.0.versionInfo.agentVersions","typeLabel":"object"},"stackVersion":{"type":"string","description":"Opaque identifier for the internal model/prompt stack. Bumps whenever the\nunderlying model pipeline changes. Use it for client-side change detection\n(e.g. invalidate cached results, trigger replays). The format is intentionally\nopaque — treat it as a black-box string and pattern-match only for equality,\nnever parse its structure.\n","example":"2026.04-a7f3","uniqueKey":"oneOf.0.versionInfo.stackVersion","typeLabel":"string"}},"uniqueKey":"oneOf.0.versionInfo","typeLabel":"object"},"costBreakdown":{"type":"object","properties":{"totalCredits":{"type":"number","uniqueKey":"oneOf.0.costBreakdown.totalCredits","typeLabel":"number"},"agents":{"type":"array","items":{"type":"object","properties":{"agent":{"type":"string","example":"jurisdiction","uniqueKey":"oneOf.0.costBreakdown.agents.items.[INDEX].agent","typeLabel":"string"},"stage":{"type":"string","enum":["A","B","C"],"description":"Pipeline stage — the agent's work is decomposed into three sub-steps:\n- **A** — Legal research (retrieves applicable law; cacheable with a 30-day TTL)\n- **B** — Risk interpretation (maps law to content-specific risk)\n- **C** — Compliance composition (writes structured output)\n","uniqueKey":"oneOf.0.costBreakdown.agents.items.[INDEX].stage","typeLabel":"enum\u003cstring>"},"credits":{"type":"number","uniqueKey":"oneOf.0.costBreakdown.agents.items.[INDEX].credits","typeLabel":"number"},"cached":{"type":"boolean","description":"Whether the research cache was used","example":false,"uniqueKey":"oneOf.0.costBreakdown.agents.items.[INDEX].cached","typeLabel":"boolean"}},"uniqueKey":"oneOf.0.costBreakdown.agents.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.costBreakdown.agents","typeLabel":"object[]"}},"uniqueKey":"oneOf.0.costBreakdown","typeLabel":"object"},"creditsCharged":{"type":"number","description":"Credits debited for this request. `0` on a cache hit.","uniqueKey":"oneOf.0.creditsCharged","typeLabel":"number"},"cached":{"type":"boolean","description":"`true` when the result was served from the response cache or an idempotent replay.\n","uniqueKey":"oneOf.0.cached","typeLabel":"boolean"},"coverageIncomplete":{"type":"boolean","description":"`true` when at least one agent could not consult its legal corpus. Always equals\n`coverageGaps.length > 0`.\n","uniqueKey":"oneOf.0.coverageIncomplete","typeLabel":"boolean"},"coverageGaps":{"type":"array","items":{"type":"object","required":["agentId","reason"],"properties":{"agentId":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.coverageGaps.items.[INDEX].agentId","typeLabel":"string"},"reason":{"type":"string","enum":["memory_disabled","lookup_unavailable","no_compatible_card","legacy_unclassified"],"description":"Why the agent could not consult its governed corpus for this check.","isRequired":true,"uniqueKey":"oneOf.0.coverageGaps.items.[INDEX].reason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0.coverageGaps.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.coverageGaps","typeLabel":"object[]"},"analysisDiagnostics":{"type":"array","items":{"type":"object","description":"First-class pipeline diagnostic. Surfaces non-compliance signals like\nrenderer overflow or boundary-validation drops without polluting\nthe compliance findings array.\n","required":["code","message","severity"],"properties":{"code":{"type":"string","description":"Stable machine-readable code (e.g. `evidence_truncated`, `video_check_missing_evidence_ids`).","example":"evidence_truncated","isRequired":true,"uniqueKey":"oneOf.0.analysisDiagnostics.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"oneOf.0.analysisDiagnostics.items.[INDEX].message","typeLabel":"string"},"severity":{"type":"string","enum":["info","warning","error"],"isRequired":true,"uniqueKey":"oneOf.0.analysisDiagnostics.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"evidenceIds":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.analysisDiagnostics.items.[INDEX].evidenceIds.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.analysisDiagnostics.items.[INDEX].evidenceIds","typeLabel":"string[]"}},"uniqueKey":"oneOf.0.analysisDiagnostics.items.[INDEX]","typeLabel":"object"},"description":"Pipeline diagnostics that are not compliance findings.","uniqueKey":"oneOf.0.analysisDiagnostics","typeLabel":"object[]"},"regulatedActors":{"type":"array","items":{"type":"string","enum":["advertiser","manufacturer","platform","provider","payer","pharmacy","HCP","telehealth_provider","adviser","broker_dealer","bank","lender","servicer","debt_collector","fund_manager","payment_service_provider","insurer"],"description":"The regulated party a check is evaluating. Corpus rules tagged with an incompatible\nactor are excluded from asserted citations and cannot drive blocking findings.\n","uniqueKey":"oneOf.0.regulatedActors.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Present when the check was evaluated for specific regulated actors.","uniqueKey":"oneOf.0.regulatedActors","typeLabel":"enum\u003cstring>[]"},"agentsRun":{"type":"array","items":{"type":"object","required":["id","outcome"],"properties":{"id":{"type":"string","enum":["ai-laws","jurisdiction-detection","advertising-law","platform-policy","metadata-labeling","rights-clearance","rights-clearance-text","rights-clearance-image","compliance-score","fs-compliance-financial-promotion","fs-compliance-advisory-suitability","fs-compliance-credit-servicing","fs-compliance-markets-trading","fs-compliance-financial-crime","fs-compliance-ai-governance","financial-services-compliance","pharma-healthcare-compliance"],"description":"Agent identifier. Use `GET /agents` to discover all available agents dynamically.\nThe list is filtered to the industries your workspace has selected.\n\n**Financial services.** The six `fs-compliance-*` agents correspond one-to-one to the\nreview scopes (`financial_promotion` → `fs-compliance-financial-promotion`, and so on).\nIn a full check they are selected with `reviewScopes`. Via `POST /agents/{agentId}`\nonly `fs-compliance-financial-promotion` can be invoked directly today; the other five\nreturn 400 `review_scope_not_enabled` on direct invocation and must run through\n`POST /compliance/check`. `financial-services-compliance` is a read-only alias of\n`fs-compliance-financial-promotion` accepted for older clients.\n\n**Pharma and healthcare.** `pharma-healthcare-compliance` runs for workspaces on the\n`pharma_healthcare` industry and honours `regulatedActor`.\n\n`ai-laws` is the canonical id; `jurisdiction-detection` is accepted as an\ninput alias for backward compatibility with historical clients. New\nintegrations should use `ai-laws`.\n\n**Note on rights-clearance variants.** `GET /agents` exposes two registered agents\nfor rights clearance: `rights-clearance-text` and `rights-clearance-image` — invoke\nthem via `POST /agents/{agentId}` using those qualified IDs. On **check response\nobjects**, however, text rights-clearance findings carry the bare `agentId:\n\"rights-clearance\"`. Treat bare `rights-clearance` and `rights-clearance-text` as\nthe same logical pipeline — the bare form is the value that appears on `checks[]`\nentries from that agent.\n","isRequired":true,"uniqueKey":"oneOf.0.agentsRun.items.[INDEX].id","typeLabel":"enum\u003cstring>"},"outcome":{"type":"string","enum":["completed","completed_no_findings","not_applicable","failed_required","failed_optional","insufficient_evidence"],"description":"How a specialist agent finished. `completed` and `completed_no_findings` are charged;\nthe other four release the agent's reservation.\n","isRequired":true,"uniqueKey":"oneOf.0.agentsRun.items.[INDEX].outcome","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","enum":["timeout","agent_error","invalid_model_output","legal_context_unavailable","legal_context_overflow","fs_agent_not_available"],"description":"Present when `outcome` is a failure. `legal_context_unavailable` means the scope's corpus is not yet served.","uniqueKey":"oneOf.0.agentsRun.items.[INDEX].reason","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0.agentsRun.items.[INDEX]","typeLabel":"object"},"description":"One record per financial-services specialist selected for this check, with how it\nfinished. Absent on checks that ran no specialist and on cached results produced\nbefore this field existed.\n","uniqueKey":"oneOf.0.agentsRun","typeLabel":"object[]"},"decisionReasons":{"type":"array","items":{"type":"string","enum":["blocking_check","required_review_incomplete","legal_context_overflow","flagged_check"],"description":"Why the decision is what it is. `blocking_check`: a blocking finding forced BLOCK.\n`required_review_incomplete`: a required specialist did not complete, so the check is\nHOLD. `legal_context_overflow`: the applicable rule set exceeded what one run can\nevaluate. `flagged_check`: a flagged finding produced HOLD.\n","uniqueKey":"oneOf.0.decisionReasons.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Every rule that contributed to `decision`, in evaluation order. Present on checks\nthat ran a financial-services specialist.\n","uniqueKey":"oneOf.0.decisionReasons","typeLabel":"enum\u003cstring>[]"},"_meta":{"type":"object","description":"Present only for test mode (zt_test_ keys)","properties":{"mode":{"type":"string","enum":["test"],"uniqueKey":"oneOf.0._meta.mode","typeLabel":"enum\u003cstring>"},"sandbox":{"type":"boolean","uniqueKey":"oneOf.0._meta.sandbox","typeLabel":"boolean"},"creditsCharged":{"type":"number","uniqueKey":"oneOf.0._meta.creditsCharged","typeLabel":"number"},"estimatedProductionCost":{"type":"number","uniqueKey":"oneOf.0._meta.estimatedProductionCost","typeLabel":"number"},"scenarioId":{"type":"string","example":"claim-violation","uniqueKey":"oneOf.0._meta.scenarioId","typeLabel":"string"}},"uniqueKey":"oneOf.0._meta","typeLabel":"object"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","properties":{"jobId":{"type":"string","example":"job_xyz789","uniqueKey":"oneOf.1.jobId","typeLabel":"string"},"status":{"type":"string","enum":["queued","pending"],"uniqueKey":"oneOf.1.status","typeLabel":"enum\u003cstring>"},"estimatedCredits":{"type":"number","uniqueKey":"oneOf.1.estimatedCredits","typeLabel":"number"},"queuePosition":{"type":"integer","example":1,"uniqueKey":"oneOf.1.queuePosition","typeLabel":"integer"},"pollUrl":{"type":"string","example":"/v1/compliance/jobs/job_xyz789","uniqueKey":"oneOf.1.pollUrl","typeLabel":"string"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"requestId":"\u003cstring>","reportId":"rpt_abc123","score":72,"decision":"PUBLISH","checks":[{"id":"chk_a1b2c3d4","agentId":"ai-laws","checkName":"Unsubstantiated Health Claim - 'Cure Cancer'","status":"pass","severity":"critical","message":"'Guaranteed to cure cancer' is an unsubstantiated health claim under FTC and EU UCPD.","recommendation":"Remove the guarantee or substantiate with peer-reviewed clinical evidence.","citation":"FTC Endorsement Guides, 16 CFR Part 255","metadata":"\u003cstring>","jurisdictions":["us","eu"],"platforms":["youtube","instagram"],"scope":"global","primaryCategory":"celebrity-endorsement","categories":["unsubstantiated-health-claim","performance-claim"]}],"checksById":{},"indexes":{"byJurisdiction":{},"byPlatform":{},"bySeverity":{},"byStatus":{},"byCategory":{},"byCategoryAll":{},"byAgent":{}},"annotations":[{"type":"text-span","agentId":"ai-laws","severity":"critical","message":"'Guaranteed results' may violate FTC endorsement guides","checkRef":"\u003cstring>","checkId":"chk_a1b2c3d4","suggestion":"Consider 'may help' instead of 'guaranteed'","textLocation":{"start":120,"end":138,"matchedText":"guaranteed results"},"timelineLocation":{"startMs":15000,"endMs":28000,"track":"audio"},"imageLocation":{"imageUrl":"\u003cstring>","boundingBox":{"x":123,"y":123,"width":123,"height":123}}}],"profile":{"detectedJurisdictions":["\u003cstring>"],"applicableRules":[{}],"targetPlatforms":["\u003cstring>"],"confidence":0.5,"reasoning":"\u003cstring>"},"agentSummaries":{},"versionInfo":{"engineVersion":"1.3.2","rulesVersion":"2026-04-01","agentVersions":{"advertising-law":"1.1.0","ai-laws":"1.3.0"},"stackVersion":"2026.04-a7f3"},"costBreakdown":{"totalCredits":123,"agents":[{"agent":"jurisdiction","stage":"A","credits":123,"cached":false}]},"creditsCharged":123,"cached":true,"coverageIncomplete":true,"coverageGaps":[{"agentId":"\u003cstring>","reason":"memory_disabled"}],"analysisDiagnostics":[{"code":"evidence_truncated","message":"\u003cstring>","severity":"info","evidenceIds":["\u003cstring>"]}],"regulatedActors":["advertiser"],"agentsRun":[{"id":"ai-laws","outcome":"completed","reason":"timeout"}],"decisionReasons":["blocking_check"],"_meta":{"mode":"test","sandbox":true,"creditsCharged":123,"estimatedProductionCost":123,"scenarioId":"claim-violation"}}}},"exampleType":"generated"},"text/event-stream":{"schema":{"type":"string","description":"SSE stream with agent.started, agent.completed, score, and complete events","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"\u003cstring>"}},"exampleType":"generated"}},"exampleType":"generated"},"88a0be1d-3aee-43b4-94d4-bd7760073650":{"description":"The request was refused before any credits were reserved. `data.code` is one of:\n`review_scope_not_enabled` (unknown scope, scope requires the financial_services\nindustry, or scope not enabled on the workspace), `review_scope_jurisdiction_unsupported`\n(a selected scope has no corpus coverage for a requested jurisdiction),\n`regulated_actor_not_enabled`, `mode_missing_or_invalid` (company workspaces must send\n`mode`), `company_webhook_url_forbidden`, `document_and_text_conflict`,\n`document_count_exceeded`, `document_malformed`, `invalid_content_length`. Plain\nvalidation failures carry no code; read `message`.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope. `data.code` is the stable discriminator to branch on;\n`statusMessage` is the human-readable reason. Unless a response documents extra\nnamed fields, `data` is reduced to `{ code }` before it is sent.\n","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","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","uniqueKey":"statusMessage","typeLabel":"string"},"data":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"review_scope_not_enabled","isRequired":true,"uniqueKey":"data.code","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":123,"message":"\u003cstring>","error":true,"url":"\u003cstring>","statusMessage":"\u003cstring>","data":{"code":"review_scope_not_enabled"}}}},"exampleType":"generated"}},"exampleType":"generated"},"1a332f40-bdf1-449c-8375-92c61126416b":{"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"},"69aaf7d6-c330-4264-b149-1614feaec226":{"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"},"7db94dfa-7e8c-4749-bd3b-157af44ef90c":{"description":"Either the tenant scope denial described under `TenantScopeDenied`, or\n`data.code: review_scope_not_entitled` (a selected review scope is not included in the\nplan), or `data.code: company_async_not_enabled`.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope. `data.code` is the stable discriminator to branch on;\n`statusMessage` is the human-readable reason. Unless a response documents extra\nnamed fields, `data` is reduced to `{ code }` before it is sent.\n","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","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","uniqueKey":"statusMessage","typeLabel":"string"},"data":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"review_scope_not_enabled","isRequired":true,"uniqueKey":"data.code","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":123,"message":"\u003cstring>","error":true,"url":"\u003cstring>","statusMessage":"\u003cstring>","data":{"code":"review_scope_not_enabled"}}}},"exampleType":"generated"}},"exampleType":"generated"},"9308afb6-6126-4378-b868-05c54a956e42":{"description":"The upload exceeds a limit. `data.code` is one of `document_too_large`,\n`document_too_many_pages`, `document_too_much_text`, `text_exceeds_tier_limit`,\n`payload_too_large` (provenance; also carries `limitBytes`), `video_upload_too_large`.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope. `data.code` is the stable discriminator to branch on;\n`statusMessage` is the human-readable reason. Unless a response documents extra\nnamed fields, `data` is reduced to `{ code }` before it is sent.\n","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","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","uniqueKey":"statusMessage","typeLabel":"string"},"data":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"review_scope_not_enabled","isRequired":true,"uniqueKey":"data.code","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":123,"message":"\u003cstring>","error":true,"url":"\u003cstring>","statusMessage":"\u003cstring>","data":{"code":"review_scope_not_enabled"}}}},"exampleType":"generated"}},"exampleType":"generated"},"8d4a9908-ee49-42ed-8b75-ff89134359b5":{"description":"The file type is not accepted. `data.code` is one of `document_format_unsupported`\n(legacy `.doc`, unknown signature, or a filename that does not match the bytes),\n`document_encrypted`, `unknown_content_type`, `video_signing_unavailable`,\n`unsupported_container`.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope. `data.code` is the stable discriminator to branch on;\n`statusMessage` is the human-readable reason. Unless a response documents extra\nnamed fields, `data` is reduced to `{ code }` before it is sent.\n","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","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","uniqueKey":"statusMessage","typeLabel":"string"},"data":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"review_scope_not_enabled","isRequired":true,"uniqueKey":"data.code","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":123,"message":"\u003cstring>","error":true,"url":"\u003cstring>","statusMessage":"\u003cstring>","data":{"code":"review_scope_not_enabled"}}}},"exampleType":"generated"}},"exampleType":"generated"},"7ea696c7-6163-491b-8146-6733d3176f0f":{"description":"The document was accepted but could not be used. `data.code` is one of\n`document_no_extractable_text` (for example a scanned PDF) or\n`document_extraction_timeout`.\n","content":{"application/json":{"schema":{"type":"object","description":"Standard error envelope. `data.code` is the stable discriminator to branch on;\n`statusMessage` is the human-readable reason. Unless a response documents extra\nnamed fields, `data` is reduced to `{ code }` before it is sent.\n","required":["statusCode","message"],"properties":{"statusCode":{"type":"integer","isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","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","uniqueKey":"statusMessage","typeLabel":"string"},"data":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"review_scope_not_enabled","isRequired":true,"uniqueKey":"data.code","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":123,"message":"\u003cstring>","error":true,"url":"\u003cstring>","statusMessage":"\u003cstring>","data":{"code":"review_scope_not_enabled"}}}},"exampleType":"generated"}},"exampleType":"generated"},"34f8ac09-0df8-4df3-a06f-1b005104cffd":{"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":"Run compliance check - ZebraTruth — Runtime Compliance for AI Agents","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-26T01:29:05.776Z","originalFileLocation":"api-reference/compliance/run-compliance-check.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=\"Check content against jurisdiction laws, platform policies, and rights clearance. Supports three response modes: sync (block until complete), stream (SSE events per agent), and async (webhook callback on completion). Request formats. Accepts either application/json (the canonical format, full feature set including streaming and webhooks) or multipart/form-data (for uploading image binaries directly from a local file system). The multipart form is sync-only and bypasses the response cache (cache is keyed on text, so mixing image sets would return wrong results). Latency. Sync checks typically complete in 15–120 seconds depending on mode, number of jurisdictions/platforms, and content length. Cached hits return in ≤1s. Set client timeouts to at least 2.5 minutes (150s). For long-running or batched workflows, prefer responseMode: \u0026quot;async\u0026quot; with a webhook to avoid long-held connections. Tenant scoping. Every request is scoped to your account\u0026#x27;s subscribed jurisdictions and platforms (set during onboarding at https://developers.zebratruth.ai). Requesting a jurisdiction or platform outside that set returns 403. See the Tenant Onboarding and Scoping guide. Financial services. Workspaces on the financial_services industry select the specialist review scopes a check should run with reviewScopes, describe the artifact with contentKind, and may narrow the regulated actors with regulatedActors. Admission is checked in this order, all before any credits are reserved: unknown or disabled scope (400 review_scope_not_enabled), scope without corpus coverage for a requested jurisdiction (400 review_scope_jurisdiction_unsupported), actor not enabled on the workspace (400 regulated_actor_not_enabled), scope not in the plan (403 review_scope_not_entitled). Successful responses then carry agentsRun and decisionReasons. At most 6 specialist agents run per request. Documents. The multipart form accepts a single document part (PDF or Word .docx) in place of text. The document is extracted server-side and checked as text. To inspect the extracted text first, call POST /compliance/documents/extract.\">\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=\"Run compliance check - ZebraTruth — Runtime Compliance for AI Agents\">\u003cmeta data-mint-head property=\"og:description\" content=\"Check content against jurisdiction laws, platform policies, and rights clearance. Supports three response modes: sync (block until complete), stream (SSE events per agent), and async (webhook callback on completion). Request formats. Accepts either application/json (the canonical format, full feature set including streaming and webhooks) or multipart/form-data (for uploading image binaries directly from a local file system). The multipart form is sync-only and bypasses the response cache (cache is keyed on text, so mixing image sets would return wrong results). Latency. Sync checks typically complete in 15–120 seconds depending on mode, number of jurisdictions/platforms, and content length. Cached hits return in ≤1s. Set client timeouts to at least 2.5 minutes (150s). For long-running or batched workflows, prefer responseMode: \u0026quot;async\u0026quot; with a webhook to avoid long-held connections. Tenant scoping. Every request is scoped to your account\u0026#x27;s subscribed jurisdictions and platforms (set during onboarding at https://developers.zebratruth.ai). Requesting a jurisdiction or platform outside that set returns 403. See the Tenant Onboarding and Scoping guide. Financial services. Workspaces on the financial_services industry select the specialist review scopes a check should run with reviewScopes, describe the artifact with contentKind, and may narrow the regulated actors with regulatedActors. Admission is checked in this order, all before any credits are reserved: unknown or disabled scope (400 review_scope_not_enabled), scope without corpus coverage for a requested jurisdiction (400 review_scope_jurisdiction_unsupported), actor not enabled on the workspace (400 regulated_actor_not_enabled), scope not in the plan (403 review_scope_not_entitled). Successful responses then carry agentsRun and decisionReasons. At most 6 specialist agents run per request. Documents. The multipart form accepts a single document part (PDF or Word .docx) in place of text. The document is extracted server-side and checked as text. To inspect the extracted text first, call POST /compliance/documents/extract.\">\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/compliance/run-compliance-check\">\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=Compliance+Checks\u0026amp;title=Run+compliance+check\u0026amp;description=Check+content+against+jurisdiction+laws%2C+platform+policies%2C+and+rights+clearance.%0ASupports+three+response+modes%3A+sync+%28block+until+complete%29%2C+stream+%28SSE+events\u0026amp;theme=a5a701a9b75e19dc4c00f206\u0026amp;signature=060a7f004bc950ba63495f6867f9fbd52370824f724c13085b6605b1a497e2c0\">\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=\"Run compliance check - ZebraTruth — Runtime Compliance for AI Agents\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Check content against jurisdiction laws, platform policies, and rights clearance. Supports three response modes: sync (block until complete), stream (SSE events per agent), and async (webhook callback on completion). Request formats. Accepts either application/json (the canonical format, full feature set including streaming and webhooks) or multipart/form-data (for uploading image binaries directly from a local file system). The multipart form is sync-only and bypasses the response cache (cache is keyed on text, so mixing image sets would return wrong results). Latency. Sync checks typically complete in 15–120 seconds depending on mode, number of jurisdictions/platforms, and content length. Cached hits return in ≤1s. Set client timeouts to at least 2.5 minutes (150s). For long-running or batched workflows, prefer responseMode: \u0026quot;async\u0026quot; with a webhook to avoid long-held connections. Tenant scoping. Every request is scoped to your account\u0026#x27;s subscribed jurisdictions and platforms (set during onboarding at https://developers.zebratruth.ai). Requesting a jurisdiction or platform outside that set returns 403. See the Tenant Onboarding and Scoping guide. Financial services. Workspaces on the financial_services industry select the specialist review scopes a check should run with reviewScopes, describe the artifact with contentKind, and may narrow the regulated actors with regulatedActors. Admission is checked in this order, all before any credits are reserved: unknown or disabled scope (400 review_scope_not_enabled), scope without corpus coverage for a requested jurisdiction (400 review_scope_jurisdiction_unsupported), actor not enabled on the workspace (400 regulated_actor_not_enabled), scope not in the plan (403 review_scope_not_entitled). Successful responses then carry agentsRun and decisionReasons. At most 6 specialist agents run per request. Documents. The multipart form accepts a single document part (PDF or Word .docx) in place of text. The document is extracted server-side and checked as text. To inspect the extracted text first, call POST /compliance/documents/extract.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://zebratruthai.mintlify.app/_mintlify/api/og/v2?division=Compliance+Checks\u0026amp;title=Run+compliance+check\u0026amp;description=Check+content+against+jurisdiction+laws%2C+platform+policies%2C+and+rights+clearance.%0ASupports+three+response+modes%3A+sync+%28block+until+complete%29%2C+stream+%28SSE+events\u0026amp;theme=a5a701a9b75e19dc4c00f206\u0026amp;signature=060a7f004bc950ba63495f6867f9fbd52370824f724c13085b6605b1a497e2c0\">\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/compliance/run-compliance-check\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/compliance/run-compliance-check.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/compliance/run-compliance-check#webpage\",\"url\":\"https://docs.zebratruth.ai/api-reference/compliance/run-compliance-check\",\"name\":\"Run compliance check\",\"description\":\"Check content against jurisdiction laws, platform policies, and rights clearance. Supports three response modes: sync (block until complete), stream (SSE events per agent), and async (webhook callback on completion). Request formats. Accepts either application/json (the canonical format, full feature set including streaming and webhooks) or multipart/form-data (for uploading image binaries directly from a local file system). The multipart form is sync-only and bypasses the response cache (cache is keyed on text, so mixing image sets would return wrong results). Latency. Sync checks typically complete in 15–120 seconds depending on mode, number of jurisdictions/platforms, and content length. Cached hits return in ≤1s. Set client timeouts to at least 2.5 minutes (150s). For long-running or batched workflows, prefer responseMode: \\\"async\\\" with a webhook to avoid long-held connections. Tenant scoping. Every request is scoped to your account's subscribed jurisdictions and platforms (set during onboarding at https://developers.zebratruth.ai). Requesting a jurisdiction or platform outside that set returns 403. See the Tenant Onboarding and Scoping guide. Financial services. Workspaces on the financial_services industry select the specialist review scopes a check should run with reviewScopes, describe the artifact with contentKind, and may narrow the regulated actors with regulatedActors. Admission is checked in this order, all before any credits are reserved: unknown or disabled scope (400 review_scope_not_enabled), scope without corpus coverage for a requested jurisdiction (400 review_scope_jurisdiction_unsupported), actor not enabled on the workspace (400 regulated_actor_not_enabled), scope not in the plan (403 review_scope_not_entitled). Successful responses then carry agentsRun and decisionReasons. At most 6 specialist agents run per request. Documents. The multipart form accepts a single document part (PDF or Word .docx) in place of text. The document is extracted server-side and checked as text. To inspect the extracted text first, call POST /compliance/documents/extract.\",\"dateModified\":\"2026-09-26T01:29:05.776Z\",\"isPartOf\":{\"@id\":\"https://docs.zebratruth.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.zebratruth.ai/api-reference/compliance/run-compliance-check#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.zebratruth.ai/api-reference/compliance/run-compliance-check#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"ZebraTruth — Runtime Compliance for AI Agents\",\"item\":\"https://docs.zebratruth.ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Run compliance check\",\"item\":\"https://docs.zebratruth.ai/api-reference/compliance/run-compliance-check\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.zebratruth.ai/api-reference/compliance/run-compliance-check#apireference\",\"headline\":\"Run compliance check\",\"name\":\"Run compliance check\",\"description\":\"Check content against jurisdiction laws, platform policies, and rights clearance. Supports three response modes: sync (block until complete), stream (SSE events per agent), and async (webhook callback on completion). Request formats. Accepts either application/json (the canonical format, full feature set including streaming and webhooks) or multipart/form-data (for uploading image binaries directly from a local file system). The multipart form is sync-only and bypasses the response cache (cache is keyed on text, so mixing image sets would return wrong results). Latency. Sync checks typically complete in 15–120 seconds depending on mode, number of jurisdictions/platforms, and content length. Cached hits return in ≤1s. Set client timeouts to at least 2.5 minutes (150s). For long-running or batched workflows, prefer responseMode: \\\"async\\\" with a webhook to avoid long-held connections. Tenant scoping. Every request is scoped to your account's subscribed jurisdictions and platforms (set during onboarding at https://developers.zebratruth.ai). Requesting a jurisdiction or platform outside that set returns 403. See the Tenant Onboarding and Scoping guide. Financial services. Workspaces on the financial_services industry select the specialist review scopes a check should run with reviewScopes, describe the artifact with contentKind, and may narrow the regulated actors with regulatedActors. Admission is checked in this order, all before any credits are reserved: unknown or disabled scope (400 review_scope_not_enabled), scope without corpus coverage for a requested jurisdiction (400 review_scope_jurisdiction_unsupported), actor not enabled on the workspace (400 regulated_actor_not_enabled), scope not in the plan (403 review_scope_not_entitled). Successful responses then carry agentsRun and decisionReasons. At most 6 specialist agents run per request. Documents. The multipart form accepts a single document part (PDF or Word .docx) in place of text. The document is extracted server-side and checked as text. To inspect the extracted text first, call POST /compliance/documents/extract.\",\"url\":\"https://docs.zebratruth.ai/api-reference/compliance/run-compliance-check\",\"mainEntityOfPage\":{\"@id\":\"https://docs.zebratruth.ai/api-reference/compliance/run-compliance-check#webpage\"},\"dateModified\":\"2026-09-26T01:29:05.776Z\",\"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","description":"Complete endpoint reference for the ZebraTruth Compliance API","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","description":"Dedicated image rights clearance. Checks for:\n\n- **Restricted-category content** — six advertising-restricted categories: alcohol \u0026 spirits, weapons \u0026 firearms, tobacco \u0026 smoking, gambling, pharmaceuticals, financial products (incl. crypto / forex / investments). See the [Restricted Categories guide](/guides/restricted-categories) for the full catalog.\n- **Content safety (ZebraSafety)** — adult / violence / racy / medical likelihood signals. Tiered: `(high confidence)` → `status: \"block\"`; `(medium confidence)` → `status: \"flag\"`.\n- **Brand logo \u0026 stock-agency watermark detection** — trademarks and unlicensed-stock indicators.\n- **C2PA / IPTC metadata** — Content Credentials, provenance, AI generation markers.\n- **Known-person likeness** — right-of-publicity flag. *Surfaces only when the celebrity-detection provider is enabled in the deployment; not active in the default ZebraTruth-managed configuration today.*\n\nUse this for image-only checks. For combined text + image checks, use `/compliance/check` with `content.imageUrls`.\n\n**Request formats.** Accepts either `application/json` (`imageUrls` referencing publicly\naccessible URLs) or `multipart/form-data` (upload up to 2 image binaries directly — use\nwhen you don't have a public URL handy). Total request body is capped at 4.5 MB.\n\n**Per-jurisdiction citations.** Citations on returned checks are composed from the laws\napplicable to the jurisdictions you requested AND the platform policies for the platforms\nyou requested. A restricted-category detection with `jurisdictions: [\"us\"]` cites the\nfederal regulator (e.g. FTC, FDA, SEC); the same detection with `jurisdictions: [\"eu\", \"uk\"]`\ncites European directives and UK codes. Adding `platforms: [\"facebook\", \"tiktok\"]` appends\nthe corresponding platform-policy references.\n\n**Check statuses.** Stock watermarks and high-severity restricted categories return\n`status: \"block\"`; brand logos, medium-severity restricted categories, and medium-confidence\ncontent-safety signals return `status: \"flag\"` (review). See the [Image Rights Clearance\nguide](/guides/image-rights-clearance) for the full matrix.\n\n**Tenant scoping.** Every request is scoped to your account's subscribed jurisdictions\nand platforms. Requesting a jurisdiction or platform outside that set returns 403. See\nthe [Tenant Onboarding and Scoping guide](/guides/tenant-onboarding-and-scoping).\n","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","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","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":"Run compliance check - 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"]}