Skip to content

Full OCR

Este endpoint recebe imagens ou PDFs de documentos de identificação e devolve, para cada documento encontrado, três coisas:

  1. Classificação — que documento é aquele (CNH, RG, CRNM, CRLV…), de que país, e qual face foi vista.
  2. Extração — os campos escritos no documento, lidos por OCR.
  3. 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/v4

Headers

http
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âmetroDescriçãoObrigatório
federalRevenueNumberCPF conhecido da pessoa, para orientar a busca na Receita Federal. Aceita máscara. Pode ser repetido para enviar mais de um CPF.Não
returnsFaceInfoQuando 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
returnsCroppedDocumentBase64Quando true, cada documento traz o recorte da imagem em documentBase64. Padrão: false.Não
returnsMultiCroppedDocumentsQuando true, documentBase64 vira uma lista de recortes em vez de um valor único. Depende de returnsCroppedDocumentBase64. Padrão: false.Não
returnsCroppedDocumentsInfoQuando true, cada recorte vira um objeto { side, b64 } em vez de uma string. Depende de returnsCroppedDocumentBase64. Padrão: false.Não
forceLiveTaxDataQuando true, pede que a consulta à Receita Federal seja feita ao vivo. Padrão: false.Não
documentscopyQuando true, roda a análise de documentoscopia sobre CNH e RG. Padrão: false. Só tem efeito na v4. Veja Documentoscopia.Não
groupAnalysisByFieldAgrupa o resultado da documentoscopia por campo. Só faz sentido junto com documentscopy=true. Padrão: false.Não
analyzeForgeryAcrescenta 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

ItemValor
Formatosimage/png, image/jpeg, application/pdf
Quantidade por chamadaaté 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

bash
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:

bash
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:

CampoDescriçãoTipo
idIdentificador único da requisiçãoString
versionVersão da API que atendeu a chamadaString
dataLista com uma entrada por documento reconhecido. Vem vazia quando nenhum documento foi reconhecido.Object[]
metadataMetadados da requisiçãoObject

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.

BlocoO que é
classificationQue documento é, de que país, qual face
extraction e enhancedO que foi lido do documento, cru e limpo
taxData e matchesO que a Receita Federal devolveu e o que bateu
postOfficeDataEndereço confrontado com os Correios (só em comprovante)
faceA face encontrada no documento
documentBase64Recorte da imagem do documento
metadataArquivos 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.

CampoDescriçãoTipo
classification.typeTipo do documento: DriversLicense, FederalID, Passport, Transportation, ProofOfResidenceString
classification.subtypeModelo dentro do tipo: Printed, Digital, Decree2018Paper, CRLV-PrintedString
classification.countryPaís emissor, em três letras: BRA, UNI, USAString
classification.sideFace consolidada do documento: Front, Back ou FrontAndBackString
classification.sameImagetrue quando frente e verso vieram da mesma página do mesmo arquivoBoolean

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

