createRoute — declare an OpenAPI route
Imported from the facade: import { createRoute, z, jsonContent, HttpStatusCodes } from "@/framework/facade.js".
Declares a fully documented route — path, method, tags, request (params/query/body) and response schemas — that createRouter().api() mounts and the OpenAPI spec renders. See Routing and OpenAPI.
Signature
| Function | Signature | Description |
|---|---|---|
createRoute | (args: RouteConfig) => RouteConfig | Declare an OpenAPI route with request/response schemas |
Use cases
Basic route
ts
import { createRoute, group, HttpStatusCodes, jsonContent, z } from "@/framework/facade.js";
const listRoute = createRoute({
path: "/",
method: "get",
tags: ["Posts"],
summary: "List all posts",
responses: {
[HttpStatusCodes.OK]: jsonContent(z.array(PostSchema), "list of posts"),
},
});
export default group().api(listRoute, async (c) => c.json(await listPosts()));Request bodies & params
ts
const storeRoute = createRoute({
path: "/",
method: "post",
tags: ["Posts"],
request: { body: jsonContent(CreatePostSchema, "post data") },
responses: { [HttpStatusCodes.CREATED]: jsonContent(PostSchema, "created post") },
});
const showRoute = createRoute({
path: "/{id}",
method: "get",
tags: ["Posts"],
request: { params: z.object({ id: z.coerce.number().openapi({ example: 1 }) }) },
responses: {
[HttpStatusCodes.OK]: jsonContent(PostSchema, "post details"),
[HttpStatusCodes.NOT_FOUND]: { description: "Post not found" },
},
});Real world — the auth router
ts
// modules/auth/routes/api.ts
const loginRoute = createRoute({
path: "/login",
method: "post",
tags: ["Auth"],
request: { body: jsonContent(LoginSchema, "Login payload") },
responses: { [HttpStatusCodes.OK]: jsonContent(AuthResponseSchema, "Logged in") },
});Notes
createRouteis re-exported from@hono/zod-openapiand pairs with the facade'sz(see z for.openapi()).- Requires
OPEN_API=trueto drive the Scalar UI at/api-docs. - Mount it with
createRouter().api(route, handler)orgroup().api(route, handler)— see createRouter.
