MCP-Server

mcp

cheap.doc/mcp
Sicherheit Öffentlich und erreichbar MCP 2025-11-25

Was dieses MCP kann

Recognizes passports, national IDs, and driver's licences from images, returning structured document data and scan status.

check_balance
Check remaining credits
Return how many credits are left on the account and what the current period has used: the balance, split into this month's free credits (100 every month, drawn first) and the paid credits, the credits spent, and the scan counters broken down by status (recognized, unreadable, no document found, unsupported document, rejected). Takes no arguments and calls GET /v1/usage; under the public sandbox key it answers without calling anything. One recognised document draws one credit, at $0.01; scans that recognised nothing are counted and never charged. Needs a real API key – under the public sandbox key there is no account behind the call, and the answer says so instead of reporting zeros that read like a balance. Use it before working through a batch of documents, or when a scan is refused for lack of credit.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['balance_credits', 'period', 'scans', 'credits_spent', 'free_allowance', 'paid_balance_credits', 'credits_spent_by_kind'], 'properties': {'scans': {'type': 'object', 'required': ['total', 'billed', 'by_status'], 'properties': {'total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'billed': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'by_status': {'type': 'object', 'required': ['recognized', 'no_document_found', 'unreadable', 'unsupported_document', 'rejected'], 'properties': {'rejected': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'recognized': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'unreadable': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'no_document_found': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'unsupported_document': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}}, 'additionalProperties': False}}, 'additionalProperties': False}, 'period': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$'}, 'start': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$'}}, 'description': 'Bounds of the current usage period (UTC calendar month).', 'additionalProperties': False}, 'credits_spent': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Credits charged within the period.'}, 'free_allowance': {'anyOf': [{'type': 'object', 'required': ['monthly_credits', 'remaining_credits', 'resets_at'], 'properties': {'resets_at': {'anyOf': [{'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$'}, {'type': 'null'}], 'description': 'When the free credits are next set back to the monthly amount (00:00 UTC on the first of the next month); null when there is no next monthly amount.'}, 'monthly_credits': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Free credits the account is set back to at the start of each UTC calendar month: 100 every month.'}, 'remaining_credits': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Free credits left this month.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': "This month's free credits, drawn before paid credits; null when the account may not draw free credits (its email address is not confirmed, or its free credits were withdrawn) and for a key with no account."}, 'balance_credits': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': "Credits currently available to the account: this month's free credits plus the paid credits; null for a key with no account (the public sandbox key)."}, 'paid_balance_credits': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}], 'description': "Paid credits: bought or granted to the account, drawn once this month's free credits are used up, and never reset; null only for a key with no account (the public sandbox key)."}, 'credits_spent_by_kind': {'type': 'object', 'required': ['free', 'paid'], 'properties': {'free': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, 'paid': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}}, 'description': 'Credits charged within the period, by the kind that paid.', 'additionalProperties': False}}, 'additionalProperties': False}
delete_scan
Delete a stored scan
Permanently delete one stored scan now, before its retention window would end. This cannot be undone: the stored result, its history row and its thumbnail are removed, and the scan can no longer be listed, fetched or replayed through its idempotency_key. The credit it drew is not refunded, and this period's usage counters still count it. Input: scan_id – meta.id of a scan_document result, or id of a list_scans row. Output: { id, deleted: true }. Calls DELETE /v1/scans/{id}. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Errors: an id that is unknown, belongs to another account, has passed its window or was already deleted is refused as not_found, and nothing is deleted. Use it when someone asks for a document's data to be removed; confirm the id with list_scans or get_scan first, because the deletion is final.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scan_id'], 'properties': {'scan_id': {'type': 'string', 'pattern': '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'description': "The scan's id: meta.id of the scan_document result, or id of a list_scans row (a lower-case UUID)."}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id', 'deleted'], 'properties': {'id': {'$ref': '#/definitions/ScanId'}, 'deleted': {'type': 'boolean', 'const': True, 'description': 'Always true: the stored result is gone and cannot be read back.'}}, 'definitions': {'ScanId': {'type': 'string', 'example': '01a0af18-cd8d-7a61-9f2d-4c7b8e105da3', 'pattern': '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'description': 'Scan identifier: a UUID version 7 (RFC 9562), canonical lower-case `8-4-4-4-12`. Its leading 48 bits are the millisecond the scan was made, so ids sort in the order the scans happened – but treat the value as opaque: nothing else about it is part of the contract.'}}, 'additionalProperties': False}
get_scan
Fetch a stored scan
Fetch the full result of one stored scan by its id, as it was returned when the document was recognised. Input: scan_id – meta.id of a scan_document result, or id of a list_scans row. Output: the same Scan object scan_document returns (meta, document, holder, fields, mrz and the rest) plus a one-line summary, with two differences: the image crops are never stored, so every images slot is null, and quality reads not_checked. Calls GET /v1/scans/{id}; it never re-runs recognition and never charges a credit. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Errors: an id that is unknown, belongs to another account, was made with retain_hours 0 or has passed its window is refused as not_found – the cases are not told apart. Use it to read back a document recognised earlier instead of scanning the image again.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scan_id'], 'properties': {'scan_id': {'type': 'string', 'pattern': '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'description': "The scan's id: meta.id of the scan_document result, or id of a list_scans row (a lower-case UUID)."}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['meta', 'document', 'holder', 'fields', 'mrz', 'images', 'quality', 'authenticity'], 'properties': {'mrz': {'$ref': '#/definitions/ScanMrz'}, 'meta': {'$ref': '#/definitions/ScanMeta'}, 'fields': {'type': 'array', 'items': {'$ref': '#/definitions/ScanField'}, 'description': 'Every field the engine extracted off the printed document, re-keyed to our vocabulary – the open set. Always present; empty when nothing was extracted. A field read in more than one language appears once per language, so `name` repeats and only `id` is unique.'}, 'holder': {'anyOf': [{'$ref': '#/definitions/ScanHolder'}, {'type': 'null'}]}, 'images': {'$ref': '#/definitions/ScanImages'}, 'quality': {'$ref': '#/definitions/ScanQuality'}, 'document': {'anyOf': [{'$ref': '#/definitions/ScanDocument'}, {'type': 'null'}]}, 'authenticity': {'$ref': '#/definitions/ScanAuthenticity'}}, 'definitions': {'ScanId': {'type': 'string', 'example': '01a0af18-cd8d-7a61-9f2d-4c7b8e105da3', 'pattern': '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'description': 'Scan identifier: a UUID version 7 (RFC 9562), canonical lower-case `8-4-4-4-12`. Its leading 48 bits are the millisecond the scan was made, so ids sort in the order the scans happened – but treat the value as opaque: nothing else about it is part of the contract.'}, 'ScanMrz': {'type': 'object', 'required': ['status', 'reason', 'lines', 'text'], 'properties': {'text': {'type': ['string', 'null'], 'description': 'The same lines run together with nothing between them: one unbroken string, with no newlines and no spaces. Null when there are none.'}, 'lines': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'description': "The zone's lines in order, exactly as read – two for a TD3 passport, three for a TD1 card. The zone's alphabet is `A-Z`, `0-9` and the filler `<`, so a line carries no whitespace. Null when the document carries none."}, 'reason': {'type': ['string', 'null'], 'example': 'Check digit failed for: document number, date of birth', 'description': 'One plain sentence naming what did not check out, for `failed`; null otherwise.'}, 'status': {'$ref': '#/definitions/MrzStatus'}}, 'additionalProperties': False}, 'ScanMeta': {'type': 'object', 'required': ['schema_version', 'id', 'status', 'billed', 'confidence', 'timing', 'created_at', 'reference'], 'properties': {'id': {'$ref': '#/definitions/ScanId'}, 'billed': {'type': 'boolean', 'description': 'Whether this scan was charged to the balance.'}, 'status': {'$ref': '#/definitions/ScanStatus'}, 'timing': {'anyOf': [{'$ref': '#/definitions/ScanTiming'}, {'type': 'null'}]}, 'reference': {'type': ['string', 'null'], 'description': "The request's `reference`, echoed back."}, 'confidence': {'allOf': [{'$ref': '#/definitions/ConfidenceBand'}], 'description': 'How strongly the recognition backs this reading as a whole. Each entry of `fields` carries its own band as well, and they can differ from this one.'}, 'created_at': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$', 'description': 'Timestamp, ISO-8601 in UTC (`YYYY-MM-DDTHH:MM:SSZ`).'}, 'schema_version': {'type': 'string', 'const': '1.0', 'description': 'The version of this body, always `1.0`. A consumer that pins this value checks that the body is the one it was written against.'}}, 'additionalProperties': False}, 'MrzStatus': {'enum': ['passed', 'failed', 'absent'], 'type': 'string', 'description': 'Verdict on the machine-readable zone: `passed` (present, every check digit valid and nothing contradicting the printed page), `failed` (present but something did not check out) or `absent` (the document carries none).'}, 'ScanCheck': {'type': 'object', 'required': ['name', 'label', 'result', 'detail'], 'properties': {'name': {'type': 'string', 'minLength': 1, 'description': 'Our stable snake_case key for this check.'}, 'label': {'type': 'string', 'minLength': 1, 'description': 'Our human label for this check.'}, 'detail': {'type': ['string', 'null'], 'description': 'One plain sentence about what this check saw, or null when it has nothing to add.'}, 'result': {'$ref': '#/definitions/CheckResult'}}, 'additionalProperties': False}, 'ScanField': {'type': 'object', 'required': ['id', 'name', 'label', 'category', 'value', 'language', 'confidence'], 'properties': {'id': {'type': 'string', 'example': 'surname@1032', 'minLength': 1, 'description': 'Identity of this entry, unique across `fields`: the key and the language identifier the value was read as, plus an occurrence counter when the same pair is reported twice. `name` is the semantic key and repeats – a document that carries a field in two scripts yields one entry per language – so use `id`, not `name`, to address or key a single entry.'}, 'name': {'type': 'string', 'example': 'surname', 'minLength': 1, 'description': 'Our stable snake_case key.'}, 'label': {'type': 'string', 'example': 'Surname', 'minLength': 1, 'description': 'Our human label.'}, 'value': {'type': ['string', 'null'], 'description': 'The value of this reading: the national-script spelling on a national-script reading, the transliterated Latin value on the default reading (the one whose `id` carries the identifier `0`). Null when the field is empty.'}, 'category': {'$ref': '#/definitions/FieldCategory'}, 'language': {'type': ['string', 'null'], 'example': 'Greek', 'description': "The language this reading was made in, e.g. `Greek`. The default Latin-script reading – the document's own Latin page and the machine-readable zone, `id` suffix `@0` – is `English`. Null only on `days_to_expire`, a number computed from the expiry date rather than text read in any language."}, 'confidence': {'$ref': '#/definitions/ConfidenceBand'}}, 'additionalProperties': False}, 'ScanHolder': {'type': 'object', 'required': ['given_names', 'surname', 'full_name', 'birth_date', 'sex', 'nationality'], 'properties': {'sex': {'anyOf': [{'enum': ['M', 'F', 'X'], 'type': 'string'}, {'type': 'null'}], 'description': 'The sex the document states: `M`, `F`, or `X` for unspecified. Null when none was read.'}, 'surname': {'type': ['string', 'null'], 'description': "The holder's surname, as printed. Null when none was read."}, 'full_name': {'type': ['string', 'null'], 'description': "The holder's name as the document prints it in one combined field. Null when the document carries no such field – it is not composed from the two above."}, 'birth_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$', 'description': 'Calendar date, ISO-8601 (`YYYY-MM-DD`).'}, {'type': 'null'}], 'description': "The holder's date of birth, ISO-8601 (`YYYY-MM-DD`). Null when none was read."}, 'given_names': {'type': ['string', 'null'], 'description': "The holder's given names, as printed. Null when none was read."}, 'nationality': {'anyOf': [{'type': 'string', 'example': 'GRC', 'pattern': '^[A-Z]{3}$', 'description': 'ISO 3166-1 alpha-3 country code.'}, {'type': 'null'}], 'description': "The holder's nationality, ISO 3166-1 alpha-3. Null when none was read; it is not assumed from the issuing state."}}, 'additionalProperties': False}, 'ScanImages': {'type': 'object', 'required': ['document_crop', 'rear', 'main_photo', 'signature', 'watermark_face', 'barcode', 'chip'], 'properties': {'chip': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The chip area of the document, when it carries one.'}, 'rear': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The reverse side of the document, when the picture carried one and a crop of it was produced.'}, 'barcode': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The barcode area of the document, when it carries one.'}, 'signature': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': "The holder's signature as printed on the document."}, 'main_photo': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': "The holder's photograph as printed on the document."}, 'document_crop': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The document itself, cropped out of the uploaded picture and deskewed – the front side of a card, the data page of a booklet.'}, 'watermark_face': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': "The faint second copy of the holder's face printed into the page as a security feature – a different image from `main_photo`, and the one a verifier compares against it. Null when the document carries none."}}, 'description': 'Image crops, returned in the recognition response only. Each is scaled down by height, proportionally and never upwards, to at most 250 px for `document_crop` and 100 px for every other crop, then re-encoded with every metadata block dropped.', 'additionalProperties': False}, 'ScanStatus': {'enum': ['recognized', 'no_document_found', 'unreadable', 'unsupported_document', 'rejected'], 'type': 'string', 'description': 'Outcome of a scan. Exactly these five string values; there are no numeric codes.'}, 'ScanTiming': {'type': 'object', 'required': ['upload_ms', 'processing_ms', 'total_ms'], 'properties': {'total_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': "From the request arriving to the result being complete. At least `upload_ms + processing_ms`; the remainder is the gates that run after `upload_ms` is taken – the allowance, the idempotency check and the credit hold – plus preparing the result images and mapping the engine's output into this body. It stops there: writing the history row and serializing the response happen after the number is fixed, so the same figure is stored and returned."}, 'upload_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': "From the request's headers reaching the server to its body being received and validated, with your key resolved and its rate limit checked. The allowance, idempotency and credit gates are claimed after this number is taken, so they are not in it. Dominated by your own connection and by how large the image is – this is the half you can shrink, by sending a smaller picture from closer by."}, 'processing_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'The recognition itself – the server-side engine call.'}}, 'description': "The split of the request's time. Null on a scan made before the split existed and read back out of storage: only the engine call was timed then, and the two halves cannot be recovered from it.", 'additionalProperties': False}, 'CheckResult': {'enum': ['pass', 'warn', 'fail'], 'type': 'string', 'description': 'Outcome of a single check.'}, 'ScanQuality': {'type': 'object', 'required': ['overall'], 'properties': {'overall': {'enum': ['not_checked', 'pass', 'warn', 'fail'], 'type': 'string', 'description': 'Whether the uploaded picture was good enough to recognize from. `not_checked` when nothing measured it – a scan read back from storage, which keeps no engine output.'}}, 'additionalProperties': False}, 'ScanDocument': {'type': 'object', 'required': ['kind', 'country', 'country_name', 'issuing_state', 'type_name', 'type_confidence', 'number', 'series', 'issue_date', 'expiry_date', 'is_expired', 'days_remaining'], 'properties': {'kind': {'type': 'string', 'minLength': 1, 'description': 'Document type, e.g. `passport`.'}, 'number': {'type': ['string', 'null'], 'example': 'AM7304518', 'description': 'The document number, as printed. Null when none was read. A series the document prints separately is in `series`, never folded into this value.'}, 'series': {'type': ['string', 'null'], 'description': 'The document series, for a document that prints one as a field of its own. Null when the document carries none or none was read; it is never split out of `number`.'}, 'country': {'anyOf': [{'type': 'string', 'example': 'GRC', 'pattern': '^[A-Z]{3}$', 'description': 'ISO 3166-1 alpha-3 country code.'}, {'type': 'null'}], 'description': 'The state that issued the document, ISO 3166-1 alpha-3. The same reading as `issuing_state` under the name most callers filter on; null when nothing was read.'}, 'type_name': {'type': ['string', 'null'], 'example': 'Greece - Passport', 'description': 'The document type under its full name. Null on a scan read back from storage, which keeps no engine output.'}, 'is_expired': {'type': ['boolean', 'null'], 'description': 'Whether the document had already expired when the scan was made. Null when no expiry date was read, which is a different answer from `false`.'}, 'issue_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$', 'description': 'Calendar date, ISO-8601 (`YYYY-MM-DD`).'}, {'type': 'null'}], 'description': 'The date the document was issued, ISO-8601 (`YYYY-MM-DD`). Null when none was read.'}, 'expiry_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$', 'description': 'Calendar date, ISO-8601 (`YYYY-MM-DD`).'}, {'type': 'null'}], 'description': 'The date the document expires, ISO-8601 (`YYYY-MM-DD`). Null when none was read; `is_expired` and `days_remaining` are computed from it.'}, 'country_name': {'type': ['string', 'null'], 'example': 'Greece', 'description': "The issuing state's name, as read from the document."}, 'issuing_state': {'anyOf': [{'type': 'string', 'example': 'GRC', 'pattern': '^[A-Z]{3}$', 'description': 'ISO 3166-1 alpha-3 country code.'}, {'type': 'null'}], 'description': 'The issuing state, ISO 3166-1 alpha-3 – the same reading as `country`, under the name the machine-readable zone gives it.'}, 'days_remaining': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Days until expiry at the time of the scan; negative once expired.'}, 'type_confidence': {'allOf': [{'$ref': '#/definitions/ConfidenceBand'}], 'description': 'How strongly the document-type match is backed.'}}, 'additionalProperties': False}, 'FieldCategory': {'enum': ['identity', 'document', 'dates', 'address', 'visa', 'other'], 'type': 'string', 'description': 'Which group of the report a field belongs to.'}, 'ConfidenceBand': {'enum': ['low', 'medium', 'high'], 'type': 'string', 'description': 'How strongly the recognition backs this value: `high`, `medium` or `low`. An unknown or missing probability reads as `low`.'}, 'ScanAuthenticity': {'type': 'object', 'required': ['overall', 'checks'], 'properties': {'checks': {'type': 'array', 'items': {'$ref': '#/definitions/ScanCheck'}, 'description': 'One entry per authenticity check that ran. Always present; empty under the recognition-only scenario, where nothing ran.'}, 'overall': {'enum': ['not_checked', 'pass', 'warn', 'fail'], 'type': 'string', 'description': '`not_checked` under the recognition-only scenario; populated by authenticity verification later.'}}, 'additionalProperties': False}}, 'additionalProperties': False}
list_scans
List stored scans
List the account's stored scans, most recent first, one page at a time. Inputs: the optional limit (1 to 100 rows, default 20) and cursor (the next_cursor of the previous page; omit it for the first page). Output: scans – one row per scan with id, status (recognized, unreadable, no_document_found, unsupported_document or rejected), billed, duration_ms, reference (your own string from the scan) and created_at – and next_cursor, which is null on the last page. A row holds no extracted data; call get_scan with its id for the full result. Calls GET /v1/scans; it never charges a credit. Only scans made with a live key under a non-zero retention window are stored, and only until that window ends (retain_hours on the scan, or the account's history-retention setting, one year by default); a scan made with retain_hours 0 was never stored. A key reaches its own account's scans and no other account's. Under a sandbox key – the public one or an account's own sk_sandbox_ key – nothing is stored. Under the public sandbox key the answer is an empty list, given without calling the API. Errors: a cursor this API did not issue is refused (validation_failed); a key the API does not know is refused (unauthorized). Use it to find a scan made earlier – by its reference or its time – before reading or deleting it.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Rows per page, 1 to 100 (default 20).'}, 'cursor': {'type': 'string', 'minLength': 1, 'description': 'next_cursor from the previous page; omit it for the first page.'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['scans', 'next_cursor'], 'properties': {'scans': {'type': 'array', 'items': {'$ref': '#/definitions/ScanSummary'}, 'description': "The account's scans, most recent first."}, 'next_cursor': {'type': ['string', 'null'], 'description': 'Opaque cursor for the next page: send it back as `cursor` to continue after the last row of this one. Null on the last page.'}}, 'definitions': {'ScanId': {'type': 'string', 'example': '01a0af18-cd8d-7a61-9f2d-4c7b8e105da3', 'pattern': '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'description': 'Scan identifier: a UUID version 7 (RFC 9562), canonical lower-case `8-4-4-4-12`. Its leading 48 bits are the millisecond the scan was made, so ids sort in the order the scans happened – but treat the value as opaque: nothing else about it is part of the contract.'}, 'ScanStatus': {'enum': ['recognized', 'no_document_found', 'unreadable', 'unsupported_document', 'rejected'], 'type': 'string', 'description': 'Outcome of a scan. Exactly these five string values; there are no numeric codes.'}, 'ScanSummary': {'type': 'object', 'required': ['id', 'status', 'billed', 'duration_ms', 'reference', 'created_at'], 'properties': {'id': {'$ref': '#/definitions/ScanId'}, 'billed': {'type': 'boolean', 'description': 'Whether this scan was charged to the balance.'}, 'status': {'$ref': '#/definitions/ScanStatus'}, 'reference': {'type': ['string', 'null'], 'description': "The request's `reference`, echoed back."}, 'created_at': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$', 'description': 'Timestamp, ISO-8601 in UTC (`YYYY-MM-DDTHH:MM:SSZ`).'}, 'duration_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Server-side processing time of the scan in milliseconds.'}}, 'additionalProperties': False}}, 'additionalProperties': False}
scan_document
Recognise a passport or ID document
Recognise a passport, national ID card or driver's licence from a photo or scan and return what is printed on it as structured JSON. Inputs: the image as image_base64 or image_url (https, on a public address); plus the optional expect_country, return_portrait, retain_hours, reference and idempotency_key. Output: a Scan object – meta (id, status, billed, confidence, timing), document (kind, issuing country, number, series, date of issue, date of expiry, whether it has expired and how many days are left), holder (given names, surname, date of birth, sex, nationality), fields (every field read off the printed page, each with its own confidence), mrz (whether the machine-readable zone checks out, why not when it does not, and its lines exactly as read), images, quality and authenticity – plus a one-line summary of the same result. Calls POST /v1/scans. Cost: it bills one credit ($0.01) only when a document is recognised; an unreadable image, an empty frame or an unsupported type costs nothing, and meta.billed says which happened. Without a key, the public sandbox key is used. It gives 10 free recognised documents per address in all, and at most 10 requests per address an hour, whatever their answer. Registering gives 100 free documents every month. Use it whenever someone hands over an identity document and wants it read, transcribed, or checked against what they claim – a name, a document number, a date of birth or an expiry date.
Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'image_url': {'type': 'string', 'description': 'https: URL of an image on a public internet address, which the server fetches (25 MB maximum).'}, 'reference': {'type': 'string', 'maxLength': 128, 'description': 'Your own correlation string, echoed back in the result.'}, 'image_base64': {'type': 'string', 'description': 'The document image as base64 (a data: URL is also accepted).'}, 'retain_hours': {'type': 'integer', 'maximum': 8760, 'minimum': 0, 'description': "Hours the result stays readable via GET /v1/scans/{id} (0 = store nothing). Omit it to use the account's own history-retention setting."}, 'expect_country': {'type': 'string', 'maxLength': 3, 'minLength': 3, 'description': 'ISO 3166-1 alpha-3 country you expect, or omit for any.'}, 'idempotency_key': {'type': 'string', 'description': 'Makes a retried scan return the first result instead of charging again.'}, 'return_portrait': {'type': 'boolean', 'description': 'Whether to include the holder photograph crop, images.main_photo (default true).'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['meta', 'document', 'holder', 'fields', 'mrz', 'images', 'quality', 'authenticity'], 'properties': {'mrz': {'$ref': '#/definitions/ScanMrz'}, 'meta': {'$ref': '#/definitions/ScanMeta'}, 'fields': {'type': 'array', 'items': {'$ref': '#/definitions/ScanField'}, 'description': 'Every field the engine extracted off the printed document, re-keyed to our vocabulary – the open set. Always present; empty when nothing was extracted. A field read in more than one language appears once per language, so `name` repeats and only `id` is unique.'}, 'holder': {'anyOf': [{'$ref': '#/definitions/ScanHolder'}, {'type': 'null'}]}, 'images': {'$ref': '#/definitions/ScanImages'}, 'quality': {'$ref': '#/definitions/ScanQuality'}, 'document': {'anyOf': [{'$ref': '#/definitions/ScanDocument'}, {'type': 'null'}]}, 'authenticity': {'$ref': '#/definitions/ScanAuthenticity'}}, 'definitions': {'ScanId': {'type': 'string', 'example': '01a0af18-cd8d-7a61-9f2d-4c7b8e105da3', 'pattern': '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'description': 'Scan identifier: a UUID version 7 (RFC 9562), canonical lower-case `8-4-4-4-12`. Its leading 48 bits are the millisecond the scan was made, so ids sort in the order the scans happened – but treat the value as opaque: nothing else about it is part of the contract.'}, 'ScanMrz': {'type': 'object', 'required': ['status', 'reason', 'lines', 'text'], 'properties': {'text': {'type': ['string', 'null'], 'description': 'The same lines run together with nothing between them: one unbroken string, with no newlines and no spaces. Null when there are none.'}, 'lines': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'description': "The zone's lines in order, exactly as read – two for a TD3 passport, three for a TD1 card. The zone's alphabet is `A-Z`, `0-9` and the filler `<`, so a line carries no whitespace. Null when the document carries none."}, 'reason': {'type': ['string', 'null'], 'example': 'Check digit failed for: document number, date of birth', 'description': 'One plain sentence naming what did not check out, for `failed`; null otherwise.'}, 'status': {'$ref': '#/definitions/MrzStatus'}}, 'additionalProperties': False}, 'ScanMeta': {'type': 'object', 'required': ['schema_version', 'id', 'status', 'billed', 'confidence', 'timing', 'created_at', 'reference'], 'properties': {'id': {'$ref': '#/definitions/ScanId'}, 'billed': {'type': 'boolean', 'description': 'Whether this scan was charged to the balance.'}, 'status': {'$ref': '#/definitions/ScanStatus'}, 'timing': {'anyOf': [{'$ref': '#/definitions/ScanTiming'}, {'type': 'null'}]}, 'reference': {'type': ['string', 'null'], 'description': "The request's `reference`, echoed back."}, 'confidence': {'allOf': [{'$ref': '#/definitions/ConfidenceBand'}], 'description': 'How strongly the recognition backs this reading as a whole. Each entry of `fields` carries its own band as well, and they can differ from this one.'}, 'created_at': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$', 'description': 'Timestamp, ISO-8601 in UTC (`YYYY-MM-DDTHH:MM:SSZ`).'}, 'schema_version': {'type': 'string', 'const': '1.0', 'description': 'The version of this body, always `1.0`. A consumer that pins this value checks that the body is the one it was written against.'}}, 'additionalProperties': False}, 'MrzStatus': {'enum': ['passed', 'failed', 'absent'], 'type': 'string', 'description': 'Verdict on the machine-readable zone: `passed` (present, every check digit valid and nothing contradicting the printed page), `failed` (present but something did not check out) or `absent` (the document carries none).'}, 'ScanCheck': {'type': 'object', 'required': ['name', 'label', 'result', 'detail'], 'properties': {'name': {'type': 'string', 'minLength': 1, 'description': 'Our stable snake_case key for this check.'}, 'label': {'type': 'string', 'minLength': 1, 'description': 'Our human label for this check.'}, 'detail': {'type': ['string', 'null'], 'description': 'One plain sentence about what this check saw, or null when it has nothing to add.'}, 'result': {'$ref': '#/definitions/CheckResult'}}, 'additionalProperties': False}, 'ScanField': {'type': 'object', 'required': ['id', 'name', 'label', 'category', 'value', 'language', 'confidence'], 'properties': {'id': {'type': 'string', 'example': 'surname@1032', 'minLength': 1, 'description': 'Identity of this entry, unique across `fields`: the key and the language identifier the value was read as, plus an occurrence counter when the same pair is reported twice. `name` is the semantic key and repeats – a document that carries a field in two scripts yields one entry per language – so use `id`, not `name`, to address or key a single entry.'}, 'name': {'type': 'string', 'example': 'surname', 'minLength': 1, 'description': 'Our stable snake_case key.'}, 'label': {'type': 'string', 'example': 'Surname', 'minLength': 1, 'description': 'Our human label.'}, 'value': {'type': ['string', 'null'], 'description': 'The value of this reading: the national-script spelling on a national-script reading, the transliterated Latin value on the default reading (the one whose `id` carries the identifier `0`). Null when the field is empty.'}, 'category': {'$ref': '#/definitions/FieldCategory'}, 'language': {'type': ['string', 'null'], 'example': 'Greek', 'description': "The language this reading was made in, e.g. `Greek`. The default Latin-script reading – the document's own Latin page and the machine-readable zone, `id` suffix `@0` – is `English`. Null only on `days_to_expire`, a number computed from the expiry date rather than text read in any language."}, 'confidence': {'$ref': '#/definitions/ConfidenceBand'}}, 'additionalProperties': False}, 'ScanHolder': {'type': 'object', 'required': ['given_names', 'surname', 'full_name', 'birth_date', 'sex', 'nationality'], 'properties': {'sex': {'anyOf': [{'enum': ['M', 'F', 'X'], 'type': 'string'}, {'type': 'null'}], 'description': 'The sex the document states: `M`, `F`, or `X` for unspecified. Null when none was read.'}, 'surname': {'type': ['string', 'null'], 'description': "The holder's surname, as printed. Null when none was read."}, 'full_name': {'type': ['string', 'null'], 'description': "The holder's name as the document prints it in one combined field. Null when the document carries no such field – it is not composed from the two above."}, 'birth_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$', 'description': 'Calendar date, ISO-8601 (`YYYY-MM-DD`).'}, {'type': 'null'}], 'description': "The holder's date of birth, ISO-8601 (`YYYY-MM-DD`). Null when none was read."}, 'given_names': {'type': ['string', 'null'], 'description': "The holder's given names, as printed. Null when none was read."}, 'nationality': {'anyOf': [{'type': 'string', 'example': 'GRC', 'pattern': '^[A-Z]{3}$', 'description': 'ISO 3166-1 alpha-3 country code.'}, {'type': 'null'}], 'description': "The holder's nationality, ISO 3166-1 alpha-3. Null when none was read; it is not assumed from the issuing state."}}, 'additionalProperties': False}, 'ScanImages': {'type': 'object', 'required': ['document_crop', 'rear', 'main_photo', 'signature', 'watermark_face', 'barcode', 'chip'], 'properties': {'chip': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The chip area of the document, when it carries one.'}, 'rear': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The reverse side of the document, when the picture carried one and a crop of it was produced.'}, 'barcode': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The barcode area of the document, when it carries one.'}, 'signature': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': "The holder's signature as printed on the document."}, 'main_photo': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': "The holder's photograph as printed on the document."}, 'document_crop': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': 'The document itself, cropped out of the uploaded picture and deskewed – the front side of a card, the data page of a booklet.'}, 'watermark_face': {'anyOf': [{'type': 'string', 'pattern': '^data:image\\/(jpeg|png);base64,[A-Za-z0-9+/]+={0,2}$', 'description': 'Image as a `data:` URL with base64 payload.'}, {'type': 'null'}], 'description': "The faint second copy of the holder's face printed into the page as a security feature – a different image from `main_photo`, and the one a verifier compares against it. Null when the document carries none."}}, 'description': 'Image crops, returned in the recognition response only. Each is scaled down by height, proportionally and never upwards, to at most 250 px for `document_crop` and 100 px for every other crop, then re-encoded with every metadata block dropped.', 'additionalProperties': False}, 'ScanStatus': {'enum': ['recognized', 'no_document_found', 'unreadable', 'unsupported_document', 'rejected'], 'type': 'string', 'description': 'Outcome of a scan. Exactly these five string values; there are no numeric codes.'}, 'ScanTiming': {'type': 'object', 'required': ['upload_ms', 'processing_ms', 'total_ms'], 'properties': {'total_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': "From the request arriving to the result being complete. At least `upload_ms + processing_ms`; the remainder is the gates that run after `upload_ms` is taken – the allowance, the idempotency check and the credit hold – plus preparing the result images and mapping the engine's output into this body. It stops there: writing the history row and serializing the response happen after the number is fixed, so the same figure is stored and returned."}, 'upload_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': "From the request's headers reaching the server to its body being received and validated, with your key resolved and its rate limit checked. The allowance, idempotency and credit gates are claimed after this number is taken, so they are not in it. Dominated by your own connection and by how large the image is – this is the half you can shrink, by sending a smaller picture from closer by."}, 'processing_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': 'The recognition itself – the server-side engine call.'}}, 'description': "The split of the request's time. Null on a scan made before the split existed and read back out of storage: only the engine call was timed then, and the two halves cannot be recovered from it.", 'additionalProperties': False}, 'CheckResult': {'enum': ['pass', 'warn', 'fail'], 'type': 'string', 'description': 'Outcome of a single check.'}, 'ScanQuality': {'type': 'object', 'required': ['overall'], 'properties': {'overall': {'enum': ['not_checked', 'pass', 'warn', 'fail'], 'type': 'string', 'description': 'Whether the uploaded picture was good enough to recognize from. `not_checked` when nothing measured it – a scan read back from storage, which keeps no engine output.'}}, 'additionalProperties': False}, 'ScanDocument': {'type': 'object', 'required': ['kind', 'country', 'country_name', 'issuing_state', 'type_name', 'type_confidence', 'number', 'series', 'issue_date', 'expiry_date', 'is_expired', 'days_remaining'], 'properties': {'kind': {'type': 'string', 'minLength': 1, 'description': 'Document type, e.g. `passport`.'}, 'number': {'type': ['string', 'null'], 'example': 'AM7304518', 'description': 'The document number, as printed. Null when none was read. A series the document prints separately is in `series`, never folded into this value.'}, 'series': {'type': ['string', 'null'], 'description': 'The document series, for a document that prints one as a field of its own. Null when the document carries none or none was read; it is never split out of `number`.'}, 'country': {'anyOf': [{'type': 'string', 'example': 'GRC', 'pattern': '^[A-Z]{3}$', 'description': 'ISO 3166-1 alpha-3 country code.'}, {'type': 'null'}], 'description': 'The state that issued the document, ISO 3166-1 alpha-3. The same reading as `issuing_state` under the name most callers filter on; null when nothing was read.'}, 'type_name': {'type': ['string', 'null'], 'example': 'Greece - Passport', 'description': 'The document type under its full name. Null on a scan read back from storage, which keeps no engine output.'}, 'is_expired': {'type': ['boolean', 'null'], 'description': 'Whether the document had already expired when the scan was made. Null when no expiry date was read, which is a different answer from `false`.'}, 'issue_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$', 'description': 'Calendar date, ISO-8601 (`YYYY-MM-DD`).'}, {'type': 'null'}], 'description': 'The date the document was issued, ISO-8601 (`YYYY-MM-DD`). Null when none was read.'}, 'expiry_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$', 'description': 'Calendar date, ISO-8601 (`YYYY-MM-DD`).'}, {'type': 'null'}], 'description': 'The date the document expires, ISO-8601 (`YYYY-MM-DD`). Null when none was read; `is_expired` and `days_remaining` are computed from it.'}, 'country_name': {'type': ['string', 'null'], 'example': 'Greece', 'description': "The issuing state's name, as read from the document."}, 'issuing_state': {'anyOf': [{'type': 'string', 'example': 'GRC', 'pattern': '^[A-Z]{3}$', 'description': 'ISO 3166-1 alpha-3 country code.'}, {'type': 'null'}], 'description': 'The issuing state, ISO 3166-1 alpha-3 – the same reading as `country`, under the name the machine-readable zone gives it.'}, 'days_remaining': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Days until expiry at the time of the scan; negative once expired.'}, 'type_confidence': {'allOf': [{'$ref': '#/definitions/ConfidenceBand'}], 'description': 'How strongly the document-type match is backed.'}}, 'additionalProperties': False}, 'FieldCategory': {'enum': ['identity', 'document', 'dates', 'address', 'visa', 'other'], 'type': 'string', 'description': 'Which group of the report a field belongs to.'}, 'ConfidenceBand': {'enum': ['low', 'medium', 'high'], 'type': 'string', 'description': 'How strongly the recognition backs this value: `high`, `medium` or `low`. An unknown or missing probability reads as `low`.'}, 'ScanAuthenticity': {'type': 'object', 'required': ['overall', 'checks'], 'properties': {'checks': {'type': 'array', 'items': {'$ref': '#/definitions/ScanCheck'}, 'description': 'One entry per authenticity check that ran. Always present; empty under the recognition-only scenario, where nothing ran.'}, 'overall': {'enum': ['not_checked', 'pass', 'warn', 'fail'], 'type': 'string', 'description': '`not_checked` under the recognition-only scenario; populated by authenticity verification later.'}}, 'additionalProperties': False}}, 'additionalProperties': False}
search_docs
Search the doc.cheap API documentation
Full-text search over the doc.cheap API documentation – endpoints, request options, every response field, the error codes and what to do about each, MRZ rules, retention and pricing. Takes a query and an optional limit (1 to 20, default 5), and answers with the matching sections: title, a snippet, and a link to the page. It reads a copy of the documentation shipped beside this server, so it makes no network call and works offline. Use it before guessing at a field name, an error code or a scan option – what it returns is the published contract rather than a recollection of it.
Nur Lesen
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'maximum': 20, 'minimum': 1, 'description': 'Maximum number of results (default 5).'}, 'query': {'type': 'string', 'minLength': 1, 'description': 'What to search the documentation for.'}}}
Ausgabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['results'], 'properties': {'results': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'page', 'link', 'snippet', 'score'], 'properties': {'link': {'type': 'string', 'description': 'Address of the section on the documentation site.'}, 'page': {'type': 'string', 'description': 'Path of the page the section is on; empty for the home page.'}, 'score': {'type': 'number', 'description': 'Relevance: heading matches count five times a body match.'}, 'title': {'type': 'string', 'description': 'Heading of the matching documentation section.'}, 'snippet': {'type': 'string', 'description': "The start of the section's text."}}, 'additionalProperties': False}, 'description': 'Matching sections, best first; empty when nothing matched.'}}, 'additionalProperties': False}
Hinzugefügt
delete_scan
1. October 2026 02:42
Hinzugefügt
get_scan
1. October 2026 02:42
Hinzugefügt
list_scans
1. October 2026 02:42
Geändert
scan_document
1. October 2026 02:42
Geändert
check_balance
27. September 2026 02:40
Geändert
scan_document
27. September 2026 02:40
Hinzugefügt
search_docs
25. September 2026 02:40
Hinzugefügt
check_balance
25. September 2026 02:40
Hinzugefügt
scan_document
25. September 2026 02:40