BillionVerify LogoBillionVerify

API Reference

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

La API de BillionVerify es un servicio RESTful que proporciona potentes capacidades de verificación de correos electrónicos. Todas las solicitudes a la API deben realizarse a través de HTTPS.

URL Base

https://api.billionverify.com/v1

Especificación OpenAPI

La especificación completa de la API está disponible en formato OpenAPI 3.0:

Puede importar la especificación OpenAPI en herramientas como Postman, Insomnia, o usarla para generar bibliotecas cliente.

Autenticación

Todas las solicitudes a la API requieren autenticación usando un token Bearer en el encabezado Authorization:

BV-API-KEY: YOUR_API_KEY

Obtén tu clave API desde el panel de BillionVerify.

Ejemplo

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"}'

Límites de Tasa

PlanSolicitudes/HoraSolicitudes/Día
Free1001,000
Starter1,00010,000
Professional10,000100,000
EnterprisePersonalizadoPersonalizado

La información sobre los límites de tasa se incluye en los encabezados de respuesta:

EncabezadoDescripción
X-RateLimit-LimitMáximo de solicitudes permitidas
X-RateLimit-RemainingSolicitudes restantes en la ventana
X-RateLimit-ResetMarca de tiempo Unix cuando se restablece el límite

Cuando se excede el límite de tasa, recibirás una respuesta 429 Too Many Requests:

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

Puntos Finales

Verificación de Correo Electrónico Individual

Verifica una sola dirección de correo electrónico con resultados detallados.

POST /verify/single

Solicitud

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

Parámetros

ParámetroTipoRequeridoPredeterminadoDescripción
emailstring-Dirección de correo electrónico a verificar
smtp_checkbooleanNotrueRealizar verificación de buzón SMTP
timeoutintegerNo5000Tiempo de espera de solicitud en milisegundos (máx: 30000)

Respuesta

{
  "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 de Respuesta

CampoTipoDescripción
emailstringLa dirección de correo electrónico verificada
statusstringEstado de verificación: valid, invalid, unknown, catchall
resultobjectResultados detallados de la verificación
scorenumberPuntuación de confianza (0.0 - 1.0)
reasonstringRazón del estado invalid/unknown (nullable)
credits_usedintegerNúmero de créditos consumidos

Campos del Objeto Result

CampoTipoDescripción
deliverablebooleanSi el correo puede recibir mensajes
valid_formatbooleanSi el correo tiene sintaxis válida
valid_domainbooleanSi el dominio existe
valid_mxbooleanSi el dominio tiene registros MX
disposablebooleanSi el correo es de un servicio desechable
rolebooleanSi el correo está basado en roles (info@, support@)
catchallbooleanSi el dominio acepta todos los correos
freebooleanSi el correo es de un proveedor gratuito
smtp_validbooleanSi la verificación SMTP pasó

Verificación Masiva de Correos Electrónicos

Verifica múltiples direcciones de correo electrónico de forma sincrónica. Ideal para lotes pequeños (máximo 50 correos).

POST /verify/bulk

Solicitud

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

Parámetros

ParámetroTipoRequeridoPredeterminadoDescripción
emailsarray-Array de direcciones de correo electrónico (máx: 50)
check_smtpbooleanNotrueRealizar verificación SMTP

Respuesta

{
  "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én el saldo actual de créditos e información de uso.

GET /credits

Respuesta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "account_id": "abc123",
    "api_key_id": "key_xyz",
    "api_key_name": "Default API Key",
    "credits_balance": 9500,
    "credits_consumed": 500,
    "credits_added": 10000,
    "last_updated": "2026-02-04T10:30:00Z"
  }
}

Verificación de Archivo

Sube un archivo CSV o Excel para verificación de correo asíncrona. Ideal para listas grandes.

POST /verify/file

Solicitud

curl -X POST https://api.billionverify.com/v1/verify/file \
  -H "BV-API-KEY: sk_your_api_key" \
  -F "file=@emails.csv"

Parámetros

ParámetroTipoRequeridoDescripción
filefileArchivo CSV o Excel (máx: 20MB, 100,000 filas)
email_columnstringNoNombre de columna con correos (detección automática si no se especifica)

Formatos de Archivo Soportados

  • CSV (.csv)
  • Excel (.xlsx, .xls)
  • Texto (.txt) - un correo por línea

Respuesta

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "task_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
    "status": "pending",
    "message": "File uploaded successfully, processing started",
    "file_name": "emails.csv",
    "file_size": 45678,
    "estimated_count": 1000,
    "unique_emails": 950,
    "total_rows": 1000,
    "email_column": "email",
    "status_url": "/v1/verify/file/7143874e-21c5-43c1-96f3-2b52ea41ae6a",
    "created_at": "2026-02-04T10:30:00Z"
  }
}

Obtener Estado del Trabajo de Archivo

Verifica el estado de un trabajo de verificación de archivo.

GET /verify/file/{job_id}

Respuesta (En Progreso)

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

Respuesta (Completado)

