Nitro logoNitro

API Routes

File-based API routing with HTTP method support and dynamic parameters.
api/hello.ts
import { defineHandler } from "nitro/h3";

export default defineHandler(() => "Nitro is amazing!");

Nitro supports file-based routing in the api/ or routes/ directory. Each file becomes an API endpoint based on its path.

Basic Route

Create a file in the api/ directory to define a route. The file path becomes the URL path:

hello.ts
import { defineHandler } from "nitro/h3";

export default defineHandler(() => "Nitro is amazing!");

This creates a GET /api/hello endpoint.

Dynamic Routes

Use square brackets [param] for dynamic URL segments. Access params via event.context.params:

[name].ts
import { defineHandler } from "nitro/h3";

export default defineHandler((event) => `Hello (param: ${event.context.params!.name})!`);

This creates a GET /api/hello/:name endpoint (e.g., /api/hello/world).

HTTP Methods

Suffix your file with the HTTP method (.get.ts, .post.ts, .put.ts, .delete.ts, etc.):

GET Handler

test.get.ts
import { defineHandler } from "nitro/h3";

export default defineHandler(() => "Test get handler");

POST Handler

test.post.ts
import { defineHandler } from "h3";

export default defineHandler(async (event) => {
  const body = await event.req.json();
  return {
    message: "Test post handler",
    body,
  };
});

Learn More