API Lifecycle

Versionado de API

Las API cambian. El versionado es la forma de implementar mejoras sin romper los clientes que ya dependen de ti, y la manera de retirar versiones antiguas de forma planificada.

intermediate13 min readUpdated 15 sept 2026
versioning.js
js
// versioning.js
app.get("/v1/posts", listPostsV1);
app.get("/v2/posts", listPostsV2);

// signal that v1 is going away
app.use("/v1", (req, res, next) => {
  res.set("Deprecation", "true");
  res.set("Sunset", "Wed, 31 Dec 2026 23:59:59 GMT");
  res.set("Link", '</v2/posts>; rel="successor-version"');
  next();
});
Breaking
Elimina o cambia el comportamiento
Aditivo
Generalmente seguro
Común
Versionado por URI
Flexible
Versionado por Header
Retiro
Deprecation y Sunset
Regla
Nunca rompas el contrato en silencio

Por que importa

Por qué es importante el versionado

Evolucionar sin romper

El versionado te permite mejorar la API mientras los clientes siguen operando con el contrato antiguo hasta que migren.

Cambios predecibles

Una política clara sobre qué se considera un cambio disruptivo permite que los clientes sepan cuándo deben actuar.

Retiro deliberado

Los headers de deprecación y sunset convierten la eliminación de una versión antigua en un plan comunicado, no en una sorpresa.

La imagen completa

Las tres ideas detrás del versionado

Identifica qué rompe los clientes, elige una estrategia sostenible y retira las versiones siguiendo un calendario.

Compatibilidad

Clasificar

Decide si un cambio es aditivo y seguro, o disruptivo y amerita una nueva versión.

Estrategia

Exponer

Elige cómo seleccionan los clientes la versión: en la URL, en un header o mediante el media type.

Ciclo de Vida

Retirar

Anuncia la deprecación, establece una fecha de sunset y monitorea el uso antes de eliminar cualquier cosa.

Versionado de un vistazo

Conceptos fundamentales

Versionado por URI

/v1/posts, la opción más visible y fácil de probar.

Versionado por Header

Un header personalizado o el parámetro Accept selecciona la versión.

Parámetro de consulta

?version=2, simple pero fácil de olvidar.

Cambios aditivos

Los nuevos campos opcionales y endpoints rara vez rompen los clientes.

Deprecación

El header Deprecation señala una eliminación próxima.

Sunset

El header Sunset indica la fecha en que una versión dejará de funcionar.

Una breve historia

De API congeladas a la evolución continua

  1. 2000s

    URLs versionadas

    Las API públicas adoptan las rutas estilo /v1 como norma.

    2000s
  2. 2012

    Negociación por Header

    Algunas API mueven el versionado a los headers para mantener las URLs estables.

    12
  3. 2017

    Headers de deprecación

    Los headers estándar para deprecación y sunset ganan tracción.

    17
  4. 2020s

    Evolución continua

    Los cambios aditivos y compatibles hacia atrás reducen la necesidad de subir la versión.

    2020s
  5. Hoy

    Política explícita

    Las API maduras documentan qué se considera un cambio disruptivo y cuánto tiempo viven las versiones.

    Hoy

La guia completa

Versionado de API: Todo lo que necesitas saber

Por qué es importante el versionado

Una API es una promesa. Una vez que los clientes dependen de ella, cambiarla descuidadamente rompe sus aplicaciones, y los clientes rotos resultan costosos para todos. El versionado es la forma de implementar mejoras mientras se ofrece a los clientes un contrato estable y un camino claro para migrar.

El objetivo no es evitar el cambio, sino hacer que sea predecible: saber qué cambios son seguros, exponer las versiones de manera consistente y retirar las antiguas siguiendo un calendario comunicado, en lugar de dar sorpresas.

Cambios disruptivos frente a cambios aditivos

La mayor parte de los problemas de versionado provienen de no clasificar los cambios. Empieza estableciendo una regla clara.

Generalmente seguros (aditivos):

  • Añadir un nuevo campo opcional a una respuesta.
  • Añadir un nuevo endpoint.
  • Añadir un nuevo parámetro de solicitud opcional.
  • Añadir un nuevo valor de enum, siempre que los clientes toleren valores desconocidos.

Disruptivos (requieren una versión):

  • Eliminar o renombrar un campo.
  • Cambiar el tipo o formato de un campo.
  • Convertir un parámetro opcional en obligatorio.
  • Cambiar el significado o el valor predeterminado de un comportamiento existente.
  • Cambiar los códigos de estado o la estructura de los errores de los que dependen los clientes.

Diseñar los clientes para que ignoren los campos desconocidos es la mejor manera de garantizar que los cambios aditivos sean seguros. Documenta esta regla para que nadie tenga que adivinar.

Estrategias de versionado

Existen cuatro formas comunes de permitir que los clientes seleccionen una versión.

Versionado por URI — la versión forma parte de la ruta.

GET /v1/posts
GET /v2/posts

Es visible, fácil de rutear, fácil de cachear y fácil de probar en un navegador. Es la opción más común para APIs públicas, aunque los puristas argumentan que la URL no debería cambiar.

Versionado por Header — un header personalizado selecciona la versión.

GET /posts
X-API-Version: 2

Las URLs se mantienen estables, lo cual es ideal para el cacheo por recurso, pero la versión es invisible en los logs, enlaces y pruebas de navegador.

Versionado por Media-type — la negociación de contenido selecciona la versión.

GET /posts
Accept: application/vnd.example.v2+json

Este es el enfoque más alineado con REST y se integra con la negociación de contenido, pero es el más difícil de descubrir y depurar.

