Generate an API_CONTRACT.md by scanning the real codebase. Never fabricate endpoints or types.
1. Detect the backend stack
| File | Stack |
|---|---|
package.json with @nestjs/core |
NestJS |
package.json with express/fastify |
Express/Fastify |
composer.json |
CakePHP / Laravel |
pyproject.toml or requirements.txt with django/fastapi/flask |
Python |
go.mod |
Go |
Cargo.toml with actix/axum/rocket |
Rust |
Gemfile with rails |
Rails |
2. Scan routes and controllers
| Stack | Where to look |
|---|---|
| NestJS | *.controller.ts — decorators @Get, @Post, @Put, @Delete, @Patch |
| Express/Fastify | routes/**, router/** — router.get(), app.post(), etc. |
| CakePHP/Laravel | *Controller.php — public methods, routes/*.php |
| Django | urls.py — urlpatterns, ViewSet classes |
| FastAPI | *.py — @app.get, @router.post, etc. |
| Go | *_handler.go, *_router.go — HandleFunc, mux.Handle |
| Rails | config/routes.rb — resources, get/post/put/delete |
| Rust | routes/*.rs — handler functions, route macros |
3. For each endpoint, extract
- HTTP method and path
- Request body / query params (from DTOs, structs, dataclasses, type annotations)
- Response type (if detectable)
- Auth requirement (if detectable)
- If a type cannot be determined, write
// TODO: define type— NEVER fabricate
4. Generate the contract
Use this format:
# API Contract — [Project Name]
Source of truth for backend/frontend communication.
## Global Conventions
- Base URL: [detected or TODO]
- Auth: [detected or TODO]
- Response format: [detected or standard JSON]
- Error format: [detected or TODO]
## [Domain — grouped by controller/router]
### [METHOD] [path]
**Request:**
\`\`\`[lang]
[body type / query params]
\`\`\`
**Response:**
\`\`\`[lang]
[response type]
\`\`\`
**Auth:** [required/optional/none]
**Notes:** [if applicable]
---
## Changelog
| Date | Change | Side |
|------|--------|------|
| [today] | Initial generation from code | backend |
5. Placement
- If argument is
sharedor no argument: proposeshared/API_CONTRACT.md - If argument is
root: proposeAPI_CONTRACT.mdat project root
Present the generated contract and wait for user validation before writing.