Ir al contenido

Referencia y límites

Los rate limits están diferenciados por bucket. Cada bucket cuenta de forma independiente —el tráfico de lectura no consume cuota de escritura— y todos los contadores son por API Key.

BucketLímiteEndpoints
write60 req/minPOST /channel/message — envío de mensajes reales
read300 req/minGET /ping · GET /conversations/.../messages · GET /leads/...
sandbox600 req/minPOST /channel/message/sandbox — testing sin LLM

Endpoints especiales:

EndpointLímite
POST /channel/webhook-secret/rotate5 req/min
POST /channel/webhook-secret/confirm · /cancel10 req/min
POST /channel/webhooks/test30 req/min
POST · DELETE /channel/session-tokens60 req/min

Cuando excedés un bucket recibís un 429 con estos headers de respuesta:

HeaderValor
Retry-After60 — segundos a esperar antes de reintentar
X-RateLimit-LimitEl máximo por minuto del bucket que excediste
X-RateLimit-Remaining0 (acabás de agotar el bucket)
ConceptoValor
Tamaño de mensajeMáximo 5.000 caracteres
session_idMáximo 200 caracteres
contact_nameMáximo 120 caracteres (se recorta)
Idempotency-KeyMáximo 200 caracteres · TTL 24h
Token efímero TTLDefault 30 min · máximo 4h
Rotación de webhookVentana dual: 72h
Timeout de webhook10 segundos para responder HTTP 200
Reintentos de webhook4 intentos: +10s, +30s, +2min, +10min
Versión soportadaX-Overtaker-Version: 1
API Keys activasMáximo 3 por tenant

POST /channel/message/sandbox simula /channel/message sin llamar al LLM, sin persistir mensajes ni leads, y sin consumir cuota del bucket write. Usa su propio bucket sandbox (600/min). Ideal para wizards de setup, CI/CD y para probar firma de webhooks sin gastar créditos.

POST /api/v1/channel/message/sandbox
Authorization: Bearer sk_live_YOUR_KEY
Content-Type: application/json
X-Overtaker-Version: 1
{ "session_id": "test-user", "message": "test" }
// 200 OK
{
"message_id": "sb_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "received"
}

Si la API key tiene webhook_url configurada, se dispara un webhook message.response canned con el marcador "sandbox": true para que tu handler procese un payload realista:

{
"event": "message.response",
"sandbox": true,
"session_id": "test-user",
"user_email": "",
"message_id": "sb_uuid",
"conversation_id": "sb_conv",
"response": {
"text": "[SANDBOX] Esta es una respuesta de prueba del Canal API.",
"quick_replies": ["", "No"]
},
"timestamp": "2026-05-27T12:00:00Z"
}
CódigoSignificadoCausa típica
400Bad RequestVersión no soportada, campo inválido o base64 malformado
401UnauthorizedAPI Key ausente, revocada o expirada
403ForbiddenCanal API no habilitado en el plan del tenant
422UnprocessableValidación del body fallida (email vacío, mensaje muy largo, etc.)
429Too Many RequestsRate limit excedido — reintentá respetando el header Retry-After
503Service UnavailableSistema temporalmente no disponible — reintentá con backoff

Los errores HTTP (400, 401, 403, 404, 429, 503) devuelven un cuerpo JSON con un detail de tipo string:

{ "detail": "Canal API no habilitado para este tenant." }

Las fallas de validación (422) devuelven detail como una lista de errores por campo (formato estándar de FastAPI):

{
"detail": [
{
"loc": ["body", "message"],
"msg": "ensure this value has at most 5000 characters",
"type": "value_error.any_str.max_length"
}
]
}