BillionVerify LogoBillionVerify

API Reference

Complete email checker API reference. Endpoints, parameters, response codes for email verification and validation.

A API BillionVerify é um serviço RESTful que fornece recursos poderosos de verificação de email. Todas as requisições da API devem ser feitas via HTTPS.

URL Base

https://api.billionverify.com/v1

Especificação OpenAPI

A especificação completa da API está disponível no formato OpenAPI 3.0:

Você pode importar a especificação OpenAPI em ferramentas como Postman, Insomnia, ou usá-la para gerar bibliotecas cliente.

Autenticação

Todas as requisições da API requerem autenticação usando um token Bearer no cabeçalho Authorization:

BV-API-KEY: YOUR_API_KEY

Obtenha sua chave de API no painel BillionVerify.

Exemplo

curl -X POST https://api.billionverify.com/v1/verify/single \
  -H "BV-API-KEY: bv_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"email": "test@example.com"}'

Limites de Taxa

PlanoRequisições/HoraRequisições/Dia
Gratuito1001.000
Inicial1.00010.000
Profissional10.000100.000
EmpresarialPersonalizadoPersonalizado

Informações sobre limites de taxa são incluídas nos cabeçalhos de resposta:

CabeçalhoDescrição
X-RateLimit-LimitRequisições máximas permitidas
X-RateLimit-RemainingRequisições restantes na janela
X-RateLimit-ResetTimestamp Unix quando o limite será resetado

Quando o limite de taxa for excedido, você receberá uma resposta 429 Too Many Requests:

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded. Please try again later.",
    "retry_after": 3600
  }
}

Endpoints

Verificação de Email Único

Verifica um único endereço de email com resultados detalhados.

POST /verify/single

Requisição

{
  "email": "user@example.com",
  "check_smtp": true
}

Parâmetros

ParâmetroTipoObrigatórioPadrãoDescrição
emailstringSim-Endereço de email para verificar
smtp_checkbooleanNãotrueRealizar verificação de caixa de correio SMTP
timeoutintegerNão5000Tempo limite da requisição em milissegundos (máx: 30000)

Resposta

{
  "email": "user@example.com",
  "status": "valid",
  "result": {
    "deliverable": true,
    "valid_format": true,
    "valid_domain": true,
    "valid_mx": true,
    "disposable": false,
    "role": false,
    "catchall": false,
    "free": false,
    "smtp_valid": true
  },
  "score": 0.95,
  "reason": null,
  "credits_used": 1
}

Campos da Resposta

CampoTipoDescrição
emailstringO endereço de email verificado
statusstringStatus da verificação: valid, invalid, unknown, catchall
resultobjectResultados detalhados da verificação
scorenumberPontuação de confiança (0.0 - 1.0)
reasonstringMotivo para status inválido/desconhecido (pode ser nulo)
credits_usedintegerNúmero de créditos consumidos

Campos do Objeto Result

CampoTipoDescrição
deliverablebooleanSe o email pode receber mensagens
valid_formatbooleanSe o email tem sintaxe válida
valid_domainbooleanSe o domínio existe
valid_mxbooleanSe o domínio tem registros MX
disposablebooleanSe o email é de um serviço descartável
rolebooleanSe o email é baseado em função (info@, support@)
catchallbooleanSe o domínio aceita todos os emails
freebooleanSe o email é de um provedor gratuito
smtp_validbooleanSe a verificação SMTP passou

Verificação em Massa de Emails

Verifique múltiplos endereços de email de forma síncrona. Ideal para lotes pequenos (máximo 50 emails).

POST /verify/bulk

Requisição

{
  "emails": [
    "user1@example.com",
    "user2@example.com",
    "user3@example.com"
  ],
  "check_smtp": true
}

Parâmetros

ParâmetroTipoObrigatórioPadrãoDescrição
emailsarraySim-Array de endereços de email (máx: 50)
check_smtpbooleanNãotrueRealizar verificação SMTP

Resposta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "results": [
      {
        "email": "user1@example.com",
        "status": "valid",
        "score": 0.95,
        "is_deliverable": true,
        "is_disposable": false,
        "is_catchall": false,
        "is_role": false,
        "is_free": false,
        "domain": "example.com",
        "smtp_check": true,
        "reason": null,
        "credits_used": 1
      }
    ],
    "total_emails": 3,
    "valid_emails": 2,
    "invalid_emails": 1,
    "credits_used": 3,
    "process_time": 2500
  }
}

