API Endpoint Scaffolder
Instructions
When creating a new API endpoint:
- Identify the framework (Express, Next.js, FastAPI, etc.)
- Determine HTTP method (GET, POST, PUT, PATCH, DELETE)
- Define request/response types
- Implement with best practices
Templates
Next.js App Router (TypeScript)
typescript// app/api/[resource]/route.ts import { NextRequest, NextResponse } from 'next/server'; import { z } from 'zod'; const RequestSchema = z.object({ // Define your schema }); export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url); // Implementation return NextResponse.json({ data }, { status: 200 }); } catch (error) { console.error('[API] Error:', error); return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } } export async function POST(request: NextRequest) { try { const body = await request.json(); const validated = RequestSchema.parse(body); // Implementation return NextResponse.json({ data }, { status: 201 }); } catch (error) { if (error instanceof z.ZodError) { return NextResponse.json( { error: 'Validation failed', details: error.errors }, { status: 400 } ); } return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } }
Express (TypeScript)
typescriptimport { Router, Request, Response, NextFunction } from 'express'; import { z } from 'zod'; const router = Router(); const CreateSchema = z.object({ // Define schema }); router.post('/', async (req: Request, res: Response, next: NextFunction) => { try { const data = CreateSchema.parse(req.body); // Implementation res.status(201).json({ success: true, data }); } catch (error) { next(error); } }); export default router;
Best Practices
- Always validate input using Zod, Yup, or similar
- Use proper HTTP status codes:
- 200: Success
- 201: Created
- 400: Bad Request
- 401: Unauthorized
- 403: Forbidden
- 404: Not Found
- 500: Server Error
- Log errors but don't expose internals to clients
- Use consistent response format
- Add rate limiting for public endpoints
- Document with OpenAPI/Swagger when possible

