Documentation
API

OpenAPI (Swagger)

Make your oRPC router accessible via /api/v1 and expose OpenAPI JSON.

This project exposes:

  • API endpoint: /api/v1/*
  • OpenAPI spec: /openapi.json

You do not need to manually edit src/app/api/v1/[[...rest]]/route.ts for each new endpoint. Just define routes in your feature router, for example:

list: base
  .route({ method: 'GET', path: '/todo/list' })
  .output(ListTodosOutputSchema)
  .handler(async () => {
    return listTodos();
  })

This route becomes available at:

/api/v1/todo/list

Expose OpenAPI JSON

Create or update:

src/app/openapi.json/route.ts

Use this scaffold:

import { OpenAPIGenerator } from '@orpc/openapi';
import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4';
import { NextResponse } from 'next/server';

import { router } from '@/lib/orpc/router';

const generator = new OpenAPIGenerator({
  schemaConverters: [new ZodToJsonSchemaConverter()],
});

async function handleRequest() {
  const spec = await generator.generate(router, {
    info: {
      title: 'Public API',
      version: '1.0.0',
    },
  });

  return NextResponse.json(spec);
}

export const GET = handleRequest;

Quick check

Run the app and open:

http://localhost:3000/api/v1/todo/list
http://localhost:3000/openapi.json

If your feature router is registered in src/lib/orpc/router.ts, both endpoints will include it.

On this page