> ## 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.

# 브라질 CPF + 얼굴 대조 (Datavalid) API: ID Match

> Didit의 브라질 데이터베이스 검증으로 CPF와 얼굴 대조를 공신력 있는 기관 데이터와 대조합니다. 호출당 $0.45부터, 계약이나 최소 사용량이 없습니다.

SERPRO Datavalid v4 pf-facial은 Receita Federal을 통해 CPF(필수)를 검증하고, 실시간 셀피(필수)를 Senatran에 보관된 CNH 사진과 대조합니다. 이름과 생년월일 검사는 선택 사항입니다. Didit은 `POST /v3/database-validation/` 엔드포인트로 이 서비스를 제공하므로, 제출된 데이터를 공식 소스와 대조하고 정규화된 일치 결과를 받을 수 있습니다. 입력 형식: `tax_number`에는 브라질 CPF(정확히 11자리 숫자)를 입력합니다.

## 적용 범위

* **적용 범위:** \~50%
* **국가:** 브라질
* **서비스 ID:** `bra_cpf_facial`
* **데이터 영역:** 생체 정보
* **카테고리:** NationalIDRegistry

브라질 성인의 약 50%가 대상입니다. 얼굴 대조 단계는 Senatran에 보관된 CNH 사진에 의존하므로, 운전면허(CNH)를 가진 사람만 대조할 수 있습니다.

## 입력

| 필드 | 필수 여부 | 예시 |
| - | -: | - |
| `tax_number` | 예 | `11111111111` |
| `selfie` | 예 | `@./selfie.jpg` |
| `first_name` | 아니요 | `John` |
| `last_name` | 아니요 | `Doe` |
| `date_of_birth` | 아니요 | `1990-01-01` |
| `vendor_data` | 아니요 | `user-1234` |

* **필수 입력:** `tax_number`, `selfie`
* **선택 입력:** `first_name`, `last_name`, `date_of_birth`, `vendor_data`
* **동의:** 필수
* **워크플로 사용 가능 여부:** 워크플로에서 사용 가능
* **적용 범위:** \~50%
* **가격:** 성공한 쿼리 건당 \$0.45

## 본문 파라미터

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

이 데이터베이스 서비스의 ISO 3166-1 alpha-3 국가 코드입니다.

예시: `BRA`

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

이 서비스 ID를 포함하는 배열입니다. 서비스를 고정하면 요청이 이 정확한 데이터베이스로만 범위가 지정됩니다.

예시: `bra_cpf_facial`

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

이 서비스에 대한 최종 사용자의 명시적 동의입니다.

예시: `true`

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

세금 또는 재정 식별 번호입니다.

예시: `11111111111`

**selfie** `file` *required*

생체 데이터베이스 검증을 위해 업로드할 셀피 이미지 파일입니다. 허용 형식: JPEG, PNG 또는 WebP.

예시: `@./selfie.jpg`

**first\_name** `string`

검증할 이름입니다.

예시: `John`

**last\_name** `string`

검증할 성입니다.

예시: `Doe`

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

`YYYY-MM-DD` 형식의 생년월일입니다.

예시: `1990-01-01`

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

이 사람을 나타내는 고정 사용자 참조값입니다(예: 내부 사용자 ID). Didit은 이 값을 사용해 독립 검사를 같은 최종 사용자에게 연결하고, 중복 탐지 노이즈를 줄입니다.

예시: `user-1234`

## 입력 규칙 및 검증 참고 사항

* 브라질 CPF(정확히 11자리 숫자)
* `tax_number`에는 숫자만 입력해야 합니다. 요청을 보내기 전에 공백, 하이픈 및 구두점을 제거하세요.
* `tax_number`는 정확히 11자여야 합니다.

## 호출 방법

```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));
```

