Skip to main content
effect-orpc preserves oRPC route metadata methods. Use them when your router is served by an oRPC OpenAPI handler or when you generate OpenAPI documentation from your oRPC router.

Route a procedure

route.ts
const listUsers = effectProcedure
  .route({ method: "GET", path: "/users" })
  .output(z.array(User))
  .effect(function* () {
    return yield* UsersRepo.list();
  });

Prefix a router

prefix.ts
const usersRouter = effectProcedure.prefix("/api").router({
  list: effectProcedure
    .route({ method: "GET", path: "/users" })
    .effect(function* () {
      return yield* UsersRepo.list();
    }),
});
The final route path is /api/users.

Tag procedures

tag.ts
const usersRouter = effectProcedure.tag("Users").router({
  list: effectProcedure
    .route({ method: "GET", path: "/users" })
    .effect(function* () {
      return yield* UsersRepo.list();
    }),
});

Contract-first metadata

Contract-first APIs can also use route metadata in the contract definition.
contract-route.ts
const contract = {
  users: {
    list: eoc.route({ method: "GET", path: "/users" }).output(z.array(User)),
  },
};

Next step

Expose procedures directly with Callable and actionable procedures.
Last modified on June 15, 2026