OpenAPI: lint, formateo y estructura de una API mantenible

OpenAPI: lint, formateo y estructura de una API mantenible

operationId, tags, responses de error: las reglas que evitan deuda cuando linteas y formateas specs OpenAPI.

09.08.2026
8 min de lectura
Compartir este artículo:
openapi
lint
format
api-design
REST
Tutorial

¿Por qué lintear y formatear una spec OpenAPI antes de hacer merge?

Una spec puede pasar la validación de esquema y aun así salir sin operationId, sin tags o con solo una respuesta default — y esa deuda técnica aparece semanas después, cuando los generadores SDK, portales API o tests de contrato fallan en silencio. El formateo solo no cubre esas lagunas; el lint detecta reglas de estilo y de completitud que los validadores ignoran. El linter OpenAPI en línea de FastMinify aplica un subconjunto Spectral fijo sobre las operaciones de paths, entero en el navegador. Combínalo con el formateador OpenAPI para diffs de PR legibles y con el validador OpenAPI para la conformidad de esquema. Empieza por nuestra guía de validación OpenAPI si te bloquean errores estructurales, y luego explora el hub de herramientas API.

Detección de operationId, tags y respuestas 2xx faltantes antes de generar SDK o portal
Subconjunto Spectral: info-contact, paths-kebab-case, operation-description, y más
Formato JSON o YAML para diffs de PR estables — ordenación recursiva de claves opcional
100 % local — las specs no salen del navegador (ideal para contratos internos)
Cadena recomendada: validar → formatear → lintear → commit

Límites honestos y diseño de API mantenible

Lo que lint-openapi no hace

Un estado lint passed significa ninguna issue en el subconjunto v1 — no que tu API esté lista para producción ni documentada por completo.

Sin test de seguridad (flujos auth, enforcement de scopes)
Sin test de contrato runtime sobre endpoints live
Sin bundle multi-archivo automático — un pegado autónomo por ejecución
Sin soporte Swagger 2.0 — solo OpenAPI 3.x
Los warnings no bloquean un estado «passed with warnings» — trátalos como bloqueadores de merge si tu política lo exige
operationId, tags y respuestas de error

Estos campos evitan una deuda de spec que los validadores no ven pero que generadores y portales exigen.

operationId: estable, único, camelCase — evita renombrados sin un plan de deprecación
tags: agrupación por dominio o bounded context — alineado con las secciones del portal dev
Respuestas 2xx: el lint exige la presencia — añade 400/401/404/500 explícitos con esquemas donde los clientes los necesiten
info.description e info.contact: el lint avisa si faltan — rellena para APIs externas
Nombres de paths: prefiere /pet-orders a /petOrders — regla kebab-case alineada con REST
Cuándo pasar al tooling de CI

Las herramientas del navegador aceleran el feedback; los pipelines imponen la política de la organización.

Rulesets Spectral personalizados (nombres, cabeceras de seguridad, paginación)
Detección de breaking changes entre versiones de spec
Bundle multi-archivo con resolución de $ref externas
Validación de import específica de gateway (AWS API Gateway, plugins Kong)
Documenta la versión OpenAPI objetivo (3.0 vs 3.1 JSON Schema draft) en el README del repo

Design-first: validar, formatear y después lintear

Tres herramientas, tres intenciones

No intercambies los pasos en la revisión — cada herramienta responde a una pregunta distinta sobre tu archivo OpenAPI.

Validate (validate-openapi): conformidad de esquema OpenAPI 3.x vía Scalar — veredicto válido/inválido
Format (format-openapi): indentación y legibilidad — no corrige desviaciones semánticas ni de estilo
Lint (lint-openapi): reglas Spectral sobre las operaciones de paths — warnings y errores distintos de la validación de esquema
Orden recomendado: validar → formatear → lintear antes del merge
La sintaxis JSON sola no basta — ver la guía de validación para esquema vs lint
Reglas de lint en v1 (subconjunto Spectral)

El lint de FastMinify no es Spectral completo — entrega un conjunto fijo de reglas centrado en operaciones de paths mantenibles (ADR-OAS-009).

not-openapi (error): la raíz debe ser OpenAPI 3.x con un objeto info — puerta de entrada antes del resto de reglas
info-contact (warning): info.contact debería estar presente
info-description (warning): info.description no vacío
paths-kebab-case (warning): segmentos de path en kebab-case o vN
operation-operationId (warning): cada operación tiene un operationId no vacío
operation-tags (warning): al menos un tag por operación
operation-description (warning): summary o description requeridos
operation-success-response (error): al menos una respuesta 2xx — default solo no basta
path-item-ref (warning): $ref de path item no expandida en lint v1
Lo que el lint no cubre (v1)

Alcance honesto — no asumas paridad con Spectral, Redocly o los motores de política de gateway.

Solo operaciones de paths — webhooks y callbacks fuera de alcance v1
Sin upload de ruleset personalizado — subconjunto fijo, no un runner Spectral
El lint no sustituye la validación de esquema — usa validate-openapi para Scalar
Sin fetch de URL $ref externas — pega una spec autónoma
Límite de entrada 512 KiB — las specs muy voluminosas corresponden a la CI
Formatear para la revisión, no para la semántica