성공한 호출은 모두 HTTP `200`을 반환합니다. **`outcome_code`** 필드는 실제로 무슨 일이 일어났는지 알려 줍니다. 예를 들어 실제 생체 불일치(`BIOMETRIC_NO_MATCH`)와 읽을 수 없는 셀피(`BIOMETRIC_IMAGE_UNUSABLE`)를 구분합니다. 표시된 `status`는 기본 기능 상태이며, 설정한 [부분 일치 / 불일치 작업](https://docs.didit.me/ko/core-technology/database-validation/database-validation-warnings.md)에 따라 재정의될 수 있습니다.

**`MATCH`**: 레지스트리가 신원을 확인했으며, 확인한 모든 필드가 일치했습니다.

```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`**: 레지스트리가 제출된 데이터와 일치하는 결과를 반환하지 않았습니다.

```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`**: 얼굴 대조 점수가 허용 임계값보다 낮으므로, 셀피는 레지스트리 사진과 같은 사람이 아닙니다.

```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`**: 셀피를 처리할 수 없습니다(비어 있음, 얼굴 없음, 품질 낮음, 또는 레지스트리가 읽을 수 없음). 사용자에게 셀피를 다시 촬영하도록 요청하십시오.

```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`**: 레지스트리가 CPF(및 전송한 이름과 생년월일)를 확인했지만 얼굴을 비교할 수 없었습니다. 이 CPF에 대한 기준 사진이 없거나, 셀피를 사용할 수 없었기 때문입니다(얼굴 미검출, 이미지 크기 부적합, 품질 낮음, 또는 얼굴이 둘 이상). 확인된 필드는 `validation`에 그대로 남으므로 `match_type`에 반영되지만, 필수 얼굴 검사가 해결되지 않았으므로 해당 검사는 검토 대상으로 전송됩니다. 새 셀피를 요청하거나, 등록된 사진이 없는 사람에게는 문서 인증으로 대체하십시오.

```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"
      }
    }
  ]
}
```

## 반환 데이터

`source_data`에 노출되는 정확한 필드는 레지스트리가 반환하는 내용에 따라 달라집니다. `bra_cpf_facial`에 대해 현재 생성된 예시는 다음과 같은 정규화된 형식을 문서화합니다:

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

## 요금 및 SLA

브라질 - CPF + 얼굴 대조(Datavalid) 쿼리는 Didit이 검증 소스로부터 확정적인 결과를 받은 경우에만 과금됩니다.

* **건당 가격:** \$0.45 USD.
* **과금:** 성공한 쿼리 건당. 레지스트리에 연결할 수 없는 경우, 필수 필드가 누락된 경우, 또는 요청이 소스에 도달하기 전에 거부된 경우에는 과금되지 않습니다.
* **지연 시간:** 일반적인 p95 값은 2초 미만입니다.
* **가용성:** Didit 측 기준 분기당 99.9%입니다. 하위 소스의 가용성은 국가와 데이터 세트에 따라 다릅니다.

## 출처 정보

이 출처는 브라질 연방 데이터 처리 서비스가 운영하는 공식 정부 출처인 [SERPRO](https://www.serpro.gov.br) Datavalid입니다. CPF는 Receita Federal의 기록과 대조하고, 셀피는 국가 운전면허 등록부인 Senatran에 보관된 해당 인물의 사진과 대조합니다.

사진은 CNH(운전면허증) 기록에서 가져오므로 CNH를 보유한 사람만 얼굴 정보가 등록되어 있습니다. 그래서 적용 범위가 성인 인구의 약 50%로 제한됩니다. 이 데이터는 공신력이 있지만, 운전면허를 한 번도 취득한 적이 없는 모든 브라질 국민에 대해서는 데이터가 없습니다.

**더 넓은 적용 범위가 필요하신가요?** 대신 [BRA - Unico IDCloud (CPF + selfie)](https://docs.didit.me/ko/api-reference/database-validation/brazil/unico-idcloud.md)를 사용하십시오. Unico의 민간 생체 인식 등록부를 통해 브라질 성인의 약 96%에 도달할 수 있으며, 비용은 여기 \$0.45 대비 \$0.20입니다. 정부 등록부를 기준 데이터로 삼아야 할 때는 Datavalid를, 모든 사람을 확인해야 할 때는 IDCloud를 선택하십시오.

## 계속 읽기

* [브라질 데이터베이스 검증 개요](https://docs.didit.me/api-reference/database-validation/brazil.md)
* [데이터베이스 검증 개요](https://docs.didit.me/ko/core-technology/database-validation/overview.md)
* [결과 코드](https://docs.didit.me/ko/core-technology/database-validation/database-validation-outcome-codes.md)


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