La API de Plazbot aplica un limite de uso por workspace para garantizar la estabilidad de la plataforma. El limite usa un modelo token bucket: permite rafagas cortas y castiga solo el uso sostenido por encima del limite.
Limites
| Recurso | Limite |
|---|---|
| API REST (todas las rutas) | 120 requests por minuto por workspace, con rafaga adicional de hasta 40 requests |
Webhooks entrantes de workers (POST /api/worker/webhook/{nombre}) | 100 requests por minuto por webhook |
El limite se comparte entre todas las integraciones que usan el mismo workspace (SDK, API REST directa, MCP, workers).
Headers de respuesta
Cada respuesta de la API incluye headers informativos para que tu integracion pueda autorregularse:
| Header | Descripcion |
|---|---|
X-RateLimit-Limit | Limite de requests por minuto del workspace. |
X-RateLimit-Remaining | Requests disponibles en este momento (incluye la rafaga). |
Respuesta al exceder el limite
Cuando el limite se excede, la API responde 429 Too Many Requests con el header Retry-After (segundos a esperar antes de reintentar):
json
01{02 "success": false,03 "code": 429,04 "errorCode": "RATE_LIMIT_EXCEEDED",05 "message": "Rate limit excedido. Máximo 120 requests por minuto por workspace."06}
Buenas practicas
- Respeta
Retry-After: al recibir un429, espera los segundos indicados antes de reintentar. No reintentes en loop inmediato. - Usa backoff exponencial en procesos batch: si un
429se repite, duplica la espera en cada reintento. - Pagina con
pageSize=100: para recorrer contactos usa el tamano de pagina maximo y minimiza la cantidad de llamadas (ver Contactos - Paginacion). - Cachea lo que no cambia: variables del workspace, etiquetas y fases cambian poco; no las consultes en cada request.
Ejemplo de manejo de 429
ts
01async function callWithRetry<T>(fn: () => Promise<T>, maxRetries = 3): Promise<T> {02 for (let attempt = 0; ; attempt++) {03 try {04 return await fn();05 } catch (error: any) {06 const status = error?.response?.status;07 if (status !== 429 || attempt >= maxRetries) throw error;0809 const retryAfter = Number(error.response.headers["retry-after"] ?? 5);10 await new Promise((r) => setTimeout(r, retryAfter * 1000 * (attempt + 1)));11 }12 }13}