Parámetro de consulta (Query parameter)?version=2. Simple, pero es fácil de omitir y complicado para el cacheo.

Cualquiera que sea la opción que elijas, aplícala de manera consistente y documéntala. Mezclar estrategias es peor que elegir una que no esté tan de moda.

Depreciación y sunset

Eliminar una versión debe ser un proceso, no un evento.

Deprecation: true
Sunset: Wed, 31 Dec 2026 23:59:59 GMT
Link: </v2/posts>; rel="successor-version"
  • Deprecation anuncia que una versión o endpoint va a desaparecer.
  • Sunset indica la fecha exacta en la que dejará de funcionar.
  • Link apunta al reemplazo.

Acompaña los headers con una guía de migración, entradas en el changelog y comunicación directa con los usuarios más activos. Luego, monitorea el uso: si una parte significativa del tráfico sigue utilizando la versión antigua cerca de la fecha de sunset, extiéndela en lugar de romper esos clientes.

Ejecutar versiones en paralelo

Soportar dos versiones significa que el código debe dar servicio a ambas. Algunos enfoques comunes son:

  • Handlers versionados que mapean a servicios compartidos, para que la lógica de negocio resida en un solo lugar.
  • Adapters que traducen la representación antigua a la nueva.
  • Feature flags para el despliegue gradual de nuevos comportamientos.
  • Especificaciones separadas por versión, generadas y publicadas junto con la API.

Mantén las diferencias entre versiones al mínimo. Los forks grandes de lógica son difíciles de mantener y es muy fácil que diverjan con el tiempo.

Comunicando los cambios

El versionado solo funciona si los clientes saben qué está ocurriendo.

  • Publica un changelog y marca claramente los cambios disruptivos (breaking changes).
  • Mantén una OpenAPI spec actualizada por cada versión.
  • Envía avisos de deprecación en los headers y, siempre que sea posible, por correo electrónico.
  • Proporciona una guía de migración con ejemplos de antes y después.
  • Ofrece una ventana de soporte que se ajuste a los ciclos de lanzamiento de tus usuarios.

Mejores prácticas

  • Clasifica cada cambio como aditivo o disruptivo (breaking change) antes de lanzarlo.
  • Prioriza los cambios aditivos; incrementa la versión solo cuando sea estrictamente necesario.
  • Elige una estrategia de versionado y aplícala en todo el proyecto.
  • Nunca elimines un campo o endpoint sin un periodo de depreciación.
  • Anuncia la depreciación mediante headers y una fecha de finalización (sunset date).
  • Monitorea el tráfico por versión antes de retirar una.
  • Mantén la lógica compartida detrás de adaptadores específicos para cada versión.

Errores comunes

  • Romper los clientes de forma silenciosa al cambiar la estructura de una respuesta.
  • Crear versiones para cada pequeño cambio, generando una carga de mantenimiento excesiva.
  • Mezclar diferentes estrategias de versionado dentro de la misma API.
  • Eliminar una versión sin previo aviso o sin ofrecer una ruta de migración.
  • Permitir que versiones antiguas sigan ejecutándose indefinidamente sin un plan definido.
  • Olvidar actualizar la documentación y las especificaciones de cada versión.

Próximos pasos

El versionado es lo que permite que una API sobreviva al contacto con clientes reales. Basa tu trabajo en un diseño REST limpio, describe cada versión con OpenAPI y utiliza HTTP headers para comunicar la obsolescencia. Después, redacta una política de una sola página para tu propia API: define qué se considera un cambio disruptivo (breaking change) y cuánto tiempo vivirán las versiones.

Realizar un cambio

Agregar un campo opcional suele ser seguro. Renombrar o eliminar un campo, o cambiar un tipo, rompe los clientes y requiere una nueva versión.

Aditivo
{
  "id": "42",
  "title": "Hello",
  "tags": []
}
// new optional field,
// existing clients unaffected
Disruptivo (Breaking)
{
  "id": "42",
  "headline": "Hello"
}
// "title" removed;
// every client breaks

Seleccionar una versión

El versionado por URI es explícito, cacheable y fácil de probar. El versionado por header mantiene las URLs estables pero es más difícil de visualizar y compartir.

URI
GET /v2/posts
Accept: application/json
Header
GET /posts
Accept: application/vnd.example.v2+json

Compromisos

¿Deberías versionar siquiera?

La versionización es una red de seguridad, no un objetivo. Diseña primero para la compatibilidad y recurre a una nueva versión solo cuando un cambio rompa de verdad a los clientes.

Strengths

  • Protege a los clientes existentes

    Una nueva versión te permite lanzar mejoras que rompen mientras los clientes antiguos siguen funcionando hasta que migren a su ritmo.

  • Obliga a una política clara

    Decidir qué cuenta como ruptura hace explícito el contrato y mantiene a los equipos honestos con la compatibilidad.

  • Permite una retirada deliberada

    Las cabeceras de deprecación y sunset convierten la retirada de una versión antigua en un plan comunicado y supervisado.

Trade-offs

  • Cada versión tiene un coste

    Cada versión soportada multiplica las pruebas, la documentación y el mantenimiento, así que las antiguas deben retirarse según un calendario.

  • Fragmenta el ecosistema

    Los clientes, la documentación y los SDK se reparten entre versiones, y las preguntas de soporte se vuelven más difíciles de responder.

  • A menudo evitable

    Los cambios aditivos y compatibles hacia atrás cubren la mayoría de las necesidades, así que versionar puede volverse una costumbre que supera las rupturas reales.

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender API Versioning?

Nuestro tutorial interactivo te guia a traves de API Versioning paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.