Full OCR
Este endpoint recebe imagens ou PDFs de documentos de identificação e devolve, para cada documento encontrado, três coisas:
- Classificação — que documento é aquele (CNH, RG, CRNM, CRLV…), de que país, e qual face foi vista.
- Extração — os campos escritos no documento, lidos por OCR.
- Cruzamento — quando o documento traz CPF, os dados lidos são confrontados com a base da Receita Federal, e a resposta diz campo a campo se bateram.
É a diferença para o Classificador, que só responde que documento é este e não lê nada de dentro dele.
Este endpoint não faz liveness (use o Liveness), não compara a face do documento com uma selfie (use o Face Match) e não consulta a base biométrica do governo. Para somar a validação no Datavalid da SERPRO, use o Full OCR + Datavalid.
Comprovante de residência tem endpoint próprio
O Full OCR reconhece comprovantes de residência e extrai o endereço deles, mas a análise dedicada é melhor. Para comprovantes, use o Comprovante de Residência.
Request
POST/full-ocr/v4Headers
Authorization: ApiKey <sua-chave-de-api>Este endpoint também aceita o token JWT, no formato Authorization: Bearer <accessToken>. Veja Token JWT.
Parâmetros
Todos opcionais, na query string.
| Parâmetro | Descrição | Obrigatório |
|---|---|---|
| federalRevenueNumber | CPF conhecido da pessoa, para orientar a busca na Receita Federal. Aceita máscara. Pode ser repetido para enviar mais de um CPF. | Não |
| returnsFaceInfo | Quando true, a resposta traz o objeto face de cada documento. Padrão: false. Só tem efeito na v4 — na v2 e na v3 a face vem sempre. | Não |
| returnsCroppedDocumentBase64 | Quando true, cada documento traz o recorte da imagem em documentBase64. Padrão: false. | Não |
| returnsMultiCroppedDocuments | Quando true, documentBase64 vira uma lista de recortes em vez de um valor único. Depende de returnsCroppedDocumentBase64. Padrão: false. | Não |
| returnsCroppedDocumentsInfo | Quando true, cada recorte vira um objeto { side, b64 } em vez de uma string. Depende de returnsCroppedDocumentBase64. Padrão: false. | Não |
| forceLiveTaxData | Quando true, pede que a consulta à Receita Federal seja feita ao vivo. Padrão: false. | Não |
| documentscopy | Quando true, roda a análise de documentoscopia sobre CNH e RG. Padrão: false. Só tem efeito na v4. Veja Documentoscopia. | Não |
| groupAnalysisByField | Agrupa o resultado da documentoscopia por campo. Só faz sentido junto com documentscopy=true. Padrão: false. | Não |
| analyzeForgery | Acrescenta a análise de adulteração ao resultado da documentoscopia. Só faz sentido junto com documentscopy=true. Padrão: false. | Não |
🚧 Os parâmetros booleanos só ligam com a string true
Qualquer outro valor — 1, TRUE, yes, ou o parâmetro sem valor — é lido como false. E, diferente de outros endpoints, um parâmetro de query desconhecido não gera erro aqui: ele é simplesmente ignorado. Um returnFaceInfo escrito sem o s não devolve 422; devolve 200 sem a face.
🚧 federalRevenueNumber é validado pelo dígito verificador
Um CPF que não passa na validação derruba a requisição inteira com 422, antes de qualquer processamento. Isso vale para cada valor quando você envia mais de um.
Arquivos aceitos
| Item | Valor |
|---|---|
| Formatos | image/png, image/jpeg, application/pdf |
| Quantidade por chamada | até 7 arquivos |
| Tamanho máximo (multipart) | 15 MB por arquivo |
Os nomes dos campos do formulário são livres — eles voltam na resposta, em metadata.filesInfo. Enviar mais de sete arquivos é recusado com 422.
Um PDF de várias páginas tem cada página analisada separadamente. A partir da v3, frente e verso do mesmo documento encontrados em páginas ou arquivos diferentes são fundidos em uma única entrada de data.
Além do multipart/form-data, os arquivos podem ser enviados em JSON, no campo base64, como descrito em Envio de arquivos.
Exemplo Request
curl -i -X POST 'https://api-homolog.nxcd.app/full-ocr/v4' \
--header 'Authorization: ApiKey SUA_CHAVE_AQUI' \
--form 'frente=@./cnh-frente.jpg' \
--form 'verso=@./cnh-verso.jpg'Informando o CPF esperado, para orientar a consulta à Receita Federal:
curl -i -X POST 'https://api-homolog.nxcd.app/full-ocr/v4?federalRevenueNumber=123.456.789-09' \
--header 'Authorization: ApiKey SUA_CHAVE_AQUI' \
--form 'documento=@./cnh.pdf'Response
Esta seção descreve a v4, a versão recomendada. A v2 e a v3 devolvem um data com outro formato — veja Versões.
O envelope é o padrão da API:
| Campo | Descrição | Tipo |
|---|---|---|
| id | Identificador único da requisição | String |
| version | Versão da API que atendeu a chamada | String |
| data | Lista com uma entrada por documento reconhecido. Vem vazia quando nenhum documento foi reconhecido. | Object[] |
| metadata | Metadados da requisição | Object |
A lista vem ordenada do melhor para o pior resultado
data é ordenada internamente: entram na frente os documentos com dado da Receita Federal, depois os com mais campos batendo, depois os com mais campos extraídos. Se você espera um único documento, leia data[0] — mas confira antes que a lista não está vazia.
Cada item de data é montado com os blocos abaixo. Nem todos aparecem sempre: as condições estão em cada seção.
| Bloco | O que é |
|---|---|
classification | Que documento é, de que país, qual face |
extraction e enhanced | O que foi lido do documento, cru e limpo |
taxData e matches | O que a Receita Federal devolveu e o que bateu |
postOfficeData | Endereço confrontado com os Correios (só em comprovante) |
face | A face encontrada no documento |
documentBase64 | Recorte da imagem do documento |
metadata | Arquivos enviados e tempo de processamento. Fica na raiz, fora de data[]. |
data[].classification
O que a IA reconheceu no arquivo, antes de ler qualquer campo.
| Campo | Descrição | Tipo |
|---|---|---|
| classification.type | Tipo do documento: DriversLicense, FederalID, Passport, Transportation, ProofOfResidence… | String |
| classification.subtype | Modelo dentro do tipo: Printed, Digital, Decree2018Paper, CRLV-Printed… | String |
| classification.country | País emissor, em três letras: BRA, UNI, USA… | String |
| classification.side | Face consolidada do documento: Front, Back ou FrontAndBack | String |
| classification.sameImage | true quando frente e verso vieram da mesma página do mesmo arquivo | Boolean |
🚧 Na v4 o side muda de vocabulário e sides desaparece
Na v3, classification.sides é uma lista com uma entrada por página classificada, e o side de cada uma usa OnlyFront / OnlyBack / FrontAndBack.
Na v4, a lista some do classification: sobra um side único, já consolidado, no vocabulário Front / Back / FrontAndBack. O detalhe por página migra para metadata.filesInfo[].details — é lá que ficam a confiança e a página de cada face reconhecida.
{
"classification": {
"type": "DriversLicense",
"subtype": "Printed",
"country": "BRA",
"side": "FrontAndBack",
"sameImage": false
}
}data[].extraction e data[].enhanced
São os campos lidos do documento, em duas versões do mesmo dado:
extraction— o texto como saiu do OCR, sem tratamento. É o que estava escrito no papel, incluindo ruído de leitura.enhanced— o mesmo dado normalizado e corrigido. É esta versão que passa pelo cruzamento com a Receita Federal: quando o nome bate, o CPF confirmado pela Receita é gravado aqui, e campos com sobras de OCR são limpos.
Para preencher formulário e persistir, use o enhanced. Use o extraction quando precisar saber o que literalmente estava impresso.
Os dois têm a mesma estrutura, com as diferenças de campo marcadas na tabela:
| Campo | Descrição | Tipo |
|---|---|---|
| schemaName | Identificador do conjunto de campos usado nesta extração. Depende do tipo e do modelo do documento. | String |
| person | Os dados da pessoa | Object |
| person.taxId | CPF | String |
| person.name | Nome | String |
| person.birthdate | Data de nascimento | String |
| person.parentage | Filiação em uma linha só. Existe apenas no extraction. | String |
| person.mothersName | Nome da mãe. Existe apenas no enhanced, já separado da filiação. | String |
| person.fathersName | Nome do pai. Existe apenas no enhanced. | String |
| otherFields | Os demais campos do documento. O conjunto de chaves varia conforme o tipo e o modelo. | Object |
Campo vazio é "", não ausente
As chaves de person e de otherFields são fixas para cada modelo de documento: elas aparecem sempre, e o que não foi lido vem como string vazia. Você não precisa testar a existência da chave — precisa testar se ela está vazia.
O conjunto de chaves de otherFields não é o mesmo no extraction e no enhanced — a normalização quebra alguns campos em dois.
Em uma CNH, o extraction traz driversLicenseCategory, expireAt, firstIssuedAt, formNumberFront, formNumberBack, issuedAt, locale, mopedsLicense, nacionality, naturalness, notes, permission, registerNumber, renach, securityNumber, sourceDocument, sourceDocumentIssuer e state. No enhanced, locale vira localeCity e localeState, naturalness vira naturalnessCity e naturalnessState, e os dois formNumber* viram um formNumber só; o resto é igual.
Em um RG do modelo padrão, o extraction traz documentId, header, issuedAt, naturalness, origin e version. O enhanced traz documentId, headerState, issuedAt, naturalnessCity, naturalnessState, originCity, originState, version, illiterate e ageTag.
{
"extraction": {
"schemaName": "driversLicense",
"person": {
"taxId": "123.456.789-09",
"name": "JOAO DA SILVA SANTOS",
"birthdate": "01/02/1990",
"parentage": "ANTONIO SANTOS MARIA DA SILVA SANTOS"
},
"otherFields": {
"driversLicenseCategory": "AB",
"expireAt": "10/03/2029",
"firstIssuedAt": "15/04/2010",
"formNumberFront": "00123456789",
"formNumberBack": "00123456789",
"issuedAt": "10/03/2019",
"locale": "SAO PAULO",
"naturalness": "SAO PAULO SP",
"registerNumber": "01234567890",
"renach": "SP012345678",
"securityNumber": "12345678901",
"sourceDocument": "12.345.678-9",
"sourceDocumentIssuer": "SSP SP",
"state": "SP",
"mopedsLicense": "",
"nacionality": "BRASILEIRA",
"notes": "",
"permission": ""
}
},
"enhanced": {
"schemaName": "driversLicense",
"person": {
"taxId": "12345678909",
"name": "JOAO DA SILVA SANTOS",
"birthdate": "1990-02-01",
"mothersName": "MARIA DA SILVA SANTOS",
"fathersName": "ANTONIO SANTOS"
},
"otherFields": {
"driversLicenseCategory": "AB",
"expireAt": "10/03/2029",
"firstIssuedAt": "15/04/2010",
"formNumber": "00123456789",
"issuedAt": "2019-03-10",
"localeCity": "SAO PAULO",
"localeState": "SP",
"mopedsLicense": "",
"nacionality": "BRASILEIRA",
"notes": "",
"permission": "",
"registerNumber": "01234567890",
"renach": "SP012345678",
"securityNumber": "12345678901",
"sourceDocument": "12.345.678-9",
"sourceDocumentIssuer": "SSP SP",
"state": "SP",
"naturalnessCity": "SAO PAULO",
"naturalnessState": "SP"
}
}
}data[].taxData e data[].matches
É aqui que mora o cruzamento externo. taxData é o que a Receita Federal devolveu para o CPF; matches diz, campo a campo, se o que estava no documento bate com o que a Receita tem.
| Campo | Descrição | Tipo |
|---|---|---|
| taxData.taxId | CPF localizado na Receita Federal | String |
| taxData.name | Nome registrado na Receita Federal | String |
| taxData.mothersName | Nome da mãe registrado na Receita Federal | String |
| taxData.birthdate | Data de nascimento registrada na Receita Federal | String |
| matches.name | true quando o nome lido do documento corresponde ao da Receita Federal | Boolean |
| matches.mothersName | true quando o nome da mãe corresponde | Boolean |
| matches.birthdate | true quando a data de nascimento corresponde | Boolean |
🚧 Quando os dois blocos não aparecem
taxData e matches são removidos da resposta para documentos que não têm dado a cruzar com a Receita Federal — CRLV e ANTT, por exemplo, e a carteira de identidade chilena.
Além disso, a consulta à Receita depende da face que você enviou, porque o CPF não está impresso nos dois lados de todo documento:
- CNH — a consulta acontece com frente e verso, ou só com a frente. Enviando só o verso, não acontece. E, para CNH, a consulta só é feita quando o país é
BRA. - RG — a consulta acontece com frente e verso; só com o verso, apenas nos modelos padrão; só com a frente, apenas na CIN de 2022.
Quando a consulta não acontece, os dois blocos continuam na resposta, mas com os campos vazios e todos os matches em false. Se você precisa do cruzamento, envie o documento inteiro.
matches.name: false não significa sempre "nome diferente"
Um nome lido com menos de 8 caracteres — típico de OCR que falhou — é tratado como não conferido: matches.name vem false sem que a comparação chegue a ser feita. E, quando o nome não bate, o cruzamento para ali: os demais campos não são usados para corrigir o enhanced.
{
"taxData": {
"taxId": "12345678909",
"name": "JOAO DA SILVA SANTOS",
"mothersName": "MARIA DA SILVA SANTOS",
"birthdate": "1990-02-01"
},
"matches": {
"name": true,
"mothersName": true,
"birthdate": true
}
}data[].postOfficeData
Só aparece quando o documento reconhecido é um comprovante de residência. Traz o endereço devolvido pelos Correios para o CEP lido, e o resultado da comparação com o que estava escrito no comprovante.
| Campo | Descrição | Tipo |
|---|---|---|
| postOfficeData.zipCode | CEP conforme os Correios | String |
| postOfficeData.address | Logradouro conforme os Correios | String |
| postOfficeData.district | Bairro conforme os Correios | String |
| postOfficeData.city | Cidade conforme os Correios | String |
| postOfficeData.state | UF conforme os Correios | String |
| postOfficeData.matches | Objeto com zipCode, address, district, city e state booleanos | Object |
Para analisar comprovantes de residência, prefira o endpoint dedicado, que documenta este bloco em detalhe.
data[].face
A face encontrada no documento. Só aparece na v4 quando você envia returnsFaceInfo=true, e some quando nenhuma face foi detectada.
| Campo | Descrição | Tipo |
|---|---|---|
| face.age | Idade aparente estimada | Number |
| face.gender.value | Male ou Female | String |
| face.boundingBox | Posição da face na imagem, em proporções entre 0 e 1 (top, left, width, height) | Object |
| face.croppedBase64 | Recorte da face em base64 | String |
{
"face": {
"age": 34,
"gender": { "value": "Male" },
"boundingBox": {
"top": 0.2237228155136108,
"left": 0.2856607735157013,
"width": 0.1555942893028259,
"height": 0.1687679588794708
},
"croppedBase64": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAA...K5CYII="
}
}data[].documentBase64
O recorte da imagem do documento, isolado do resto da foto. Só aparece com returnsCroppedDocumentBase64=true, e o formato depende dos outros dois parâmetros:
| Parâmetros | Formato de documentBase64 |
|---|---|
returnsCroppedDocumentBase64=true | String com o base64 |
+ returnsCroppedDocumentsInfo=true | Object com side e b64 |
+ returnsMultiCroppedDocuments=true | Array dos formatos acima |
Documentoscopia
Com documentscopy=true na v4, documentos do tipo CNH e RG ganham um bloco data[].documentscopy com o resultado da perícia automática dos campos. groupAnalysisByField=true reorganiza esse bloco por campo, e analyzeForgery=true acrescenta a ele um forgeryAnalysis com a análise de adulteração.
O conteúdo do bloco varia conforme o modelo do documento e não está descrito aqui. Se a documentoscopia é o seu caso de uso principal, o produto dedicado é a Documentoscopia Automática.
metadata
| Campo | Descrição | Tipo |
|---|---|---|
| metadata.filesInfo | Lista com uma entrada por arquivo enviado, mesmo os em que nada foi reconhecido | Object[] |
| metadata.filesInfo[].fieldname | Nome do campo usado no envio | String |
| metadata.filesInfo[].name | Nome do arquivo enviado | String |
| metadata.filesInfo[].size | Tamanho do arquivo, em bytes | Number |
| metadata.filesInfo[].pages | Número de páginas do arquivo. Para imagens, 1. | Number |
| metadata.filesInfo[].mimetype | Tipo do arquivo enviado | String |
| metadata.filesInfo[].encoding | Codificação do arquivo no envio | String |
| metadata.filesInfo[].sha256 | Hash SHA-256 do arquivo enviado | String |
| metadata.filesInfo[].details | Só na v4. Uma entrada por face reconhecida naquele arquivo. | Object[] |
| metadata.filesInfo[].details[].side | Face reconhecida: Front, Back ou FrontAndBack | String |
| metadata.filesInfo[].details[].page | Página em que ela foi reconhecida. Começa em 0. | Number |
| metadata.filesInfo[].details[].confidence | Confiança da classificação daquela face | Number |
| metadata.timeSpent | Tempo de processamento da requisição, em milissegundos | Number |
Exemplo completo
Status Code: 200CNH enviada em dois arquivos, frente e verso, com CPF confirmado pela Receita Federal:
{
"id": "13cfec7c-b238-4820-a4d1-5173e4c1418e",
"version": "v4",
"data": [
{
"extraction": {
"schemaName": "driversLicense",
"person": {
"taxId": "123.456.789-09",
"name": "JOAO DA SILVA SANTOS",
"birthdate": "01/02/1990",
"parentage": "ANTONIO SANTOS MARIA DA SILVA SANTOS"
},
"otherFields": {
"driversLicenseCategory": "AB",
"expireAt": "10/03/2029",
"firstIssuedAt": "15/04/2010",
"formNumber": "00123456789",
"issuedAt": "10/03/2019",
"locale": "SAO PAULO",
"mopedsLicense": "",
"nacionality": "BRASILEIRA",
"notes": "",
"permission": "",
"registerNumber": "01234567890",
"renach": "SP012345678",
"securityNumber": "12345678901",
"sourceDocument": "12.345.678-9",
"sourceDocumentIssuer": "SSP SP",
"state": "SP"
}
},
"enhanced": {
"schemaName": "driversLicense",
"person": {
"taxId": "12345678909",
"name": "JOAO DA SILVA SANTOS",
"birthdate": "1990-02-01",
"mothersName": "MARIA DA SILVA SANTOS",
"fathersName": "ANTONIO SANTOS"
},
"otherFields": {
"driversLicenseCategory": "AB",
"expireAt": "10/03/2029",
"firstIssuedAt": "15/04/2010",
"formNumber": "00123456789",
"issuedAt": "2019-03-10",
"localeCity": "SAO PAULO",
"localeState": "SP",
"mopedsLicense": "",
"nacionality": "BRASILEIRA",
"notes": "",
"permission": "",
"registerNumber": "01234567890",
"renach": "SP012345678",
"securityNumber": "12345678901",
"sourceDocument": "12.345.678-9",
"sourceDocumentIssuer": "SSP SP",
"state": "SP",
"naturalnessCity": "SAO PAULO",
"naturalnessState": "SP"
}
},
"taxData": {
"taxId": "12345678909",
"name": "JOAO DA SILVA SANTOS",
"mothersName": "MARIA DA SILVA SANTOS",
"birthdate": "1990-02-01"
},
"matches": {
"name": true,
"mothersName": true,
"birthdate": true
},
"classification": {
"type": "DriversLicense",
"subtype": "Printed",
"country": "BRA",
"side": "FrontAndBack",
"sameImage": false
}
}
],
"metadata": {
"filesInfo": [
{
"fieldname": "frente",
"name": "cnh-frente.jpg",
"size": 567098,
"pages": 1,
"mimetype": "image/jpeg",
"encoding": "7bit",
"sha256": "41c2ece339abfcf9ba1e7d5a60666162a24ef34ba95adeb41ed1d9721c91c6b0",
"details": [
{ "side": "Front", "confidence": 0.99, "page": 0 }
]
},
{
"fieldname": "verso",
"name": "cnh-verso.jpg",
"size": 512044,
"pages": 1,
"mimetype": "image/jpeg",
"encoding": "7bit",
"sha256": "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
"details": [
{ "side": "Back", "confidence": 0.97, "page": 0 }
]
}
],
"timeSpent": 9840
}
}Nenhum documento reconhecido
Status Code: 200Um arquivo sem documento reconhecível não é erro: a resposta é 200, data vem vazia, e metadata.filesInfo continua listando o que foi enviado.
{
"id": "6a1d1e8c-4a7d-4a5e-9f2c-1b0f2a9c7e11",
"version": "v4",
"data": [],
"metadata": {
"filesInfo": [
{
"fieldname": "documento",
"name": "borrada.jpg",
"size": 152064,
"pages": 1,
"mimetype": "image/jpeg",
"encoding": "7bit",
"sha256": "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"
}
],
"timeSpent": 3120
}
}Headers de resposta
| Header | Quando aparece |
|---|---|
Nextid-ReqId | Em todas as respostas. Traz o identificador da requisição, o mesmo do campo id do corpo. |
Erros
| Código | Quando ocorre |
|---|---|
| 401 Unauthorized | Chave de API ou token JWT ausente, inválido, ou sem permissão para este endpoint. |
| 404 Not Found | A versão informada na URL não existe. Só v2, v3 e v4 são aceitas. |
| 406 Not Acceptable | O corpo foi enviado como JSON, mas sem o campo base64. |
| 413 Payload Too Large | Um dos arquivos enviados em multipart/form-data passa de 15 MB. |
| 415 Unsupported Media Type | O header Content-Type está ausente ou não é suportado. |
| 422 Unprocessable Entity | federalRevenueNumber que não passa na validação do dígito verificador, formato de arquivo não aceito, ou mais de sete arquivos. |
| 500 Internal Server Error | Falha inesperada durante o processamento. |
Exemplo de resposta com CPF inválido:
Status Code: 422{
"id": "13cfec7c-b238-4820-a4d1-5173e4c1418e",
"error": {
"statusCode": 422,
"error": "Unprocessable Entity",
"message": "Invalid Federal Revenue Number"
}
}O formato das respostas de erro está descrito em Códigos HTTP das respostas.
Versões
A versão recomendada é a v4, chamada em /full-ocr/v4. É a única que separa extraction de enhanced, que usa o resultado da Receita Federal para corrigir o dado extraído, e onde os parâmetros de query fazem efeito.
‼️ Omitir a versão entrega a chamada para a v2
POST /full-ocr, sem versão no caminho, é atendido pela v2 — não pela v4. A v2 tem outro formato de resposta e ignora todos os parâmetros de query descritos na seção Request. Informe sempre a versão na URL.
| Versão | Situação | O que muda |
|---|---|---|
| v4 | Recomendada | extraction e enhanced separados, taxData/matches na raiz do item, classification.side consolidado, details no filesInfo. Único onde os parâmetros de query valem. |
| v3 | Disponível | Um objeto extraction só, sem enhanced. Cruzamento com a Receita em federalRevenueData. classification.sides como lista. |
| v2 | Legada | Não funde frente e verso: cada face vira uma entrada de data. classification usa nomes antigos (CNH, RG). É o que responde quando a versão é omitida na URL. |
O que muda na v3
data[] deixa de ter extraction/enhanced separados e passa a ter:
| Campo | Descrição | Tipo |
|---|---|---|
| extraction | Objeto plano com os campos lidos do documento, sem separação entre cru e limpo | Object |
| federalRevenueData | O cruzamento com a Receita Federal, agora aninhado | Object |
| federalRevenueData.name | Nome na Receita Federal | String |
| federalRevenueData.federalRevenueNumber | CPF na Receita Federal | String |
| federalRevenueData.mothersName | Nome da mãe na Receita Federal | String |
| federalRevenueData.birthdate | Data de nascimento na Receita Federal | String |
| federalRevenueData.matches | Objeto com name, federalRevenueNumber, mothersName e birthdate, cada um com matched | Object |
| classification.type | Tipo do documento | String |
| classification.subtype | Modelo do documento | String |
| classification.country | País emissor | String |
| classification.sides | Lista com side, page, fieldname e confidence de cada face reconhecida | Object[] |
| postOfficeData | Mesmo formato da v4 | Object |
| face | Mesmo formato da v4, mas sempre presente — returnsFaceInfo não tem efeito aqui | Object |
{
"id": "13cfec7c-b238-4820-a4d1-5173e4c1418e",
"version": "v3",
"data": [
{
"extraction": {
"name": "JOAO DA SILVA SANTOS",
"federalRevenueNumber": "12345678909",
"mothersName": "MARIA DA SILVA SANTOS",
"birthdate": "01/02/1990",
"registerNumber": "01234567890",
"driversLicenseCategory": "AB",
"expireAt": "10/03/2029"
},
"federalRevenueData": {
"name": "JOAO DA SILVA SANTOS",
"federalRevenueNumber": "12345678909",
"mothersName": "MARIA DA SILVA SANTOS",
"birthdate": "01/02/1990",
"matches": {
"name": { "matched": true },
"federalRevenueNumber": { "matched": true },
"mothersName": { "matched": true },
"birthdate": { "matched": true }
}
},
"classification": {
"type": "DriversLicense",
"subtype": "Printed",
"country": "BRA",
"sides": [
{ "side": "OnlyFront", "page": 0, "fieldname": "frente", "confidence": 0.99 },
{ "side": "OnlyBack", "page": 0, "fieldname": "verso", "confidence": 0.97 }
]
},
"face": {
"age": 34,
"gender": { "value": "Male" },
"boundingBox": { "top": 0.22, "left": 0.28, "width": 0.15, "height": 0.16 },
"croppedBase64": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAA...K5CYII="
}
}
],
"metadata": {
"filesInfo": [
{
"fieldname": "frente",
"name": "cnh-frente.jpg",
"size": 567098,
"pages": 1,
"mimetype": "image/jpeg",
"encoding": "7bit",
"sha256": "41c2ece339abfcf9ba1e7d5a60666162a24ef34ba95adeb41ed1d9721c91c6b0"
}
],
"timeSpent": 8120
}
}O que muda na v2
Além de não ter enhanced, a v2 tem duas diferenças que quebram o consumo:
- Não funde frente e verso. Cada face reconhecida vira uma entrada separada de
data, cada uma compageefieldnamena raiz do item. Uma CNH enviada em dois arquivos devolve duas entradas, não uma. classificationusa outro vocabulário.typevem traduzido paraCNH,RG,CPF,PROOF-OF-RESIDENCE,SELFIE,IMPRESSOS,CARTAOCREDITOouOTHERS, e a face fica emclassification.face, com os valoresfront,backoufront-back. Não hásubtypenemcountry.
O cruzamento com a Receita Federal fica em federalRevenueData, com os matches em federalRevenueData.matched — note o nome no singular, diferente da v3 — e cada campo trazendo matched, confidence (0 a 1) e strategy (char-to-char ou by-tokens).
{
"id": "13cfec7c-b238-4820-a4d1-5173e4c1418e",
"version": "v2",
"data": [
{
"page": 0,
"fieldname": "frente",
"extraction": {
"name": "JOAO DA SILVA SANTOS",
"federalRevenueNumber": "12345678909",
"mothersName": "MARIA DA SILVA SANTOS",
"birthdate": "01/02/1990",
"registerNumber": "01234567890",
"driversLicenseCategory": "AB"
},
"federalRevenueData": {
"name": "JOAO DA SILVA SANTOS",
"federalRevenueNumber": "12345678909",
"mothersName": "MARIA DA SILVA SANTOS",
"birthdate": "01/02/1990",
"matched": {
"name": { "matched": true, "confidence": 1, "strategy": "char-to-char" },
"federalRevenueNumber": { "matched": true, "confidence": 1, "strategy": "char-to-char" },
"mothersName": { "matched": true, "confidence": 0.97, "strategy": "by-tokens" },
"birthdate": { "matched": true, "confidence": 1, "strategy": "char-to-char" }
}
},
"classification": {
"confidence": 0.99,
"type": "CNH",
"face": "front"
},
"face": {
"age": 34,
"gender": { "value": "Male", "confidence": 99.72 },
"boundingBox": { "top": 0.22, "left": 0.28, "width": 0.15, "height": 0.16 },
"croppedBase64": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAA...K5CYII="
}
}
],
"metadata": {
"filesInfo": [
{
"fieldname": "frente",
"name": "cnh-frente.jpg",
"size": 567098,
"pages": 1,
"mimetype": "image/jpeg",
"encoding": "7bit",
"sha256": "41c2ece339abfcf9ba1e7d5a60666162a24ef34ba95adeb41ed1d9721c91c6b0"
}
],
"timeSpent": 7450
}
}‼️ Trocar de versão quebra quem lê a resposta
O caminho de um mesmo dado muda em todas as três versões. O nome da mãe conferido pela Receita Federal está em data[].federalRevenueData.mothersName na v2 e na v3, e em data[].taxData.mothersName na v4. O resultado da conferência está em data[].federalRevenueData.matched.mothersName.matched na v2, em data[].federalRevenueData.matches.mothersName.matched na v3, e em data[].matches.mothersName na v4.
Um código escrito para uma versão não funciona na outra sem alteração.