python --version
pip install fastapi uvicorn
Build a versioned API with /v1 and /v2 routers, backward-compatible deprecation headers, and version negotiation middleware.
1 from fastapi import FastAPI, APIRouter, Request 2 from pydantic import BaseModel 3 4 app = FastAPI(title="Versioned API") 5 6 # V1 schema (older) 7 class UserV1(BaseModel): 8 id: int 9 name: str 10 11 # V2 schema (expanded) 12 class UserV2(BaseModel): 13 id: int 14 full_name: str 15 email: str 16 created_at: str 17 18 v1_router = APIRouter(prefix="/v1", tags=["v1"]) 19 v2_router = APIRouter(prefix="/v2", tags=["v2"]) 20 21 @v1_router.get("/users/{user_id}", response_model=UserV1) 22 async def get_user_v1(user_id: int): 23 return UserV1(id=user_id, name="John Doe") 24 25 @v2_router.get("/users/{user_id}", response_model=UserV2) 26 async def get_user_v2(user_id: int): 27 return UserV2( 28 id=user_id, 29 full_name="John Doe", 30 email="john@example.com", 31 created_at="2024-01-01T00:00:00Z", 32 ) 33 34 app.include_router(v1_router) 35 app.include_router(v2_router) 36 37 @app.middleware("http") 38 async def add_deprecation_headers(request: Request, call_next): 39 response = await call_next(request) 40 if request.url.path.startswith("/v1/"): 41 response.headers["Deprecation"] = "true" 42 response.headers["Sunset"] = "Sat, 01 Jan 2026 00:00:00 GMT" 43 response.headers["Link"] = '</v2/users>; rel="successor-version"' 44 return response 45 46 @app.get("/api/versions") 47 async def list_versions(): 48 return { 49 "versions": [ 50 {"version": "v1", "status": "deprecated", "sunset": "2026-01-01"}, 51 {"version": "v2", "status": "current", "sunset": None}, 52 ] 53 } 54
Sign in to share your feedback and join the discussion.