Código HTTP 483 – “I’m Not a Freezer”: Qué es, cuándo usarlo y cómo implementarlo hoy
Introducción
¿Alguna vez tu API ha devuelto 429 Too Many Requests aunque el cliente no estaba enviando peticiones en exceso?
En muchos casos el problema real es que el cliente está “congelando” recursos del servidor (manteniendo conexiones abiertas o dejando operaciones en espera) sin haberlo negociado.
Para dar una respuesta clara y evitar malentendidos, el IETF está discutiendo el nuevo código 483 – “I’m Not a Freezer”. En este artículo práctico descubrirás qué significa este código, cuándo deberías devolverlo y, lo más importante, cómo implementarlo en tu stack sin romper nada.
1. ¿Qué indica el 483?
| Código | Significado breve | Cuándo usarlo |
|---|---|---|
| 483 | El servidor rechaza la petición porque el cliente intenta mantener recursos en estado de espera sin autorización. | Cuando el cliente mantiene una conexión, una transacción o un lock más allá del tiempo acordado y el servidor decide cerrarlo. |
| 429 | Rate‑limit excedido. | Cuando la velocidad de peticiones supera el límite permitido. |
| 503 | Servicio temporalmente no disponible. | Cuando el servidor está sobrecargado o en mantenimiento, sin relación con la conducta del cliente. |
En resumen, 483 habla de persistencia no autorizada, mientras que 429 y 503 se centran en cantidad y disponibilidad respectivamente.
2. ¿Por qué surge ahora?
- Micro‑servicios y APIs modernas manejan recursos escasos (sockets, hilos, buffers).
- Los clientes a menudo usan long‑polling o WebSocket sin acordar límites de tiempo, lo que bloquea recursos críticos.
- La especificación actual no tiene un código que exprese explícitamente “no voy a mantener este recurso para ti”.
El 483 cubre ese vacío y permite a los equipos de operaciones comunicar la razón del rechazo de forma inequívoca.
3. Ejemplos concretos
3.1. Node.js / Express
app.post('/jobs/:id/start', (req, res) => {
const job = jobs.get(req.params.id);
// El cliente intenta re‑usar un job que ya está en estado "running"
if (job && job.status === 'running' && !req.headers['x-keep-alive']) {
// 483 + cuerpo JSON explicativo
return res.status(483).json({
error: "I’m Not a Freezer",
message: "El cliente está intentando mantener el job activo sin autorización."
});
}
// lógica normal…
});
3.2. Nginx como proxy (respuesta estática)
# Bloquear peticiones que superen 30 s sin header X-Keep-Alive
map $http_x_keep_alive $freeze {
default 0;
"" 1;
}
if ($request_time > 30 && $freeze) {
return 483 "I’m Not a Freezer\r\n";
}
3.3. cURL (para probar)
curl -i -X POST http://api.ejemplo.com/jobs/42/start \
-H "Content-Type: application/json" \
-d '{"payload":"…"}'
Si el servidor devuelve:
HTTP/1.1 483 I’m Not a Freezer
Content-Type: application/json
...
{
"error":"I’m Not a Freezer",
"message":"El cliente está intentando mantener el job activo sin autorización."
}
…has recibido la señal correcta.
4. Guía de adopción paso a paso
- Identifica los puntos críticos donde tu API permite “esperas largas” (polling, streaming, jobs).
-
Define un header de negociación, por ejemplo
X-Keep-Alive: trueoPrefer: wait=30. - Implementa la lógica de rechazo con el código 483 cuando falte el header o el tiempo supere el límite.
- Documenta el código en tu OpenAPI/Swagger:
responses:
'483':
description: I’m Not a Freezer – el cliente intentó mantener recursos sin autorización
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
- Actualiza los clientes para que manejen 483 como una condición recuperable: volver a enviar la petición con la negociación adecuada o abortar la operación.
-
Monitorea la métrica
http_response_status{code="483"}en tu sistema de observabilidad para detectar patrones de abuso.
5. Ventajas y desventajas
| Pros | Contras |
|---|---|
| Comunicación clara del motivo del rechazo. | Necesita coordinación entre cliente y servidor (header de negociación). |
| Evita que los clientes “bloqueen” recursos indefinidamente. | Aún no está estandarizado; algunos proxies pueden tratarlo como 500. |
| Facilita métricas de abuso de recursos. | Requiere actualización de documentación y pruebas. |
| Reduce la ambigüedad entre 429 y 503. | Puede generar confusión si se usa de forma inconsistente. |
6. Comparativa rápida
| Escenario | 429 | 503 | 483 |
|---|---|---|---|
| Cliente supera 100 req/s | ✔️ | ❌ | ❌ |
| Servidor en mantenimiento programado | ❌ | ✔️ | ❌ |
Cliente mantiene una conexión abierta 2 min sin X-Keep-Alive
|
❌ | ❌ | ✔️ |
| Cliente reintenta después de 503 y sigue fallando | ✔️ (rate‑limit) | ✔️ (retry‑after) | ✔️ (necesita negociación) |
7. Preguntas frecuentes (FAQ)
1️⃣ ¿Puedo usar 483 en HTTP/1.0?
Sí, el número es válido en cualquier versión que acepte códigos de tres dígitos. Sin embargo, algunos navegadores antiguos pueden no reconocerlo; en esos casos, devuelve también un cuerpo explicativo.
2️⃣ ¿Qué pasa si el cliente ignora el 483?
El cliente seguirá recibiendo la respuesta y, según su lógica, debería abortar o renegociar. Si no lo hace, el servidor puede cerrar la conexión inmediatamente.
3️⃣ ¿Debo combinar 483 con Retry-After?
No es necesario. Retry-After se usa con 429 o 503. En 483 la solución es negarse a mantener el recurso, no volver a intentar más tarde.
4️⃣ ¿Hay riesgos de que algún proxy convierta 483 en 500?
Algunos proxies antiguos pueden tratar códigos no reconocidos como 500. La solución práctica es enviar también un encabezado Connection: close para forzar el cierre y evitar comportamientos inesperados.
8. Conclusión
El código 483 – “I’m Not a Freezer” cierra una laguna importante en la especificación HTTP: la falta de un estado que indique que el servidor rechaza una petición porque el cliente quiere “congelar” recursos sin haberlo acordado.
Implementarlo es sencillo: define un header de negociación, agrega la condición de rechazo y documenta el código en tu contrato API. Con esa pequeña inversión ganarás claridad, evitarás bloqueos de recursos y tendrás métricas útiles para detectar patrones de abuso.
¿Listo para que tu API deje de ser un congelador? Añade el 483 hoy mismo y comunica de forma inequívoca cuándo no vas a mantener recursos para quien no lo pidió.
¿Te ha resultado útil este artículo? Déjanos tu comentario y comparte tu experiencia implementando el 483 en tu stack.
Top comments (0)