Brazil eKYC verification matches submitted individual data against Brazilian government sources of truth. Brazil also supports a separate income verification endpoint that returns employment and income data for a valid CPF. See the eKYC API Reference for common response semantics that apply across all identity-matching sources.
Available sources
| Source | Description |
|---|---|
| BR GOVT 1 | Verifies submitted data against Brazilian government records associated with the provided tax ID (CPF). |
| BR Income Verification | Retrieves employment and estimated income data for a valid CPF. |
| BR_TAX_PHONE_REGISTER | Verifies submitted data against Brazil's official tax register (CPF) and mobile phone register. |
BR GOVT 1
Request parameters
| Parameter | Required | Description |
|---|---|---|
country |
Mandatory | Must be BR. |
taxId |
Mandatory | Brazilian CPF. Eleven digits. |
firstName |
Mandatory | First name of the individual. |
surName |
Mandatory | Last name of the individual. If the individual has a middle name, include it here. |
houseNo |
Optional | House number. |
street |
Optional | Full street including apartment number. |
city |
Optional | City of the individual's address (for example, Rio de Janeiro). |
state |
Optional | Two-letter state code (for example, RJ). |
postalCode |
Optional | Postal code. |
dateOfBirth |
Optional | Format: yyyy-mm-dd. |
nationality |
Optional | Accepted values: BRAZILIAN, NATURALIZED_BRAZILIAN, FOREIGNER, BRAZILIAN_BORN_ABROAD. |
Sample request
{
"plugins": ["kyc"], //required field
"firstName": "Renata", // required field
"surName": "De Maria Santos", //required field
"houseNo" : "121",
"street" : "Rua Luiz Ferreira Dorta",
"postalCode": "76535000",
"country": "BR", //required firled
"state" : "RJ",
"city" : "Rio de Janerio",
"dateOfBirth": "1980-06-01",
"nationality" : "1",
"taxId" : "23490843490" //required field
}
Response fields
BR GOVT 1 anchors verification on the tax ID (CPF). See the eKYC API Reference for common match field definitions and status values. BR GOVT 1 uses approximatematch as an alternative to fuzzy for some fields, and unabletoverify for address components when the individual has no driver's license record.
| Field | Statuses | Description |
|---|---|---|
taxIdMatch |
exact, nomatch |
Matches submitted CPF against the CPF in the government source of truth. |
taxIdNameMatch |
exact, approximatematch, nomatch |
Matches submitted name against the name associated with the CPF in the government source of truth. |
taxIdDobMatch |
exact, nomatch |
Matches submitted date of birth against the date of birth associated with the CPF. |
taxIdStateMatch |
exact, nomatch, unabletoverify |
Matches submitted state against the government source of truth. |
taxIdAddressMatch |
exact, approximatematch, nomatch, unabletoverify |
Matches submitted address against the government source of truth. Approximate match is returned when at least two address elements (street, postal code, city, or state) match exactly. |
taxIdCityMatch |
exact, nomatch, unabletoverify |
Matches submitted city against the government source of truth. |
taxIdPostalCodeMatch |
exact, nomatch, unabletoverify |
Matches submitted postal code against the government source of truth. |
taxIdNationalityMatch |
exact, nomatch |
Matches submitted nationality against the CPF in the government source of truth. |
taxIdLevel |
low, high |
Risk level associated with the CPF. See below. |
overallLevel |
low, medium, high |
Overall risk level of the submitted attributes associated with the CPF. |
Info
unabletoverify is returned for address-based fields (taxIdStateMatch, taxIdAddressMatch, taxIdCityMatch, taxIdPostalCodeMatch) when the individual does not have a driver's license record. Addresses are validated through the Brazilian government's driver's license source of truth.
taxIdLevel
taxIdLevel reflects the status of the submitted CPF:
low: The CPF status is regular (verified).high: The CPF status is suspended, associated with a deceased holder, pending regularization, canceled due to multiplicity, or canceled by authority.
Reason codes
BR GOVT 1 returns reason codes alongside match and risk-level fields. Selected Brazil-specific reason codes:
| Reason code | Description |
|---|---|
ASDL |
Unable to verify address because the CPF does not have a CNH (driver's license) in the official government database. |
TSR |
Tax ID status (situação CPF) is regular. |
TSRF |
Tax ID status is not regular. It may be suspended, canceled due to pending regularization, null, or associated with a deceased holder. |
TSRP |
Tax ID status is pending regularization. |
TNPIN |
Tax ID check was not performed due to invalid nationality. |
TLGPD |
Tax ID check was not performed due to LGPD (minor's data). |
ASCV |
State and country validated. |
For the full list of reason codes, see eKYC Reason Codes.
Sample response
{
"kyc": [
{ "key": "taxIdNationalityMatch", "status": "exact" },
{ "key": "taxIdDobMatch", "status": "exact" },
{ "key": "taxIdMatch", "status": "exact" },
{ "key": "taxIdAddressMatch", "status": "approximatematch", "reasonCodes": ["ASCV"] },
{ "key": "taxIdNameMatch", "status": "exact" },
{ "key": "taxIdStateMatch", "status": "exact" },
{ "key": "taxIdCityMatch", "status": "exact" },
{ "key": "taxIdPostalCodeMatch", "status": "nomatch" },
{ "key": "taxIdLevel", "status": "low", "reasonCodes": ["TSR"] },
{ "key": "overallLevel", "status": "low" }
]
}
BR Income verification
Brazil supports a separate endpoint for retrieving employment and estimated income data for a valid CPF. This endpoint is distinct from the standard eKYC endpoint and returns employment type, employment sector, and an estimated income range in Brazilian Real.
Endpoint
POST /omni/externalVerification/income
For the request contract, see the eKYC Income Verification API reference.
Response fields
| Field | Statuses | Description |
|---|---|---|
employment_type |
success, failure |
Employment type for the individual (for example, ENTREPRENEUR / BUSINESS OWNER, SELF-EMPLOYED, EMPLOYEE). |
employment_sector |
success, failure |
Employment sector, including the CNAE code and description. |
income_range |
success, failure |
Estimated monthly income range in Brazilian Real (R$), based on a statistical prediction model. |
Each field returns a status (indicating whether data was available), a sub_label (a display label for the field), and a message (the actual value or Unavailable).
Estimated income range
The income range is calculated as a multiple of the Brazilian minimum wage and returned as a range in Brazilian Real (R$):
- No information
- 0 - 1412
- 1412 - 2824
- 2824 - 4236
- 4236 - 7060
- 7060 - 9884
- 9884 - 14120
- 14120 - 21180
- 21180 - 28240
- Above 28240
Employment type
Employment type describes the individual's current employment status. Example values:
ENTREPRENEUR / BUSINESS OWNERSELF-EMPLOYEDEMPLOYEE
Employment sector
Employment sector describes the industry the individual works in, including a CNAE code and Portuguese-language description. The CNAE (Classificação Nacional de Atividades Econômicas) is Brazil's national classification of economic activities, maintained by the Instituto Brasileiro de Geografia e Estatística (IBGE).
Example values:
PRIVATE - 4789001 - COMERCIO VAREJISTA DE SUVENIRES, BIJUTERIAS E ARTESANATOSPRIVATE - 7319002 - PROMOCAO DE VENDASPUBLIC - 8412400 - REGULACAO DAS ATIVIDADES DE SAUDE, EDUCACAO, SERVICOS CULTURAIS E OUTROS SERVICOS SOCIAIS
For the full CNAE classification, see the IBGE CNAE reference.
Sample response
{
"income": [
{
"key": "employment_type",
"status": "success",
"sub_label": "Type",
"message": "ENTREPRENEUR | BUSINESS OWNER"
},
{
"key": "employment_sector",
"status": "success",
"sub_label": "Sector",
"message": "PRIVATE - 4639701 - COMERCIO ATACADISTA DE PRODUTOS ALIMENTICIOS EM GERAL"
},
{
"key": "income_range",
"status": "success",
"sub_label": "Estimated Income Range",
"message": "9240-13200"
}
]
}
Availability
Income data may not always be available even for a valid, verified CPF. If a CPF passes the standard BR GOVT 1 check but no income data is available, the income verification endpoint returns failure statuses for the affected fields.
Brazil Tax + Phone Register
Request parameters
| Parameter | Required | Description |
|---|---|---|
source |
Mandatory | Must be BR_TAX_PHONE_REGISTER. |
country |
Mandatory | Must be BR. |
firstName |
Mandatory | First name of the individual. Must not contain digits. |
middleName |
Optional | Middle name of the individual. Must not contain digits. |
surName |
Mandatory | Last name of the individual. Must not contain digits. |
city |
Mandatory | City of the individual's address (for example, São Paulo). |
street |
Optional | Street name (address = street + houseNo in Brazil). |
houseNo |
Optional | House/building number, combined with street to form the full address. |
state |
Optional | Brazilian state. Enter the state name, optionally with its two-letter abbreviation (for example, São Paulo – SP). |
postalCode |
Optional | Brazil postal code (CEP). See format note below. |
dateOfBirth |
Optional | Format: yyyy-mm-dd. |
gender |
Optional | Must be m or f. |
email |
Optional | Email address of the individual. |
phone |
Optional | Brazil mobile phone number. See format note below. |
idNum |
Optional | Brazilian CPF (Cadastro de Pessoas Físicas). See format note below. |
Sample request
{
"plugins": ["kyc"], //required field
"source": "BR_TAX_PHONE_REGISTER", //required field
"firstName": "João", //required field
"middleName": "Carlos",
"surName": "da Silva Oliveira", //required field
"street": "Rua Augusta",
"houseNo": "1500",
"city": "São Paulo", //required field
"state": "SP",
"postalCode": "01304-001",
"country": "BR", //required field
"dateOfBirth": "1991-08-02",
"gender": "m",
"email": "example.example@gmail.com",
"phone": "+55 11 91234-5678",
"idNum": "12345678909"
}
Response fields
Brazil Tax + Phone Register anchors verification on individual name, address, and phone number. See the eKYC API Reference for common match field definitions and status values.
| Field | Statuses | Description |
|---|---|---|
firstNameMatch |
exact, fuzzy, nomatch | Matches first name submitted against the value in the source of truth. |
middleNameMatch |
exact, fuzzy, nomatch, nodata | Matches middle name submitted against the value in the source of truth. |
lastNameMatch |
exact, fuzzy, nomatch | Matches last name submitted against the value in the source of truth. |
fullNameMatch |
exact, fuzzy, nomatch | Composite of firstNameMatch, lastNameMatch, and middleNameMatch. See below for calculation logic. |
dobMatch |
exact, fuzzy, nomatch, nodata | Matches date of birth submitted against the value in the source of truth. |
streetMatch |
exact, fuzzy, nomatch, nodata | Matches street/address submitted against the value in the source of truth. |
cityMatch |
exact, fuzzy, nomatch, nodata | Matches city submitted against the value in the source of truth. |
stateMatch |
exact, fuzzy, nomatch, nodata | Matches state submitted against the value in the source of truth. |
postalCodeMatch |
exact, fuzzy, nomatch, nodata | Matches postal code submitted against the value in the source of truth. |
fullAddressMatch |
exact, fuzzy, nomatch, nodata | Composite of streetMatch, cityMatch, stateMatch, and postalCodeMatch. See below for calculation logic. |
idNumMatch |
exact, fuzzy, nomatch, nodata | Matches CPF (idNum) submitted against the value in the source of truth. |
genderMatch |
exact, fuzzy, nomatch, nodata | Matches gender submitted against the value in the source of truth. |
phoneMatch |
exact, fuzzy, nomatch, nodata | Matches phone submitted against the value in the source of truth. |
emailMatch |
exact, fuzzy, nomatch, nodata | Matches email submitted against the value in the source of truth. |
overallLevel |
low, medium, high | Overall risk level. See below for calculation logic. |
fullNameMatch calculation
exactwhenfirstNameMatchis exact andlastNameMatchis exact, andmiddleNameMatchis exact or nodata.nomatchwhenfirstNameMatchis nomatch orlastNameMatchis nomatch.fuzzyfor any other combination.
fullAddressMatch calculation
exactwhencityMatchis exact, and at least one ofstreetMatch,stateMatch, orpostalCodeMatchis exact or nodata.nomatchwhencityMatchis nomatch.nodatawhencityMatch,streetMatch,stateMatch, andpostalCodeMatchare all nodata.fuzzyfor any other combination.
overallLevel calculation
overallLevel is calculated based on the risk associated with the submitted full name and city:
lowwhenfullNameMatchandcityMatchare both exact.highwhenfullNameMatchorcityMatchis nomatch.mediumfor all other combinations.
Contact your Incode representative to customize the overallLevel calculation for your use case.
Sample response
{
"kyc": [
{ "key": "firstNameMatch", "status": "exact" },
{ "key": "middleNameMatch", "status": "exact" },
{ "key": "lastNameMatch", "status": "exact" },
{ "key": "fullNameMatch", "status": "exact" },
{ "key": "dobMatch", "status": "exact" },
{ "key": "streetMatch", "status": "exact" },
{ "key": "cityMatch", "status": "exact" },
{ "key": "stateMatch", "status": "exact" },
{ "key": "postalCodeMatch", "status": "exact" },
{ "key": "fullAddressMatch", "status": "exact" },
{ "key": "idNumMatch", "status": "exact" },
{ "key": "genderMatch", "status": "nomatch" },
{ "key": "phoneMatch", "status": "exact" },
{ "key": "emailMatch", "status": "nomatch" },
{ "key": "overallLevel", "status": "low" }
]
}