curl -X POST "https://verification.didit.me/v3/database-validation/" \
-H "x-api-key: YOUR_API_KEY" \
-F "issuing_state=ARG" \
-F "services=arg_renaper" \
-F "vendor_data=user-1234" \
-F "document_number=11111111" \
-F "selfie=@./selfie.jpg" \
-F "gender=M"
from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.database_validation.validate(
issuing_state="ARG",
services=["arg_renaper"],
document_number="11111111",
gender="M",
vendor_data="user-1234",
selfie=open("selfie.jpg", "rb"),
)
print(result)
import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.databaseValidation.validate({
issuing_state: "ARG",
services: ["arg_renaper"],
document_number: "11111111",
gender: "M",
vendor_data: "user-1234",
selfie: await fileFromPath("selfie.jpg"),
});
console.log(result);
ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{
IssuingState: "ARG",
Services: didit.Some([]string{"arg_renaper"}),
DocumentNumber: didit.String("11111111"),
Gender: didit.Some(didit.DatabaseValidationValidateParamsGender("M")),
VendorData: didit.String("user-1234"),
Selfie: didit.Some(didit.FileFromPath("selfie.jpg")),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
import java.nio.file.Path;
import java.util.List;
import me.didit.Didit;
import me.didit.types.DatabaseValidationValidateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.databaseValidation().validate(DatabaseValidationValidateParams.builder()
.issuingState("ARG")
.services(List.of("arg_renaper"))
.documentNumber("11111111")
.gender(DatabaseValidationValidateParams.Gender.of("M"))
.vendorData("user-1234")
.selfie(Path.of("selfie.jpg"))
.build());
System.out.println(result);
<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
use Didit\File;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->databaseValidation->validate([
'issuing_state' => 'ARG',
'services' => ['arg_renaper'],
'document_number' => '11111111',
'gender' => 'M',
'vendor_data' => 'user-1234',
'selfie' => File::fromPath('selfie.jpg'),
]);
print_r($result->toArray());
require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.database_validation.validate(
issuing_state: "ARG",
services: ["arg_renaper"],
document_number: "11111111",
gender: "M",
vendor_data: "user-1234",
selfie: Pathname("selfie.jpg")
)
puts result.to_h
using System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.DatabaseValidation.ValidateAsync(new DatabaseValidationValidateParams
{
IssuingState = "ARG",
Services = new string[] { "arg_renaper" },
DocumentNumber = "11111111",
Gender = new DatabaseValidationValidateParamsGender("M"),
VendorData = "user-1234",
Selfie = FileUpload.FromPath("selfie.jpg"),
});
Console.WriteLine(JsonSerializer.Serialize(result));
{
"request_id": "req_01H…",
"status": "Approved",
"issuing_state": "ARG",
"match_type": "full_match",
"validations": [
{
"outcome_code": "MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"date_of_birth": "1990-01-01",
"face_match_score": "92",
"first_name": "John",
"full_name": "John Doe",
"identification_number": "SAMPLE-ID-12345",
"last_name": "Doe",
"tax_id": "SAMPLE-12345",
"tax_id_type": "SAMPLE-12345"
},
"validation": {
"identification_number": "full_match"
}
}
]
}
{
"request_id": "req_01H…",
"status": "Declined",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "NO_MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
{
"request_id": "req_01H…",
"status": "Declined",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "BIOMETRIC_NO_MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
{
"request_id": "req_01H…",
"status": "In Review",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "BIOMETRIC_IMAGE_UNUSABLE",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
🇦🇷 Argentina
Argentina - DNI verification (RENAPER) API
Argentina - DNI verification (RENAPER): authoritative Argentina database lookup via Didit. Pay-per-call from $0.20, no contracts, no minimums.
POST
/
v3
/
database-validation
/
curl -X POST "https://verification.didit.me/v3/database-validation/" \
-H "x-api-key: YOUR_API_KEY" \
-F "issuing_state=ARG" \
-F "services=arg_renaper" \
-F "vendor_data=user-1234" \
-F "document_number=11111111" \
-F "selfie=@./selfie.jpg" \
-F "gender=M"
from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.database_validation.validate(
issuing_state="ARG",
services=["arg_renaper"],
document_number="11111111",
gender="M",
vendor_data="user-1234",
selfie=open("selfie.jpg", "rb"),
)
print(result)
import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.databaseValidation.validate({
issuing_state: "ARG",
services: ["arg_renaper"],
document_number: "11111111",
gender: "M",
vendor_data: "user-1234",
selfie: await fileFromPath("selfie.jpg"),
});
console.log(result);
ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{
IssuingState: "ARG",
Services: didit.Some([]string{"arg_renaper"}),
DocumentNumber: didit.String("11111111"),
Gender: didit.Some(didit.DatabaseValidationValidateParamsGender("M")),
VendorData: didit.String("user-1234"),
Selfie: didit.Some(didit.FileFromPath("selfie.jpg")),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
import java.nio.file.Path;
import java.util.List;
import me.didit.Didit;
import me.didit.types.DatabaseValidationValidateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.databaseValidation().validate(DatabaseValidationValidateParams.builder()
.issuingState("ARG")
.services(List.of("arg_renaper"))
.documentNumber("11111111")
.gender(DatabaseValidationValidateParams.Gender.of("M"))
.vendorData("user-1234")
.selfie(Path.of("selfie.jpg"))
.build());
System.out.println(result);
<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
use Didit\File;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->databaseValidation->validate([
'issuing_state' => 'ARG',
'services' => ['arg_renaper'],
'document_number' => '11111111',
'gender' => 'M',
'vendor_data' => 'user-1234',
'selfie' => File::fromPath('selfie.jpg'),
]);
print_r($result->toArray());
require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.database_validation.validate(
issuing_state: "ARG",
services: ["arg_renaper"],
document_number: "11111111",
gender: "M",
vendor_data: "user-1234",
selfie: Pathname("selfie.jpg")
)
puts result.to_h
using System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.DatabaseValidation.ValidateAsync(new DatabaseValidationValidateParams
{
IssuingState = "ARG",
Services = new string[] { "arg_renaper" },
DocumentNumber = "11111111",
Gender = new DatabaseValidationValidateParamsGender("M"),
VendorData = "user-1234",
Selfie = FileUpload.FromPath("selfie.jpg"),
});
Console.WriteLine(JsonSerializer.Serialize(result));
{
"request_id": "req_01H…",
"status": "Approved",
"issuing_state": "ARG",
"match_type": "full_match",
"validations": [
{
"outcome_code": "MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"date_of_birth": "1990-01-01",
"face_match_score": "92",
"first_name": "John",
"full_name": "John Doe",
"identification_number": "SAMPLE-ID-12345",
"last_name": "Doe",
"tax_id": "SAMPLE-12345",
"tax_id_type": "SAMPLE-12345"
},
"validation": {
"identification_number": "full_match"
}
}
]
}
{
"request_id": "req_01H…",
"status": "Declined",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "NO_MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
{
"request_id": "req_01H…",
"status": "Declined",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "BIOMETRIC_NO_MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
{
"request_id": "req_01H…",
"status": "In Review",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "BIOMETRIC_IMAGE_UNUSABLE",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
Verifies Argentine DNI against the official RENAPER civil registry, with biometric face-match against the photo on file. 100% population coverage. Didit exposes this service through
With a Liveness step before it, RENAPER compares the live selfie. Without one, Didit sends the portrait printed on the ID document instead, which confirms the document photo but not that the person in front of the camera is its holder. A service ID the workflow cannot run is rejected with a
POST /v3/database-validation/ so you can verify the submitted data against the authoritative source and receive normalized match results.
Coverage
- Coverage: 100%
- Country: Argentina
- Service ID:
arg_renaper - Data domain: Identity
- Category: NationalIDRegistry
Inputs
| Field | Required | Example |
|---|---|---|
document_number | Yes | 11111111 |
selfie | Yes | @./selfie.jpg |
gender | Yes | M |
first_name | No | John |
last_name | No | Doe |
date_of_birth | No | 1990-01-01 |
vendor_data | No | user-1234 |
- Required inputs:
document_number,selfie,gender - Optional inputs:
first_name,last_name,date_of_birth,vendor_data - Consent: Not required
- Workflow availability: Available in workflow
- Coverage: 100%
- Price: $0.20 per successful query
Body parameters
string
default:"ARG"
required
ISO 3166-1 alpha-3 country code for this database service.Example:
ARGstring
default:"arg_renaper"
required
Array containing this service ID. Pinning the service keeps the request scoped to this exact database.Example:
arg_renaperstring
default:"11111111"
required
Document number extracted from or provided by the user.Example:
11111111file
required
Selfie image file to upload for biometric database validation. Accepted formats: JPEG, PNG, or WebP.Example:
@./selfie.jpgstring
default:"M"
required
Gender value, when required by the database.Allowed values:
M (male), F (female), X (other or unknown).Example: Mstring
Given name to validate.Example:
Johnstring
Family name to validate.Example:
Doestring
Date of birth in
YYYY-MM-DD format.Example: 1990-01-01string
default:"user-1234"
Your stable user reference for this person, such as your internal user ID. Didit uses it to link standalone checks to the same end user and reduce duplicate-detection noise.Example:
user-1234Input rules & validation notes
- Argentine DNI (7-8 digits, optional M/F prefix)
document_numbermust be 7-9 characters long.document_numbermust match[MFmf]?\d{7,8}.
How to call it
curl -X POST "https://verification.didit.me/v3/database-validation/" \
-H "x-api-key: YOUR_API_KEY" \
-F "issuing_state=ARG" \
-F "services=arg_renaper" \
-F "vendor_data=user-1234" \
-F "document_number=11111111" \
-F "selfie=@./selfie.jpg" \
-F "gender=M"
from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.database_validation.validate(
issuing_state="ARG",
services=["arg_renaper"],
document_number="11111111",
gender="M",
vendor_data="user-1234",
selfie=open("selfie.jpg", "rb"),
)
print(result)
import Didit, { fileFromPath } from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.databaseValidation.validate({
issuing_state: "ARG",
services: ["arg_renaper"],
document_number: "11111111",
gender: "M",
vendor_data: "user-1234",
selfie: await fileFromPath("selfie.jpg"),
});
console.log(result);
ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{
IssuingState: "ARG",
Services: didit.Some([]string{"arg_renaper"}),
DocumentNumber: didit.String("11111111"),
Gender: didit.Some(didit.DatabaseValidationValidateParamsGender("M")),
VendorData: didit.String("user-1234"),
Selfie: didit.Some(didit.FileFromPath("selfie.jpg")),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
import java.nio.file.Path;
import java.util.List;
import me.didit.Didit;
import me.didit.types.DatabaseValidationValidateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.databaseValidation().validate(DatabaseValidationValidateParams.builder()
.issuingState("ARG")
.services(List.of("arg_renaper"))
.documentNumber("11111111")
.gender(DatabaseValidationValidateParams.Gender.of("M"))
.vendorData("user-1234")
.selfie(Path.of("selfie.jpg"))
.build());
System.out.println(result);
<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
use Didit\File;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->databaseValidation->validate([
'issuing_state' => 'ARG',
'services' => ['arg_renaper'],
'document_number' => '11111111',
'gender' => 'M',
'vendor_data' => 'user-1234',
'selfie' => File::fromPath('selfie.jpg'),
]);
print_r($result->toArray());
require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.database_validation.validate(
issuing_state: "ARG",
services: ["arg_renaper"],
document_number: "11111111",
gender: "M",
vendor_data: "user-1234",
selfie: Pathname("selfie.jpg")
)
puts result.to_h
using System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.DatabaseValidation.ValidateAsync(new DatabaseValidationValidateParams
{
IssuingState = "ARG",
Services = new string[] { "arg_renaper" },
DocumentNumber = "11111111",
Gender = new DatabaseValidationValidateParamsGender("M"),
VendorData = "user-1234",
Selfie = FileUpload.FromPath("selfie.jpg"),
});
Console.WriteLine(JsonSerializer.Serialize(result));
Every successful call returns HTTP 200. The outcome_code field tells you what actually happened — distinguishing, for example, a real biometric mismatch (BIOMETRIC_NO_MATCH) from a selfie that could not be read (BIOMETRIC_IMAGE_UNUSABLE). The status shown is the default feature status; your configured Partial Match / No Match actions can override it.MATCH — The registry confirmed the identity and every checked field matched.{
"request_id": "req_01H…",
"status": "Approved",
"issuing_state": "ARG",
"match_type": "full_match",
"validations": [
{
"outcome_code": "MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"date_of_birth": "1990-01-01",
"face_match_score": "92",
"first_name": "John",
"full_name": "John Doe",
"identification_number": "SAMPLE-ID-12345",
"last_name": "Doe",
"tax_id": "SAMPLE-12345",
"tax_id_type": "SAMPLE-12345"
},
"validation": {
"identification_number": "full_match"
}
}
]
}
NO_MATCH — The registry returned no match for the submitted data.{
"request_id": "req_01H…",
"status": "Declined",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "NO_MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
BIOMETRIC_NO_MATCH — The face-match score was below the acceptance threshold - the selfie is not the same person as the registry photo.{
"request_id": "req_01H…",
"status": "Declined",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "BIOMETRIC_NO_MATCH",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
BIOMETRIC_IMAGE_UNUSABLE — The selfie could not be processed (empty, no face, low quality, or the registry could not read it). Prompt the user to retake the selfie.{
"request_id": "req_01H…",
"status": "In Review",
"issuing_state": "ARG",
"match_type": "no_match",
"validations": [
{
"outcome_code": "BIOMETRIC_IMAGE_UNUSABLE",
"service_id": "arg_renaper",
"service_name": "Argentina - DNI verification (RENAPER)",
"source_data": {
"identification_number": "NO_MATCH"
},
"validation": {
"identification_number": "no_match"
}
}
]
}
Returned data
The exact fields surfaced insource_data depend on what the registry returns. The generated example for arg_renaper currently documents this normalized shape:
date_of_birthface_match_scorefirst_namefull_nameidentification_numberlast_nametax_idtax_id_type
Pricing & SLAs
Argentina - DNI verification (RENAPER) queries are billed only when Didit receives a conclusive result from the validation source.- Per-call price: $0.20 USD.
- Billing: per successful query. You are not charged when the registry is unreachable, when required fields are missing, or when the request is rejected before reaching the source.
- Latency: typical p95 < 2 s.
- Availability: 99.9% per quarter on Didit’s side; downstream source availability varies by country and dataset.
Face match score
face_match_score is RENAPER’s similarity between the selfie and the photo on file for the DNI, sent as a whole number from 0 to 100 in a string, for example "92". It is not a probability between 0 and 1.
The check returns BIOMETRIC_NO_MATCH when RENAPER reports that the face does not match, or when the score is below 50. At 50 or above the face is accepted, and the registered name and date of birth are then compared with the data you sent.
The photo on file can be several years old, so a genuine user can score low after a large change in appearance. Consider sending BIOMETRIC_NO_MATCH to manual review rather than declining it outright, with the Partial Match / No Match actions.
When RENAPER does not answer
If RENAPER cannot be reached or answers with an error, the result isREGISTRY_UNAVAILABLE: nothing about the person was checked, and the call is not billed. The same request can succeed when you retry it later. See Outcome Codes for how to handle it.
Documents a workflow reads
Inside a workflow, the DNI number and gender come from the ID Verification step, which reads the Argentine DNI card and the digital DNI. Foreign residents hold the same DNI card and are verified the same way. The old booklet DNI (libreta) is not a supported ID Verification document, so a user who only holds one cannot complete that step. You can still check their DNI number directly withPOST /v3/database-validation/.
Use it in a workflow
Add the service to a Database Validation step after ID Verification. For example, withPOST /v3/workflows/:
{
"workflow_label": "Argentina KYC with RENAPER",
"features": [
{"feature": "OCR"},
{"feature": "LIVENESS", "config": {"face_liveness_method": "PASSIVE"}},
{
"feature": "DATABASE_VALIDATION",
"config": {"database_validation_countries": {"ARG": {"services": ["arg_renaper"]}}}
}
]
}
400 that names it, so the step is never saved without the check you asked for. See Workflow Feature Configs for every Database Validation setting.
Continue reading
Last modified on October 29, 2026