Skip to content

OpenAPI Code Generator

A fast, opinionated C# code generator that transforms OpenAPI 3.x specifications into modern C# records, enums, and type aliases.

Modern C# Output

Generates record types with init-only properties, nullable reference types, and System.Text.Json attributes.

Install in Seconds

Install as a .NET global tool with a single command. No configuration files needed — just point it at your spec and go.

JSON & YAML Support

Works with both JSON and YAML OpenAPI 3.x specifications, whether they’re local files or remote URLs.

Fully Configurable

Control namespaces, enum styles, collection types, doc comments, and more through CLI flags or the programmatic API.

Terminal window
# Install the tool
dotnet tool install --global Nikcio.OpenApiCodeGen
# Generate C# models from your OpenAPI spec
openapi-codegen petstore.yaml -o Models.cs -n MyApp.Models

Your OpenAPI schemas become clean, strongly-typed C# records:

// <auto-generated>
// This file was auto-generated by OpenApiCodeGenerator.
// Do not make direct changes to the file.
// </auto-generated>
#nullable enable
using System.Text.Json.Serialization;
namespace Generated.Petstore;
/// <summary>
/// Order Status
/// </summary>
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum OrderStatus
{
[JsonStringEnumMemberName("placed")]
Placed,
[JsonStringEnumMemberName("approved")]
Approved,
[JsonStringEnumMemberName("delivered")]
Delivered
}
/// <summary>
/// pet status in the store
/// </summary>
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum PetStatus
{
[JsonStringEnumMemberName("available")]
Available,
[JsonStringEnumMemberName("pending")]
Pending,
[JsonStringEnumMemberName("sold")]
Sold
}
public record Order
{
[JsonPropertyName("id")]
public long? Id { get; init; }
[JsonPropertyName("petId")]
public long? PetId { get; init; }
[JsonPropertyName("quantity")]
public int? Quantity { get; init; }
[JsonPropertyName("shipDate")]
public DateTimeOffset? ShipDate { get; init; }
/// <summary>
/// Order Status
/// </summary>
[JsonPropertyName("status")]
public OrderStatus? Status { get; init; }
[JsonPropertyName("complete")]
public bool? Complete { get; init; }
}
public record Category
{
[JsonPropertyName("id")]
public long? Id { get; init; }
[JsonPropertyName("name")]
public string? Name { get; init; }
}
public record User
{
[JsonPropertyName("id")]
public long? Id { get; init; }
[JsonPropertyName("username")]
public string? Username { get; init; }
[JsonPropertyName("firstName")]
public string? FirstName { get; init; }
[JsonPropertyName("lastName")]
public string? LastName { get; init; }
[JsonPropertyName("email")]
public string? Email { get; init; }
[JsonPropertyName("password")]
public string? Password { get; init; }
[JsonPropertyName("phone")]
public string? Phone { get; init; }
/// <summary>
/// User Status
/// </summary>
[JsonPropertyName("userStatus")]
public int? UserStatus { get; init; }
}
public record Tag
{
[JsonPropertyName("id")]
public long? Id { get; init; }
[JsonPropertyName("name")]
public string? Name { get; init; }
}
public record Pet
{
[JsonPropertyName("id")]
public long? Id { get; init; }
[JsonPropertyName("name")]
public required string Name { get; init; }
[JsonPropertyName("category")]
public Category? Category { get; init; }
[JsonPropertyName("photoUrls")]
public required IReadOnlyList<string> PhotoUrls { get; init; }
[JsonPropertyName("tags")]
public IReadOnlyList<Tag>? Tags { get; init; }
/// <summary>
/// pet status in the store
/// </summary>
[JsonPropertyName("status")]
public PetStatus? Status { get; init; }
}
public record ApiResponse
{
[JsonPropertyName("code")]
public int? Code { get; init; }
[JsonPropertyName("type")]
public string? Type { get; init; }
[JsonPropertyName("message")]
public string? Message { get; init; }
}