ProValidPhone

Documentação da API ProValidPhone v1

Quatro endpoints REST em JSON para validar números brasileiros e confirmar posse por código OTP via SMS ou ligação com voz. Base: https://api.provalidphone.com.br. Todas as respostas são JSON em UTF-8.

Autenticação

Toda chamada exige uma API key criada no painel. A chave crua (pvp_live_…) é exibida uma única vez na criação; a plataforma guarda apenas o hash SHA-256. Envie a chave em um dos dois headers:

Authorization: Bearer pvp_live_SUACHAVE
# ou
X-API-Key: pvp_live_SUACHAVE

Chave ausente, inválida ou revogada devolve 403. Cada API key pode ter um nome de projeto (remetente), que aparece no texto do SMS e é repassado ao serviço de voz para a locução da ligação.

Validação estrutural

POST /v1/validate

Normaliza e valida um número brasileiro sem enviar nada ao telefone. Não consome cota. Aceita o número como o usuário digitou: com ou sem parênteses, traço, espaço, DDI.

# requisição
curl -X POST https://api.provalidphone.com.br/v1/validate \
  -H "Authorization: Bearer pvp_live_SUACHAVE" \
  -H "Content-Type: application/json" \
  -d '{"phone":"(11) 99999-8888"}'

# resposta 200
{
  "valid": true,
  "phone": "(11) 99999-8888",
  "e164": "+5511999998888",
  "type": "movel",
  "ddd": "11",
  "errors": []
}

type é movel ou fixo. Quando valid é false, errors traz a lista de motivos em português (por exemplo, DDD inválido ou comprimento incorreto), type vem desconhecido e e164 vem null.

Envio do código (SMS ou voz)

POST /v1/verify/sms e POST /v1/verify/call

Valida o número, gera um código de 6 dígitos e o envia por SMS (/sms) ou por uma ligação que dita o código em voz (/call). Cria uma sessão de verificação e devolve o id para a conferência. Consome 1 verificação da cota quando o provedor aceita o envio.

# requisição (mesmo corpo para /sms e /call)
curl -X POST https://api.provalidphone.com.br/v1/verify/sms \
  -H "Authorization: Bearer pvp_live_SUACHAVE" \
  -H "Content-Type: application/json" \
  -d '{"phone":"+5511999998888"}'

# resposta 201
{
  "id": "3f6c1c2e-9a1b-4d0e-8f7a-2b5c9d1e4a77",
  "status": "pending",
  "channel": "sms",
  "phone": "+5511999998888"
}

Texto do SMS: {Nome do projeto} enviou o codigo: 123456. Na ligação, o código é ditado dígito a dígito. Se o número for inválido, a resposta é 400 com error: phone_invalido e nada é enviado.

Conferência do código

POST /v1/verify/check

Confere o código digitado pelo usuário para a sessão informada. Não consome cota. Ao acertar, a sessão passa a verified e não aceita novas conferências.

# requisição
curl -X POST https://api.provalidphone.com.br/v1/verify/check \
  -H "Authorization: Bearer pvp_live_SUACHAVE" \
  -H "Content-Type: application/json" \
  -d '{"id":"3f6c1c2e-9a1b-4d0e-8f7a-2b5c9d1e4a77","code":"123456"}'

# resposta 200
{ "id": "3f6c1c2e-9a1b-4d0e-8f7a-2b5c9d1e4a77", "valid": true, "status": "verified" }

Valores de status: pending (aguardando), verified (confirmado), failed (tentativas esgotadas) e expired (prazo vencido). Sessões só são visíveis para a conta que as criou; id desconhecido devolve 404.

Códigos de erro

HTTPerrorQuando aconteceO que fazer
400phone_invalidoO número não passou na validação estruturalMostrar os motivos de errors ao usuário e pedir correção
403autenticaçãoAPI key ausente, inválida ou revogadaConferir o header e a chave no painel
402cotaCota mensal de verificações atingidaAguardar a próxima competência ou ampliar o plano
402trialPeríodo de teste encerrado sem plano ativoContratar um plano de produção
403suspensaConta suspensaEntrar em contato com o suporte
404sessao_nao_encontradaid inexistente ou de outra contaConferir o id devolvido no envio
429limiteMais de 3 envios na última hora para o mesmo númeroAguardar antes de reenviar; oferecer o outro canal
502falha_envioO provedor não aceitou o SMS ou a ligaçãoTentar novamente ou usar o outro canal
503canal_indisponivelCanal (SMS ou voz) desativado no momentoUsar o outro canal e tentar mais tarde

Limites e regras do código

RegraValor padrão
Tamanho do código6 dígitos numéricos
Validade do código5 minutos a partir do envio
Tentativas de conferência por código5
Envios por hora para o mesmo número3 (somando SMS e voz)
Cota mensal no período de teste100 verificações
Armazenamento do códigoApenas hash SHA-256; nunca em texto claro

Fluxo recomendado de integração

  1. Chame /v1/validate assim que o usuário digitar o número e mostre o erro na hora se valid for false. Isso evita envio para número impossível.
  2. Ofereça SMS como padrão e a ligação com voz como alternativa visível (útil para fixo e quando o SMS não chega).
  3. Guarde o id da sessão no seu lado e mostre um campo de 6 dígitos com contagem de 5 minutos.
  4. Em /v1/verify/check, trate valid: false com status: pending como código errado (ainda há tentativas) e failed ou expired como sessão encerrada, oferecendo novo envio.
  5. Trate 429 mostrando o tempo de espera e sugerindo o outro canal; nunca reenvie automaticamente em loop.
  6. Persista o número em E.164 (campo e164) para evitar duplicidade na sua base.

Criar conta e gerar API key Ver preços