API routes

API routes are route.ts files in the app/ directory. They export functions named after HTTP methods (GET, POST, PUT, DELETE, etc).

A simple GET handler

app/api/posts/route.ts
import type { RouteHandler } from "swift-rust/router";

export const GET: RouteHandler = async ({ request }) => {
  const posts = await db.posts.findMany();
  return Response.json(posts);
};

A POST handler with body parsing

app/api/posts/route.ts
import type { RouteHandler } from "swift-rust/router";

export const POST: RouteHandler = async ({ request }) => {
  const body = await request.json();
  const post = await db.posts.create({ data: body });
  return Response.json(post, { status: 201 });
};

Dynamic API routes

Use the same [param] syntax as pages.

app/api/posts/[id]/route.ts
import type { RouteHandler } from "swift-rust/router";

export const GET: RouteHandler = async ({ params }) => {
  const post = await db.posts.findUnique({ where: { id: params.id } });
  if (!post) return new Response("Not found", { status: 404 });
  return Response.json(post);
};

Cookies and headers

The request object exposes cookies, headers, and standard Fetch API methods.

usage
export const POST: RouteHandler = async ({ request }) => {
  const session = request.cookies.get("session")?.value;
  if (!session) return new Response("Unauthorized", { status: 401 });
  return Response.json({ ok: true });
};

Custom responses

Return any standard Response object. The framework passes it through unchanged. For PDFs, use Response.pdf(tree).