Una API REST puede estar técnicamente correcta y aun así ser difícil de usar si no sigue buenas prácticas de diseño.
👉 En este capítulo veremos las mejores prácticas para diseñar APIs REST limpias y efectivas.
Usar sustantivos, no verbos
/crearUsuario # incorrecto
/usuarios # correcto
👉 El método HTTP ya define la acción (POST /usuarios
crea un usuario).
Usar plural para colecciones
/usuario # incorrecto
/usuarios # correcto
Usar minúsculas y guiones medios
/HistorialCompras # incorrecto
/historial-compras # correcto
Mantener jerarquía clara
/usuarios/1/pedidos # pedidos del usuario 1
/productos/15/comentarios # comentarios del producto 15
Cada método debe usarse de acuerdo con su semántica:
👉 Esto evita confusión y mantiene la API predecible.
Siempre devolver códigos HTTP correctos:
200 OK
: operación exitosa.201 Created
: recurso creado.204 No Content
: eliminación sin datos.400 Bad Request
: error en la petición del cliente.401 Unauthorized
: falta autenticación.403 Forbidden
: no tiene permisos.404 Not Found
: recurso no existe.500 Internal Server Error
: error inesperado del servidor.👉 Nunca devolver siempre 200
, incluso en errores.
snake_case
o camelCase
(elegir uno y no mezclar).Ejemplo correcto
{
"id": 1,
"nombre": "Ana",
"email": "ana@ejemplo.com"
}
Ejemplo incorrecto
["Ana", "ana@ejemplo.com"] # difícil de entender
👉 Además, incluir mensajes claros en errores:
{
"error": "Bad Request",
"mensaje": "El campo 'email' es obligatorio"
}
Cuando una colección puede devolver miles de resultados, paginación y filtros son indispensables.
Ejemplo
GET /usuarios?pagina=2&limite=20
Respuesta
{
"pagina": 2,
"limite": 20,
"total": 95,
"usuarios": [
{ "id": 21, "nombre": "Luis" },
{ "id": 22, "nombre": "Laura" }
]
}
👉 Esto mejora el rendimiento y evita respuestas demasiado grandes.
500
debe ser genérico).👉 Una API sin seguridad es una puerta abierta a ataques.
Siempre versionar la API desde el inicio:
/api/v1/usuarios
/api/v2/usuarios
👉 Permite evolucionar sin romper compatibilidad con clientes antiguos.
👉 La documentación es parte del producto, no un accesorio.
Definir un formato único para errores. Ejemplo:
{
"error": "Not Found",
"mensaje": "El producto con id 99 no existe",
"codigo": 404,
"timestamp": "2025-09-10T12:30:00Z",
"ruta": "/productos/99"
}
👉 Esto ayuda a los clientes a interpretar los fallos de manera consistente.
is_
o activo
. Ejemplo: "activo": true
.2025-09-10T12:30:00Z
)."precio": 1500.00, "moneda": "USD"
.Endpoint
GET /api/v1/productos?categoria=electronica&pagina=1&limite=2
Respuesta
{
"pagina": 1,
"limite": 2,
"total": 25,
"productos": [
{ "id": 101, "nombre": "Notebook Gamer", "precio": 2200.00, "stock": true },
{ "id": 102, "nombre": "Auriculares Bluetooth", "precio": 150.00, "stock": false }
]
}
👉 Claridad en la ruta, paginación, nombres consistentes y uso correcto de JSON.
Las buenas prácticas en diseño de APIs REST hacen la diferencia entre una API usable y una API profesional, confiable y escalable.
👉 En resumen: una API bien diseñada habla el mismo idioma que los desarrolladores.