Guías

Cómo crear una API REST: diseño, seguridad y despliegue

Para crear una API REST, enumera los recursos que gestiona tu app (usuarios, pedidos, reservas), asigna a cada uno una URL como /orders o /orders/{id} y usa métodos HTTP para las acciones: GET para leer, POST para crear, PATCH para actualizar y DELETE para eliminar. Devuelve JSON con códigos de estado claros, valida cada entrada, exige autenticación y comprobaciones de permisos por registro en el servidor, y pagina las listas. Después documenta los endpoints y despliega la API detrás de HTTPS.

Esta guía cubre las decisiones de diseño, un conjunto de rutas de ejemplo, prompts para un creador de apps con IA y los errores que provocan agujeros de seguridad. Si las APIs te son nuevas, empieza por qué es una API.

Cuándo necesitas una API REST

  • Tu frontend web necesita guardar y cargar datos desde un servidor
  • Una app móvil, un socio o una herramienta de automatización necesita acceder a tus datos
  • Otros servicios te envían eventos (webhooks)
  • Repartes el trabajo entre un equipo de frontend y otro de backend

REST es el estilo más común, pero no el único. REST vs GraphQL explica cuándo encaja mejor un único endpoint de consultas flexible.

Primero el diseño: recursos y rutas

Apunta los sustantivos de tu app y lo que la gente hace con ellos. Para una app sencilla de reservas:

MétodoRutaQué haceCódigo de éxito
GET/api/bookingsLista las reservas del usuario (paginadas)200
POST/api/bookingsCrea una reserva201
GET/api/bookings/{id}Obtiene una reserva200
PATCH/api/bookings/{id}Cambia algunos campos200
DELETE/api/bookings/{id}Cancela una reserva204
GET/api/healthComprobación de estado para monitorización200

Estas rutas se corresponden con crear, leer, actualizar y eliminar; consulta qué es CRUD. Convenciones que conviene seguir:

  • Sustantivos en plural y sin verbos en las URLs: /bookings, no /getBookings.
  • Anida solo un nivel cuando aclara la propiedad: /bookings/{id}/notes.
  • Las acciones que no son CRUD pueden ser subrecursos: POST /bookings/{id}/cancel es más claro que un PATCH con magia.
  • Nombres coherentes para los campos, como created_at en todas partes.

Códigos de estado y errores

Usa los códigos HTTP estándar para que los clientes sepan qué ha pasado sin tener que interpretar texto:

CódigoSignificadoÚsalo cuando
200OKUna lectura o actualización correcta
201CreatedUn POST ha creado algo
204No ContentÉxito sin nada que devolver
400Bad RequestLa entrada no ha superado la validación
401UnauthorizedNo has iniciado sesión o el token no es válido
403ForbiddenHas iniciado sesión pero no tienes permiso
404Not FoundNo existe, o el que llama no debe saber que existe
409ConflictDuplicado, o el hueco ya está reservado
429Too Many RequestsSe ha superado el límite de peticiones
500Server ErrorAlgo ha fallado en tu lado

Devuelve los errores siempre con una misma forma JSON, por ejemplo {"error": {"code": "slot_taken", "message": "Ese horario ya no está disponible."}}, y nunca incluyas trazas de error ni errores de base de datos en las respuestas.

Opciones y compromisos

DecisiónOpción sencillaAlternativa
Dónde vive la APIRutas de API dentro de tu framework webUn servicio de API separado, útil para varios clientes o con otro lenguaje
AutenticaciónCookies de sesión para tu propia app webTokens (bearer o API keys) para apps móviles y terceros
Paginación?page=2&limit=20Por cursor (?after=...), más estable en listas grandes y cambiantes
VersionadoNinguno hasta que haya usuarios externos/v1/ en la ruta cuando otros dependan de ella
DocumentaciónUn README con las rutasUna especificación OpenAPI, que las herramientas convierten en documentación interactiva y en código de cliente

Paso a paso

  1. Enumera los recursos y las rutas como se ha visto, incluyendo quién puede llamar a cada una.
  2. Modela los datos en tu base de datos con los campos y relaciones que necesitas.
  3. Construye primero las rutas de lectura y después las de crear, actualizar y eliminar.
  4. Valida la entrada en cada escritura con una librería de esquemas: campos obligatorios, tipos, longitudes, valores permitidos. Rechaza los campos desconocidos.
  5. Añade autenticación y después autorización por registro: cargar /bookings/42 debe comprobar que la reserva 42 pertenece al que llama, no solo que alguien ha iniciado sesión.
  6. Pagina todas las listas y limita el tamaño de página.
  7. Limita las peticiones en el login y en las rutas costosas. Consulta límites de uso (rate limiting).
  8. Configura CORS solo si navegadores de otros dominios deben llamar a la API, y enumera esos orígenes de forma explícita. Cómo corregir errores de CORS explica los errores que verás.
  9. Escribe documentación y pruebas para cada ruta, incluidos los casos de fallo.
  10. Despliega con los secretos en variables de entorno, HTTPS, registros y una comprobación de estado.

