Documentación de la API
REST · JSON · Bearer auth. Un solo endpoint hace el 90% del trabajo.
Quickstart
Después de registrarte, tenés una API key bb_live_... con 500 créditos gratis. Con eso ya podés hacer verificaciones. Base URL:
https://api.byebouncer.comcurl -X POST https://api.byebouncer.com/api/v1/verify \
-H "Authorization: Bearer bb_live_xxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"email": "someone@example.com"}'Autenticación
Todos los endpoints que consumen créditos requieren el header Authorization: Bearer <api_key>.
- Live keys (
bb_live_*): backend, sin restricción de dominio, todos los endpoints. - Public keys (
bb_pub_*): frontend (widget JS), CORS restringido por dominio y acceso autenticado solo a/verify./suggestes público y no necesita key.
Nunca commitees API keys al repo. Rotalas desde el dashboard si sospechás compromiso.
POST /api/v1/verify
Verifica un email. Corta la respuesta cache-hit (misma dirección en última hora) sin consumir crédito.
Request
{
"email": "someone@example.com"
}Response (200)
{
"email": "someone@example.com",
"status": "deliverable",
"action": "allow",
"flagged": false,
"signals": [
"valid_syntax",
"mx_found",
"mailbox_accepts_mail"
],
"domain": {
"name": "example.com",
"type": "business",
"disposable": false,
"free_provider": false,
"has_mx": true
},
"cached": false,
"response_time_ms": 1230,
"credits_remaining": 499,
"verified_at": "2026-08-18T15:30:00Z"
}curl -X POST https://api.byebouncer.com/api/v1/verify \
-H "Authorization: Bearer bb_live_xxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"email": "someone@example.com"}'POST /api/v1/suggest
Detecta typos en el dominio y devuelve una sugerencia si la distancia Levenshtein contra un dominio conocido es ≤ 2. No hace lookup de red.
curl -X POST https://api.byebouncer.com/api/v1/suggest \
-H "Content-Type: application/json" \
-d '{"email": "user@gnail.com"}'
# → { "suggestion": "user@gmail.com", ... }GET /api/v1/domain/:domain
Clasifica un dominio (disposable/free/business/education) + MX lookup. Útil para páginas de SEO o quick-check antes de registrar.
curl https://api.byebouncer.com/api/v1/domain/mailinator.com
# → { "domain": "mailinator.com", "type": "disposable", ... }GET /api/v1/credits
Balance actual de la key usada. Se lee siempre desde DB (nunca del cache).
curl https://api.byebouncer.com/api/v1/credits \
-H "Authorization: Bearer bb_live_xxxxxxxxxx"GET /api/v1/status
Estado del servicio. Devuelve ok o degraded según ping a Postgres + Redis. Podés apuntar Better Uptime u otro monitor externo.
Códigos de error
| HTTP | error | Significado |
|---|---|---|
| 400 | invalid_request | Body malformado o vacío |
| 401 | missing_authorization_header | Falta header Bearer |
| 401 | invalid_api_key | Key inexistente o revocada |
| 402 | insufficient_credits | Sin saldo suficiente |
| 403 | origin_not_allowed | Public key: Origin no está en allowed_domains |
| 403 | live_key_required | La operación requiere una key live |
| 429 | rate_limit_exceeded | Rate limit por IP o por api_key alcanzado |
| 500 | verify_failed | Error interno del motor |
| 503 | pack_not_configured | Falta env var de Paddle price_id |
Rate limits
Aplicamos rate limiting con sliding window en Redis. Headers en toda respuesta:
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1723644800| Endpoint | Límite | Ventana | Identificador |
|---|---|---|---|
| /verify (live key) | 50 | 1 segundo | api_key_id |
| /verify (live key) | 10.000 | 1 hora | api_key_id |
| /verify (public key) | 10 | 1 segundo | api_key_id |
| /suggest | 20 | 1 minuto | IP |
| /domain/:d | 30 | 1 minuto | IP |
| /demo/verify | 5 | 1 hora | IP |