Errores y troubleshooting
La API usa códigos HTTP estándar y siempre devuelve un cuerpo JSON con la misma forma cuando hay error.
Formato del error
{
"error": {
"code": "string", // estable, machine-readable
"message": "string" // legible para humanos
}
}El campo code es estable: si tu integración ramifica por error, basa la lógica en code, no en message (que puede cambiar de fraseo entre versiones).
Códigos HTTP que verás
| Status | Cuándo aparece | Cómo reaccionar |
|---|---|---|
| 200 OK | Petición correcta | Procesa data normalmente |
| 201 Created | Recurso creado (cuando aplica) | Lee el ID en la respuesta |
| 400 Bad Request | Query string inválido o body mal formado | Corrige los parámetros — no reintentar |
| 401 Unauthorized | Header ausente, token inválido o expirado | Verifica la clave; emite una nueva si fue revocada |
| 403 Forbidden | La clave no tiene los scopes que requiere el endpoint | Crea una nueva clave con los scopes necesarios |
| 404 Not Found | Recurso ausente o pertenece a otra organización | Verifica el ID — no reintentar |
| 409 Conflict | Estado incompatible (ej. resolver una alerta ya resuelta) | Lee el código y decide si es no-op |
| 429 Too Many Requests | Cuota agotada (60 req/min por clave) | Espera Retry-After segundos y reintenta |
| 5xx Server Error | Fallo transitorio del servidor | Reintenta con backoff exponencial |
Códigos code que devuelve la API
Autenticación y permisos
| Code | Status | Significado |
|---|---|---|
| missing_or_invalid_authorization | 401 | Header Authorization ausente o no respeta el formato 'Bearer rud1_sk_...' |
| invalid_key_format | 401 | El token no respeta el formato esperado |
| invalid_api_key | 401 | La clave no existe, ha sido revocada o el secreto no coincide |
| expired_api_key | 401 | La clave existe pero pasó su fecha de expiración |
| insufficient_scope | 403 | La clave es válida pero le falta el scope que el endpoint requiere |
| rate_limit_exceeded | 429 | Pasaste el límite de 60 req/min para esta clave |
Request y recursos
| Code | Status | Significado |
|---|---|---|
| invalid_query | 400 | Algún parámetro de query no pasa la validación (ver fieldErrors) |
| not_found | 404 | El recurso no existe en tu organización |
| alert_already_resolved | 409 | Intentaste reconocer una alerta que ya está en RESOLVED |
ℹ️ En errores de validación (invalid_query) la respuesta incluye un objeto fieldErrors con la lista de campos problemáticos — útil para mostrar mensajes específicos en tu UI.
Estrategia de reintentos recomendada
Las únicas categorías que conviene reintentar automáticamente son 429 (rate limit, esperando Retry-After) y 5xx (fallo transitorio). Para todo lo demás, reintentar solo amplifica el problema.
async function rud1Get(path, attempt = 0) {
const res = await fetch(`https://www.rud1.es${path}`, {
headers: { Authorization: `Bearer ${process.env.RUD1_API_KEY}` },
});
// 429: espera el Retry-After del servidor
if (res.status === 429 && attempt < 3) {
const retry = Number(res.headers.get("Retry-After") ?? 1) * 1000;
await new Promise((r) => setTimeout(r, retry));
return rud1Get(path, attempt + 1);
}
// 5xx: backoff exponencial con jitter — máximo 3 intentos
if (res.status >= 500 && attempt < 3) {
const wait = (2 ** attempt) * 500 + Math.random() * 250;
await new Promise((r) => setTimeout(r, wait));
return rud1Get(path, attempt + 1);
}
// 4xx ≠ 429: error del cliente, no reintentar
if (!res.ok) {
const body = await res.json();
throw new Error(`${body.error.code}: ${body.error.message}`);
}
return res.json();
}Diagnóstico rápido
Estoy recibiendo 401 todo el rato
- Verifica que el header sea exactamente
Authorization: Bearer rud1_sk_...con un espacio entre "Bearer" y el token. - Comprueba que la clave no esté revocada en
Ajustes → Claves API. - Si configuraste expiración, mira si ya pasó. La columna Expira del listado lo indica.
- Asegúrate de que copiaste el secreto completo (incluye el guion bajo entre el prefijo y la parte aleatoria).
Recibo 403 insufficient_scope
El endpoint que intentas usar requiere un scope que tu clave no tiene. El campo message te dirá cuál falta. Crea una clave nueva con esos scopes o, si la integración solo necesita ese permiso ocasional, considera dividirla en dos claves distintas (una por privilegio).
404 cuando estoy seguro de que el recurso existe
Por seguridad nunca diferenciamos "no existe" de "existe pero pertenece a otra organización": ambos casos devuelven 404. Verifica que la clave que estás usando es de la misma organización a la que pertenece el recurso.
Reportar un problema
Si crees que has encontrado un comportamiento incorrecto, escribe a support@rud1.es con:
- El prefijo de la clave (solo los 16 primeros caracteres,
rud1_sk_...). - El método y la ruta exacta de la petición.
- La fecha y hora aproximada (UTC) en la que pasó — facilita encontrar el log.
- El cuerpo de error completo que recibiste.
🚨 Nunca incluyas el secreto completo en correos, tickets ni screenshots. Si crees que se ha filtrado, revoca la clave inmediatamente desde el panel.