Skip to main content

The first-level fields

Inside front and back

The back’s validations

The most expensive trap: a mismatched back is not an HTTP error. Front of one document + back of another = 200 / "Operation end successfully." — the OCR did work, on both images; that is why the analysis “succeeded”. The detection lives in back.frontBackTemplateValidation: false (with backIsTheSameIdTypeThatFront: 1). A system that decides on the status code accepts documents assembled from two different IDs.

The other 200 that approves nothing

A photo with no readable document returns 200 with message: "Cant get document fields", id: "unknown", an empty viz — and an unsolicited events block with the pipeline trace:
Treat it as “ask the user for another capture”, never as an approval with empty fields.

crossMatchConfidence

Consistency between data sources, as 0–100 percentages per field:
An 88.9 on one field usually means one doubtful OCR character. On the front alone, crossMatchConfidence is typically {} — there is only one source to compare; that is normal, not a failure.
The service imposes no threshold. The acceptance policy over crossMatchConfidence is yours: a strict onboarding may demand 100 on the document number and tolerate less on names.

Document antispoofing is informational

With antiSpoofingDocument / antiSpoofingFaceInDocument, the response adds security.* blocks (screen recapture, photocopy, tampering scores — e.g. 94.69, 99) and face.isSpoofing.
These verdicts do not change the HTTP code or message: a document flagged as recaptured still returns 200 / "Operation end successfully.". If your policy rejects on these signals, evaluate them explicitly. An empty security block ({}) means “not evaluated”, not “clean”.

Deserializer particularities

  1. mrz.expected is tri-state: true / false / absent.
  2. The values inside mrz.extras are strings, even when they look numeric.
  3. barcode.result is a 1-element array, not an object.
  4. isNativePersonDocument is tri-state as well.
  5. viz is template-driven: never hard-code the field set; read GET /{templateId}/details.
  6. Responses weigh ~1 MB (embedded base64 images): size buffers accordingly and never log raw bodies.

Next: Errors

Status codes, the 422 that echoes your whole request — image included — and which errors are safe to retry.
Last modified on September 9, 2026