> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Brasilien CPF Gesichtsabgleich API (Datavalid): ID Match

> Brasilien CPF + Gesichtsabgleich (Datavalid) via Didit: amtliche Datenbankabfrage. Pay-per-call ab $0.45, ohne Verträge oder Mindestabnahme.

SERPRO Datavalid v4 pf-facial prüft die CPF (Pflicht) gegen die Receita Federal und gleicht das Live-Selfie (Pflicht) mit dem im Senatran hinterlegten CNH-Porträt ab. Optional werden Name und Geburtsdatum geprüft. Didit stellt diesen Dienst über `POST /v3/database-validation/` bereit, damit Sie die übermittelten Daten mit der maßgeblichen Quelle abgleichen und normalisierte Abgleichsergebnisse erhalten. Eingabeformat: `tax_number` nimmt die brasilianische CPF entgegen (genau 11 Ziffern).

## Abdeckung

* **Abdeckung:** \~50%
* **Land:** Brasilien
* **Dienst-ID:** `bra_cpf_facial`
* **Datenbereich:** Biometrisch
* **Kategorie:** NationalIDRegistry

Etwa 50% der erwachsenen Brasilianer können abgeglichen werden: Der Gesichtsabgleich stützt sich auf das im Senatran hinterlegte CNH-Porträt, daher können nur Führerscheininhaber (CNH) abgeglichen werden.

## Eingaben

| Feld | Pflicht | Beispiel |
| - | -: | - |
| `tax_number` | Ja | `11111111111` |
| `selfie` | Ja | `@./selfie.jpg` |
| `first_name` | Nein | `John` |
| `last_name` | Nein | `Doe` |
| `date_of_birth` | Nein | `1990-01-01` |
| `vendor_data` | Nein | `user-1234` |

* **Pflichteingaben:** `tax_number`, `selfie`
* **Optionale Eingaben:** `first_name`, `last_name`, `date_of_birth`, `vendor_data`
* **Einwilligung:** Erforderlich
* **Verfügbarkeit im Workflow:** Im Workflow verfügbar
* **Abdeckung:** \~50%
* **Preis:** \$0.45 pro erfolgreiche Abfrage

## Body-Parameter

**issuing\_state** `string` *required* (default: BRA)

ISO-3166-1-Alpha-3-Ländercode für diesen Datenbankdienst.

Beispiel: `BRA`

**services** `string` *required* (default: bra\_cpf\_facial)

Array, das diese Dienst-ID enthält. Das Festlegen des Dienstes beschränkt die Anfrage auf genau diese Datenbank.

Beispiel: `bra_cpf_facial`

**consent** `boolean` *required* (default: true)

Ausdrückliche Einwilligung des Endbenutzers für diesen Dienst.

Beispiel: `true`

**tax\_number** `string` *required* (default: 11111111111)

Steuer- oder Fiskalidentifikationsnummer.

Beispiel: `11111111111`

**selfie** `file` *required*

Selfie-Bilddatei für die biometrische Datenbankvalidierung. Akzeptierte Formate: JPEG, PNG oder WebP.

Beispiel: `@./selfie.jpg`

**first\_name** `string`

Zu validierender Vorname.

Beispiel: `John`

**last\_name** `string`

Zu validierender Nachname.

Beispiel: `Doe`

**date\_of\_birth** `string`

Geburtsdatum im Format `YYYY-MM-DD`.

Beispiel: `1990-01-01`

**vendor\_data** `string` (default: user-1234)

Ihre stabile Benutzerreferenz für diese Person, etwa Ihre interne Benutzer-ID. Didit verwendet sie, um eigenständige Prüfungen demselben Endbenutzer zuzuordnen und Störsignale bei der Duplikaterkennung zu reduzieren.

Beispiel: `user-1234`

## Eingaberegeln und Hinweise zur Validierung

