{"openapi":"3.1.0","info":{"title":"Stipple API","summary":"Evidence-backed verification for the documents you receive.","description":"Stipple is the document infrastructure layer: evidence-backed checks on the documents you receive.\n\nEvery endpoint reports **coverage, not a verdict** — an explainable signal a human acts on, never an\nautomated decision. Most tools accept a document as a multipart `file`, JSON `bytes_b64`, or a public\n`url`; long-running calls support `?stream=1` (Server-Sent Events). No API key is required to start (a per-IP free tier); add a key with `POST /v1/keys` to raise your daily limit.\n\n- **Sandbox** — add `sandbox: true` (or the header `Stp-Sandbox: true`) to any tool to get a\n  deterministic, clearly-labelled fixture response, free and without touching your daily quota.\n- **Idempotency** — send an `Idempotency-Key` header on a POST so a retry never processes twice.\n- **Rate limits** — every response carries `RateLimit-Limit`, `RateLimit-Remaining`, and `RateLimit-Reset`.\n","contact":{"name":"Stipple","url":"https://www.stipple.sh/contact"},"license":{"name":"Security & terms","url":"https://www.stipple.sh/security"},"version":"0.4.0"},"servers":[{"url":"https://www.stipple.sh","description":"Production"}],"paths":{"/livez":{"get":{"summary":"Healthz","operationId":"healthz_livez_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthz Livez Get"}}}}}}},"/health":{"get":{"summary":"Healthz","operationId":"healthz_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthz Health Get"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthz Healthz Get"}}}}}}},"/agents.md":{"get":{"summary":"Agents Md","description":"Public agent guide — the distribution channel for the long tail of agent builders.","operationId":"agents_md_agents_md_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Llms","operationId":"llms_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/agent-card.json":{"get":{"summary":"Agent Card Route","description":"Machine-readable discovery card, served at the conventional agent-card paths that agent\ndirectories probe (several were 404ing on these). Describes the real MCP + REST surface.","operationId":"agent_card_route_v1_agent_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/agent.json":{"get":{"summary":"Agent Card Route","description":"Machine-readable discovery card, served at the conventional agent-card paths that agent\ndirectories probe (several were 404ing on these). Describes the real MCP + REST surface.","operationId":"agent_card_route_v1_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/agent-card.json":{"get":{"summary":"Agent Card Route","description":"Machine-readable discovery card, served at the conventional agent-card paths that agent\ndirectories probe (several were 404ing on these). Describes the real MCP + REST surface.","operationId":"agent_card_route__well_known_agent_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/agent.json":{"get":{"summary":"Agent Card Route","description":"Machine-readable discovery card, served at the conventional agent-card paths that agent\ndirectories probe (several were 404ing on these). Describes the real MCP + REST surface.","operationId":"agent_card_route__well_known_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/warrants":{"post":{"tags":["Documents"],"summary":"Create Warrant","description":"Inspect one document. Intake: multipart ``file``, or a JSON body with\n``bytes_b64`` (+ optional ``filename``). Returns the WarrantBundle as JSON, or — with\n``?stream=1`` — a lifecycle SSE stream (``received`` → ``inspecting`` → ``result``).\n\nIdentical documents (same sha256) reuse the stored bundle to skip the paid VLM call;\npass ``?fresh=1`` to force a re-inspection.","operationId":"create_warrant_v1_warrants_post","parameters":[{"name":"stream","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Stream"}},{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Fresh"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_warrant_v1_warrants_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/warrants/{warrant_id}/feedback":{"post":{"summary":"Submit Feedback","description":"Record a thumbs up/down on a prior warrant. The precision-flywheel label source.","operationId":"submit_feedback_v1_warrants__warrant_id__feedback_post","parameters":[{"name":"warrant_id","in":"path","required":true,"schema":{"type":"string","title":"Warrant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Feedback V1 Warrants  Warrant Id  Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback":{"post":{"tags":["Meta"],"summary":"Submit Tool Feedback","description":"Thumbs up/down for the stateless analysis tools (`detect_ai_text`, `verify_references`),\nwhich mint no warrant id. Records a short, non-sensitive label — the document is never stored.\nBest-effort: a write failure never fails the response.","operationId":"submit_tool_feedback_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolFeedbackBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Submit Tool Feedback V1 Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/contact":{"post":{"tags":["Meta"],"summary":"Submit Contact","description":"Receive a contact-form message. No third-party email provider (by design): the message is\nwritten as ONE structured stdout line (jsonPayload.event=\"contact_message\") that Cloud Run\nlands in Cloud Logging — query/alert on it like the other app events. Bot submissions (honeypot\nor impossibly-fast) are silently dropped before the sink, on top of the rate limit.","operationId":"submit_contact_v1_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Submit Contact V1 Contact Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/warrants/check":{"get":{"tags":["Meta"],"summary":"Check Warrant","description":"Cache check: has this exact document (by sha256) already been inspected? Lets an\nagent skip a redundant (paid) inspection. Declared BEFORE the ``{warrant_id}`` route so\nthe literal path wins. Returns ``{cached, warrant_id, permalink}`` or ``{cached: false}``.","operationId":"check_warrant_v1_warrants_check_get","parameters":[{"name":"sha256","in":"query","required":true,"schema":{"type":"string","title":"Sha256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Warrant V1 Warrants Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/warrants/{warrant_id}":{"get":{"tags":["Documents"],"summary":"Get Warrant","description":"Retrieve a stored warrant by id — the permalink/share + agent fetch surface.\n``?format=json`` (default) returns the bundle; ``?format=md`` a Markdown report.","operationId":"get_warrant_v1_warrants__warrant_id__get","parameters":[{"name":"warrant_id","in":"path","required":true,"schema":{"type":"string","title":"Warrant Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Warrant V1 Warrants  Warrant Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/warrants/{warrant_id}/report.pdf":{"get":{"tags":["Documents"],"summary":"Get Warrant Report","description":"A branded, audit-ready PDF of the warrant — fetchable by a human or an agent.","operationId":"get_warrant_report_v1_warrants__warrant_id__report_pdf_get","parameters":[{"name":"warrant_id","in":"path","required":true,"schema":{"type":"string","title":"Warrant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/detect-ai-text":{"post":{"tags":["Generated content"],"summary":"Detect Ai Text Route","description":"Estimate the probability a document's PROSE was AI-written — the engine behind the\n`/ai-detector` page, mirroring the `/mcp-aitext` tool. Send multipart `file` (PDF/text), or\nJSON `{\"text\": \"...\"}` / `{\"bytes_b64\": \"...\", \"filename\": \"...\"}` / `{\"url\": \"https://...\"}`\n(public hosts only, SSRF-guarded, size-capped). Returns\n`{applicable, probability, lean, tells, reasoning, limitations}` — it ABSTAINS on non-prose\n(forms/tables/scans) with `applicable: false`. The probability is the model's CONFIDENCE,\nnot a calibrated truth.","operationId":"detect_ai_text_route_v1_detect_ai_text_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_detect_ai_text_route_v1_detect_ai_text_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Detect Ai Text Route V1 Detect Ai Text Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/classify":{"post":{"tags":["Documents"],"summary":"Classify Document Route","description":"Classify a FINANCIAL document's type — the engine behind the `/classify` page,\nmirroring the `/mcp-classify` tool. We specialise in financial-services documents:\npayslip, tax_invoice, bank_statement, salary_certificate, payg_summary, receipt —\nanything else returns 'other', and below-threshold verdicts abstain as 'unknown'.\nSend multipart `file` (PDF/image), or JSON `{\"bytes_b64\": ..., \"filename\": ...}` /\n`{\"url\": \"https://...\"}` (public hosts only, SSRF-guarded). Stateless — the document\nis never stored. Type classification only, NOT an authenticity judgment.","operationId":"classify_document_route_v1_classify_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_classify_document_route_v1_classify_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Classify Document Route V1 Classify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/extract":{"post":{"tags":["Documents"],"summary":"Extract Fields Route","description":"Extract structured FIELDS from any document — the engine behind the `/extract` page,\nmirroring the `extract_fields` MCP tool. A vision model reads up to a few pages and returns\nthe values you ask for. Four ways to say WHAT to pull: `fields` (an ad-hoc list — names, or\n{name,type,description}; type = text|amount|date|boolean), `template` (a named preset:\npayslip, tax_invoice, bank_statement, receipt), NEITHER (auto — classify the document then\napply that type's fields), or auto on an unknown type (schema-free — every labelled field).\nSend multipart `file` with optional `?template=`/`?country=`/`?max_pages=`/repeated\n`?fields=`, or JSON `{bytes_b64|url, filename, fields, template, country, max_pages}` (URLs\nSSRF-guarded). Returns `{mode, document_type, fields{name:{value,confidence,page}}, not_found,\npages_read, page_limit, ...}`. EXTRACTION, not verification — values are what the document\nshows, not proof it is genuine; the document is never stored.","operationId":"extract_fields_route_v1_extract_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_fields_route_v1_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Extract Fields Route V1 Extract Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/redact":{"post":{"tags":["Documents"],"summary":"Redact Pii Route","description":"Detect and MASK personal data in a document — the engine behind the `/redact` page,\nmirroring the `redact_pii` MCP tool. Two layers: a deterministic regex+checksum pass for\nstructured identifiers (emails, payment cards via Luhn, US SSN, India PAN, AU ABN) and a vision\nmodel pass for the unstructured PII regex can't catch (names, addresses, dates of birth, phone\nnumbers, photo/signature presence). Returns a typed inventory whose values are MASKED (never\nreturned in full) plus a redacted copy of the text. Send multipart `file` with optional\n`?max_pages=`, or JSON `{bytes_b64|url, filename, max_pages}` (SSRF-guarded). DETECTION\ncoverage, not a guarantee — it may miss or over-flag; the document is never stored.","operationId":"redact_pii_route_v1_redact_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_redact_pii_route_v1_redact_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Redact Pii Route V1 Redact Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/adverse-media":{"post":{"tags":["Screening"],"summary":"Adverse Media Route","description":"Screen a subject for ADVERSE MEDIA and SANCTIONS/PEP exposure — the engine behind the\n`/adverse-media` page, mirroring the `screen_adverse_media` MCP tool. Two layers: a\ndeterministic, corroboration-gated match against consolidated global sanctions & PEP data, and\nan entity-disambiguated pass over public news/web sources classifying adverse coverage. Identify\nthe subject by JSON `{\"name\", \"dob\", \"country\", \"aliases\", \"employer\", \"role\"}`, or pass an\nidentity document (multipart `file`, or JSON `bytes_b64`/`url`) to read the subject from it\n(disambiguators may be added as query params or JSON alongside). Returns `{subject, sanctions,\nadverse_media, risk_flag, headline, limitations}`. Screening COVERAGE, not a determination — a\nhit means \"review\", not \"guilty\", and \"nothing found\" is not a clean record. Stateless.","operationId":"adverse_media_route_v1_adverse_media_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_adverse_media_route_v1_adverse_media_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Adverse Media Route V1 Adverse Media Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/identity-check":{"post":{"tags":["Identity"],"summary":"Identity Check Route","description":"Run an Australian identity check over a SET of documents — the engine behind the\n`/identity` page, mirroring the `verify_identity` MCP tool. A vision model reads each\ndocument (type + which N/P/A/S fields it shows + issue date); a deterministic engine then\ntallies them against a scheme: `afp_100_point` (points, default) or `austrac_safe_harbour`\n(category combinations). Send multipart `files` (one or more PDFs/images) with an optional\n`?scheme=`, or JSON `{\"documents\": [{\"url\": ...} | {\"bytes_b64\": ..., \"filename\": ...}],\n\"scheme\": ...}` (URLs are SSRF-guarded). Stateless — documents are never stored. Returns\n`{established, points/target or satisfied_path, documents[], reason, ...}`. This is identity\nCOVERAGE, not a forgery judgment (use /v1/warrants for authenticity).","operationId":"identity_check_route_v1_identity_check_post","parameters":[{"name":"scheme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_identity_check_route_v1_identity_check_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Identity Check Route V1 Identity Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/check-pack":{"post":{"tags":["Identity"],"summary":"Check Pack Route","description":"Check whether a SET of documents satisfies a checklist — the engine behind the\n`/check-pack` page, mirroring the `check_pack` MCP tool. Each document is CLASSIFIED (one cheap\npage-1 read, hash-cached — never field extraction or multi-page reads), then a deterministic\nengine maps the document types onto the checklist's required slots and reports what's present\nand what's missing. Supply a named `?scheme=` (`income_proof` / `lending_prequal` /\n`rental_application`) OR a `requirements` checklist (JSON: a list of type names or\n`{key, accepts:[types], optional}`; multipart: repeated `?requirements=`). Send multipart\n`files`, or JSON `{\"documents\":[{\"url\"}|{\"bytes_b64\",\"filename\"}], \"scheme\"|\"requirements\"}`\n(URLs SSRF-guarded; up to 12 documents). Returns `{complete, slots[], missing[], documents[],\nunmatched_documents[]}`. COVERAGE, not approval — that the right document TYPES are present, not\nthat any is genuine (use /v1/warrants) or that an application is approved.","operationId":"check_pack_route_v1_check_pack_post","parameters":[{"name":"scheme","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_check_pack_route_v1_check_pack_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Pack Route V1 Check Pack Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fact-checks/{check_id}":{"get":{"tags":["Generated content"],"summary":"Get Fact Check","description":"Retrieve a stored fact-check result by its content-hash id (``fc_<16 hex>``) — the\ndata source for the shareable /fc/<id> permalink pages.","operationId":"get_fact_check_v1_fact_checks__check_id__get","parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Fact Check V1 Fact Checks  Check Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys":{"post":{"tags":["Keys & usage"],"summary":"Create Api Key","description":"Self-serve API key issuance (free preview). The key is returned ONCE and never stored\nin plaintext — only its hash. A keyed caller gets its own daily quota instead of sharing\nthe per-IP one, and can read its metered usage via ``GET /v1/usage``.","operationId":"create_api_key_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Api Key V1 Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage":{"get":{"tags":["Keys & usage"],"summary":"Get Usage","description":"Metered usage for the presented API key (Authorization: Bearer). Reads the same daily\ncounters the rate limiter writes, so reported usage always matches enforcement.","operationId":"get_usage_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Usage V1 Usage Get"}}}}}}},"/v1/verify-references":{"post":{"tags":["Generated content"],"summary":"Verify References Route","description":"Verify a document's citations + internal arithmetic — the engine behind the `/fact-check`\npage, mirroring the `/mcp-verify` tool. Send multipart `file` (PDF), or JSON `{\"text\": \"...\"}`\n/ `{\"bytes_b64\": \"...\", \"filename\": \"...\"}` / `{\"url\": \"https://...\"}` (public hosts only,\nSSRF-guarded, size-capped). `?deep=1` adds the slower web claim-entailment pass; `?stream=1`\nreturns an SSE lifecycle stream (``received`` → ``working`` … → ``result``) so the long deep\npass survives proxy timeouts. Reports verification COVERAGE, not truth.","operationId":"verify_references_route_v1_verify_references_post","parameters":[{"name":"deep","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Deep"}},{"name":"stream","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Stream"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_verify_references_route_v1_verify_references_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_adverse_media_route_v1_adverse_media_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_adverse_media_route_v1_adverse_media_post"},"Body_check_pack_route_v1_check_pack_post":{"properties":{"files":{"anyOf":[{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array"},{"type":"null"}],"title":"Files"}},"type":"object","title":"Body_check_pack_route_v1_check_pack_post"},"Body_classify_document_route_v1_classify_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_classify_document_route_v1_classify_post"},"Body_create_warrant_v1_warrants_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_create_warrant_v1_warrants_post"},"Body_detect_ai_text_route_v1_detect_ai_text_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_detect_ai_text_route_v1_detect_ai_text_post"},"Body_extract_fields_route_v1_extract_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_extract_fields_route_v1_extract_post"},"Body_identity_check_route_v1_identity_check_post":{"properties":{"files":{"anyOf":[{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array"},{"type":"null"}],"title":"Files"}},"type":"object","title":"Body_identity_check_route_v1_identity_check_post"},"Body_redact_pii_route_v1_redact_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_redact_pii_route_v1_redact_post"},"Body_verify_references_route_v1_verify_references_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_verify_references_route_v1_verify_references_post"},"ContactBody":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"message":{"type":"string","title":"Message"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"elapsed_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elapsed Ms"}},"type":"object","required":["name","email","message"],"title":"ContactBody"},"CreateKeyBody":{"properties":{"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["email"],"title":"CreateKeyBody"},"FeedbackBody":{"properties":{"verdict":{"type":"string","enum":["up","down"],"title":"Verdict"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["verdict"],"title":"FeedbackBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ToolFeedbackBody":{"properties":{"tool":{"type":"string","enum":["detect_ai_text","verify_references","classify_document","verify_identity","extract_fields","check_pack","redact_pii","screen_adverse_media"],"title":"Tool"},"verdict":{"type":"string","enum":["up","down"],"title":"Verdict"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["tool","verdict"],"title":"ToolFeedbackBody"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"tags":[{"name":"Documents","description":"Verify, classify, extract from, and redact documents."},{"name":"Identity","description":"Identity and document-pack completeness checks."},{"name":"Screening","description":"Adverse-media and sanctions/PEP screening."},{"name":"Generated content","description":"Fact-check sources and detect AI-written text."},{"name":"Keys & usage","description":"Self-serve API keys and usage metering."},{"name":"Meta","description":"Health, discovery, feedback, and cache-check endpoints."}]}