Guías

Versionado y obsolescencia

Dentro de v1 Filmo solo añade cosas. Cualquier cosa que pueda romper tu integración se anuncia antes, ya sea como una nueva versión mayor o como una obsolescencia con al menos seis meses antes de la retirada.

La versión del contrato sigue semver y aparece en info.version en el archivo OpenAPI. GET /api/v1/account también la devuelve. Usa esa versión para identificar el contrato de tu integración. Consulta también la Referencia de OpenAPI.

CambioDentro de v1Cómo te llega
Una operación nueva; un campo de petición, filtro o parámetro opcional nuevoAditivo: permitidoSe publica en cualquier versión sin aviso previo. Se registra en el changelog con la versión en la que llegó.
Una propiedad nueva en una respuesta; un valor nuevo en una unión de respuesta (un estado, un tipo)Aditivo: permitidoIgual que arriba.
Una validación más laxaAditivo: permitidoIgual que arriba.
Eliminar o renombrar una operación, un campo o un parámetro; cambiar un tipo; hacer anulable una propiedad de la respuestaIncompatibleSolo con una nueva versión mayor, o mediante una obsolescencia con aviso previo.
Endurecer una validación; cambiar el scope que requiere una operaciónIncompatibleIgual que arriba.
Eliminar un campoNunca dentro de una versión mayorUn campo que deja de tener sentido se marca como obsoleto en su esquema y se registra en el changelog. Solo se elimina en la siguiente versión mayor.

Los campos con datos sensibles para el negocio (costes, márgenes, códigos de acceso, documentos fiscales internos, nóminas del personal y datos personales) quedan excluidos por diseño del borde público. Hoy no forman parte de la v1, así que no planifiques una integración en torno a ellos.

Un cambio incompatible se hace exactamente de una de estas dos formas.

  • En una nueva versión mayor, /api/v2. Filmo mantiene v1 en funcionamiento durante al menos doce meses después de anunciar v2.
  • Mediante deprecación con aviso. La operación se marca como deprecated en el archivo OpenAPI, con un objeto x-deprecation que lleva since (la versión que la anunció), on (el día en que entra en vigor), sunset (el día en que desaparece), replacement (opcional) y una note. Los días son YYYY-MM-DD.

Una operación obsoleta te lo indica en tres sitios.

  • Toda respuesta, incluidas las de error, lleva la cabecera Deprecation (RFC 9745, una marca de tiempo Unix con el prefijo @) y la cabecera Sunset (RFC 8594, una fecha HTTP).
  • Las mismas respuestas llevan una cabecera Link con dos relaciones: rel="deprecation" y rel="sunset", ambas apuntan a la documentación.
  • Todo cuerpo JSON correcto lleva una entrada meta.warnings[] con code puesto en deprecated, un message, el día sunset, el replacement (o null cuando no hay ninguno) y un link a la documentación.

El día de sunset es al menos 180 días (seis meses) después del día en que la deprecación entra en vigor. La operación sigue funcionando hasta entonces y desaparece el día de sunset: después responde 404 not_found, antes incluso de autenticar la petición, así que un cliente que ignoró los avisos ve una operación inexistente en lugar de un error de autorización.

// Call this for every response you receive, with the parsed JSON body (or null).
export function noteDeprecation(method, path, res, body) {
  const deprecation = res.headers.get("Deprecation");
  const sunset = res.headers.get("Sunset");
  const warned = (body?.meta?.warnings ?? []).some((w) => w.code === "deprecated");
  if (deprecation || sunset || warned) {
    console.warn("Deprecated:", method, path, { deprecation, sunset });
  }
}

Cada versión queda registrada en la pestaña Changelog de estos documentos, en el formato Keep a Changelog: un encabezado con la versión y la fecha ([x.y.z] - YYYY-MM-DD) y, debajo, solo las secciones que tienen contenido entre Added, Changed, Deprecated, Removed y Fixed. Una línea de deprecación nombra la operación, el día en que quedó obsoleta, su día de retirada y el sustituto. Nada se elimina antes de su retirada. Suscríbete al feed y léelo antes de cada actualización de un cliente generado.

Los cambios aditivos se publican sin aviso, así que tu integración debe tolerarlos.

  • Ignora las propiedades de respuesta que no uses. No valides las respuestas con un esquema cerrado que rechace propiedades desconocidas.
  • Gestiona los valores que no conozcas en una unión: un estado, un tipo. Hoy los estados son listas cerradas, y un valor nuevo es un cambio aditivo documentado. Da a cada switch una rama por defecto.
  • Ten cuidado con los clientes generados con enums cerrados. Un valor nuevo puede hacer que lancen un error al procesar una respuesta.
  • No controles la lógica con detail ni con errors[].message. Son para personas y cambian con el idioma. Ramifica según code.
  • Configura alertas para las cabeceras Deprecation y Sunset y para meta.warnings[], de modo que una obsolescencia llegue a una persona al menos 180 días antes de la retirada.

Las mismas comprobaciones están en la lista de comprobación de salida a producción.

  • Guías

    Archivo OpenAPI y clientes generados

    Filmo publica toda su API como un archivo OpenAPI 3.1. Úsalo para generar un cliente tipado, para importar la API en Postman, Insomnia o Bruno, o para ejecutar un servidor mock en tu máquina.

  • Guías

    Lista de comprobación de salida a producción

    Repasa estas ocho comprobaciones antes de que tu integración funcione con datos de producción. Cada una remite a la guía que la explica.

  • Guías

    Respuestas

    Las respuestas correctas envuelven su contenido en data; las listas añaden pagination; algunas operaciones añaden meta; los errores son problemas RFC 9457. Las respuestas de la API comparten un mismo conjunto de cabeceras.