PureTools

Códigos de Estado HTTP: Referencia Completa

PureTools Team· 9 min de lectura
Códigos de Estado HTTP: Referencia Completa

Códigos de Estado HTTP: Lo Que Tu Servidor Realmente Le Dice al Cliente

Toda respuesta HTTP incluye un código de estado de tres dígitos. Acertalos y tu API es intuitiva. Errarlos y los desarrolladores pasan horas depurando por qué el cliente hace retry en un 200 que debería ser 400.

Las Cinco Clases

RangoCategoríaSignificado
1xxInformacionalSolicitud recibida, continuando
2xxÉxitoSolicitud aceptada y procesada
3xxRedirecciónCliente debe tomar acción adicional
4xxError del ClienteLa solicitud tiene un problema
5xxError del ServidorServidor falló al cumplir solicitud válida

Códigos de Éxito (2xx)

CódigoNombreCuándo Usar
200OKGET exitoso, PUT/PATCH actualizó con éxito
201CreatedPOST creó un nuevo recurso. Incluye header Location con la URL del nuevo recurso.
202AcceptedSolicitud aceptada para procesamiento asíncrono (ej: job en cola). Aún no completado.
204No ContentDELETE exitoso, nada que retornar. También bueno para PUT sin cuerpo de respuesta.
// Ejemplos Express.js
app.post('/users', (req, res) => {
  const user = createUser(req.body);
  res.status(201).json(user);
});

app.delete('/users/:id', (req, res) => {
  deleteUser(req.params.id);
  res.status(204).send();
});

app.post('/reports', (req, res) => {
  queueReportGeneration(req.body);
  res.status(202).json({ message: 'Reporte siendo generado' });
});

Códigos de Redirección (3xx)

CódigoNombreCuándo Usar
301Moved PermanentlyURL del recurso cambió permanentemente. Los browsers cachean esto. Usa para migraciones de dominio.
302FoundRedirect temporal. Browser usa GET para el redirect (incluso si el original era POST).
304Not ModifiedGET condicional — recurso no cambió desde la versión cacheada.
307Temporary RedirectComo 302, pero preserva el método HTTP. POST sigue siendo POST.
308Permanent RedirectComo 301, pero preserva el método HTTP.

Error común: Usar 302 cuando debería ser 301. Si el cambio de URL es permanente (mudó a nuevo dominio, cambió estructura de URL), usa 301 para que los buscadores actualicen su índice.

Códigos de Error del Cliente (4xx)

CódigoNombreCuándo Usar
400Bad RequestJSON malformado, campos requeridos faltantes, tipos de datos inválidos
401UnauthorizedSin autenticación o token inválido. Nombre engañoso — significa "no autenticado".
403ForbiddenAutenticado pero sin permiso. El usuario es conocido, pero no puede acceder a este recurso.
404Not FoundRecurso no existe en esta URL.
405Method Not AllowedEndpoint existe, pero no para este método HTTP (ej: POST en endpoint solo GET).
409ConflictConflicto con estado actual — email duplicado, versión incompatible, edición concurrente.
422Unprocessable EntityJSON es válido, pero datos no pasan validación (ej: formato de email incorrecto).
429Too Many RequestsRate limited. Incluye header Retry-After.
// 400 vs 422 — ambos son válidos, elige una convención
// 400: solicitud es estructuralmente incorrecta (JSON malformado)
// 422: solicitud es estructuralmente correcta, pero datos son inválidos

app.post('/users', (req, res) => {
  if (!req.body.email) {
    return res.status(422).json({
      error: 'Validación falló',
      details: [{ field: 'email', message: 'Email es requerido' }]
    });
  }
});

Códigos de Error del Servidor (5xx)

CódigoNombreCuándo Usar
500Internal Server ErrorGenérico "algo se rompió." No filtres stack traces a clientes.
502Bad GatewayProxy reverso (Nginx) no pudo conectar al servidor upstream (tu app crasheó).
503Service UnavailableServidor temporalmente fuera — mantenimiento, sobrecargado. Incluye Retry-After.
504Gateway TimeoutProxy reverso hizo timeout esperando que tu app responda.

Principio clave: 4xx significa que el cliente necesita corregir algo. 5xx significa que el servidor necesita corregir algo. Si el cliente nunca puede tener éxito cambiando su solicitud, es un 5xx.

Árbol de Decisión

¿La solicitud es válida?
├── No → ¿Es un problema estructural?
│   ├── Sí → 400 Bad Request
│   └── No → 422 Unprocessable Entity
├── Sí → ¿El usuario está autenticado?
│   ├── No → 401 Unauthorized
│   └── Sí → ¿El usuario está autorizado?
│       ├── No → 403 Forbidden
│       └── Sí → ¿El recurso existe?
│           ├── No → 404 Not Found
│           └── Sí → ¿Se procesó con éxito?
│               ├── Sí → 200/201/204
│               └── No → 500 Internal Server Error

Referencia rápida: Códigos de Estado HTTP — tabla buscable con descripciones, categorías y ejemplos para cada código.