Scaffold new Next.js API endpoints with authentication, rate limiting, and tests. Use when creating new API routes, adding endpoints, or building API features.
Installs into .claude/skills of the current project.
Are you the author of Api Endpoint Scaffold?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/diegosouzapw-api-endpoint-scaffold)
---
name: api-endpoint-scaffold
description: Scaffold new Next.js API endpoints with authentication, rate limiting, and tests. Use when creating new API routes, adding endpoints, or building API features.
allowed-tools: Read, Grep, Glob, Write, Edit
---
# API Endpoint Scaffold
Creates production-ready API endpoints following this repo's patterns.
## When to Use
- "Create an endpoint for..."
- "Add API route for..."
- "I need a POST/GET endpoint"
- "Build an API for {feature}"
## Prerequisites
Before creating an endpoint, confirm:
1. Endpoint path (e.g., `/api/users/profile`)
2. HTTP methods needed (GET, POST, PUT, DELETE)
3. Authentication required? (default: yes)
4. Rate limiting config (requests/window)
5. Request/response schema
## Procedure
### Step 1: Create Route File
Path: `apps/web/app/api/{path}/route.ts`
Use the template in [templates.md](./templates.md).
### Step 2: Add Rate Limiting (if needed)
Import from existing pattern:
```typescript
import { withUserRateLimit } from '../_lib/withUserRateLimit';
import { createRateLimiter } from '@acme/security';
```
### Step 3: Add Request Validation
Use Zod for schema validation:
```typescript
import { z } from 'zod';
const RequestSchema = z.object({
field: z.string().min(1),
});
```
### Step 4: Create Integration Test
Path: `packages/tests/src/{feature}.test.ts`
See [templates.md](./templates.md) for test template.
### Step 5: Verify
Run these commands:
1. `pnpm typecheck` - Type check
2. `pnpm lint` - Lint check
3. `pnpm test:integration` - Run tests
## Checklist
- [ ] Route file created at correct path
- [ ] Authentication check using `getCurrentUser()`
- [ ] Rate limiting applied via `withUserRateLimit`
- [ ] Request validation with Zod
- [ ] Proper error responses (400, 401, 403, 429, 500)
- [ ] Integration test created
- [ ] TypeScript types pass
- [ ] ESLint passes
## Guardrails
- ALWAYS use `getCurrentUser()` from `@acme/auth` for auth
- ALWAYS apply rate limiting to user-facing endpoints
- NEVER expose internal errors to clients
- NEVER skip request validation
- If unsure about rate limit config, ask user