API de consulta de CPF.
Integre ao seu sistema.
Consulte nome e data de nascimento pelo CPF com respostas em JSON. Veja como autenticar, enviar consultas individuais ou em lote e tratar cada resultado no seu sistema.
https://cpfdireto.comSua próxima integração começa com um prompt.
Escolha o ambiente, copie as instruções e entregue ao seu agente. O prompt inclui o contrato da API, estados da interface, autenticação, créditos e testes.
Pronto para colar. Sua chave fica fora do prompt.
Ver o prompt completo
Implemente esta integração no meu projeto Lovable. Detecte o backend disponível: use uma função de servidor ou Edge Function conforme a arquitetura existente. Solicite CPF_DIRETO_KEY pelo formulário de secrets. O navegador chama somente a função protegida da aplicação. Não coloque a chave na conversa.
Integre CPF Direto em uma aplicação existente, respeitando a arquitetura e os padrões do projeto.
Contrato: https://cpfdireto.com/api/openapi.json
Guia: https://cpfdireto.com/api-guide.md
Base: https://cpfdireto.com (as rotas já incluem /api/v1).
1. Implemente a chamada no backend. Guarde CPF_DIRETO_KEY como segredo no servidor; solicite seu preenchimento pelo gerenciador de segredos, nunca pelo chat. Não exponha a chave em frontend, bundle, logs, URLs ou localStorage.
2. Proteja a rota da sua aplicação com autenticação, autorização por usuário e limite de uso. Não crie um proxy público para uma chave paga. Preserve o controle de origem/CSRF quando usar cookies.
3. Envie Authorization: Bearer <CPF_DIRETO_KEY> e Content-Type: application/json. POST /api/v1/consultas recebe {"cpf":"12345678909"}. CPF é string, nunca número. Preserve zeros iniciais; valide 11 dígitos e verificadores antes de enviar.
4. HTTP 200 pode ser {success:true,data:{name,cpf,birthday,gender},meta:{remainingCredits,consultedAt}} OU {success:false,data:null,meta:{remainingCredits,consultedAt}}. Não confunda ausência de registro com erro HTTP. birthday é YYYY-MM-DD; gender é M, F ou null. consultedAt é ISO 8601 UTC de processamento, não de atualização da fonte.
5. POST /api/v1/lotes recebe {cpfs:[strings]}, de 1 a 100 itens. Retorna {results:[{success,data}],meta}, em ordem e incluindo duplicatas. Inválidos e ausentes têm success:false/data:null. Cada ocorrência encontrada custa 1 crédito; duplicatas custam novamente. HTTP 402 cancela o débito de todo o lote.
6. GET /api/v1/saldo retorna {remainingCredits,includedCredits,includedUsed,extraCredits,renewsAt}. Use renewsAt para renovação; saldo não reserva créditos. GET /api/v1/historico retorna {rows,total}; filtros limit (1–500, padrão 500), offset (>=0), q (até 120 caracteres, busca mascarada), status, type, from e to (datas inclusivas em Brasília). /api/v1/historico.csv usa os mesmos filtros e paginação e retorna CSV UTF-8 com BOM e ponto e vírgula; erros são JSON.
7. Erros JSON: {error:{code,message}}. Trate status HTTP + error.code: 400 invalid_cpf/request_error, 401 unauthorized/invalid_api_key/request_error, 402 credits_exhausted, 403 email_unverified/billing_hold/request_error, 404 request_error, 413 request_error, 415 request_error, 429 rate_limited, 500 server_error e 503 catalog_unavailable/catalog_busy/real_data_disabled. A mensagem pode variar. Em 429, respeite Retry-After em segundos. Registre X-Request-Id sem documentos ou chaves.
8. Limite padrão: 120 requisições/minuto por conta, compartilhadas entre chaves e consultas do painel; observe X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset (Unix em segundos) quando presentes. Um lote conta como uma requisição. Saldo/histórico não gastam créditos, mas contam nesse limite.
9. Configure timeout e cancelamento, impeça duplo envio, mostre carregamento, encontrado, não encontrado, entrada inválida, falta de saldo e indisponibilidade. Não repita POST automaticamente após timeout, erro 500 ou falha de rede: pode ter sido cobrado. Não há garantia de idempotência nem suporte documentado a Idempotency-Key nas consultas. Limite as tentativas; não faça polling de consultas.
10. Renderize nomes como texto, sem HTML; evite cache público, analytics e logs com dados pessoais. Não apresente a consulta como prova de identidade, score ou situação fiscal. Não invente SDK, MCP, webhook ou endpoint de sandbox.
11. Escreva testes de contrato com respostas locais: encontrado com gender:null, não encontrado 200, erros 400/401/402/403/429/503, timeout incerto e lote misto. Não use consultas pagas nos testes automáticos. Documente onde preencher o segredo e como executar o projeto.Auth0 cuida do login da sua aplicação. Seu backend valida o usuário e utiliza a chave do CPF Direto para fazer a consulta.
Autenticação
- Crie e confirme sua conta.
Comece no plano Grátis e confirme o e-mail para liberar consultas.
- Gere sua chave no painel.
Abra API → Chaves de API. Guarde a chave em um segredo do servidor; você pode revogá-la ou substituí-la pelo painel.
- Envie o cabeçalho em cada chamada.
Todas as rotas desta referência exigem a chave. POST também exige
Content-Type: application/json.
Authorization: Bearer SUA_CHAVE
Content-Type: application/jsonA chave fica no servidor. Use CPF_DIRETO_KEY em uma variável de ambiente privada. Não use X-API-Key, query string ou token Auth0 para autenticar no CPF Direto. Chamadas de outro site devem passar pelo seu backend.
Faça a primeira requisição
Defina CPF_DIRETO_KEY no ambiente do servidor. Envie o CPF no corpo JSON; ele deve ser uma string para preservar zeros iniciais.
curl --include --max-time 15 --request POST \
https://cpfdireto.com/api/v1/consultas \
--header "Authorization: Bearer $CPF_DIRETO_KEY" \
--header "Content-Type: application/json" \
--data '{"cpf": "12345678909"}'Os exemplos mostram a chamada HTTP completa. No seu fluxo, trate os erros HTTP e depois verifique success. Use os dados exibidos apenas para entender o formato; eles não garantem um resultado no catálogo.
Consultar um CPF
/api/v1/consultasInforme o CPF como string, com ou sem pontuação, até 32 caracteres. Os 11 dígitos e os verificadores são validados. Preserve zeros iniciais. Um registro encontrado consome 1 crédito; um CPF válido sem registro retorna HTTP 200, success: false e data: null, sem cobrança.
{
"cpf": "12345678909"
}{
"success": true,
"data": {
"name": "Pessoa de exemplo",
"cpf": "12345678909",
"birthday": "1990-06-15",
"gender": null
},
"meta": {
"remainingCredits": 19,
"consultedAt": "2026-10-14T15:30:00.000Z"
}
}success antes de ler data. Um erro HTTP usa outro formato: {"error":{"code":"…","message":"…"}}.Erros possíveis: 400, 401, 402, 403, 404, 413, 415, 429, 500 e 503. Ver códigos e tratamento.
Consultar em lote
/api/v1/lotesEnvie cpfs como uma lista de 1 a 100 strings, com até 32 caracteres cada. A resposta é síncrona e mantém a ordem, incluindo repetições. Itens inválidos e não encontrados retornam success: false e data: null. Valide os dígitos antes de enviar para distingui-los. Cada ocorrência encontrada custa 1 crédito; repetições também são cobradas. Com saldo insuficiente, todo o envio retorna 402 sem débito parcial.
{
"cpfs": [
"12345678909",
"52998224725"
]
}{
"results": [
{
"success": true,
"data": {
"name": "Pessoa de exemplo",
"cpf": "12345678909",
"birthday": "1990-06-15",
"gender": null
}
},
{
"success": false,
"data": null
}
],
"meta": {
"remainingCredits": 19,
"consultedAt": "2026-10-14T15:30:00.000Z"
}
}results[i] a cpfs[i]. Um item inválido não interrompe os demais; a estrutura do envio deve ser válida. Remova duplicatas antes de enviar se quiser evitar consumo repetido.Erros possíveis: 400, 401, 402, 403, 404, 413, 415, 429, 500 e 503. Ver códigos e tratamento.
Consultar saldo
/api/v1/saldoRetorna o saldo atual, a franquia do plano, o consumo da franquia, os créditos adicionais e a próxima renovação. Não consome créditos, mas conta no limite de requisições. O saldo é informativo e não reserva créditos para outra requisição.
{
"remainingCredits": 19,
"includedCredits": 20,
"includedUsed": 1,
"extraCredits": 0,
"renewsAt": "2026-11-01T03:00:00.000Z"
}- remainingCredits
- Total de créditos disponíveis agora.
- includedCredits / includedUsed
- Franquia mensal e quantidade já utilizada dessa franquia.
- extraCredits
- Créditos adicionais ainda disponíveis.
- renewsAt
- Próxima renovação em ISO 8601 UTC. O plano pago depende da confirmação do pagamento do período.
Erros possíveis: 401, 403, 404, 429 e 500. Ver códigos e tratamento.
Consultar histórico
/api/v1/historicoRetorna somente as operações da sua conta, da mais recente para a mais antiga, com documentos mascarados. rows contém a página; total é o número de itens que correspondem aos filtros, antes da paginação. Sem resultados: rows: [] e total: 0. Não consome créditos; conta no limite de requisições.
Filtros e paginação
Todos são opcionais. Codifique os valores na URL. A paginação usa offset; novas consultas podem deslocar páginas durante a leitura.
| Parâmetro | Tipo | Como usar |
|---|---|---|
limit | integer | Itens por página: 1 a 500. Padrão: 500. |
offset | integer | Itens a pular, a partir de 0. Padrão: 0. |
from | string | Data inicial inclusiva, AAAA-MM-DD, no horário de Brasília. |
to | string | Data final inclusiva, AAAA-MM-DD, no horário de Brasília. Deve ser igual ou posterior a from. |
status | string | Filtre por resultado: Encontrado, Não encontrado ou Inválido. |
type | string | Filtre por tipo: Individual ou Em lote. |
q | string | Busca textual no documento mascarado, resultado e tipo. Até 120 caracteres; não busca nome ou CPF completo. |
https://cpfdireto.com/api/v1/historico?limit=20&offset=0&from=2026-10-01&to=2026-10-31&status=Encontrado{
"rows": [
{
"id": "10946738-6d63-40a0-bd01-5ee2a40de9cd",
"document": "***.456.789-**",
"status": "Encontrado",
"type": "Individual",
"date": "2026-10-14T15:30:00.000Z",
"chargedCredits": 1
}
],
"total": 1
}chargedCredits é 0 ou 1; date é ISO 8601 UTC. id identifica o item do histórico. Nome e dados cadastrais completos não são retornados aqui.
Erros possíveis: 400, 401, 403, 404, 429 e 500. Ver códigos e tratamento.
Exportar histórico
/api/v1/historico.csvMesmos filtros e paginação do histórico JSON, inclusive o máximo de 500 linhas por chamada. Retorna text/csv; charset=utf-8 com BOM, separador ponto e vírgula e campos entre aspas. Use offset para exportar mais páginas. Erros continuam sendo JSON. Não consome créditos; conta no limite de requisições.
"Documento";"Resultado";"Tipo";"Data";"Créditos consumidos"
"***.456.789-**";"Encontrado";"Individual";"2026-10-14T15:30:00.000Z";"1"Erros possíveis: 400, 401, 403, 404, 429 e 500. Ver códigos e tratamento.
Entenda os campos da consulta
| Campo | Tipo | Significado |
|---|---|---|
success | boolean | true se houver registro; false quando não encontrado. No lote, vale por item. |
data | object | null | Registro encontrado ou null. Verifique success antes de acessar os campos. |
data.name | string | Nome presente no cadastro. Renderize como texto. |
data.cpf | string | 11 dígitos sem pontuação. Preserve zeros à esquerda. |
data.birthday | string | Data de nascimento em AAAA-MM-DD, sem horário. Não use birthDate. Trate como data civil, sem converter pelo fuso horário. |
data.gender | "M" | "F" | null | Informação de gênero disponível. null não altera success nem remove o cadastro. |
meta.remainingCredits | integer | Saldo após esta requisição. Pode mudar com consultas concorrentes. |
meta.consultedAt | string | Processamento em ISO 8601 UTC. Não informa a atualização da fonte. |
As consultas retornam somente o resultado e meta. Não incluem dados da conta, preços ou histórico. O alias POST /api/v1/consulta permanece compatível; use /api/v1/consultas em integrações novas.
Status HTTP e códigos de erro
Leia o status HTTP primeiro. Em erros, a resposta contém error.code e error.message, sem data ou meta. Use o código para decidir o fluxo; o texto da mensagem pode variar.
{
"error": {
"code": "invalid_cpf",
"message": "Confira os 11 dígitos e digite um CPF válido."
}
}Corrija o CPF antes de reenviar.
| HTTP / código | Quando acontece | O que fazer |
|---|---|---|
400invalid_cpf | CPF individual com formato ou dígitos inválidos. | Corrija o CPF antes de reenviar. |
400request_error | JSON, lista ou filtros inválidos. O texto da mensagem explica o campo. | Confira o corpo e os parâmetros. Não repita a mesma entrada. |
401unauthorized | Credencial ausente. | Envie Authorization: Bearer SUA_CHAVE. |
401invalid_api_key | A chave não está ativa. | Confira ou substitua a chave no painel. |
401request_error | Formato do cabeçalho Authorization incorreto. | Use Bearer, um espaço e a chave, sem aspas. |
402credits_exhausted | Saldo insuficiente para os registros encontrados. | Adicione créditos. Um lote não debita parcialmente. |
403email_unverified | Confirmação de e-mail pendente. | Confirme o e-mail da conta antes de consultar. |
403billing_hold | Conta com pendência de pagamento. | Resolva a pendência pelo suporte. |
403request_error | Origem de navegador não permitida ou proteção de sessão ausente. | Integre pelo backend com a chave de API. |
404request_error | Caminho ou método HTTP não suportado. | Confira a rota e o método; não confunda com CPF não encontrado. |
413request_error | Corpo maior que 128.000 bytes. | Reduza o corpo; envie no máximo 100 CPFs por lote. |
415request_error | Content-Type incorreto no POST. | Envie Content-Type: application/json. |
429rate_limited | Limite de requisições atingido. | Respeite Retry-After (segundos). Use fila e tentativas limitadas. |
500server_error | Falha interna inesperada. | Registre X-Request-Id. Não repita POST automaticamente: o resultado pode ser incerto. |
503catalog_unavailable | Catálogo indisponível. | Aguarde e limite novas tentativas. Se persistir, contate o suporte. |
503catalog_busy | Fila de consultas ocupada. | Reduza a concorrência e use espera progressiva com variação aleatória. |
503real_data_disabled | Consultas temporariamente desabilitadas no serviço. | Aguarde a habilitação pelo responsável do serviço. |
Guarde o cabeçalho X-Request-Id ao reportar uma falha. O identificador fica no cabeçalho, não no JSON. Não envie sua chave ou documentos completos ao registrar um chamado.
Limites, créditos e novas tentativas
Requisições e créditos são contagens diferentes
O limite padrão é de 120 requisições por minuto por conta, compartilhado entre chaves e chamadas do painel às rotas v1. Um lote conta como uma requisição, mas cada CPF encontrado consome um crédito. Saldo e histórico entram no limite de requisições sem consumir créditos.
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 119
X-RateLimit-Reset: 1791991860
X-Request-Id: 10946738-6d63-40a0-bd01-5ee2a40de9cdOs cabeçalhos de quota são enviados quando disponíveis; X-RateLimit-Reset usa segundos Unix. Em HTTP 429, leia Retry-After em segundos. Não dependa de receber os demais cabeçalhos no erro.
Renovação e saldo
O plano Grátis renova a franquia no início do mês em Brasília. O plano pago acompanha o período efetivamente pago da assinatura. A franquia não acumula; créditos adicionais permanecem até o consumo. Use renewsAt retornado pelo saldo. Consultar planos.
Reenvio com controle
- 400, 401, 402, 403, 404, 413 e 415: corrija a causa antes de reenviar.
- 429: aguarde
Retry-After, limite tentativas e reduza concorrência. - 503: use espera progressiva com variação aleatória e limite tentativas;
real_data_disableddepende da habilitação do serviço. - Timeout, erro 500 ou conexão interrompida: o processamento pode ter ocorrido. Não repita consultas automaticamente.
Idempotency-Key não impede nova cobrança. Desabilite duplo envio na interface e acompanhe requisições em andamento na sua aplicação.O corpo JSON aceita até 128.000 bytes. Todos os exemplos de timeout nesta página são escolhas do cliente; não representam uma garantia de tempo de resposta.
Playground
Explore respostas sem credenciais ou envie uma requisição real com sua chave. A URL da requisição real usa este mesmo servidor.
Exemplo de resposta · HTTP 200
{
"success": true,
"data": {
"name": "Pessoa de exemplo",
"cpf": "12345678909",
"birthday": "1990-06-15",
"gender": null
},
"meta": {
"remainingCredits": 19,
"consultedAt": "2026-10-14T15:30:00.000Z"
}
}Resposta ilustrativa do contrato. Nenhuma consulta foi enviada.
Perguntas frequentes
Um HTTP 200 sempre significa que o CPF foi encontrado?
Não. HTTP 200 significa que a consulta foi processada. Verifique success antes de acessar data. Se success for false, data será null e não haverá consumo de crédito. HTTP 404 indica rota ou método incorreto, não um CPF ausente.
Posso chamar a API diretamente do frontend?
A integração deve passar pelo seu backend ou função de servidor. Guarde a chave em uma variável de ambiente ou cofre de segredos. Nunca a coloque em variáveis VITE_ ou NEXT_PUBLIC_, código público, localStorage ou prompts. O playground desta página é uma ferramenta manual e envia a chave somente ao próprio CPF Direto.
Como testo sem fazer uma consulta real?
O modo Exemplos do playground mostra os contratos sem rede, chave ou consumo de créditos. O modo Requisição real usa sua chave e o saldo da conta. Os dados ilustrativos não garantem que o mesmo CPF exista no catálogo. Não há um endpoint sandbox separado.
O que acontece se repetir um CPF ou uma requisição?
Cada ocorrência encontrada consome um crédito, inclusive CPFs repetidos em um lote. As consultas não têm garantia de idempotência; um cabeçalho Idempotency-Key não elimina cobranças repetidas. Em timeout ou conexão interrompida, o servidor pode ter concluído a consulta. Não repita automaticamente.
Quando os créditos são renovados?
No plano grátis, a franquia renova no início do mês no horário de Brasília. Em assinaturas pagas, a renovação acompanha o período efetivamente pago. A franquia não acumula; créditos adicionais permanecem até o consumo. Consulte renewsAt em /api/v1/saldo e não calcule a renovação pelo relógio do navegador.
Gênero ausente significa que o CPF não foi encontrado?
Não. gender pode ser M, F ou null. Um gênero sem informação não muda success nem remove os demais dados do registro. A data de nascimento usa birthday, no formato AAAA-MM-DD.
A resposta confirma identidade ou situação na Receita Federal?
A API retorna dados cadastrais presentes no catálogo. Não retorna score, dívidas, situação fiscal, comprovante de identidade ou consulta em tempo real à Receita Federal. consultedAt é o horário de processamento da consulta, não a data de atualização do cadastro.
Como usar CPF Direto em uma aplicação com Auth0?
Auth0 autentica os usuários da sua aplicação. Seu backend valida o access token e a permissão do usuário; depois chama CPF Direto usando sua chave própria. Um token Auth0 não substitui a chave de CPF Direto. Use o prompt Com Auth0 para orientar seu agente de implementação.
Há SDK, webhook ou MCP para consultas?
A integração documentada é HTTP com JSON e Bearer, sem SDK obrigatório. Os lotes são síncronos; não há job para acompanhar nem webhook de conclusão. Agentes podem ler OpenAPI e o guia em Markdown para implementar um cliente HTTP. Isso não representa um servidor MCP.
Crie sua chave e acompanhe o consumo no painel.