El formateador hace pretty-print en JSON o YAML (indentación 2 o 4 espacios) y puede ordenar las claves de forma recursiva para diffs estables.

JSON in → JSON out; YAML in → YAML out — se conserva el tipo de entrada
Los comentarios YAML desaparecen al formatear — guarda una copia antes de reformatear una spec anotada
openapi: 3.0 numérico en YAML se normaliza a cadena 3.0.0
Ordenar claves es útil en PR — no es un reordenamiento OpenAPI-aware de las secciones
OpenAPI inválido puede formatearse igual si el parse funciona — vuelve a validar después de edits fuertes

Lintear y formatear OpenAPI: flujo paso a paso

Usar el linter OpenAPI

El linter OpenAPI parsea JSON o YAML (máx. 512 KiB), comprueba la puerta not-openapi y luego ejecuta las reglas sobre las operaciones. Estado: passed, passed with warnings o failed — nunca un verde simple cuando hay warnings.

Lint con debounce en directo en el editor Monaco
Lista de issues con código de regla, nivel y ruta JSON Pointer
Panel de resultados: contadores error/warning y stats de paths/operaciones
Errores de parse con número de línea cuando se conoce
Los documentos Swagger 2.0 fallan en not-openapi — migra a OpenAPI 3 primero
Usar el formateador OpenAPI

El formateador OpenAPI hace pretty-print para una revisión humana. Auto-format al pegar; botón Format (⌘↵) tras una edición manual.

Indentación 2 o 4 espacios — convención de equipo
Ordenación recursiva de claves opcional para diffs git estables
Panel de salida resaltado con Shiki
Encadenar format → validate → lint para un paso completo pre-merge
Combinar con el <a href="/es/json-validator" class="text-primary hover:underline">validador JSON</a> si la sintaxis bruta es dudosa
Escenario — Generación SDK bloqueada por operationId faltante

Tu pipeline mobile genera un cliente desde la spec — los warnings ignorados se convierten en fallos aguas abajo.

1

Paso 1: Validar la conformidad de esquema

Pega en validate-openapi. Corrige primero los errores Scalar — el lint no ayuda sobre una spec estructuralmente inválida.

2

Paso 2: Lintear las operaciones de paths

Abre lint-openapi. Resuelve los warnings operation-operationId y operation-tags en cada endpoint público.

3

Paso 3: Formatear y abrir la PR

Pasa la spec corregida por format-openapi con ordenación de claves si el equipo la usa. Vuelve a lintear antes del commit.

Escenario — Diff YAML ilegible en revisión de contrato

Un diseñador exporta YAML minificado — los revisores no ven los renombrados accidentales de paths.

1

Paso 1: Formatear para la legibilidad

Pega en format-openapi, indentación 2 espacios, ordenación de claves si el equipo está de acuerdo.

2

Paso 2: Validar y luego lintear

Valida con Scalar y después lintea para paths-kebab-case y operation-success-response en los endpoints nuevos.

3

Paso 3: Documentar las respuestas de error

El lint exige la presencia 2xx — añade a mano 4xx/5xx con descriptions para contratos de producción (fuera de los errores lint v1).

Flujo de revisión PR: del design-first al merge

Checklist pre-merge recomendada

Trata el trío del navegador como puerta rápida antes de git push — la CI sigue siendo la fuente de verdad del equipo, pero detectar en local ahorra minutos de pipeline. Orden: (1) validate-openapi — corregir los errores Scalar; (2) format-openapi — diff legible; (3) lint-openapi — resolver los errores y después los warnings según la política del equipo; (4) commit.

Puntos de atención del revisor

Más allá del validate en verde, pregunta: ¿los operationId son únicos y estables para el codegen? ¿Los tags coinciden con la navegación del portal API? ¿Cada operación documenta al menos una respuesta de éxito — y las formas de error habituales para los equipos cliente?

Completar con la CI y las herramientas vecinas

En CI, los equipos suelen ejecutar Spectral, openapi-cli o Redocly con rulesets más estrictos que FastMinify v1. Combina el lint del navegador con nuestra guía CI/CD. Para pivotes de esquema: json-schema-to-openapi y openapi-to-json-schema en el hub. Para validar payloads contra un esquema una vez el contrato está sano: consulta nuestra guía de validación JSON Schema.

Conclusión

Las specs OpenAPI mantenibles exigen más que la validación de esquema: el lint captura las lagunas de operationId, tags y responses que bloquean los generadores, y el formateo mantiene las PR revisables. Valida primero, formatea para humanos, lintea para el estilo — todo en local antes de la CI. Explora el hub API para la conversión JSON Schema y la validación SDL GraphQL cuando tu trabajo de contrato vaya más allá de REST.

Encadena validar → formatear → lintear antes de cada PR de spec
Trata los warnings de lint como bloqueadores de merge si está en juego la generación SDK
Activa la ordenación de claves solo si todo el equipo está de acuerdo — cambia la semántica de los diffs
Relee la guía de validación cuando aparezcan errores Scalar antes de depurar el lint
Pasa a Spectral/Redocly en CI para reglas de organización más allá del subconjunto v1
Compartir este artículo
Compartir este artículo: