# Add API Route

> Add a new JobPilot API route or module the standard way - contracts schema, controller, service, response schema, optional web hook. Use for "add an endpoint", "new route", "new module".

- Skill: `suxrobgm/add-api-route` (Agent Skill)
- Install (CLI): `npx skillmds@latest add suxrobgm/add-api-route`
- Raw SKILL.md: https://api.skillmd.com/api/skills/suxrobgm/add-api-route/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: suxrobgm (https://skillmd.com/u/suxrobgm)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/suxrobgm/add-api-route

---


# Add an API route

Follow the conventions in `.claude/rules/api.md` (response schemas, `z.date()`, global error
envelope). Steps:

1. Request schema: reuse or add in `packages/contracts` (or the module's `<name>.schema.ts`).
   Uuid path ids via `idParam`.
2. Response schema: model the service's return **exactly** in `<name>.schema.ts`, or use a
   shared envelope from `@/types/response`. Elysia strips fields not in the schema.
3. Route: in `modules/<name>/<name>.controller.ts`, add `body`/`query`/`params` as needed, the
   `response` success schema, a `detail` summary, and a `rateLimit(policy)` `beforeHandle`
   where the endpoint warrants one. No per-route error responses - they're declared globally.
4. Logic in `<name>.service.ts` (tsyringe `@singleton`; injected classes stay value imports).
   New module: mirror an existing one and mount its controller in `app.ts`.
5. Web side (if needed): Eden Treaty picks up types automatically; add query/mutation hooks
   under `apps/web/src/api/`.
6. Invoke the `verify` skill.

