{"openapi":"3.1.0","info":{"title":"Zerodoc API","description":"Privacy-first, zero-retention document/OCR/IDP API.","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["meta"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/health/ready":{"get":{"tags":["meta"],"summary":"Health Ready","operationId":"health_ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/extract":{"post":{"tags":["extract"],"summary":"Extract","operationId":"extract_v1_extract_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_v1_extract_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/classify":{"post":{"tags":["classify"],"summary":"Classify Document","operationId":"classify_document_v1_classify_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_classify_document_v1_classify_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/split":{"post":{"tags":["split"],"summary":"Split Document","operationId":"split_document_v1_split_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_split_document_v1_split_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/crop":{"post":{"tags":["crop"],"summary":"Crop Document","operationId":"crop_document_v1_crop_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_crop_document_v1_crop_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CropResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys":{"post":{"tags":["keys"],"summary":"Create Key","operationId":"create_key_v1_keys_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["keys"],"summary":"List Keys","operationId":"list_keys_v1_keys_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyInfo"},"title":"Response List Keys V1 Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{key_id}":{"delete":{"tags":["keys"],"summary":"Revoke Key","operationId":"revoke_key_v1_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApiKeyInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"active":{"type":"boolean","title":"Active"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","name","prefix","active"],"title":"ApiKeyInfo"},"Body_classify_document_v1_classify_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"Body_classify_document_v1_classify_post"},"Body_crop_document_v1_crop_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"Body_crop_document_v1_crop_post"},"Body_extract_v1_extract_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"doc_type":{"type":"string","title":"Doc Type","default":"invoice"}},"type":"object","title":"Body_extract_v1_extract_post"},"Body_split_document_v1_split_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"Body_split_document_v1_split_post"},"BoundingBox":{"properties":{"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"}},"type":"object","required":["x","y","width","height"],"title":"BoundingBox","description":"Normalized bounding box (0..1) relative to the page dimensions."},"ClassifyCandidate":{"properties":{"doc_type":{"type":"string","title":"Doc Type"},"score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Score"}},"type":"object","required":["doc_type","score"],"title":"ClassifyCandidate"},"ClassifyResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"status":{"type":"string","title":"Status","default":"ok"},"document":{"$ref":"#/components/schemas/DocumentInfo"},"doc_type":{"type":"string","title":"Doc Type"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"candidates":{"items":{"$ref":"#/components/schemas/ClassifyCandidate"},"type":"array","title":"Candidates"},"retention":{"$ref":"#/components/schemas/RetentionInfo"}},"type":"object","required":["request_id","document","doc_type","confidence"],"title":"ClassifyResponse","description":"Document-type routing decision. Deliberately lean: no text/blocks —\nclassify is for routing, and returning less content is the privacy-friendly\ndefault. Run /v1/extract on the routed document for content."},"CreateKeyRequest":{"properties":{"name":{"type":"string","title":"Name","default":""}},"type":"object","title":"CreateKeyRequest"},"CreatedKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"active":{"type":"boolean","title":"Active"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"},"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["id","name","prefix","active","api_key"],"title":"CreatedKeyResponse"},"CropItem":{"properties":{"item":{"type":"integer","title":"Item"},"page":{"type":"integer","title":"Page"},"bbox":{"$ref":"#/components/schemas/BoundingBox"},"doc_type":{"type":"string","title":"Doc Type"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"image_mime_type":{"type":"string","title":"Image Mime Type","default":"image/png"},"image_base64":{"type":"string","title":"Image Base64"}},"type":"object","required":["item","page","bbox","doc_type","confidence","image_base64"],"title":"CropItem","description":"One document isolated from a shared page, returned as an inline image."},"CropResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"status":{"type":"string","title":"Status","default":"ok"},"document":{"$ref":"#/components/schemas/DocumentInfo"},"items":{"items":{"$ref":"#/components/schemas/CropItem"},"type":"array","title":"Items"},"retention":{"$ref":"#/components/schemas/RetentionInfo"}},"type":"object","required":["request_id","document"],"title":"CropResponse","description":"Documents isolated from a multi-document scan. Items are standalone\nimages — feed each back to /v1/extract (or /v1/classify) individually."},"DocumentInfo":{"properties":{"mime_type":{"type":"string","title":"Mime Type"},"page_count":{"type":"integer","title":"Page Count"},"size_bytes":{"type":"integer","title":"Size Bytes"}},"type":"object","required":["mime_type","page_count","size_bytes"],"title":"DocumentInfo"},"ExtractResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"status":{"type":"string","title":"Status","default":"ok"},"document":{"$ref":"#/components/schemas/DocumentInfo"},"text":{"type":"string","title":"Text"},"blocks":{"items":{"$ref":"#/components/schemas/TextBlock"},"type":"array","title":"Blocks"},"doc_type":{"type":"string","title":"Doc Type","default":"invoice"},"fields":{"$ref":"#/components/schemas/ExtractedFields"},"extraction_warnings":{"items":{"type":"string"},"type":"array","title":"Extraction Warnings"},"mean_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Confidence"},"extraction_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Extraction Confidence"},"retention":{"$ref":"#/components/schemas/RetentionInfo"}},"type":"object","required":["request_id","document","text"],"title":"ExtractResponse"},"ExtractedFields":{"properties":{"supplier":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Supplier / issuer name."},"supplier_address":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Supplier postal address, single line."},"supplier_email":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Supplier email address."},"supplier_phone":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Supplier phone number as printed."},"supplier_website":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Supplier website / domain."},"customer_name":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Bill-to name."},"customer_address":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Bill-to postal address, single line."},"delivery_address":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Ship-to / delivery address when it differs from the billing address."},"invoice_number":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Invoice number / reference as printed."},"po_number":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Purchase-order number the invoice cites."},"vat_number":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Supplier VAT registration number, format-validated (e.g. GB123456789)."},"reference_numbers":{"anyOf":[{"$ref":"#/components/schemas/ListFieldValue"},{"type":"null"}],"description":"Other reference numbers on the document (order, customer, account references)."},"invoice_date":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Issue date, ISO 8601 (YYYY-MM-DD)."},"due_date":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Payment due date, ISO 8601 (YYYY-MM-DD)."},"currency":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"ISO 4217 currency code (GBP, EUR, …)."},"net_amount":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Total before VAT."},"vat_amount":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Total VAT."},"vat_rate":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"VAT rate in percent (20.0)."},"total_amount":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Grand total payable. Cross-checked against net + VAT."},"iban":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"IBAN, checksum-validated, spaces removed."},"account_number":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"Domestic bank account number (UK: 8 digits)."},"sort_code":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"UK sort code (6 digits, formatted as printed)."},"swift":{"anyOf":[{"$ref":"#/components/schemas/FieldValue"},{"type":"null"}],"description":"SWIFT / BIC code."},"line_items":{"anyOf":[{"items":{"$ref":"#/components/schemas/LineItem"},"type":"array"},{"type":"null"}],"title":"Line Items","description":"Line-item rows. A bare array — no wrapper, no per-row confidence."},"taxes":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaxLine"},"type":"array"},{"type":"null"}],"title":"Taxes","description":"Derived from net / VAT rate / VAT amount. Mindee-compatible."},"locale":{"anyOf":[{"$ref":"#/components/schemas/Locale"},{"type":"null"}],"description":"Derived from the VAT number prefix and currency. Mindee-compatible."}},"type":"object","title":"ExtractedFields","description":"Every field /v1/extract can return for an invoice. A field is absent (not null) when it was not found."},"FieldValue":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"null"}],"title":"Value","description":"The extracted value. Amounts are numbers, dates are ISO 8601 (YYYY-MM-DD), everything else is a string."},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"0–1. Cross-checked values (e.g. net + VAT = total) score higher."},"inferred":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inferred","description":"true when the value was derived by arithmetic from other fields rather than read off the page. Reduced confidence; check it."}},"additionalProperties":true,"type":"object","required":["value","confidence"],"title":"FieldValue","description":"One extracted scalar with its confidence."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LineItem":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Line description as printed."},"quantity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quantity","description":"Quantity, when printed."},"unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unit Price","description":"Unit price, when printed."},"total_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Price","description":"Line total."}},"additionalProperties":true,"type":"object","title":"LineItem","description":"One row of the invoice's line-item table."},"ListFieldValue":{"properties":{"value":{"items":{"type":"string"},"type":"array","title":"Value"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"}},"additionalProperties":true,"type":"object","required":["value","confidence"],"title":"ListFieldValue","description":"A list-valued field with one confidence for the list."},"Locale":{"properties":{"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO 3166-1 alpha-2, from the VAT number prefix or the currency."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"ISO 4217 code."}},"type":"object","title":"Locale","description":"Derived locale (Mindee-compatible shape)."},"RetentionInfo":{"properties":{"stored":{"type":"boolean","title":"Stored","default":false},"policy":{"type":"string","title":"Policy","default":"zero-retention"},"detail":{"type":"string","title":"Detail","default":"Document processed in memory and discarded immediately after this response. No file or extracted content is persisted."}},"type":"object","title":"RetentionInfo","description":"Explicit, machine-readable proof of our zero-retention promise."},"SplitResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"status":{"type":"string","title":"Status","default":"ok"},"document":{"$ref":"#/components/schemas/DocumentInfo"},"segments":{"items":{"$ref":"#/components/schemas/SplitSegment"},"type":"array","title":"Segments"},"retention":{"$ref":"#/components/schemas/RetentionInfo"}},"type":"object","required":["request_id","document"],"title":"SplitResponse","description":"Document boundaries for a multi-page upload. Lean like /v1/classify: no\ntext/blocks — feed each segment's pages to /v1/extract for content."},"SplitSegment":{"properties":{"segment":{"type":"integer","title":"Segment"},"pages":{"items":{"type":"integer"},"type":"array","title":"Pages"},"page_count":{"type":"integer","title":"Page Count"},"doc_type":{"type":"string","title":"Doc Type"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"}},"type":"object","required":["segment","pages","page_count","doc_type","confidence"],"title":"SplitSegment","description":"One detected document within a multi-page upload."},"TaxLine":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount","description":"VAT amount."},"rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate","description":"VAT rate in percent."},"base":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Base","description":"Net amount the rate applies to."}},"type":"object","title":"TaxLine","description":"Derived VAT summary line (Mindee-compatible shape)."},"TextBlock":{"properties":{"text":{"type":"string","title":"Text"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"page":{"type":"integer","title":"Page","default":0},"bbox":{"anyOf":[{"$ref":"#/components/schemas/BoundingBox"},{"type":"null"}]}},"type":"object","required":["text","confidence"],"title":"TextBlock"},"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"}}}}