Qué hace este MCP
Recognizes passports, national IDs, and driver's licences from images, returning structured document data and scan status.
Herramientas
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Esquema de salida
{'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}
Esquema de entrada
{'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)."}}}
Esquema de salida
{'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}
Esquema de entrada
{'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)."}}}
Esquema de salida
{'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}
Esquema de entrada
{'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.'}}}
Esquema de salida
{'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}
Esquema de entrada
{'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).'}}}
Esquema de salida
{'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}
Esquema de entrada
{'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.'}}}
Esquema de salida
{'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}
Cambios recientes en herramientas
Servidores MCP similares
osint-terminal
Provides keyless OSINT and reconnaissance tools for domains, DNS, IPs, breach exposure, threat intelligence, and related lookups.
AIMEAT
Provides a self-hosted agent operating system with agent work delegation, access controls, federation, hooks, SSO, security admin…
hyperion
Acts as a paid MCP tool marketplace and utility gateway with server discovery, HTTP and JavaScript tools, research, data conversi…
Vee3
Manages Clerk authentication infrastructure, including users, organizations, domains, sessions, tokens, OAuth, SSO, machines, per…
BorealHost
Provides web hosting and infrastructure management, including site deployment, DNS, domains, containers, compute, backups, cachin…
Proof Holdings
Provides domain verification, identity and delegation proofs, human approval workflows, trusted-contact challenges, and controlle…
GoCreative Agent API
Offers pay-per-call LLM completions and data services for company intelligence, KYB, sanctions screening, threat intelligence, co…
Japan Public Ledgers MCP
Provides agent identity, memory, audit, trust, proxy, temporary email, webhook, CAPTCHA, and alerting capabilities alongside publ…