Teste de Luhn
Aplica o algoritmo de Luhn — o teste matemático embutido em todo número de cartão — para dizer se a sequência é válida. Roda inteiramente no navegador: o número não é transmitido, registrado nem armazenado. Para desenvolvedores testando checkout, QAs validando formulários e curiosos entendendo como o cartão funciona.
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
O truque matemático dentro do seu cartão
Todo número de cartão carrega um dígito final calculado sobre os demais — o checksum de Luhn, criado justamente para flagrar erro de digitação. Troque dois números de lugar, erre uma tecla, e a conta não fecha. É por isso que o checkout avisa “cartão inválido” antes mesmo de falar com a operadora: o formulário só fez a conta. Esta ferramenta faz a mesma conta, na sua frente e na sua tela.
Privacidade primeiro — por arquitetura e por política
O número que você digita não sai da página: o teste roda em JavaScript no seu navegador, sem chamada a servidor. E a política da ferramenta é explícita — número de cartão não é armazenado, registrado nem transmitido, em nenhum modo de uso. Ainda assim, a boa prática vale: para experimentar, prefira números de teste públicos em vez do seu cartão real.
O que o teste diz — e o que não diz
Luhn válido significa “esta sequência é possível como número de cartão”. Não significa que o cartão existe, tem saldo, está ativo ou pertence a alguém — nada disso é verificável sem a operadora. O teste serve para pegar erro de digitação e sequência inventada; qualquer uso além disso é fantasia. Ferramenta séria diz o limite do que faz — e se alguém vende “verificação de saldo pelo número”, desconfie: é golpe.
Para desenvolvedores
No checkout, o Luhn é a primeira validação do campo de cartão — barata, instantânea, sem tocar no gateway. Os números de teste clássicos ajudam: 4111 1111 1111 1111 passa no teste; mude o último dígito e ele reprova. Via API, a mesma checagem custa US$ 0,002 por chamada e segue a mesma política: o número é usado para calcular a resposta e nada mais.
Casos de uso
Testar o formulário do checkout
O dev da TecnoSul precisa conferir se a validação do campo de cartão está certa. Cola os números de teste na ferramenta, compara os vereditos com o comportamento do formulário e fecha o ticket.
QA de integração de pagamento
Antes de apontar para o gateway de produção, o QA confirma que a aplicação rejeita sequências inválidas localmente — sem gastar chamada do gateway com erro bobo.
Entender o algoritmo
Estudantes e curiosos usam a ferramenta para ver o Luhn em ação: digite qualquer sequência, mude um dígito, veja o veredito virar. É o jeito mais rápido de entender por que checkout pega erro de digitação.
Perguntas frequentes
Posso digitar meu cartão de verdade?
O número não sai do seu navegador — essa é a arquitetura, e a política de não armazenar nem transmitir vale sempre. Dito isso, recomendamos números de teste: é hábito de segurança que não custa nada.
Cartão que passa no Luhn existe?
Não necessariamente. O teste valida a matemática da sequência, não a existência do cartão. Verificar se um cartão está ativo é papel exclusivo da operadora, dentro do fluxo de pagamento.
Isso serve para gerar números de cartão?
Não — a ferramenta valida, não gera. E números “válidos no Luhn” não servem para comprar nada: sem emissor, conta e saldo reais, o pagamento é recusado na autorização.
Qual a relação com a bandeira do cartão?
São informações diferentes: o Luhn valida a sequência inteira; a bandeira se deduz dos primeiros dígitos. O KIT tem uma checagem própria de bandeira, também gratuita no navegador.
Quanto custa via API, e a política muda?
US$ 0,002 por chamada, pagamento por uso via PayPal. A política é a mesma do modo grátis: o número é processado para devolver o veredito e não é registrado nem retido.
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/verify/card-luhn \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"items":["valor-1","valor-2"]}'const res = await fetch("https://api.kit.forhosting.com/verify/card-luhn", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"items": [
"valor-1",
"valor-2"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/verify/card-luhn",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"items": [
"valor-1",
"valor-2"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/verify/card-luhn", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"items":["valor-1","valor-2"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"items":["valor-1","valor-2"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/verify/card-luhn", 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
{
"items": [
"valor-1",
"valor-2"
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "verify.card_luhn",
"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.
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. |