Modern C# Output
Generates record types with init-only properties, nullable reference types, and System.Text.Json attributes.
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.
# Install the tooldotnet tool install --global Nikcio.OpenApiCodeGen
# Generate C# models from your OpenAPI specopenapi-codegen petstore.yaml -o Models.cs -n MyApp.ModelsYour 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; }
}