· developers · api
File
app/api/**/route.ts
→
GET/POST
at
/api/**
. Typed
VeskRequest/VeskResponse
, cookies, headers, validation — same middleware as pages.
import { VeskRequest, VeskResponse } from '@vesk/types'
export async function POST(req: VeskRequest) {
const { name } = await req.json()
if (!name) return VeskResponse.json({ error: "name required" }, { status: 400 })
return VeskResponse.json({ ok: true, name })
}
No config.
cookies()
,
headers()
,
locals()
— same as pages.
[slug]
+ catch-all
[...rest]
— same as pages.
withValidation(req, schema)
→ 422 +
issuesToFieldMap
.
export const revalidate = 60
.
| Pillar | Vesk | Next.js route handlers | Express / Hono |
|---|---|---|---|
| Co-location |
Files under
app/api
+ share middleware with pages
|
Files under
app/api
(RSC split)
|
Manual router file |
| Validation | Built-in Zod + field map | Manual (zod) per handler | Middleware + lib |
| Auth share |
One
middleware.ts
for pages + API
|
Duplicate per group | App-level middleware |
| Typed errors |
VeskResponse.json
+
HttpError
|
NextResponse
untyped
|
Manual |