json
{
  "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:

CampoDescriçãoTipo
schemaNameIdentificador do conjunto de campos usado nesta extração. Depende do tipo e do modelo do documento.String
personOs dados da pessoaObject
person.taxIdCPFString
person.nameNomeString
person.birthdateData de nascimentoString
person.parentageFiliação em uma linha só. Existe apenas no extraction.String
person.mothersNameNome da mãe. Existe apenas no enhanced, já separado da filiação.String
person.fathersNameNome do pai. Existe apenas no enhanced.String
otherFieldsOs 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.

json
{
  "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.

CampoDescriçãoTipo
taxData.taxIdCPF localizado na Receita FederalString
taxData.nameNome registrado na Receita FederalString
taxData.mothersNameNome da mãe registrado na Receita FederalString
taxData.birthdateData de nascimento registrada na Receita FederalString
matches.nametrue quando o nome lido do documento corresponde ao da Receita FederalBoolean
matches.mothersNametrue quando o nome da mãe correspondeBoolean
matches.birthdatetrue quando a data de nascimento correspondeBoolean

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

json
{
  "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.

CampoDescriçãoTipo
postOfficeData.zipCodeCEP conforme os CorreiosString
postOfficeData.addressLogradouro conforme os CorreiosString
postOfficeData.districtBairro conforme os CorreiosString
postOfficeData.cityCidade conforme os CorreiosString
postOfficeData.stateUF conforme os CorreiosString
postOfficeData.matchesObjeto com zipCode, address, district, city e state booleanosObject

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.

CampoDescriçãoTipo
face.ageIdade aparente estimadaNumber
face.gender.valueMale ou FemaleString
face.boundingBoxPosição da face na imagem, em proporções entre 0 e 1 (top, left, width, height)Object
face.croppedBase64Recorte da face em base64String
json
{
  "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âmetrosFormato de documentBase64
returnsCroppedDocumentBase64=trueString com o base64
+ returnsCroppedDocumentsInfo=trueObject com side e b64
+ returnsMultiCroppedDocuments=trueArray 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

CampoDescriçãoTipo
metadata.filesInfoLista com uma entrada por arquivo enviado, mesmo os em que nada foi reconhecidoObject[]
metadata.filesInfo[].fieldnameNome do campo usado no envioString
metadata.filesInfo[].nameNome do arquivo enviadoString
metadata.filesInfo[].sizeTamanho do arquivo, em bytesNumber
metadata.filesInfo[].pagesNúmero de páginas do arquivo. Para imagens, 1.Number
metadata.filesInfo[].mimetypeTipo do arquivo enviadoString
metadata.filesInfo[].encodingCodificação do arquivo no envioString
metadata.filesInfo[].sha256Hash SHA-256 do arquivo enviadoString
metadata.filesInfo[].detailsSó na v4. Uma entrada por face reconhecida naquele arquivo.Object[]
metadata.filesInfo[].details[].sideFace reconhecida: Front, Back ou FrontAndBackString
metadata.filesInfo[].details[].pagePágina em que ela foi reconhecida. Começa em 0.Number
metadata.filesInfo[].details[].confidenceConfiança da classificação daquela faceNumber
metadata.timeSpentTempo de processamento da requisição, em milissegundosNumber

Exemplo completo

Status Code: 200

CNH enviada em dois arquivos, frente e verso, com CPF confirmado pela Receita Federal:

json
{
  "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: 200

Um arquivo sem documento reconhecível não é erro: a resposta é 200, data vem vazia, e metadata.filesInfo continua listando o que foi enviado.

json
{
  "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

HeaderQuando aparece
Nextid-ReqIdEm todas as respostas. Traz o identificador da requisição, o mesmo do campo id do corpo.

Erros

CódigoQuando ocorre
401 UnauthorizedChave de API ou token JWT ausente, inválido, ou sem permissão para este endpoint.
404 Not FoundA versão informada na URL não existe. Só v2, v3 e v4 são aceitas.
406 Not AcceptableO corpo foi enviado como JSON, mas sem o campo base64.
413 Payload Too LargeUm dos arquivos enviados em multipart/form-data passa de 15 MB.
415 Unsupported Media TypeO header Content-Type está ausente ou não é suportado.
422 Unprocessable EntityfederalRevenueNumber 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 ErrorFalha inesperada durante o processamento.

Exemplo de resposta com CPF inválido:

Status Code: 422
json
{
  "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ãoSituaçãoO que muda
v4Recomendadaextraction e enhanced separados, taxData/matches na raiz do item, classification.side consolidado, details no filesInfo. Único onde os parâmetros de query valem.
v3DisponívelUm objeto extraction só, sem enhanced. Cruzamento com a Receita em federalRevenueData. classification.sides como lista.
v2LegadaNã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:

CampoDescriçãoTipo
extractionObjeto plano com os campos lidos do documento, sem separação entre cru e limpoObject
federalRevenueDataO cruzamento com a Receita Federal, agora aninhadoObject
federalRevenueData.nameNome na Receita FederalString
federalRevenueData.federalRevenueNumberCPF na Receita FederalString
federalRevenueData.mothersNameNome da mãe na Receita FederalString
federalRevenueData.birthdateData de nascimento na Receita FederalString
federalRevenueData.matchesObjeto com name, federalRevenueNumber, mothersName e birthdate, cada um com matchedObject
classification.typeTipo do documentoString
classification.subtypeModelo do documentoString
classification.countryPaís emissorString
classification.sidesLista com side, page, fieldname e confidence de cada face reconhecidaObject[]
postOfficeDataMesmo formato da v4Object
faceMesmo formato da v4, mas sempre presentereturnsFaceInfo não tem efeito aquiObject
Status Code: 200
json
{
  "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 com page e fieldname na raiz do item. Uma CNH enviada em dois arquivos devolve duas entradas, não uma.
  • classification usa outro vocabulário. type vem traduzido para CNH, RG, CPF, PROOF-OF-RESIDENCE, SELFIE, IMPRESSOS, CARTAOCREDITO ou OTHERS, e a face fica em classification.face, com os valores front, back ou front-back. Não há subtype nem country.

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

Status Code: 200
json
{
  "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.

Nextcode | Soluções em Verificação de Identidade