When you run a Database Validation, you get back two layers of result:
- A standard outcome code that works the same way across every supported country, so you can write one piece of handling logic that covers all of them.
- An optional country-specific detail code that tells you exactly which condition the government registry returned — useful for support, analytics, and deciding whether to prompt the user to retry.
This page lists every value you can see and tells you how to react to each one.
Standard outcome codes
These codes are identical across every country. Build your review, decline, and retry logic on top of these — not on the per-country detail codes.
| Outcome code | Meaning | Retryable? | Recommended handling |
|---|
MATCH | The registry confirmed the identity and every checked field matched. | — | Approve. |
PARTIAL_MATCH | The identification number was found but one or more personal fields did not fully match (usually name or date of birth). | — | Send to review or configure a Partial Match Action to auto-decline. |
NO_MATCH | The registry returned no match for the submitted data. | No | Decline, or send to review depending on your policy. |
DOCUMENT_NOT_FOUND | The identification number is syntactically valid but does not exist in the government registry. | No | Decline. |
INVALID_DOCUMENT_FORMAT | The submitted identification number is malformed (wrong length, non-numeric, bad checksum). | No | Ask the user to re-enter their document number. |
INVALID_INPUT | A required input field (selfie, gender, date of birth, etc.) was missing or malformed. | No | Ask the user to resubmit the missing field. The session will automatically reprocess once the data is provided — see COULD_NOT_PERFORM_DATABASE_VALIDATION. |
MINOR_BLOCKED | The registry withheld the record because the subject is a minor. Applies in jurisdictions with data-protection laws for minors (Brazil LGPD, Argentina). | No | Decline. Respect the local legal framework — do not retry. |
DECEASED | The registry reports that the subject is deceased. | No | Decline. |
BIOMETRIC_NO_MATCH | For biometric validations (Argentina, Panama), the face-match score was below the acceptance threshold. | No | Decline, or send to review. |
BIOMETRIC_IMAGE_UNUSABLE | The selfie could not be processed — image was empty, had no face, had low quality, or the registry could not read it. | Yes | Prompt the user to retake the selfie. |
REGISTRY_UNAVAILABLE | The government registry is temporarily unreachable (timeout, connectivity error, upstream 5xx). | Yes | Retry after a short delay. Didit already retries transient errors automatically, so seeing this in the final report means the retries were exhausted. |
REGISTRY_ERROR | The registry returned an unexpected failure that does not fit any of the buckets above. | Maybe | Escalate to support with the detail code. |
The outcome_code lives inside each entry of the validations array on the validation report. See Database Validation Report for where it fits in the response.
Country-specific detail codes
The detail code is returned as outcome_detail alongside outcome_code. Only countries listed below produce detail codes beyond the standard outcome — every other supported country returns the standard codes only.
Argentina (RENAPER)
Argentina uses a biometric 1×1 validation against the RENAPER national identity registry, combining the DNI, a selfie, and declared gender.
| Detail code | Standard outcome | What it means |
|---|
300 | INVALID_DOCUMENT_FORMAT | The DNI field must be a 7–8 digit number. |
301 | DOCUMENT_NOT_FOUND | The submitted DNI does not match a valid record. |
303 | INVALID_INPUT | The selfie field was empty. |
304 | INVALID_INPUT | The gender field was empty or not one of M, F, X. |
305 | NO_MATCH | The DNI and gender combination was not found. |
306 | REGISTRY_UNAVAILABLE | The query cannot be carried out at this time. |
307 | REGISTRY_UNAVAILABLE | Error connecting to the public identity validation system. |
311 | REGISTRY_ERROR | The integration does not have access to this product. |
313 | MINOR_BLOCKED | The record belongs to an underage person. |
400 | REGISTRY_UNAVAILABLE | Connection error. |
401 | NO_MATCH | No results found for the provided data. |
405 | BIOMETRIC_IMAGE_UNUSABLE | Conflict with the image; it cannot be processed. |
406 | BIOMETRIC_IMAGE_UNUSABLE | Error in image processing. |
NO.HIT | BIOMETRIC_NO_MATCH | The face-match score was below the acceptance threshold (< 50). |
INTERNAL_ERROR | REGISTRY_UNAVAILABLE | Timeout exceeded. |
Brazil (Receita Federal — Consulta CPF)
Brazil validates the CPF against the Receita Federal’s official CPF service, with explicit handling for minors under the LGPD (Lei Geral de Proteção de Dados) and the Children’s and Adolescents’ Digital Statute.
| Detail code | Standard outcome | What it means |
|---|
200 | MATCH | CPF found and data returned successfully. |
206 | MATCH | CPF found, but some non-essential fields were not returned. |
400 | INVALID_DOCUMENT_FORMAT | CPF number is not valid. |
404 | DOCUMENT_NOT_FOUND | No CPF exists with the submitted number. |
422 | MINOR_BLOCKED | Data for a minor under 18 is withheld per LGPD (Law 13.709/2018). The response includes minor_under_18: true. |
451 | MINOR_BLOCKED | Data for a minor under 16 is withheld per LGPD and the Children’s and Adolescents’ Digital Statute (Law 15.211/2025). The response includes minor_under_18: true and minor_under_16: true. |
500 | REGISTRY_UNAVAILABLE | Upstream server error. |
504 | REGISTRY_UNAVAILABLE | Gateway timeout — the request did not reach the Consulta CPF API. |
For MINOR_BLOCKED outcomes in Brazil, source_data still returns the lgpd_minor, minor_under_18, and minor_under_16 flags so you can apply age-appropriate flows without retrying.
Panama (SIB — Tribunal Electoral)
Panama uses biometric validation against the SIB (Servicio de Identificación Biométrica) registry operated by the Tribunal Electoral. If a technical SIB error occurs, the session falls back to a 1×1 lookup automatically.
| Detail code | Standard outcome | What it means |
|---|
601 | REGISTRY_UNAVAILABLE | Operator does not exist in the database. |
602 | MINOR_BLOCKED | Citizen is under 12 years old. |
603 | DECEASED | Citizen is deceased. |
604 | NO_MATCH | Citizen has an invalid registration. |
605 | NO_MATCH | Citizen not recognized. |
606 | INVALID_INPUT | Cédula field is empty. |
607 | DOCUMENT_NOT_FOUND | Citizen not found. |
608 | REGISTRY_ERROR | No SIB access for this client. |
610 | BIOMETRIC_IMAGE_UNUSABLE | General facial validation error. |
611 | BIOMETRIC_IMAGE_UNUSABLE | Image for comparison was not sent. |
612 | BIOMETRIC_IMAGE_UNUSABLE | Image has no content. |
613 | BIOMETRIC_IMAGE_UNUSABLE | Invalid image format. |
614 | BIOMETRIC_IMAGE_UNUSABLE | No face detected in the image. |
615 | BIOMETRIC_NO_MATCH | Similarity threshold not reached. |
Other supported countries
The countries below return the standard outcome codes only — there are no country-specific detail codes to handle.
- Bolivia, Colombia, Costa Rica, El Salvador, Guatemala, Honduras, Paraguay, Spain, Uruguay, Venezuela — 1×1 lookup against the corresponding civil registry. Results map directly to
MATCH, NO_MATCH, DOCUMENT_NOT_FOUND, INVALID_DOCUMENT_FORMAT, or REGISTRY_UNAVAILABLE.
- Chile (Registro Civil) — RUT lookup. Maps to the standard outcomes plus
MINOR_BLOCKED when the registry flags an underage record.
- Dominican Republic (JCE) — Cédula lookup that returns a boolean validity; maps to
MATCH or NO_MATCH.
- Ecuador (Registro Civil) — Cédula lookup.
- Mexico (RENAPO, plus INE for 2×2) — CURP lookup via RENAPO. When
validation_type is two_by_two, an additional INE cross-reference runs; both feed into the same standard outcome codes.
- Peru (RENIEC) — DNI lookup.
Handling recipe
The simplest robust handler looks like this:
switch (result.outcome_code) {
case "MATCH":
return approve();
case "PARTIAL_MATCH":
return review();
case "NO_MATCH":
case "DOCUMENT_NOT_FOUND":
case "DECEASED":
case "MINOR_BLOCKED":
case "BIOMETRIC_NO_MATCH":
return decline();
case "INVALID_DOCUMENT_FORMAT":
case "INVALID_INPUT":
return askUserToFixInput(result.outcome_detail);
case "BIOMETRIC_IMAGE_UNUSABLE":
return askUserToRetakeSelfie();
case "REGISTRY_UNAVAILABLE":
case "REGISTRY_ERROR":
return review(); // Didit already retried; a human can decide.
default:
return review();
}
You don’t need to branch on outcome_detail for business logic — use it for analytics, debugging, and support tickets. The standard outcome_code is guaranteed to stay stable across countries and over time.
See also