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

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. /suggest es público y no necesita key.

Nunca commitees API keys al repo. Rotalas desde el dashboard si sospechás compromiso.

POST /api/v1/verify

POSTAuth: Live/Public1 crédito

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

POSTAuth: PúblicoGratis (20/min por IP)

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

GETAuth: PúblicoGratis (30/min por IP)

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

GETAuth: LiveGratis

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

GETAuth: PúblicoGratis

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

HTTPerrorSignificado
400invalid_requestBody malformado o vacío
401missing_authorization_headerFalta header Bearer
401invalid_api_keyKey inexistente o revocada
402insufficient_creditsSin saldo suficiente
403origin_not_allowedPublic key: Origin no está en allowed_domains
403live_key_requiredLa operación requiere una key live
429rate_limit_exceededRate limit por IP o por api_key alcanzado
500verify_failedError interno del motor
503pack_not_configuredFalta 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
EndpointLímiteVentanaIdentificador
/verify (live key)501 segundoapi_key_id
/verify (live key)10.0001 horaapi_key_id
/verify (public key)101 segundoapi_key_id
/suggest201 minutoIP
/domain/:d301 minutoIP
/demo/verify51 horaIP