O que o validador confere
Validar um CPF é verificar se o número é estruturalmente possível. O validador desta página faz, nesta ordem, as mesmas checagens que um back-end bem escrito deveria fazer:
- Caracteres. No campo desta página, tudo o que não é dígito é descartado enquanto você digita. Já a API e a função mostrada mais abaixo aceitam pontos, hífen e espaços como separadores e recusam qualquer outro caractere, como letras ou barras: a API responde com o motivo
caracterese a função devolvefalse. - Tamanho. Depois de limpo, o número precisa ter exatamente 11 dígitos. Nem dez, nem doze.
- Sequência repetida. Números como 111.111.111-11 ou 999.999.999-99 são rejeitados antes de qualquer conta.
- Primeiro dígito verificador. Calculado a partir dos nove primeiros dígitos com pesos de 10 a 2.
- Segundo dígito verificador. Calculado a partir dos dez primeiros dígitos com pesos de 11 a 2.
Se tudo confere, o resultado é VÁLIDO e a ferramenta mostra a região fiscal indicada pelo nono dígito. Para o CPF de exemplo 529.982.247-25, o nono dígito é 7, o que corresponde à região fiscal 7 (RJ/ES). Se alguma etapa falha, o resultado é INVÁLIDO, acompanhado do motivo e, quando o problema está nos dígitos verificadores, dos dígitos que eram esperados.
O campo aplica a máscara enquanto você digita e preserva a posição do cursor, então dá para colar um número inteiro ou corrigir um dígito no meio sem reescrever tudo.
Por que um CPF pode ser inválido
Cada falha tem uma causa diferente, e saber qual delas ocorreu ajuda a decidir a mensagem de erro que o seu sistema deve mostrar. A API devolve o mesmo código de motivo que aparece na coluna da esquerda.
| Motivo | O que significa |
|---|---|
caracteres |
A entrada tem algo além de dígitos, pontos, hífen ou espaços. Costuma vir de colagem com texto junto ou de importação de planilha mal formatada. |
tamanho |
Depois de remover a pontuação, sobram mais ou menos de 11 dígitos. Comum quando um zero à esquerda se perde, por exemplo ao guardar o CPF como número inteiro. |
repetido |
Os 11 dígitos são iguais. A conta do módulo 11 fecha para essas sequências, mas elas não são consideradas válidas e costumam aparecer como valor de preenchimento. |
dv1 |
O décimo dígito não bate com o calculado. Geralmente é erro de digitação em algum dos nove primeiros dígitos ou no próprio verificador. |
dv2 |
O primeiro verificador está certo, mas o décimo primeiro dígito não. Por exemplo, 529.982.247-26: o esperado era 5. |
A perda do zero à esquerda merece atenção especial. CPFs que começam com zero existem, e um campo numérico no banco de dados ou uma coluna de planilha formatada como número transformam 012.345.678-90 em um valor com dez dígitos. O guia sobre erros comuns ao validar CPF reúne esse e outros problemas frequentes.
Validar por código
A função abaixo, em JavaScript, implementa as mesmas cinco checagens. Ela devolve true ou false; se você precisar do motivo, transforme cada return false em um retorno com o código correspondente.
function validarCpf(valor) {
const entrada = String(valor).replace(/[.\-\s]/g, '');
if (!/^\d{11}$/.test(entrada)) return false;
if (/^(\d)\1{10}$/.test(entrada)) return false;
const digito = (n) => {
let soma = 0;
for (let i = 0; i < n; i++) soma += Number(entrada[i]) * (n + 1 - i);
const resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
};
return digito(9) === Number(entrada[9]) && digito(10) === Number(entrada[10]);
}
validarCpf('529.982.247-25'); // true
validarCpf('111.111.111-11'); // false (repetido)
validarCpf('529.982.247-26'); // false (2º dígito)A função interna digito(n) usa os n primeiros dígitos com pesos que começam em n + 1 e descem até 2: com n = 9, os pesos vão de 10 a 2; com n = 10, de 11 a 2. Repare que a validação não precisa gerar o CPF de novo: basta comparar os dois verificadores calculados com os informados.
A validação no front-end melhora a experiência de quem preenche o formulário, mas não substitui a validação no servidor, já que qualquer requisição pode ser montada sem passar pela sua interface. Versões para outras linguagens estão em TypeScript, Python, Java e C#. Para levar a regra para dentro do banco, veja o guia de validação de CPF em PostgreSQL e MySQL.
Validar pela API
Se preferir não manter a lógica no seu código, a API pública valida um CPF por requisição, sem chave:
GET https://www.cpf.dev.br/api/v1/cpf/validar/529.982.247-25
Resposta para um CPF válido:
{
"valido": true,
"cpf": "52998224725",
"formatado": "529.982.247-25",
"uf": ["ES", "RJ"]
}
O campo uf lista os estados da região fiscal indicada pelo nono dígito; neste exemplo, a região 7 (RJ/ES). Para um CPF inválido, como 529.982.247-26, valido vem como false e o campo motivo traz um dos códigos da tabela acima, neste caso dv2. O número pode ir com ou sem pontuação. O limite é de 60 requisições por minuto por IP; mais detalhes na documentação da API.
CPF válido não é CPF existente
Esta é a confusão mais comum sobre validação de CPF. Um resultado VÁLIDO significa apenas que os dígitos verificadores conferem com os nove primeiros dígitos. Ele não diz:
- se o número foi de fato emitido pela Receita Federal;
- se pertence à pessoa que o informou;
- se está em situação regular, suspenso ou cancelado.
Qualquer um pode produzir milhões de CPFs válidos com a conta mostrada acima, e é exatamente isso que o gerador de CPF faz para fins de teste. Por isso a validação matemática serve para pegar erros de digitação cedo, não para confirmar identidade. Quando o seu processo exige saber se o CPF existe e pertence a quem o informou, é preciso recorrer a serviços oficiais ou a fornecedores autorizados. O comparativo CPF válido vs. CPF existente detalha a diferença e as opções disponíveis.