> ## Documentation Index
> Fetch the complete documentation index at: https://eo.utopy.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenAPI metadata

> Attach route, prefix, and tag metadata to Effect procedures.

`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

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

## Prefix a router

```ts title="prefix.ts" theme={null}
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

```ts title="tag.ts" theme={null}
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.

```ts title="contract-route.ts" theme={null}
const contract = {
  users: {
    list: eoc.route({ method: "GET", path: "/users" }).output(z.array(User)),
  },
};
```

## Next step

Expose procedures directly with [Callable and actionable procedures](/capabilities/callable-actionable).
