x-api-key o, si no se envía ninguna clave de API, la IP de tu cliente. Cada ámbito mantiene un contador independiente con una ventana deslizante de 60 segundos.
Identificador y exenciones
El middleware elige el identificador para el límite de solicitudes en este orden:- Encabezado
x-api-key→ contador por clave. - Primer salto de
X-Forwarded-For→ contador por IP. REMOTE_ADDR→ contador por IP.
- La clave interna
DIDIT_WEBAPP_API_KEY(la usa únicamente la consola de Didit). - Los endpoints protegidos por el permiso
IsValidSession(el tráfico de sesiones integradas o del SDK). GET /system/healthcheck(lo atiendeHealthMiddlewareantes de esta capa).- Los webhooks de proveedores: Stripe, análisis AML, callbacks de verificación facial y modificación de listas KYC.
Límites globales
Cada solicitud autenticada se agrupa además según su método HTTP en un ámbito genérico, de modo que cualquier ruta nueva hereda un valor predeterminado razonable:
Los límites específicos de cada endpoint (siguiente sección) se aplican además del límite global. El primer ámbito cuyo contador supera el límite es el que devuelve
429.
Límites específicos por endpoint
El middleware define ámbitos más estrictos para las rutas de mayor impacto:GET /v3/session/<id>/decision/ lo atiende SessionV3RetrieveView y no pertenece al ámbito session-decision. Solo está sujeto al límite máximo de 600/min de generic-get. La limitación de 100/min para decisiones se aplica a las rutas de decisión v1 y v2.Formato de la respuesta 429
Cuando superas el límite de cualquier ámbito, recibes una respuesta HTTP429 con este cuerpo y estos encabezados:
Los encabezados
X-RateLimit-* solo se envían en la respuesta 429: las respuestas exitosas no los incluyen actualmente. Usa el valor de Retry-After (o X-RateLimit-Reset - now) como tiempo de espera antes del siguiente intento.
Recomendaciones para el cliente
- Respeta
Retry-Aftercomo valor mínimo de tu espera. Por encima de él, aplica un backoff exponencial con jitter (5s → 10s → 20s → 40s ± random) para que dos clientes que reciben429al mismo tiempo no se sincronicen. - Deja de reintentar tras un número reducido de intentos (por ejemplo, 5). Devuelve el error a quien hizo la llamada y avisa a tu equipo: los 429 sostenidos suelen indicar un bucle descontrolado, no un pico pasajero.
- Usa un identificador por cada carga de trabajo. Compartir una
x-api-keyentre muchos backends los agrupa en el mismo contador, lo que puede hacer que un vecino ruidoso deje sin capacidad al resto. Crea una aplicación independiente (y, por tanto, unaapi_keyindependiente) por entorno, marca o cliente: consulta Registro programático. - Almacena en caché las lecturas de decisiones. Los endpoints
/decision/no están pensados para bucles de sondeo intensivos; si necesitas actualizaciones en tiempo real, usa Webhooks y llama aGET /v3/session/<id>/decision/solo para completar datos faltantes o para auditoría. - Genera los PDF de forma diferida. La generación de PDF consume mucha CPU (límite de 50/min). Lánzala desde una cola cuando la sesión alcance un estado terminal, no en cada visualización de página.
Ejemplo de cliente que gestiona el 429
Cómo obtener más margen
Si 600 sesiones por minuto no te bastan, por ejemplo durante un lanzamiento de marketing o una carga retroactiva de datos, envía un correo a support@didit.me con el UUID de tuapplication y las tasas sostenidas y de pico que esperas. Los ajustes de límites se configuran por aplicación.