Verificar Créditos

Obtém o saldo atual de créditos e informações de uso.

GET /credits

Resposta

{
  "available": 9500,
  "used": 500,
  "total": 10000,
  "plan": "Professional",
  "resets_at": "2025-02-01T00:00:00Z",
  "rate_limit": {
    "requests_per_hour": 10000,
    "remaining": 9850
  }
}

Verificação de Arquivo

Carregue um arquivo contendo endereços de email para verificação em massa. Suporta arquivos CSV, Excel e texto.

POST /verify/file
Content-Type: multipart/form-data

Requisição

CampoTipoObrigatórioDescrição
filefileSimArquivo contendo emails (CSV, XLSX, XLS, TXT). Máx 20MB

Resposta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
    "file_name": "emails.csv",
    "total_emails": 1000,
    "status": "processing",
    "created_at": "2026-02-04T10:30:00Z"
  }
}

Obter Status do Trabalho de Arquivo

Verifica o status de um trabalho de verificação de arquivo.

GET /verify/file/{job_id}

Resposta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
    "file_name": "emails.csv",
    "status": "completed",
    "total_emails": 1000,
    "valid_emails": 850,
    "invalid_emails": 100,
    "role_emails": 30,
    "catchall_emails": 10,
    "unknown_emails": 10,
    "disposable_emails": 0,
    "credits_used": 990,
    "progress_percent": 100,
    "created_at": "2026-02-04T10:30:00Z",
    "completed_at": "2026-02-04T10:35:00Z"
  }
}

Baixar Resultados do Trabalho de Arquivo

Baixa os resultados de verificação de um trabalho de arquivo concluído.

GET /verify/file/{job_id}/results

Parâmetros de Query

ParâmetroTipoDescrição
validbooleanFiltrar apenas emails válidos
invalidbooleanFiltrar apenas emails inválidos
catchallbooleanIncluir emails catch-all
rolebooleanIncluir emails baseados em função

Resposta

Retorna um arquivo CSV com os resultados da verificação.


Webhooks

Receba notificações em tempo real quando os trabalhos de verificação de arquivos forem concluídos.

Criar Webhook

POST /webhooks

Requisição

{
  "url": "https://your-app.com/webhooks/billionverify",
  "events": ["file.completed", "file.failed"]
}

Parâmetros

ParâmetroTipoObrigatórioDescrição
urlstringSimURL HTTPS para receber notificações de webhook
eventsarraySimEventos para se inscrever

Resposta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "id": "673f3bff-81ea-4730-9cef-af1eb7f134bf",
    "url": "https://your-app.com/webhooks/billionverify",
    "events": ["file.completed", "file.failed"],
    "secret": "5c609e6893ab3b65ce8940549a030bc165762fe171e0b38f880bd570099619bf",
    "is_active": true,
    "created_at": "2026-02-04T10:30:00Z",
    "updated_at": "2026-02-04T10:30:00Z"
  }
}

Importante: O secret só é retornado ao criar o webhook. Armazene-o com segurança - você precisará dele para verificar as assinaturas do webhook.


Listar Webhooks

GET /webhooks

Resposta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "webhooks": [
      {
        "id": "673f3bff-81ea-4730-9cef-af1eb7f134bf",
        "url": "https://your-app.com/webhooks/billionverify",
        "events": ["file.completed", "file.failed"],
        "is_active": true,
        "created_at": "2026-02-04T10:30:00Z",
        "updated_at": "2026-02-04T10:30:00Z"
      }
    ],
    "total": 1
  }
}

Excluir Webhook

DELETE /webhooks/{webhook_id}

Resposta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "message": "Webhook deleted successfully",
    "webhook_id": "673f3bff-81ea-4730-9cef-af1eb7f134bf"
  }
}

Eventos de Webhook

EventoDescrição
file.completedTrabalho de verificação de arquivo concluído com sucesso
file.failedTrabalho de verificação de arquivo falhou

Payload do Webhook

Quando um evento ocorre, enviamos uma requisição POST para sua URL de webhook:

{
  "event": "file.completed",
  "timestamp": "2026-02-04T10:35:00Z",
  "data": {
    "job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
    "file_name": "emails.csv",
    "total_emails": 1000,
    "valid_emails": 850,
    "invalid_emails": 100,
    "role_emails": 30,
    "catchall_emails": 10,
    "unknown_emails": 10,
    "disposable_emails": 0,
    "credits_used": 990,
    "process_time_seconds": 125.5,
    "result_file_path": "results/2026/02/04/result_xxx.csv",
    "download_url": ""
  }
}

Cabeçalhos do Webhook

CabeçalhoDescrição
X-Webhook-EventTipo de evento (ex. file.completed)
X-Webhook-SignatureAssinatura HMAC-SHA256 para verificação
X-Webhook-TimestampTimestamp Unix quando o webhook foi enviado
User-AgentBillionVerify-Webhook/1.0

Verificando Assinaturas de Webhook

Para verificar que um webhook é do BillionVerify, calcule a assinatura HMAC-SHA256:

const crypto = require('crypto');

function verifyWebhookSignature(payload, signature, secret) {
  const expectedSignature = 'sha256=' +
    crypto.createHmac('sha256', secret)
      .update(payload)
      .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );
}
import hmac
import hashlib

def verify_webhook_signature(payload: bytes, signature: str, secret: str) -> bool:
    expected = 'sha256=' + hmac.new(
        secret.encode(),
        payload,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(signature, expected)

Status de Verificação

StatusPontuaçãoSignificadoAção Recomendada
valid0.9+Email existe e pode receber mensagensSeguro para enviar
invalid0.1Email não existe ou não pode receberRemover da lista
unknown0.5Não foi possível determinar a validadeTentar novamente mais tarde ou usar com cautela
risky0.4Email pode ter problemas de entregaUsar com cautela, monitorar devoluções
disposable0.3Email é de um serviço descartávelConsiderar remoção
catchall0.7Domínio aceita todos os emails (catch-all)Monitorar por devoluções
role0.6Email baseado em função (info@, support@)Geralmente entregável, pode ter menor engajamento

Respostas de Erro

Todos os erros seguem um formato consistente:

{
  "error": {
    "code": "ERROR_CODE",
    "message": "Human-readable error message",
    "details": "Additional context (optional)"
  }
}

Códigos de Status HTTP

CódigoDescrição
200Sucesso
400Requisição Inválida - Parâmetros inválidos
401Não Autorizado - Chave de API inválida ou ausente
403Proibido - Permissões insuficientes
404Não Encontrado - Recurso não existe
429Muitas Requisições - Limite de taxa excedido
500Erro Interno do Servidor
503Serviço Indisponível

Códigos de Erro

CódigoStatus HTTPDescrição
INVALID_API_KEY401Chave de API inválida ou ausente
RATE_LIMIT_EXCEEDED429Muitas requisições
INSUFFICIENT_CREDITS403Créditos insuficientes
INVALID_EMAIL400Formato de email inválido
INVALID_REQUEST400Corpo da requisição malformado
JOB_NOT_FOUND404ID do trabalho em massa não encontrado
TIMEOUT504Tempo limite da verificação esgotado

Melhores Práticas

1. Use Variáveis de Ambiente

Nunca codifique chaves de API diretamente:

// Bom
const apiKey = process.env.BV_API_KEY;

// Ruim - não faça isso
const apiKey = 'bv_live_xxx';

2. Trate Limites de Taxa

Implemente backoff exponencial:

async function verifyWithRetry(email, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await verify(email);
    } catch (error) {
      if (error.code === 'RATE_LIMIT_EXCEEDED') {
        await sleep(Math.pow(2, i) * 1000);
        continue;
      }
      throw error;
    }
  }
}

3. Use em Massa para Múltiplos Emails

Para verificar mais de 10 emails, use o endpoint em massa:

// Bom - uma única chamada de API
const job = await client.verifyBulk(emails);

// Ruim - muitas chamadas individuais
for (const email of emails) {
  await client.verify(email);
}

4. Implemente Webhooks para Trabalhos em Massa

Não faça polling constantemente; use webhooks:

// Envie com webhook
const job = await client.verifyBulk(emails, {
  webhookUrl: 'https://your-app.com/webhook',
});

SDKs

Use nossos SDKs oficiais para facilitar a integração:

Próximos Passos

On this page