Introducción
Cuando creamos un proyecto Web API en .NET 9, seguro notamos que algo falta: Swagger UI desapareció del template y en su lugar Microsoft incluyó su propio paquete OpenAPI, que genera la especificación pero sin la interfaz gráfica a la que estábamos acostumbrados; en este artículo vamos a revisar por qué hicieron este cambio, cómo podemos volver a usar Swagger y qué alternativa podemos aprovechar para documentar nuestras APIs.
¿Qué es OpenAPI?
Antes de abordar el tema de .NET 9 y Swagger, es importante que entendamos qué es OpenAPI y por qué es relevante en este contexto.
OpenAPI es un estándar abierto para documentar APIs REST. En pocas palabras: es un formato (generalmente un JSON o YAML) que nos permite explicar de manera clara y estructurada cómo funciona nuestra API.
Por ejemplo, nos permite documentar:
- Qué endpoints tenemos (/users, /products, etc.)
- Qué parámetros esperan nuestros endpoints
- Qué respuestas devuelven (200, 404, 500…)
- Qué modelos de datos utilizamos
A partir de este formato estándar, diversas herramientas como Swagger UI pueden leer el archivo OpenAPI y generar una interfaz gráfica interactiva que permite a los desarrolladores probar y entender nuestra API de manera sencilla.
Las razones detrás de este cambio
El principal motivo fue que el proyecto Swashbuckle no cuenta con un mantenimiento tan activo y, además, no ha lanzado una versión oficial para .NET 8. Esto obligaba a Microsoft a depender de librerías externas que no siempre se actualizan al ritmo de los nuevos lanzamientos de .NET.
Por esta razón, decidieron crear Microsoft.AspNetCore.OpenApi, un paquete oficial que genera documentos OpenAPI sin depender de herramientas de terceros. De esta manera, Microsoft puede asegurar lanzamientos más rápidos y confiables que estén alineados con cada nueva versión del framework.
IMPORTANTNo es que Swagger “haya muerto”, simplemente Microsoft dejó de incluirlo por defecto en las plantillas de proyecto.
En el siguiente enlace se puede ver la discusión oficial en GitHub sobre este cambio: GitHub Discussion
Cómo volver a usar Swagger UI en .NET 9
Swagger UI sigue siendo una de las herramientas más populares y útiles para documentar APIs, y muchos desarrolladores estamos familiarizados con su interfaz intuitiva y funcionalidades. La buena noticia es que podemos seguir utilizándola en .NET 9 sin mayor complicación. Para ello debemos de seguir los siguientes pasos:
- Instalamos el paquete NuGet:
dotnet add package Swashbuckle.AspNetCoredotnet add package Swashbuckle.AspNetCore.Annotations- Configuramos Swagger en
Program.cs:
var builder = WebApplication.CreateBuilder(args);
// other services...
// add Swagger servicebuilder.Services.AddSwaggerGen(options =>{ options.SwaggerDoc("v1", new OpenApiInfo() { Version = "v1", Title = "Example API Reference", Description = "Example API documentation for my Web API", }); options.EnableAnnotations();});
var app = builder.Build();
if (app.Environment.IsDevelopment()){ // enable Swagger middlewares app.UseSwagger(); app.UseSwaggerUI();}
// other middlewares...
app.Run();- Usamos los atributos de
Swashbuckle.AspNetCore.Annotationspara documentar nuestros endpoints:
[HttpGet("{id}")][SwaggerOperation( Summary = "Get item by ID", Description = "Retrieves an item by its unique identifier")]public ActionResult<ItemResponse> GetItem([SwaggerParameter("Item ID")] int id){ // implementation...}- Actualizamos
launchSettings.jsonpara abrir Swagger UI automáticamente al iniciar la aplicación (opcional):
{ "$schema": "https://json.schemastore.org/launchsettings.json", "profiles": { "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:5102", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "https": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "https://localhost:7175;http://localhost:5102", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } }}- Ejecutamos la aplicación y esta navegará automáticamente hacia
https://localhost:<puerto>/swaggerpara ver la interfaz de Swagger UI

Usando Scalar, una gran alternativa a Swagger UI
Si buscamos algo diferente, una alternativa interesante es Scalar, una herramienta de documentación de APIs que en este caso se complementa muy bien con el nuevo paquete Microsoft.AspNetCore.OpenApi y ofrece una interfaz moderna y amigable. Veamos cómo integrarlo en nuestro proyecto:
- Instalamos el paquete NuGet:
dotnet add package Scalar.AspNetCore- Configuramos Scalar en
Program.cs:
var builder = WebApplication.CreateBuilder(args);
// other services...
// use Microsoft OpenApi servicebuilder.Services.AddOpenApi();
var app = builder.Build();
if (app.Environment.IsDevelopment()){ // use OpenAPI endpoint app.MapOpenApi(); // enable Scalar middleware app.MapScalarApiReference(options => { options.Title = "Example API Reference"; options.Theme = ScalarTheme.BluePlanet; });}
// other middlewares...
app.Run();- Usamos metadatos de OpenAPI para documentar nuestros endpoints:
[HttpGet("{id}")][EndpointSummary("Get item by ID")][EndpointDescription("Retrieves an item by its unique identifier")]public ActionResult<ItemResponse> GetItem([Description("Item ID")] int id){ // implementation...}NOTEPodemos ver todos los atributos disponibles en la documentación oficial de ASP.NET Core.
- Actualizamos
launchSettings.jsonpara abrir Scalar automáticamente al iniciar la aplicación (opcional):
{ "$schema": "https://json.schemastore.org/launchsettings.json", "profiles": { "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "scalar", "applicationUrl": "http://localhost:5102", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "https": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "scalar", "applicationUrl": "https://localhost:7175;http://localhost:5102", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } }}- Ejecutamos la aplicación y esta navegará automáticamente hacia
https://localhost:<puerto>/scalarpara ver la interfaz de Scalar

Conclusión
Aunque Swagger UI ya no viene por defecto en los proyectos Web API con .NET 9, aún podemos usarlo fácilmente instalando el paquete Swashbuckle. Alternativamente, podemos explorar nuevas herramientas como Scalar que ofrecen interfaces modernas para documentar nuestras APIs. Lo importante es entender que OpenAPI sigue siendo el estándar para describir nuestras APIs y hay varias opciones para generar documentación interactiva a partir de él.