Validar cartão de crédito com o algoritmo de Luhn
Este validador remove espaços e hífens comuns do número informado, confirma que todos os caracteres restantes são algarismos e aplica a soma de verificação determinística de Luhn.
Executar grátis
Ele também indica a provável bandeira usando prefixos reconhecidos de Visa, Mastercard, American Express e Discover. O resultado ajuda você a encontrar erros frequentes antes de solicitar um pagamento, mas não comprova que a conta existe, está ativa, pertence ao cliente ou pode concluir uma compra.
Como funcionam a normalização e a validação da entrada
Informe o número do cartão como uma string, somente com algarismos ou no formato habitual com grupos separados por espaços ou hífens. O validador remove exclusivamente esses dois separadores. Em seguida, exige que cada caractere restante seja um algarismo ASCII. Letras, pontuação, barras, sublinhados e outros símbolos geram um erro de entrada, em vez de serem descartados silenciosamente. Esse comportamento rigoroso é importante porque uma limpeza permissiva demais pode transformar um valor digitado por engano em outro número e produzir um resultado enganoso. Uma string vazia, um valor formado apenas por separadores ou um valor que não seja string também é recusado. O objeto retornado nunca repete o número normalizado; ele contém somente o resultado da soma de verificação e a bandeira provável. Trate a entrada original como dado de pagamento confidencial em seu aplicativo, embora o cálculo seja local e não exija consulta ao emissor, autorização, solicitação de rede, valor aleatório nem estado persistente.
O que o resultado de Luhn realmente significa
O algoritmo de Luhn calcula um dígito verificador para detectar erros comuns de transcrição. A partir do algarismo mais à direita, o validador alterna entre manter um valor e duplicá-lo. Quando o valor duplicado passa de nove, nove é subtraído; todos os resultados são somados e o número passa no teste quando o total é divisível por dez. Um resultado positivo significa apenas que a sequência é matematicamente compatível com seu dígito verificador final. Ele não demonstra que um banco emitiu o número, que a conta continua aberta, que há saldo nem que a pessoa está autorizada a usá-la. Uma sequência inventada pode passar em Luhn, enquanto um cartão real com um algarismo incorreto geralmente falha. Use o resultado como retorno inicial do formulário ou controle de qualidade dos dados. Depois, confie em um processador de pagamentos adequado para tokenização, autenticação, autorização, controles antifraude e a decisão definitiva sobre a transação.
Como a provável bandeira é identificada
A bandeira é inferida pelo prefixo de identificação do emissor, e não consultada em um cadastro remoto. Um número iniciado por 4 é classificado como Visa. Mastercard inclui a faixa tradicional de 51 a 55 e a faixa mais recente de 2221 a 2720. American Express utiliza os prefixos 34 e 37. Discover abrange 6011, 65, os valores de 644 a 649 e o intervalo atribuído de 622126 a 622925. Se nenhuma regra corresponder, a bandeira será desconhecida, mas a verificação de Luhn continuará sendo calculada normalmente. A palavra provável é essencial: as atribuições mudam, existem produtos compartilhados e esta ferramenta reconhece deliberadamente apenas as quatro bandeiras solicitadas. A detecção do prefixo e a soma de verificação são independentes; um número pode ter prefixo conhecido e falhar em Luhn, ou passar em Luhn e permanecer desconhecido. Cada solicitação usa o preço-base publicado de US$ 0,002, sem cobrança variável pelo tamanho do número ou pela bandeira detectada.
Casos de uso
Aviso durante o preenchimento
Encontre um possível algarismo digitado incorretamente antes de enviar os dados a um processador adequado para autorização.
Qualidade de registros importados
Confira se números de arquivos antigos têm estrutura válida sem afirmar que as respectivas contas continuam ativas.
Teste de formulário de pagamento
Confirme que separadores de formatação são aceitos e caracteres incorretos são recusados de maneira consistente.
Perguntas frequentes
Passar no teste de Luhn comprova que o cartão é real?
Não. Isso comprova apenas que os algarismos satisfazem uma soma de verificação. Existência, titularidade, situação, saldo e autorização dependem do processador e do emissor.
Quais caracteres de formatação posso usar?
Você pode usar espaços e hífens. Eles são removidos antes do teste; qualquer outro caractere que não seja algarismo gera erro de entrada.
Quais bandeiras podem ser identificadas?
As regras de prefixo identificam provavelmente Visa, Mastercard, American Express e Discover. Outros prefixos retornam desconhecido.
Um prefixo reconhecido pode ter soma inválida?
Sim. A classificação do prefixo e o cálculo de Luhn são independentes; portanto, um prefixo Visa não garante aprovação.
O validador consulta algum banco ou bandeira?
Não. O resultado vem de aritmética determinística e regras de prefixo, sem consulta externa nem tentativa de autorização.
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/data/credit-card-luhn-validate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"number":"4111 1111 1111 1111"}'const res = await fetch("https://api.kit.forhosting.com/data/credit-card-luhn-validate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"number": "4111 1111 1111 1111"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/credit-card-luhn-validate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"number": "4111 1111 1111 1111"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/credit-card-luhn-validate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"number":"4111 1111 1111 1111"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"number":"4111 1111 1111 1111"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/credit-card-luhn-validate", 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
{
"number": "4111 1111 1111 1111"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.credit_card_luhn_validate",
"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 |
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. |