FrançaisPlayground

API routes

Drop a file in src/api/ and export HTTP-method handlers, they are served under /api/*.

// src/api/hello.ts  →  /api/hello
export function GET() {
  return Response.json({ message: 'hello' });
}

export function POST(request: Request) {
  return Response.json({ method: 'POST' });
}

Export one function per method you support: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS. The directory is configurable through apiDir in fluixi.config; src/api is the default.

Return values

A handler returns a Web Response, or any value, which is sent as JSON:

export function GET() {
  return { ok: true };          // → application/json
}

export function GET() {
  return Response.json({ ok: true }, { status: 201 });   // full control
}

export function GET() {
  return new Response('plain', { headers: { 'content-type': 'text/plain' } });
}

Return a Response yourself when you need a status other than 200, custom headers, a redirect, or a non-JSON body. The plain-value form exists so the common case stays short.

Params and catch-all

The file path is the route, with the same conventions as pages:

// src/api/users/[id].ts  →  /api/users/:id
export function GET(_req: Request, { params }: { params: { id: string } }) {
  return Response.json({ id: params.id });
}

// src/api/files/[...path].ts  →  catch-all, /api/files/**

Params arrive as plain strings on the second argument, not as accessors, an API handler runs once per request, so there is nothing reactive about it.

Everything else about the request comes from the standard Request: the query string via new URL(request.url).searchParams, the body via await request.json() or await request.formData(), and headers via request.headers.

Status codes you get for free

A request to a path that exists but with a method you did not export returns 405, with an Allow header listing the methods that file does export; an unknown /api/* path returns 404. You do not need to write either.

API route or server function?

Both run only on the server, so the choice is about who calls them:

  • A server function is for your own client code. It is typed end to end, and the call looks like a function call rather than a fetch.
  • An API route is for callers you do not control, a webhook, a mobile app, a CLI, anything that needs a stable URL, a specific status code, or a non-JSON body.

If you are reaching for fetch('/api/...') inside your own app, a server function is usually the shorter path.

Next: Middleware.