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/v1Especificação OpenAPI
A especificação completa da API está disponível no formato OpenAPI 3.0:
- OpenAPI YAML: https://api.billionverify.com/openapi.yaml
- Documentação API Interativa: https://api.billionverify.com/docs
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_KEYObtenha 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
| Plano | Requisições/Hora | Requisições/Dia |
|---|---|---|
| Gratuito | 100 | 1.000 |
| Inicial | 1.000 | 10.000 |
| Profissional | 10.000 | 100.000 |
| Empresarial | Personalizado | Personalizado |
Informações sobre limites de taxa são incluídas nos cabeçalhos de resposta:
| Cabeçalho | Descrição |
|---|---|
X-RateLimit-Limit | Requisições máximas permitidas |
X-RateLimit-Remaining | Requisições restantes na janela |
X-RateLimit-Reset | Timestamp 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/singleRequisição
{
"email": "user@example.com",
"check_smtp": true
}Parâmetros
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
email | string | Sim | - | Endereço de email para verificar |
smtp_check | boolean | Não | true | Realizar verificação de caixa de correio SMTP |
timeout | integer | Não | 5000 | Tempo 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
| Campo | Tipo | Descrição |
|---|---|---|
email | string | O endereço de email verificado |
status | string | Status da verificação: valid, invalid, unknown, catchall |
result | object | Resultados detalhados da verificação |
score | number | Pontuação de confiança (0.0 - 1.0) |
reason | string | Motivo para status inválido/desconhecido (pode ser nulo) |
credits_used | integer | Número de créditos consumidos |
Campos do Objeto Result
| Campo | Tipo | Descrição |
|---|---|---|
deliverable | boolean | Se o email pode receber mensagens |
valid_format | boolean | Se o email tem sintaxe válida |
valid_domain | boolean | Se o domínio existe |
valid_mx | boolean | Se o domínio tem registros MX |
disposable | boolean | Se o email é de um serviço descartável |
role | boolean | Se o email é baseado em função (info@, support@) |
catchall | boolean | Se o domínio aceita todos os emails |
free | boolean | Se o email é de um provedor gratuito |
smtp_valid | boolean | Se 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/bulkRequisição
{
"emails": [
"user1@example.com",
"user2@example.com",
"user3@example.com"
],
"check_smtp": true
}Parâmetros
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
emails | array | Sim | - | Array de endereços de email (máx: 50) |
check_smtp | boolean | Não | true | Realizar 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 /creditsResposta
{
"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-dataRequisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
file | file | Sim | Arquivo 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}/resultsParâmetros de Query
| Parâmetro | Tipo | Descrição |
|---|---|---|
valid | boolean | Filtrar apenas emails válidos |
invalid | boolean | Filtrar apenas emails inválidos |
catchall | boolean | Incluir emails catch-all |
role | boolean | Incluir 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 /webhooksRequisição
{
"url": "https://your-app.com/webhooks/billionverify",
"events": ["file.completed", "file.failed"]
}Parâmetros
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string | Sim | URL HTTPS para receber notificações de webhook |
events | array | Sim | Eventos 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 /webhooksResposta
{
"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
| Evento | Descrição |
|---|---|
file.completed | Trabalho de verificação de arquivo concluído com sucesso |
file.failed | Trabalho 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çalho | Descrição |
|---|---|
X-Webhook-Event | Tipo de evento (ex. file.completed) |
X-Webhook-Signature | Assinatura HMAC-SHA256 para verificação |
X-Webhook-Timestamp | Timestamp Unix quando o webhook foi enviado |
User-Agent | BillionVerify-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
| Status | Pontuação | Significado | Ação Recomendada |
|---|---|---|---|
valid | 0.9+ | Email existe e pode receber mensagens | Seguro para enviar |
invalid | 0.1 | Email não existe ou não pode receber | Remover da lista |
unknown | 0.5 | Não foi possível determinar a validade | Tentar novamente mais tarde ou usar com cautela |
risky | 0.4 | Email pode ter problemas de entrega | Usar com cautela, monitorar devoluções |
disposable | 0.3 | Email é de um serviço descartável | Considerar remoção |
catchall | 0.7 | Domínio aceita todos os emails (catch-all) | Monitorar por devoluções |
role | 0.6 | Email 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ódigo | Descrição |
|---|---|
200 | Sucesso |
400 | Requisição Inválida - Parâmetros inválidos |
401 | Não Autorizado - Chave de API inválida ou ausente |
403 | Proibido - Permissões insuficientes |
404 | Não Encontrado - Recurso não existe |
429 | Muitas Requisições - Limite de taxa excedido |
500 | Erro Interno do Servidor |
503 | Serviço Indisponível |
Códigos de Erro
| Código | Status HTTP | Descrição |
|---|---|---|
INVALID_API_KEY | 401 | Chave de API inválida ou ausente |
RATE_LIMIT_EXCEEDED | 429 | Muitas requisições |
INSUFFICIENT_CREDITS | 403 | Créditos insuficientes |
INVALID_EMAIL | 400 | Formato de email inválido |
INVALID_REQUEST | 400 | Corpo da requisição malformado |
JOB_NOT_FOUND | 404 | ID do trabalho em massa não encontrado |
TIMEOUT | 504 | Tempo 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: