Leitura de MRZ de passaporte
Extração da MRZ — a zona de leitura mecânica no rodapé de passaportes e de outros documentos de viagem — a partir de uma foto. As linhas codificadas voltam como campos: nome, número do documento, nacionalidade, data de nascimento e validade, com os dígitos verificadores conferidos. Para hotéis, agências e fluxos de KYC com consentimento.
Rode online
Rode nos nossos servidores com a sua conta. As ferramentas grátis rodam no seu navegador; esta aqui é descontada do seu saldo do KIT pelo preço acima.
As duas linhas que ninguém consegue digitar
Aquelas linhas de letras, números e símbolos “<” no pé do passaporte são a MRZ (machine readable zone), padronizada internacionalmente pela ICAO: num passaporte comum, duas linhas de 44 caracteres que condensam a identidade do viajante. Elas foram feitas para máquinas — copiar na mão é convite ao erro, e um caractere trocado no número do documento invalida o registro inteiro. Esta ferramenta lê a MRZ de uma foto e devolve os campos já decodificados: nome, número, nacionalidade, sexo, data de nascimento e validade.
Dígitos verificadores: a leitura se confere sozinha
A vantagem da MRZ sobre um OCR comum é que o próprio padrão embute dígitos verificadores sobre o número do documento, a data de nascimento e a validade. A extração recalcula esses dígitos e informa se cada campo fecha ou não. Quando tudo confere, você tem confiança matemática de que a leitura saiu fiel ao impresso; quando algo diverge, o campo vem sinalizado — o caminho é refazer a foto ou conferir manualmente antes de gravar o registro.
Consentimento e retenção: as regras da casa
Passaporte é documento de identidade, e a política aqui é a mesma da leitura de RG e CNH: uso permitido apenas para verificação de identidade com consentimento do titular — o hóspede que entrega o passaporte no check-in, o cliente que envia a foto para abrir cadastro. A imagem não fica armazenada depois de gerar a resposta. Montar bases de viajantes sem conhecimento das pessoas ou usar a leitura para vigilância é uso proibido.
Preço por imagem, status beta e limites
Cada solicitação custa US$ 0,010, mais US$ 0,0575 por imagem — US$ 0,0675 por passaporte lido, com arquivos de até 25 MB. A capacidade está em beta: a decodificação do padrão é estável, mas fotos de recepção têm reflexo, sombra e ângulo, então mantenha o alerta de dígito verificador como trava do seu fluxo. Não há mensalidade: uma pousada que lê 500 passaportes na alta temporada paga US$ 33,75 e nada nos meses vazios.
Casos de uso
Check-in de estrangeiro na pousada
Uma pousada em Recife recebe hóspedes estrangeiros e precisa preencher a FNRH, a ficha nacional obrigatória de registro de hóspedes. Em vez de decifrar o passaporte no balcão, a recepção tira uma foto: nome, nacionalidade, número do documento e data de nascimento voltam prontos para a ficha, com o hóspede ainda tirando a mochila das costas.
Agência de intercâmbio conferindo validade
Antes de fechar um pacote de intercâmbio, a agência confere se o passaporte do estudante vence nos próximos meses — muitos destinos exigem validade mínima além da data de retorno. A leitura da MRZ entrega a data de validade como campo, e o alerta de vencimento próximo vira regra automática no sistema.
KYC de cliente estrangeiro em plataforma de câmbio
Uma plataforma de remessas atende estrangeiros que vivem no Brasil e não têm RG. O passaporte entra como documento de identificação: o cliente fotografa a página de dados, a MRZ vira cadastro estruturado e os dígitos verificadores conferidos reduzem a fila de revisão manual do compliance.
Credenciamento de evento internacional
Na chegada de palestrantes e convidados estrangeiros a um congresso em São Paulo, a equipe de credenciamento fotografa o passaporte apresentado no balcão e o crachá sai com nome e nacionalidade corretos — sem soletrar sobrenomes no meio da fila.
Perguntas frequentes
Só passaporte, ou outros documentos com MRZ também?
O foco é o passaporte, que traz MRZ de duas linhas no padrão ICAO. Documentos de viagem que seguem o mesmo padrão — como carteiras de residente e vistos com zona de leitura mecânica — tendem a ser lidos, mas, como a capacidade está em beta, teste com os tipos que aparecem no seu balcão antes de confiar o fluxo a eles.
O nome sai igualzinho ao impresso na página do passaporte?
Sai como está escrito na MRZ, que por padrão não tem acento nem cedilha: “João Conceição” aparece como JOAO CONCEICAO, e sobrenomes com caracteres especiais de outros alfabetos vêm transliterados. Se o seu cadastro exige o nome com grafia completa, use o campo da MRZ como base e confirme a grafia na parte visual do documento.
O que acontece quando um dígito verificador não bate?
O campo correspondente volta sinalizado como não conferido. Na prática, isso quase sempre indica foto ruim — reflexo do plástico, linha cortada, ângulo fechado. Refaça a foto com o documento apoiado e luz uniforme; se a divergência persistir, confira o dado manualmente antes de gravar.
A foto pode ser tirada com o celular, na recepção mesmo?
Pode, e é o uso típico. O que melhora o resultado: apoiar o passaporte aberto numa superfície plana, enquadrar a página inteira de dados, evitar o flash direto sobre a lâmina plastificada e conferir se as duas linhas da MRZ aparecem completas e sem corte na imagem.
Quanto custa na prática para um hotel?
US$ 0,0675 por passaporte lido — US$ 0,010 da solicitação mais US$ 0,0575 da imagem, sempre em dólares americanos. Um hotel que registra 400 estrangeiros no mês gasta US$ 27; não há assinatura, então o custo acompanha a ocupação.
A imagem do passaporte fica guardada em algum servidor de vocês?
Não fica: ela serve para gerar a resposta da solicitação e não é armazenada. O registro que você mantém no seu sistema — exigido, por exemplo, pela ficha de hóspedes — é responsabilidade sua como controlador, com o consentimento do titular, como pede a LGPD.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/ocr/mrz \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"image":"https://ejemplo.com/imagen.jpg"}'const res = await fetch("https://api.kit.forhosting.com/ocr/mrz", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"image": "https://ejemplo.com/imagen.jpg"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/ocr/mrz",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"image": "https://ejemplo.com/imagen.jpg"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/ocr/mrz", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"image":"https://ejemplo.com/imagen.jpg"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"image":"https://ejemplo.com/imagen.jpg"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/ocr/mrz", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"image": "https://ejemplo.com/imagen.jpg"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "ocr.mrz",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_mb | 25 |
max_pages | 10 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
422 | task_failed | A tarefa falhou do nosso lado. Você não paga nada por ela. |