Un editor de SaaS abre su API a los integradores. Dos semanas después, un socio de ERP sincroniza 200.000 hojas de productos en un bucle (sin paginación) durante un fin de semana. Lunes por la mañana: base de datos PostgreSQL al 100% de CPU, facturas en la nube triplicadas, clientes principales en tiempo de espera. La reunión post-mortem revela que no hubo cuota, ni alerta, ni 429 documentado.
Abrir una API pública no significa exponer puntos finales. Es aceptar que desconocidos controlarán tu cargo, a veces por malicia, a menudo por un error de integración. Los límites deben existir antes del primer cliente, no después de la primera interrupción.
Las cuatro salvaguardias no negociables
| Barandilla | Sin él | Mínimo viable |
|---|---|---|
| Autenticación | Abuso anónimo | Clave API o credenciales de cliente OAuth2 |
| Limitación de tasa | Bucles infinitos | Por clave + por IP de respaldo |
| Cuotas | Un cliente monopoliza | Necesidad documentada/día + ráfaga/min |
| Observabilidad | Autopsia ciega | Registros estructurados, métricas p95, alertas 429/5xx |
Una API sin 429 es una API que confunde cortesía y robustez. Despedir adecuadamente protege a todos.
Limitación de tarifas: estrategia por nivel
Ejemplo de red pública:
| Nivel | Ráfaga/min | Cuota/día | Uso típico |
|---|---|---|---|
| Caja de arena | 30 | 1.000 | Desarrollador, pruebas |
| Estándar | 120 | 50.000 | Integrador de PYME |
| Socio | 600 | 500.000 | ERP, mercado |
Implementación:
- Nginx
limit_req_zonepara el límite de IP global. - Contador Redis por
api_keypara cuotas diarias. - Gateway (Traefik, Kong) para centralizar sin volver a implementar la aplicación.
Responda con 429 con Retry-After y un cuerpo JSON explícito, sin permitir que el cliente adivine un tiempo de espera de TCP.
Para obtener detalles técnicos, consulte Limitación de velocidad: proteger una API sin castigar a los buenos clientes.
Dimensionamiento del hosting: la base cuenta más que la API de la CPU
Una solicitud de API "simple" puede costar:
- 1 SELECT indexado → 2 ms
- 1 SELECT sin índice + JOIN → 800 ms × 500 req/s → muerto
Lista de verificación a continuación:
- Se requiere paginación (
límitemáximo 100, se prefiere el cursor). - Caché Redis en lecturas idempotentes (catálogo, repositorios).
- Grupo de conexiones (PgBouncer): consulte Grupo de conexiones.
- Trabajadores separados sincronización intensa frente a API interactiva.
- Escalado automático en la profundidad de la cola, no solo en la CPU.
Compartido: no para API públicas serias. VPS mínimo; nube con balanceador de carga de varios clientes de pago.
Control de versiones, obsolescencia y comunicación
Límites técnicos sin límites de producto = deuda:
- Prefijo
/v1/congelado; cambio importante =/v2/. - Encabezado
Sunsety correo electrónico 90 días antes del retiro. - Estado del incidente o página RSS: los integradores no siempre leen Slack interno.
Observabilidad: métricas que alertan antes que Twitter
- latencia p95/p99 por punto final (no solo promedio).
- Calificación 429 por tecla: detecta una integración inestable antes de la saturación.
- Conexiones de base de datos activas frente al grupo máximo.
- Top consumidores: tabla semanal de las llaves más golosas.
Alerta si p95 > SLA interno durante 5 minutos o si una clave excede la cuota del 80 % a las 2 p. m.
La cumbre: el peor cliente es el que firmó un contrato
El marketing quiere una "API abierta". Las finanzas quieren previsibilidad. La operación debe imponer paredes flexibles: lo suficientemente altas para buenos usos, lo suficientemente visibles para detener errores antes de la base.
Decide y avanza sin puntos ciegos
- Publicar límites + ejemplos 429 antes de la primera clave.
- Prueba de carga con un escenario de “cliente en bucle” (no solo una ruta feliz).
- Redis + PgBouncer antes del lanzamiento del socio.
- Panel de control de los principales consumidores revisado cada semana durante el primer mes.
- Runbook: corta una clave, modo degradado de solo lectura, comunica el estado.
Compare VPS y nube en nuestro directorio y comparación.
Preguntas frecuentes
¿Es necesario un límite de velocidad desde la versión 1?
Sí, aunque sea modesto, para evitar bucles accidentales y establecer cuotas con antelación.
¿Dónde colocar el límite de velocidad?
Nginx + clave API mínima; puerta de entrada para políticas avanzadas; código para reglas de negocio.
¿Cómo dimensionar el alojamiento de una API?
Picos por cliente, objetivo p95, costo/consulta de base de datos; almacenamiento en caché y paginación antes de escalar horizontalmente.
¿Qué documentar antes de abrir?
Límites por nivel, 429, reintento posterior, depreciación, estado del incidente.
Una API pública madura deniega las solicitudes con elegancia, antes de que la base de datos las rechace a todas sin previo aviso.
