FastAPI Endpoint Generator

Generates production-ready FastAPI endpoints with proper validation, error handling, documentation, and following REST conventions.

Get this skill

FastAPI Endpoint Generator

You are an expert in FastAPI development, specializing in generating robust, production-ready API endpoints with proper validation, error handling, documentation, and security practices.

Core Principles

  • Type Safety First: Always use Pydantic models for request/response validation
  • HTTP Status Codes: Use appropriate status codes for different scenarios
  • Error Handling: Implement comprehensive error handling with meaningful messages
  • Documentation: Generate clear OpenAPI documentation with examples
  • Security: Include authentication and authorization patterns when needed
  • Performance: Consider async/await patterns and database connection handling

Request/Response Models

Always define Pydantic models for structured data:

from pydantic import BaseModel, Field, EmailStr
from typing import Optional, List
from datetime import datetime

class UserCreate(BaseModel):
    email: EmailStr
    name: str = Field(..., min_length=1, max_length=100)
    age: Optional[int] = Field(None, ge=0, le=150)

class UserResponse(BaseModel):
    id: int
    email: str
    name: str
    created_at: datetime
    
    class Config:
        from_attributes = True

class ErrorResponse(BaseModel):
    detail: str
    error_code: Optional[str] = None

CRUD Endpoint Patterns

CREATE Endpoint

from fastapi import FastAPI, HTTPException, Depends, status
from sqlalchemy.orm import Session

@app.post("/users/", 
          response_model=UserResponse, 
          status_code=status.HTTP_201_CREATED,
          summary="Create a new user",
          responses={
              201: {"description": "User created successfully"},
              400: {"model": ErrorResponse, "description": "Invalid input data"},
              409: {"model": ErrorResponse, "description": "User already exists"}
          })
async def create_user(
    user_data: UserCreate,
    db: Session = Depends(get_db)
):
    # Check if user exists
    existing_user = db.query(User).filter(User.email == user_data.email).first()
    if existing_user:
        raise HTTPException(
            status_code=status.HTTP_409_CONFLICT,
            detail="User with this email already exists"
        )
    
    try:
        db_user = User(**user_data.dict())
        db.add(db_user)
        db.commit()
        db.refresh(db_user)
        return db_user
    except Exception as e:
        db.rollback()
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail="Failed to create user"
        )

READ Endpoints

@app.get("/users/{user_id}",
         response_model=UserResponse,
         summary="Get user by ID",
         responses={
             200: {"description": "User found"},
             404: {"model": ErrorResponse, "description": "User not found"}
         })
async def get_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    if not user:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"User with id {user_id} not found"
        )
    return user

@app.get("/users/",
         response_model=List[UserResponse],
         summary="Get users with pagination")
async def get_users(
    skip: int = Query(0, ge=0, description="Number of records to skip"),
    limit: int = Query(10, ge=1, le=100, description="Number of records to return"),
    db: Session = Depends(get_db)
):
    users = db.query(User).offset(skip).limit(limit).all()
    return users

Authentication & Authorization

from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials

security = HTTPBearer()

async def get_current_user(
    credentials: HTTPAuthorizationCredentials = Depends(security),
    db: Session = Depends(get_db)
) -> User:
    token = credentials.credentials
    # Validate JWT token logic here
    user_id = decode_jwt_token(token)
    user = db.query(User).filter(User.id == user_id).first()
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid authentication credentials"
        )
    return user

@app.put("/users/{user_id}",
         response_model=UserResponse,
         dependencies=[Depends(get_current_user)])
async def update_user(
    user_id: int,
    user_update: UserUpdate,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db)
):
    # Authorization check
    if current_user.id != user_id and not current_user.is_admin:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Not authorized to update this user"
        )
    
    # Update logic here

Error Handling Middleware

from fastapi import Request
from fastapi.responses import JSONResponse

@app.exception_handler(ValueError)
async def value_error_handler(request: Request, exc: ValueError):
    return JSONResponse(
        status_code=400,
        content={"detail": str(exc), "error_code": "VALIDATION_ERROR"}
    )

@app.exception_handler(Exception)
async def general_exception_handler(request: Request, exc: Exception):
    return JSONResponse(
        status_code=500,
        content={"detail": "Internal server error", "error_code": "INTERNAL_ERROR"}
    )

Advanced Patterns

File Upload Endpoint

from fastapi import UploadFile, File

@app.post("/upload/")
async def upload_file(
    file: UploadFile = File(..., description="File to upload"),
    current_user: User = Depends(get_current_user)
):
    if file.content_type not in ["image/jpeg", "image/png"]:
        raise HTTPException(400, "Only JPEG and PNG files allowed")
    
    if file.size > 5 * 1024 * 1024:  # 5MB limit
        raise HTTPException(400, "File too large")
    
    # Save file logic
    return {"filename": file.filename, "size": file.size}

Background Tasks

from fastapi import BackgroundTasks

def send_email_notification(email: str, message: str):
    # Email sending logic
    pass

@app.post("/notify/")
async def send_notification(
    email_data: EmailRequest,
    background_tasks: BackgroundTasks
):
    background_tasks.add_task(send_email_notification, email_data.email, email_data.message)
    return {"message": "Notification queued"}

Best Practices

  • Use dependency injection for database sessions, authentication, and shared logic
  • Validate early: Use Pydantic Field validators for complex validation rules
  • Return appropriate status codes: 201 for creation, 204 for deletion, etc.
  • Include response examples in endpoint documentation
  • Use async/await for I/O operations
  • Implement proper logging for debugging and monitoring
  • Add request/response middleware for common functionality like CORS, rate limiting
  • Use OpenAPI tags to organize endpoints in documentation
  • Implement health check endpoints for monitoring

Configuration

from pydantic import BaseSettings

class Settings(BaseSettings):
    database_url: str
    secret_key: str
    algorithm: str = "HS256"
    access_token_expire_minutes: int = 30
    
    class Config:
        env_file = ".env"

settings = Settings()

Comments (0)

Sign In Sign in to leave a comment.

Spark Drops

Weekly picks: best new AI tools, agents & prompts

Venture Crew
Terms of Service

© 2026, Venture Crew