By ApiNest Team • Last updated Aug 24, 2025
Plan the API
Define resources, operations, and error model. We’ll build a todo API with users and JWT auth.
Scaffold
npm create next-app@latest my-api --ts cd my-api
Endpoints
GET /api/todos POST /api/todos GET /api/todos/:id PATCH /api/todos/:id DELETE /api/todos/:id
Validation
// zod example
import { z } from 'zod'
const TodoInput = z.object({ title: z.string().min(1), done: z.boolean().optional() })Auth
Use a bearer token or key header. For browser apps, keep the key on the server and proxy calls.
// Simple JWT issue (pseudo)
import jwt from 'jsonwebtoken'
const token = jwt.sign({ sub: user.id, scope: ['todo:read','todo:write'] }, process.env.JWT_SECRET, { expiresIn: '15m' })Rate limits
Start 60 rpm per user; 5 rps burst. Return 429 with Retry-After. Cache reads for 30–60s.
if (tooManyRequests(user)) {
res.setHeader('Retry-After', '30')
return res.status(429).json({ error: 'RATE_LIMIT_MINUTE', message: 'Rate limit exceeded', retryAfter: 30 })
}Deploy & observe
- Deploy to Vercel or similar. Add logging (status, latency, user).
- Set alerts for error rate and p95 latency.
Postman collection & examples
GET /api/todos
Auth: Bearer <token>
POST /api/todos
{ "title": "Ship API" }FAQ
How do I version?
Path-based /v1 is simplest. Keep old versions until clients migrate.
Should I use REST or GraphQL?
REST is quicker for small teams; GraphQL helps when clients need selective fields.