* Brasilianische CPF (genau 11 Ziffern)
* `tax_number` darf nur Ziffern enthalten; entfernen Sie vor dem Senden der Anfrage Leerzeichen, Bindestriche und Satzzeichen.
* `tax_number` muss genau 11 Zeichen lang sein.

## So rufen Sie den Endpunkt auf

```bash cURL theme={null}
curl -X POST "https://verification.didit.me/v3/database-validation/" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "issuing_state=BRA" \
  -F "services=bra_cpf_facial" \
  -F "vendor_data=user-1234" \
  -F "consent=true" \
  -F "tax_number=11111111111" \
  -F "selfie=@./selfie.jpg"
```

```python Python theme={null}
from didit import Didit

# Reads DIDIT_API_KEY.
client = Didit()

result = client.database_validation.validate(
    issuing_state="BRA",
    services=["bra_cpf_facial"],
    consent=True,
    tax_number="11111111111",
    vendor_data="user-1234",
    selfie=open("selfie.jpg", "rb"),
)
print(result)
```

```javascript Node.js theme={null}
import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

// Reads DIDIT_API_KEY.
const didit = new Didit();

const result = await didit.databaseValidation.validate({
  issuing_state: "BRA",
  services: ["bra_cpf_facial"],
  consent: true,
  tax_number: "11111111111",
  vendor_data: "user-1234",
  selfie: await fileFromPath("selfie.jpg"),
});
console.log(result);
```

```go Go theme={null}
ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()

result, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{
	IssuingState: "BRA",
	Services:     didit.Some([]string{"bra_cpf_facial"}),
	Consent:      didit.Bool(true),
	TaxNumber:    didit.String("11111111111"),
	VendorData:   didit.String("user-1234"),
	Selfie:       didit.Some(didit.FileFromPath("selfie.jpg")),
})
if err != nil {
	log.Fatal(err)
}
fmt.Printf("%+v\n", result)
```

```java Java theme={null}
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("BRA")
        .services(List.of("bra_cpf_facial"))
        .consent(true)
        .taxNumber("11111111111")
        .vendorData("user-1234")
        .selfie(Path.of("selfie.jpg"))
        .build());
System.out.println(result);
```

```php PHP theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;
use Didit\File;

// Reads DIDIT_API_KEY.
$didit = new DiditClient();

$result = $didit->databaseValidation->validate([
    'issuing_state' => 'BRA',
    'services' => ['bra_cpf_facial'],
    'consent' => true,
    'tax_number' => '11111111111',
    'vendor_data' => 'user-1234',
    'selfie' => File::fromPath('selfie.jpg'),
]);
print_r($result->toArray());
```

```ruby Ruby theme={null}
require "didit"

# Reads DIDIT_API_KEY.
didit = Didit::Client.new

result = didit.database_validation.validate(
  issuing_state: "BRA",
  services: ["bra_cpf_facial"],
  consent: true,
  tax_number: "11111111111",
  vendor_data: "user-1234",
  selfie: Pathname("selfie.jpg")
)
puts result.to_h
```

```csharp .NET theme={null}
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 = "BRA",
    Services = new string[] { "bra_cpf_facial" },
    Consent = true,
    TaxNumber = "11111111111",
    VendorData = "user-1234",
    Selfie = FileUpload.FromPath("selfie.jpg"),
});
Console.WriteLine(JsonSerializer.Serialize(result));
```