{
  "success": true,
  "code": "0",
  "message": "Success",
  "data": {
    "job_id": "7143874e-21c5-43c1-96f3-2b52ea41ae6a",
    "status": "completed",
    "file_name": "emails.csv",
    "total_emails": 1000,
    "processed_emails": 1000,
    "progress_percent": 100,
    "valid_emails": 850,
    "invalid_emails": 100,
    "unknown_emails": 30,
    "role_emails": 15,
    "catchall_emails": 5,
    "disposable_emails": 0,
    "credits_used": 970,
    "process_time_seconds": 125.5,
    "result_file_path": "results/2026/02/04/result_xxx.csv",
    "download_url": "/v1/verify/file/7143874e-21c5-43c1-96f3-2b52ea41ae6a/results",
    "created_at": "2026-02-04T10:30:00Z",
    "completed_at": "2026-02-04T10:32:05Z"
  }
}

Descargar Resultados

Descarga los resultados de verificación de un trabajo completado.

GET /verify/file/{job_id}/results

Parámetros de Consulta

ParámetroTipoPredeterminadoDescripción
validboolean-Incluir correos válidos
invalidboolean-Incluir correos inválidos
catchallboolean-Incluir correos catch-all
roleboolean-Incluir correos de rol
unknownboolean-Incluir correos desconocidos

Sin parámetros de filtro, devuelve el archivo de resultados completo. Con filtros, devuelve un CSV solo con correos coincidentes.

Ejemplo: Descargar Correos Entregables

curl -o deliverable.csv \
  "https://api.billionverify.com/v1/verify/file/{job_id}/results?valid=true&catchall=true&role=true" \
  -H "BV-API-KEY: sk_your_api_key"

Webhooks

Recibe notificaciones en tiempo real cuando los trabajos de verificación de archivos se completan.

Crear Webhook

POST /webhooks

Solicitud

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

Parámetros

ParámetroTipoRequeridoDescripción
urlstringURL HTTPS para recibir notificaciones webhook
eventsarrayEventos a los que suscribirse

Respuesta

{
  "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: El secret solo se devuelve al crear el webhook. Guárdalo de forma segura - lo necesitarás para verificar las firmas del webhook.


Listar Webhooks

GET /webhooks

Respuesta

{
  "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
  }
}

Eliminar Webhook

DELETE /webhooks/{webhook_id}

Respuesta

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

Eventos de Webhook

EventoDescripción
file.completedTrabajo de verificación de archivo completado exitosamente
file.failedTrabajo de verificación de archivo falló

Carga del Webhook

Cuando ocurre un evento, enviamos una solicitud POST a tu 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": ""
  }
}

Encabezados del Webhook

EncabezadoDescripción
X-Webhook-EventTipo de evento (ej. file.completed)
X-Webhook-SignatureFirma HMAC-SHA256 para verificación
X-Webhook-TimestampMarca de tiempo Unix cuando se envió el webhook
User-AgentBillionVerify-Webhook/1.0

Verificando Firmas de Webhook

Para verificar que un webhook es de BillionVerify, calcula la firma 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)

Estado de Verificación

EstadoPuntuaciónSignificadoAcción Recomendada
valid0.9+El correo existe y puede recibir mensajesSeguro para enviar
invalid0.1El correo no existe o no puede recibirEliminar de la lista
unknown0.5No se pudo determinar la validezReintentar más tarde o usar con precaución
risky0.4El correo puede tener problemas de entregaUsar con precaución, monitorear rebotes
disposable0.3El correo es de un servicio desechableConsiderar eliminar
catchall0.7El dominio acepta todos los correos (catch-all)Monitorear rebotes
role0.6Correo basado en rol (info@, support@)Generalmente entregable, puede tener menor engagement

Respuestas de Error

Todos los errores siguen un formato consistente:

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

Códigos de Estado HTTP

CódigoDescripción
200Éxito
400Solicitud Incorrecta - Parámetros inválidos
401No Autorizado - Clave API inválida o faltante
403Prohibido - Permisos insuficientes
404No Encontrado - El recurso no existe
429Demasiadas Solicitudes - Límite de tasa excedido
500Error Interno del Servidor
503Servicio No Disponible

Códigos de Error

CódigoEstado HTTPDescripción
INVALID_API_KEY401La clave API es inválida o falta
RATE_LIMIT_EXCEEDED429Demasiadas solicitudes
INSUFFICIENT_CREDITS403No hay suficientes créditos
INVALID_EMAIL400El formato del correo es inválido
INVALID_REQUEST400El cuerpo de la solicitud está mal formado
JOB_NOT_FOUND404ID de trabajo masivo no encontrado
TIMEOUT504La verificación agotó el tiempo de espera

Mejores Prácticas

1. Usa Variables de Entorno

Nunca codifiques las claves API directamente:

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

// Malo - no hagas esto
const apiKey = 'bv_live_xxx';

2. Maneja los Límites de Tasa

Implementa retroceso 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. Usa Bulk para Múltiples Correos

Para verificar más de 10 correos, usa el punto final masivo:

// Bueno - una sola llamada API
const job = await client.verifyBulk(emails);

// Malo - muchas llamadas individuales
for (const email of emails) {
  await client.verify(email);
}

4. Implementa Webhooks para Trabajos Masivos

No hagas sondeos constantes; usa webhooks:

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

SDKs

Usa nuestros SDKs oficiales para una integración más fácil:

Próximos Pasos

On this page