Route Metadata
Procedure metadata allows you to add an optional procedure specific meta property which will be available in all middleware function parameters.
Create router with typed metadata​
import { initTRPC } from '@trpc/server';
// [...]
interface Meta {
  hasAuth: boolean;
}
export const t = initTRPC<{ ctx: Context; meta: Meta }>()();
export const appRouter = t.router({
  // [...]
});
Example with per route authentication settings​
server.ts
import { initTRPC } from '@trpc/server';
// [...]
interface Meta {
  hasAuth: boolean;
}
export const t = initTRPC<{ ctx: Context; meta: Meta }>()();
const isAuthed = t.middleware(async ({ meta, next, ctx }) => {
  // only check authorization if enabled
  if (meta?.hasAuth && !ctx.user) {
    throw new TRPCError({ code: 'UNAUTHORIZED' });
  }
  return next();
});
export const authedProcedure = t.procedure.use(isAuthed);
export const appRouter = t.router({
  hello: authedProcedure.meta({ hasAuth: false }).query(() => {
    return {
      greeting: 'hello world',
    };
  }),
  protectedHello: authedProcedure.meta({ hasAuth: true }).query(() => {
    return {
      greeting: 'hello-world',
    };
  }),
});