Jeder erfolgreiche Aufruf liefert HTTP `200` zurück. Das Feld **`outcome_code`** zeigt Ihnen, was tatsächlich passiert ist, und unterscheidet beispielsweise einen echten biometrischen Nichtabgleich (`BIOMETRIC_NO_MATCH`) von einem Selfie, das nicht verarbeitet werden konnte (`BIOMETRIC_IMAGE_UNUSABLE`). Der angezeigte `status` ist der Standardstatus der Funktion; Ihre konfigurierten [Aktionen für teilweise Übereinstimmung und keine Übereinstimmung](https://docs.didit.me/de/core-technology/database-validation/database-validation-warnings.md) können ihn überschreiben.

**`MATCH`**: Das Register hat die Identität bestätigt, und alle geprüften Felder stimmen überein.

```json 200 OK — MATCH theme={null}
{
  "request_id": "req_01H…",
  "status": "Approved",
  "issuing_state": "BRA",
  "match_type": "full_match",
  "validations": [
    {
      "outcome_code": "MATCH",
      "service_id": "bra_cpf_facial",
      "service_name": "Brazil - CPF + face match (Datavalid)",
      "source_data": {
        "date_of_birth": "1990-01-01",
        "face_match_probability": "Altíssima probabilidade",
        "face_match_score": "0.990",
        "first_name": "John",
        "identification_number": "SAMPLE-ID-12345",
        "last_name": "Doe",
        "name_match_score": "1.000",
        "verifications": {
          "identification_number": true
        }
      },
      "validation": {
        "identification_number": "full_match"
      }
    }
  ]
}
```

**`NO_MATCH`**: Das Register hat für die übermittelten Daten keine Übereinstimmung geliefert.

```json 200 OK — NO_MATCH theme={null}
{
  "request_id": "req_01H…",
  "status": "Declined",
  "issuing_state": "BRA",
  "match_type": "no_match",
  "validations": [
    {
      "outcome_code": "NO_MATCH",
      "service_id": "bra_cpf_facial",
      "service_name": "Brazil - CPF + face match (Datavalid)",
      "source_data": {
        "identification_number": "NO_MATCH"
      },
      "validation": {
        "identification_number": "no_match"
      }
    }
  ]
}
```

**`BIOMETRIC_NO_MATCH`**: Der Gesichtsabgleichswert lag unter dem Akzeptanzschwellenwert. Das Selfie zeigt nicht dieselbe Person wie das Registerfoto.

```json 200 OK — BIOMETRIC_NO_MATCH theme={null}
{
  "request_id": "req_01H…",
  "status": "Declined",
  "issuing_state": "BRA",
  "match_type": "no_match",
  "validations": [
    {
      "outcome_code": "BIOMETRIC_NO_MATCH",
      "service_id": "bra_cpf_facial",
      "service_name": "Brazil - CPF + face match (Datavalid)",
      "source_data": {
        "identification_number": "NO_MATCH"
      },
      "validation": {
        "identification_number": "no_match"
      }
    }
  ]
}
```

**`BIOMETRIC_IMAGE_UNUSABLE`**: Das Selfie konnte nicht verarbeitet werden (leer, kein Gesicht, geringe Qualität oder das Register konnte es nicht lesen). Fordern Sie den Endbenutzer auf, das Selfie erneut aufzunehmen.

```json 200 OK — BIOMETRIC_IMAGE_UNUSABLE theme={null}
{
  "request_id": "req_01H…",
  "status": "In Review",
  "issuing_state": "BRA",
  "match_type": "no_match",
  "validations": [
    {
      "outcome_code": "BIOMETRIC_IMAGE_UNUSABLE",
      "service_id": "bra_cpf_facial",
      "service_name": "Brazil - CPF + face match (Datavalid)",
      "source_data": {
        "identification_number": "NO_MATCH"
      },
      "validation": {
        "identification_number": "no_match"
      }
    }
  ]
}
```

**`INCONCLUSIVE`**: Das Register hat die CPF bestätigt (sowie den Namen und das Geburtsdatum, die Sie gesendet haben), das Gesicht konnte jedoch nicht verglichen werden. Entweder liegt für diese CPF kein Referenzfoto vor, oder das Selfie war nicht verwendbar (kein Gesicht erkannt, falsche Bildgröße, geringe Qualität oder mehr als ein Gesicht). Die bestätigten Felder bleiben in `validation` erhalten, daher spiegelt `match_type` sie wider. Die verpflichtende Gesichtsprüfung ist jedoch nicht abgeschlossen, daher wird die Prüfung zur Durchsicht weitergeleitet. Bitten Sie um ein neues Selfie oder greifen Sie für Personen ohne hinterlegtes Foto auf die Dokumentenverifizierung zurück.

```json 200 OK — INCONCLUSIVE theme={null}
{
  "request_id": "req_01H…",
  "status": "In Review",
  "issuing_state": "BRA",
  "match_type": "full_match",
  "validations": [
    {
      "outcome_code": "INCONCLUSIVE",
      "service_id": "bra_cpf_facial",
      "service_name": "Brazil - CPF + face match (Datavalid)",
      "source_data": {
        "date_of_birth": "1990-01-01",
        "first_name": "John",
        "identification_number": "SAMPLE-ID-12345",
        "last_name": "Doe",
        "name_match_score": "1.000"
      },
      "validation": {
        "identification_number": "full_match"
      }
    }
  ]
}
```

## Zurückgegebene Daten

Welche Felder genau in `source_data` erscheinen, hängt davon ab, was das Register zurückgibt. Das generierte Beispiel für `bra_cpf_facial` dokumentiert derzeit diese normalisierte Struktur:

* `date_of_birth`
* `first_name`
* `identification_number`
* `last_name`
* `name_match_score`

## Preise und SLAs

Brasilien: Abfragen für den CPF- und Gesichtsabgleich (Datavalid) werden nur abgerechnet, wenn Didit ein eindeutiges Ergebnis der Validierungsquelle erhält.

* **Preis pro Aufruf:** \$0.45 USD.
* **Abrechnung:** pro erfolgreiche Abfrage. Sie werden nicht belastet, wenn das Register nicht erreichbar ist, wenn Pflichtfelder fehlen oder wenn die Anfrage abgelehnt wird, bevor sie die Quelle erreicht.
* **Latenz:** typischerweise p95 unter 2 s.
* **Verfügbarkeit:** 99.9% pro Quartal auf Seiten von Didit; die Verfügbarkeit der nachgelagerten Quelle variiert je nach Land und Datensatz.

## Über diese Quelle

Dies ist die offizielle Behördenquelle: [SERPRO](https://www.serpro.gov.br) Datavalid, betrieben vom brasilianischen Bundesdienst für Datenverarbeitung. Die CPF wird mit der Receita Federal abgeglichen, und das Selfie wird mit dem Porträt verglichen, das für diese Person beim Senatran hinterlegt ist, dem nationalen Führerscheinregister.

Da das Porträt aus dem CNH-Datensatz (Führerschein) stammt, ist nur für Personen mit einer CNH ein Gesichtsbild hinterlegt. Dadurch ist die Abdeckung auf etwa 50% der erwachsenen Bevölkerung begrenzt. Die Daten sind maßgeblich, fehlen aber für alle Brasilianerinnen und Brasilianer, die nie einen Führerschein hatten.

**Benötigen Sie eine breitere Abdeckung?** Verwenden Sie stattdessen [BRA - Unico IDCloud (CPF + selfie)](https://docs.didit.me/de/api-reference/database-validation/brazil/unico-idcloud.md). Damit erreichen Sie rund 96% der erwachsenen Brasilianerinnen und Brasilianer über das private biometrische Register von Unico, und die Prüfung kostet \$0.20 statt \$0.45 bei dieser Quelle. Wählen Sie Datavalid, wenn Sie gezielt das staatliche Register als maßgebliche Quelle benötigen. Wählen Sie IDCloud, wenn Sie alle Personen verifizieren müssen.

## Weiterlesen

* [Übersicht zur brasilianischen Datenbankvalidierung](https://docs.didit.me/api-reference/database-validation/brazil.md)
* [Übersicht zur Datenbankvalidierung](https://docs.didit.me/de/core-technology/database-validation/overview.md)
* [Ergebniscodes](https://docs.didit.me/de/core-technology/database-validation/database-validation-outcome-codes.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.