Prompts para tu creador de apps con IA

Estructura inicial:

Crea una API REST para reservas con estas rutas: GET /api/health, GET /api/bookings (paginada, máximo 50 por página), POST /api/bookings, GET /api/bookings/:id, PATCH /api/bookings/:id, DELETE /api/bookings/:id. Guarda los datos en nuestra base de datos. Valida los cuerpos de las peticiones con una librería de esquemas y rechaza los campos desconocidos. Devuelve los errores en JSON como {"error": {"code", "message"}} con los códigos de estado correctos (400, 401, 403, 404, 409). Guarda los secretos en variables de entorno.

Seguridad:

Exige inicio de sesión en todas las rutas de reservas. En cada lectura, actualización y eliminación, comprueba en el servidor que la reserva pertenece al usuario actual; si no, devuelve 404. Nunca aceptes IDs de usuario ni roles del cuerpo de la petición. Limita POST /api/bookings a 20 por minuto por usuario. Registra los errores en el servidor sin devolver trazas de error.

Documentación:

Escribe una descripción OpenAPI de estas rutas y un README breve con ejemplos de peticiones y respuestas para cada una.

Probar tu API

Pruébala desde fuera del frontend, porque los atacantes lo harán:

  • Cada ruta funciona con datos válidos y devuelve la forma y el código documentados
  • Los campos que faltan o no son válidos devuelven 400 con un mensaje claro
  • Sin token, todas las rutas protegidas devuelven 401
  • El usuario A que pide por ID el registro del usuario B recibe 404 o 403
  • Las listas están paginadas; un limit enorme se limita
  • Los duplicados o conflictos al crear devuelven 409, no 500
  • Los límites de uso devuelven 429
  • Las respuestas de error no contienen trazas, SQL ni secretos
  • CORS solo permite los orígenes que pretendes

Errores habituales

  • Comprobar el inicio de sesión pero no la propiedad. El agujero más común en una API: cualquier usuario con sesión puede leer cualquier registro cambiando el ID.
  • Confiar en el cliente. Los precios, roles e IDs de usuario que llegan en el cuerpo de la petición se pueden modificar.
  • Devolver filas completas de la base de datos. Los hashes de contraseñas y los campos internos se filtran. Elige qué incluye cada respuesta.
  • Listas sin límite. Una petición que pide todos los registros puede ralentizar toda la app.
  • 200 OK con un mensaje de error dentro. Los clientes y la monitorización no saben que ha fallado.
  • CORS configurado para permitirlo todo en una API que usa cookies.
  • Sin comprobación de estado ni registros, así que te enteras de las caídas por los usuarios.

Para una revisión más amplia antes del lanzamiento, consulta la lista de comprobación de seguridad para apps creadas con IA.

Crear una API REST en Mythex

Puedes pedir a Mythex una API como parte de tu app o como servicio propio. La receta de la documentación backend de API REST incluye un prompt inicial: indica tu framework y tus rutas, pide errores JSON claros, guarda los secretos en variables de entorno e incluye un Dockerfile. Los backends en contenedor en Node, Python, C#, Java y otros se publican mediante un Dockerfile, y Mythex gestiona el despliegue desde Publish (backends de API). Un proyecto puede tener una web y un servidor de API en paralelo, y puedes cambiar entre ambos en la vista previa. Guarda las claves como secretos del proyecto, y si la API necesita una base de datos, pídela en el chat. Para tareas programadas en torno a tu API, consulta cómo ejecutar tareas en segundo plano.

Preguntas

¿Qué es una API REST?

Una API REST es una forma de que los programas trabajen con los datos de tu app a través de HTTP. Cada tipo de dato es un recurso con su propia URL, como /orders, y los métodos estándar actúan sobre él: GET para leer, POST para crear, PATCH o PUT para actualizar y DELETE para eliminar. Los datos suelen enviarse en JSON.

¿En qué lenguaje debo crear una API REST?

Usa el que tú o tu equipo puedan mantener. Node.js con Express o Fastify, Python con FastAPI, y los frameworks de C# o Java funcionan muy bien. Las reglas de diseño para las rutas, los códigos de estado, la validación y la autenticación importan más que el lenguaje.

¿Cómo protejo una API REST?

Exige autenticación en todas las rutas que no sean públicas, comprueba en el servidor que quien hace la petición puede acceder a cada registro concreto, valida todas las entradas, usa HTTPS, limita el número de peticiones y guarda los secretos en variables de entorno. Nunca confíes en los IDs ni en los roles que envía el cliente.

¿Necesito un backend separado para una API REST?

No siempre. Frameworks como Next.js pueden servir rutas de API junto con las páginas. Un servicio de API separado tiene sentido cuando varios clientes (web, móvil, socios) la usan, o cuando necesita su propio lenguaje o su propio escalado.

Mythex · Pricing · Crea lo que quieras con IA · Plantillas de sitios web y apps · Mythex comparado · Glosario para crear apps con IA · Herramientas gratis para crear apps con IA · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)