Skip to content

Setup

9.1.1. [AutoGenerateEndpoints] — Class-Level Attribute

Applied to any plain class (no base class required). Controls route prefix, tags, auth, strategy, caching, and rate limiting for all methods in the class.

Property Type Default Description
RoutePrefix string? class name Route prefix, e.g. "/api/users"
Tags string[]? class name OpenAPI tags
IncludeClassNameInRoute bool true Include class name in auto-generated route
RequiresAuth bool false Require authentication for all methods
Policies string[]? Authorization policy names
Roles string[]? Allowed roles
Strategy EndpointMappingStrategy Convention Which methods to map
CacheSeconds int 0 GET response cache duration (class default)
RateLimitPolicy string? Rate limiting policy name (class default)
[AutoGenerateEndpoints(
    RoutePrefix = "/api/products",
    Tags = new[] { "Products", "Catalog" },
    RequiresAuth = true,
    Policies = new[] { "AdminOnly" },
    Strategy = EndpointMappingStrategy.Convention,
    CacheSeconds = 60,
    RateLimitPolicy = "standard")]
public class ProductController { /* ... */ }

9.1.2. [AutoMapEndpoint] — Method-Level Override

Override or supplement class-level settings per method. Enables explicit routes, custom HTTP methods, method-level auth, and per-method caching/rate limiting. Required when Strategy = Explicit.

Property Type Default Description
route string (required) Explicit route template
HttpMethod string "GET" HTTP method: "GET", "POST", "PUT", "DELETE", "PATCH"
Name string? auto Endpoint name for URL generation
Tags string[]? class tags Override OpenAPI tags
Summary string? from method name Override .WithSummary()
RequiresAuth bool class default Require auth for this method
Policies string[]? class default Authorization policies
Roles string[]? class default Allowed roles
AllowAnonymous bool false Override class RequiresAuth = true
CacheSeconds int 0 GET cache duration (-1 to disable)
RateLimitPolicy string? class default Rate limit policy ("none" to disable)
[AutoGenerateEndpoints(RoutePrefix = "/api/orders", RequiresAuth = true)]
public class OrderController
{
    // Convention-mapped (GET /api/orders/{id})
    public Task<Result<Order>> GetOrder(int id) => ...;

    // Explicit override — custom route + HTTP method
    [AutoMapEndpoint("/api/orders/{id}/cancel", HttpMethod = "POST",
        Summary = "Cancel an order", CacheSeconds = -1)]
    public Task<Result<Order>> CancelOrder(int id) => ...;

    // Per-method anonymous access override
    [AutoMapEndpoint("/api/orders/public", AllowAnonymous = true)]
    public Task<Result<List<OrderSummary>>> GetPublicOrders() => ...;
}

9.1.3. HTTP Verb Convention

When Strategy = Convention (default), method names determine HTTP verb and route:

Method prefix HTTP verb Route (no id param) Route (with id param)
Get* GET {prefix} {prefix}/{id}
Create* / Add* POST {prefix} {prefix}
Update* PUT {prefix} {prefix}/{id}
Delete* DELETE {prefix} {prefix}/{id}
public Task<Result<List<Product>>> GetProducts()          // GET /api/products
public Task<Result<Product>> GetProduct(int id)           // GET /api/products/{id}
public Task<Result<Product>> CreateProduct(ProductRequest r) // POST /api/products
public Task<Result<Product>> UpdateProduct(int id, ...)   // PUT /api/products/{id}
public Task<Result> DeleteProduct(int id)                 // DELETE /api/products/{id}

9.1.4. Mapping Strategy

EndpointMappingStrategy controls which methods the generator maps:

Value Behaviour
Convention Map methods matching naming conventions (Get*, Create*, Add*, Update*, Delete*)
Explicit Map only methods decorated with [AutoMapEndpoint]
All Map all public methods returning Result<T> or OneOf<...>
// Convention (default) — naming convention drives mapping
[AutoGenerateEndpoints(RoutePrefix = "/api/users", Strategy = EndpointMappingStrategy.Convention)]

// Explicit — only [AutoMapEndpoint]-decorated methods are mapped
[AutoGenerateEndpoints(RoutePrefix = "/api/admin", Strategy = EndpointMappingStrategy.Explicit)]

// All — every public Result<T>/OneOf<...> method is mapped
[AutoGenerateEndpoints(RoutePrefix = "/api/internal", Strategy = EndpointMappingStrategy.All)]