fastapi-router-variants
Declare a route once and get path variants, API versioning and per-version OpenAPI documentation for FastAPI — for free.
fastapi-router-variants wraps APIRouter with a RouterWrapper that expands a
single route declaration into every variant it should serve — multiple paths,
multiple version prefixes (/v1/..., /v2/...), multiple mount prefixes, with
deprecation handled automatically — then builds a separate OpenAPI schema per
version and mounts Swagger UI / ReDoc / openapi.json for each of them.
Install
pip install fastapi-router-variants
# or
uv add fastapi-router-variants
Usage
from fastapi import FastAPI
from fastapi_router_variants import RouterDefaults, RouterWrapper
class ApiDefaults(RouterDefaults):
prefix = "/api" # mount every route under /api
version = True # force versioning on every route
version_range = (1, 3) # generate v1, v2, v3
version_default = 3 # the version served on unversioned doc URLs
RouterWrapper.defaults = ApiDefaults()
router = RouterWrapper()
@router.get("/users/{user_id}")
def get_user(user_id: int) -> dict[str, int]:
return {"id": user_id}
app = FastAPI()
app.include_router(router.base)
The single get declaration above registers GET /api/v1/users/{user_id},
GET /api/v2/users/{user_id} and GET /api/v3/users/{user_id}.
Path variants and flavors, versioning helpers, routing specs, per-version OpenAPI documents, custom categories and HTTP-error auto-documentation are all covered in the documentation.
Documentation
Full documentation is available at
toilal.github.io/fastapi-router-variants.
A preview of the in-progress develop branch is published at
toilal.github.io/fastapi-router-variants/dev.
Requirements
- Python ≥ 3.12
- FastAPI ≥ 0.115
License
MIT © Rémi Alvergnat
CHANGELOG
v0.2.2 (2026-07-25)
Bug Fixes
-
openapi: Clarify WebSocket route rebinding (
26360ed) -
openapi: Document preserved dependency overrides (
ce4e7f5) -
openapi: Isolate flattened routes between apps (
62b7161) -
openapi: Preserve overrides when flattening routers (
13b8175) -
openapi: Remove project-specific changelog entry (
36d8fc8) -
openapi: Remove project-specific implementation notes (
e2150fc)
v0.2.1 (2026-07-20)
Bug Fixes
v0.2.0 (2026-07-05)
Features
v0.1.0 (2026-07-05)
- Initial Release
Changelog entries are generated automatically by python-semantic-release from Conventional Commits on release.
Release files for fastapi-router-variants 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fastapi_router_variants-0.2.2.tar.gz | 155.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastapi_router_variants-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 181.3 kB
Release files / fastapi_router_variants-0.2.2.tar.gz
| Download URL | fastapi_router_variants-0.2.2.tar.gz |
|---|---|
| Size | 155.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c77f372ed3f31bdaec68c5f141fa40ece15641adacf5a8bd333c1bffd11c05a
|
|
BLAKE2b-256 checksum How to use checksums |
580589453b61878c682e19c9d4250976717cc10d2a594f9ffe5b39dab7ecbd16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fastapi_router_variants-0.2.2-py3-none-any.whl
| Download URL | fastapi_router_variants-0.2.2-py3-none-any.whl |
|---|---|
| Size | 25.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f5c06095fb4d91b57d52614c7cb9e9a5547b012ed372e136c59680e6d17bfba9
|
|
BLAKE2b-256 checksum How to use checksums |
a47060a1f7d13a14b0b936d39f595500b0f52479a643b401b959682a2e3ec9ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|