Ir al contenido

↑↓ navegar ↵ abrir Ctrl↵ nueva pestaña esc cerrar

Referencia de los códigos HTTP usados en toda la API de Rapid.

CódigoSignificado
200Éxito con cuerpo
201Recurso creado
204Éxito sin cuerpo (ej.: DELETE)
CódigoSignificado
400El cuerpo no es un JSON válido (INVALID_JSON)
401Credenciales ausentes o inválidas
403Empresa bloqueada
404Recurso no encontrado
409Conflicto (duplicado, recurso inmutable)
413Cuerpo por encima del tamaño máximo (PAYLOAD_TOO_LARGE)
422Error de validación
429Demasiadas solicitudes (rate limit)
CódigoSignificado
500Error interno (INTERNAL_ERROR), se recomienda reintentar

Toda respuesta de error tiene esta estructura:

{
"error": {
"code": "CODIGO_SEMANTICO",
"message": "Descripción legible del error"
}
}

El message viene en inglés y es para quien lee el log: el texto puede cambiar. Para decidir qué hacer en tu código, usa el code. Los endpoints que se mantienen del sistema anterior responden como antes.

CódigoHTTPUso
INVALID_JSON400El cuerpo no es un JSON válido
UNAUTHORIZED401Credenciales ausentes o inválidas
COMPANY_BLOCKED403Empresa bloqueada
VALIDATION_ERROR422Uno o más campos inválidos
NOT_FOUND404La dirección no existe en la API (error de tipeo en la ruta, barra final de más)
TRANSACTION_NOT_FOUND404Transacción inexistente
TRANSACTION_DUPLICATE409external_source + external_id ya registrado
TRANSACTION_IMMUTABLE409Transacción ya utilizada, no se puede modificar
MERCHANT_NOT_FOUND404Merchant inexistente
ALERT_NOT_FOUND404Alerta inexistente
ALERT_INVALID_STATUS422Estado inválido, o transición no permitida (plazo, vencimiento o estado ya definitivo)
PAYLOAD_TOO_LARGE413Cuerpo por encima del límite: 1 MB por solicitud, 5 MB en el envío por lotes
RATE_LIMIT_EXCEEDED429Límite de solicitudes superado (ver abajo)
INTERNAL_ERROR500Error inesperado en el servidor

Todas las rutas comparten un límite de 100 solicitudes por minuto por IP, incluidas las que responden 401 por credencial inválida. La excepción es el envío de eventos desde el navegador, que tiene su propio tope de 120 por minuto y no cuenta en los 100.

Al superarlo, la API devuelve:

HTTP/1.1 429 Too Many Requests
Retry-After: 15
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 15
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded, retry in 15 seconds"
}
}

Usa el Retry-After. Indica, en segundos, cuánto falta para que la ventana se reinicie, y el mensaje repite el mismo número. Esperar exactamente eso es mejor que adivinar: una espera progresiva a ciegas puede reintentar antes de tiempo (y recibir otro 429) o esperar más de lo necesario.

Los headers X-RateLimit-* vienen en todas las respuestas, no solo en el 429, así que puedes adelantarte: cuando X-RateLimit-Remaining se acerque a cero, frena el envío en vez de esperar el error. Para volumen, prefiere el envío por lotes, que manda hasta 1000 transacciones en una solicitud y gasta una unidad del límite.

Los errores 5xx suelen ser transitorios. Reintenta aumentando el intervalo entre intentos. Nunca reintentes 4xx: indican un error de tu lado y volverán a fallar.