Mensajes de Estado HTTP
Referencia clara de códigos de estado HTTP (1xx–5xx) con los más comunes explicados y un ejemplo fetch() que ramifica según response.status.
Cada vez que un navegador carga una página, envía un formulario o tu JavaScript realiza una llamada fetch(), el servidor responde con un código de estado HTTP de tres dígitos. Este código le indica al cliente si la solicitud fue exitosa, fue redirigida, falló por algo que hizo el cliente o falló en el servidor. El navegador lo utiliza automáticamente — sigue las redirecciones, muestra su propia página de error para algunos códigos y reutiliza el contenido en caché para otros — pero como desarrollador también lees estos códigos directamente: un formulario se envía y ramificas según la respuesta, o un fetch() se resuelve y compruebas response.ok (que simplemente significa "estado en el rango 200–299").
Aquí puedes encontrar la lista de códigos de estado de respuesta del Protocolo de Transferencia de Hipertexto (HTTP). Estos códigos responden a la solicitud que un cliente hace a un servidor — ya sea que esa solicitud use GET, POST u otro método HTTP — y se agrupan en 5 clases según su primer dígito. Conocerlos te ayuda a depurar enlaces rotos, URLs incorrectas, envíos de formularios fallidos y respuestas de API inesperadas. Repasemos cada clase:
Si recibes una respuesta que no está incluida en esta lista, significa que es una respuesta no estándar, posiblemente personalizada para el software del servidor.
Manejo de códigos de estado en JavaScript
Cuando envías un formulario o llamas a una API con fetch(), la solicitud tiene éxito (la promesa se resuelve) incluso cuando el servidor devuelve un error 4xx o 5xx — un 404 o 500 sigue siendo una respuesta HTTP válida, no un error de red. Por eso debes inspeccionar el estado tú mismo. El atajo conveniente es response.ok, que es true solo para el rango 200–299; para cualquier otro caso, ramificas según response.status para reaccionar apropiadamente:
const form = document.querySelector("#signup");
form.addEventListener("submit", async (event) => {
event.preventDefault();
const response = await fetch("/api/signup", {
method: "POST",
body: new FormData(form),
});
if (response.ok) {
// 200–299: success
window.location.href = "/welcome";
} else if (response.status === 401) {
showMessage("Please log in first.");
} else if (response.status === 422) {
// Validation errors returned as JSON
const data = await response.json();
showMessage(data.error);
} else if (response.status === 429) {
// Rate limited — respect the Retry-After header
const wait = response.headers.get("Retry-After");
showMessage(`Too many attempts. Try again in ${wait}s.`);
} else if (response.status >= 500) {
showMessage("Server error — please try again later.");
} else {
showMessage(`Unexpected error (${response.status}).`);
}
});Ten en cuenta que fetch() solo rechaza ante problemas de red genuinos (sin conexión, bloqueo CORS, fallo de DNS), por lo que envolver la llamada en try…catch maneja esos casos, mientras que el if/else anterior maneja el estado HTTP en sí.
Los códigos más comunes para conocer primero. Si solo vas a memorizar unos pocos, que sean estos: 200 (OK), 301 (Movido Permanentemente), 302 (Encontrado / redirección temporal), 401 (No Autorizado), 403 (Prohibido), 404 (No Encontrado) y 500 (Error Interno del Servidor). Cubren la gran mayoría de lo que verás en las herramientas de desarrollo del navegador y en los registros del servidor.
1xx: Información
| Código de estado | Mensaje | Descripción |
|---|---|---|
| 100 | Continue | Significa que el servidor ha recibido los encabezados de la solicitud y el cliente debe continuar enviando el cuerpo de la solicitud. |
| 101 | Switching Protocols | Significa que el cliente, que realizó la solicitud, ha pedido al servidor que cambie de protocolo (por ejemplo, para actualizar a una conexión WebSocket). |
| 102 | Processing | Un código WebDAV que indica que el servidor ha aceptado la solicitud pero aún no la ha completado; se utiliza para evitar que el cliente exceda el tiempo de espera en una operación prolongada. |
| 103 | Early Hints | Definido en RFC 8297. Permite al servidor enviar algunos encabezados de respuesta (como encabezados Link que precargan recursos) antes de la respuesta final, para que el navegador pueda comenzar a obtener recursos antes. |
2xx: Exitoso
| Código de estado | Mensaje | Descripción |
|---|---|---|
| 200 | OK | Significa que la solicitud es correcta. Es la respuesta estándar para solicitudes HTTP exitosas. |
| 201 | Created | Significa que la solicitud se ha completado y se ha creado un nuevo recurso. |
| 202 | Accepted | Significa que la solicitud ha sido aceptada para su procesamiento, pero el procesamiento continúa. |
| 203 | Non-Authoritative Information | Significa que la solicitud se ha procesado correctamente, pero devuelve información que puede provenir de otra fuente. |
| 204 | No Content | Significa que la solicitud se ha procesado correctamente, pero no devuelve ningún contenido. |
| 205 | Reset Content | Significa que la solicitud ha sido procesada, pero no devuelve ningún contenido y requiere que el solicitante restablezca la vista del documento. |
| 206 | Partial Content | Significa que el servidor solo entrega una parte del recurso, a causa de un encabezado de rango enviado por el cliente. |
3xx: Redirección
| Código de estado | Mensaje | Descripción |
|---|---|---|
| 300 | Multiple Choices | Indica múltiples opciones para el recurso que el cliente puede seguir. |
| 301 | Moved Permanently | Significa que la página se ha movido permanentemente a una nueva URL. Los navegadores y motores de búsqueda actualizan sus referencias, por lo que un 301 transfiere la equidad de enlace a la nueva URL y es la opción correcta para redirecciones favorables al SEO. |
| 302 | Found | Significa que la página solicitada se ha movido temporalmente a una nueva URL. Los motores de búsqueda mantienen indexada la URL original, por lo que debes usar 302 (no 301) cuando el traslado es de corta duración, como durante mantenimiento o pruebas A/B. |
| 303 | See Other | Significa que la respuesta a la solicitud se puede encontrar en otra URL, que el cliente debe recuperar con GET. Se utiliza habitualmente después de un POST de formulario para redirigir a una página de resultado. |
| 304 | Not Modified | Significa que el recurso solicitado no ha sido modificado desde la última vez que se almacenó en caché. El servidor no envía cuerpo, por lo que el navegador reutiliza su copia en caché — esto ahorra ancho de banda y acelera las visitas repetidas. |
| 307 | Temporary Redirect | Significa que la página solicitada se ha movido temporalmente a una nueva URL. A diferencia del 302, el cliente debe mantener el método de solicitud original (un POST sigue siendo un POST). |
| 308 | Permanent Redirect | Significa que el recurso solicitado se ha movido permanentemente a una nueva URL. |
Los códigos no listados aquí (como el 305 y el 306) están obsoletos, son raros o son específicos de extensiones.
4xx: Error del Cliente
| Código de estado | Mensaje | Descripción |
|---|---|---|
| 400 | Bad Request | Significa que la solicitud no se puede completar debido a sintaxis incorrecta o datos no válidos. |
| 401 | Unauthorized | Significa que el cliente no está autenticado — faltan credenciales válidas o son incorrectas. El servidor aún no sabe quién eres, por lo que te pide que inicies sesión. (Nota: el nombre dice "No Autorizado" pero realmente significa "No Autenticado".) |
| 402 | Payment Required | Está reservado para uso futuro. |
| 403 | Forbidden | Significa que el cliente está autenticado pero no autorizado — el servidor sabe quién eres, pero no tienes permiso para acceder a este recurso. A diferencia del 401, enviar credenciales de nuevo no ayudará. |
| 404 | Not Found | Significa que la página solicitada no se puede encontrar en este momento, pero puede estar disponible de nuevo en el futuro. |
| 405 | Method Not Allowed | Significa que la solicitud se realizó a una página que usa un método de solicitud no compatible con esa página. |
| 406 | Not Acceptable | Significa que el servidor solo puede generar una respuesta que el cliente no acepta. |
| 407 | Proxy Authentication Required | Significa que el cliente primero debe autenticarse con el proxy. |
| 408 | Request Timeout | Significa que el servidor agotó el tiempo de espera de la solicitud. |
| 409 | Conflict | Significa que la solicitud no se puede completar debido a un conflicto en la solicitud. |
| 410 | Gone | Significa que la página solicitada ya no está disponible. |
| 411 | Length Required | Significa que la longitud del contenido no está definida y el servidor no aceptará la solicitud sin ella. |
| 412 | Precondition Failed | Significa que una condición previa dada en la solicitud es evaluada como falsa por el servidor. |
| 413 | Request Entity Too Large | Significa que la entidad de la solicitud es demasiado grande y por eso el servidor no aceptará la solicitud. |
| 414 | Request-URI Too Long | Significa que la URL es demasiado larga y por eso el servidor no aceptará la solicitud. Ocurre cuando se convierte una solicitud POST en una solicitud GET con mucha información en la consulta. |
| 415 | Unsupported Media Type | Significa que el tipo de medio no es compatible y por eso el servidor no aceptará la solicitud. |
| 416 | Requested Range Not Satisfiable | Significa que el cliente solicitó una parte del archivo pero el servidor no puede suministrar esa parte. |
| 417 | Expectation Failed | Significa que el servidor no puede cumplir los requisitos del campo de encabezado de solicitud Expect. |
| 418 | I'm a Teapot | Un código de broma del RFC 2324 (el Protocolo de Control de Cafetera de Hipertexto). No es un error real, pero algunas APIs lo devuelven deliberadamente, por lo que puedes encontrarlo en la práctica. |
| 422 | Unprocessable Content | Significa que la solicitud estaba bien formada pero contiene errores semánticos que impiden su procesamiento — habitualmente devuelto por APIs cuando los datos de un formulario o JSON fallan la validación. |
| 429 | Too Many Requests | Significa que el cliente ha enviado demasiadas solicitudes en un período de tiempo determinado ("limitación de velocidad"). La respuesta a menudo incluye un encabezado Retry-After que indica cuánto tiempo esperar antes de volver a intentarlo. |
| 451 | Unavailable For Legal Reasons | Significa que el recurso solicitado no está disponible por motivos legales, como censura o una orden de eliminación (el número hace referencia a la novela Fahrenheit 451). |
Los códigos no listados aquí (como el 419, el 420 y varios en el rango 423–431) son raros, específicos de frameworks o no estándar. Algunos — como el 421 (Solicitud Mal Dirigida, usado en HTTP/2) y el 451 anterior — están estandarizados pero son poco frecuentes en el trabajo cotidiano.
5xx: Error del Servidor
| Código de estado | Mensaje | Descripción |
|---|---|---|
| 500 | Internal Server Error | Es un error genérico y los usuarios reciben este mensaje cuando no hay un mensaje específico más adecuado. |
| 501 | Not Implemented | Significa que el servidor no reconoce el método de solicitud o carece de la capacidad para completar la solicitud. |
| 502 | Bad Gateway | Significa que un servidor que actúa como puerta de enlace, proxy inverso o balanceador de carga recibió una respuesta no válida del servidor de aplicaciones upstream — a menudo porque ese backend falló o devolvió una salida mal formada. |
| 503 | Service Unavailable | Significa que el servidor no puede manejar temporalmente la solicitud (sobrecargado o inactivo por mantenimiento). Al igual que el 429, la respuesta puede incluir un encabezado Retry-After que indica a los clientes y rastreadores cuándo volver a intentarlo, por eso el 503 es el código seguro para SEO durante el tiempo de inactividad planificado. |
| 504 | Gateway Timeout | Significa que un servidor que actúa como puerta de enlace, proxy inverso o balanceador de carga no recibió respuesta a tiempo del servidor upstream. Apunta a un backend lento o sin respuesta, no al proxy en sí. |
| 505 | HTTP Version Not Supported | Significa que la versión del protocolo HTTP utilizada en la solicitud no es compatible con el servidor. |
| 507 | Insufficient Storage | Un código WebDAV que indica que el servidor no puede almacenar la representación necesaria para completar la solicitud (no tiene espacio de almacenamiento suficiente). |
| 508 | Loop Detected | Un código WebDAV que indica que el servidor detectó un bucle infinito al procesar la solicitud y lo terminó. |
| 511 | Network Authentication Required | Significa que el cliente necesita autenticarse para obtener acceso a la red (a menudo se ve detrás de un portal cautivo Wi-Fi). |
Capítulos Relacionados
El estado que devuelve un servidor a menudo depende de la propia solicitud. Para profundizar, consulta:
- Métodos HTTP — GET, POST y sus variantes, que determinan cómo se comportan algunas redirecciones (302 vs 307).
- Formularios HTML — cómo los envíos de formularios desencadenan solicitudes que pueden devolver 303, 422 o 429.
- URL HTML (Localizadores Uniformes de Recursos) — las direcciones a las que apuntan las redirecciones 3xx y las respuestas 404.