# Interface: TRPCProcedureBuilder<TContext, TMeta, TContextOverrides, TInputIn, TInputOut, TOutputIn, TOutputOut, TCaller, TErrorShape>

> 

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:211](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L211)

Builds a procedure step by step. Each method returns a new builder, so a
builder can be the base of many procedures.

## See

https://trpc.io/docs/server/procedures

## Type Parameters

| Type Parameter | Default type |
| ------ | ------ |
| `TContext` | - |
| `TMeta` | - |
| `TContextOverrides` | - |
| `TInputIn` | - |
| `TInputOut` | - |
| `TOutputIn` | - |
| `TOutputOut` | - |
| `TCaller` *extends* `boolean` | - |
| `TErrorShape` | `unknown` |

## Methods

### concat()

> **concat**\<`$Context`, `$Meta`, `$ContextOverrides`, `$InputIn`, `$InputOut`, `$OutputIn`, `$OutputOut`, `$ErrorShape`\>(`builder`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `Overwrite`\<`TContextOverrides`, `$ContextOverrides`\>, `IntersectIfDefined`\<`TInputIn`, `$InputIn`\>, `IntersectIfDefined`\<`TInputOut`, `$InputOut`\>, `IntersectIfDefined`\<`TOutputIn`, `$OutputIn`\>, `IntersectIfDefined`\<`TOutputOut`, `$OutputOut`\>, `TCaller`, `FoldErrorShape`\<`TErrorShape`, `$ErrorShape`\>\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:389](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L389)

Adds another procedure builder's inputs, middlewares and context to
this one. Useful for plugins that ship their own procedure builder.

#### Type Parameters

| Type Parameter |
| ------ |
| `$Context` |
| `$Meta` |
| `$ContextOverrides` |
| `$InputIn` |
| `$InputOut` |
| `$OutputIn` |
| `$OutputOut` |
| `$ErrorShape` |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `builder` | `Overwrite`\<`TContext`, `TContextOverrides`\> *extends* `$Context` ? `TMeta` *extends* `$Meta` ? [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`$Context`, `$Meta`, `$ContextOverrides`, `$InputIn`, `$InputOut`, `$OutputIn`, `$OutputOut`, `TCaller`, `$ErrorShape`\> : `TypeError`\<`"Meta mismatch"`\> : `TypeError`\<`"Context mismatch"`\> |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `Overwrite`\<`TContextOverrides`, `$ContextOverrides`\>, `IntersectIfDefined`\<`TInputIn`, `$InputIn`\>, `IntersectIfDefined`\<`TInputOut`, `$InputOut`\>, `IntersectIfDefined`\<`TOutputIn`, `$OutputIn`\>, `IntersectIfDefined`\<`TOutputOut`, `$OutputOut`\>, `TCaller`, `FoldErrorShape`\<`TErrorShape`, `$ErrorShape`\>\>

#### See

https://trpc.io/docs/server/middlewares#concat

***

### errors()

> **errors**\<`$Shape`\>(`formatter`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `TCaller`, `FoldErrorShape`\<`TErrorShape`, `$Shape`\>\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:299](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L299)

Adds an error formatter for this procedure. An error goes to the last
`.errors()` formatter first, and on to earlier ones and the root
`errorFormatter` until one returns a shape. A formatter only sees
errors from the steps after it, so put `.errors()` before `.input()`
to format input errors.

#### Type Parameters

| Type Parameter |
| ------ |
| `$Shape` *extends* `undefined` \| `void` \| [`TRPCErrorShape`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCErrorShape.md)\<`object`\> |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `formatter` | `ProcedureErrorFormatter`\<`TContext`, `TContextOverrides`, `$Shape`\> |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `TCaller`, `FoldErrorShape`\<`TErrorShape`, `$Shape`\>\>

#### See

https://trpc.io/docs/server/error-formatting#per-procedure-error-formatting

***

### experimental\_caller()

> **experimental\_caller**(`caller`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `true`, `TErrorShape`\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:523](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L523)

Replaces how the procedure is called, for example to make it a server
action. Experimental: it may change in any release.

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `caller` | `CallerOverride`\<`TContext`\> |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `true`, `TErrorShape`\>

#### See

https://trpc.io/docs/client/nextjs/server-actions#1-define-a-base-procedure-with-experimental_caller

***

### input()

> **input**\<`$Parser`\>(`schema`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `IntersectIfDefined`\<`TInputIn`, `inferParser`\<`$Parser`\>\[`"in"`\]\>, `IntersectIfDefined`\<`TInputOut`, `inferParser`\<`$Parser`\>\[`"out"`\]\>, `TOutputIn`, `TOutputOut`, `TCaller`, `TErrorShape`\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:232](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L232)

Adds a validator for the input. Chain several to merge object inputs.

#### Type Parameters

| Type Parameter |
| ------ |
| `$Parser` *extends* `Parser` |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `schema` | `TInputOut` *extends* `UnsetMarker` ? `$Parser` : `inferParser`\<`$Parser`\>\[`"out"`\] *extends* `undefined` \| `Record`\<`string`, `unknown`\> ? `TInputOut` *extends* `undefined` \| `Record`\<`string`, `unknown`\> ? `undefined` *extends* `any`\[`any`\] ? `undefined` *extends* `TInputOut`\<`TInputOut`\> ? `$Parser` : `TypeError`\<`"Cannot chain an optional parser to a required parser"`\> : `$Parser` : `TypeError`\<`"All input parsers did not resolve to an object"`\> : `TypeError`\<`"All input parsers did not resolve to an object"`\> |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `IntersectIfDefined`\<`TInputIn`, `inferParser`\<`$Parser`\>\[`"in"`\]\>, `IntersectIfDefined`\<`TInputOut`, `inferParser`\<`$Parser`\>\[`"out"`\]\>, `TOutputIn`, `TOutputOut`, `TCaller`, `TErrorShape`\>

#### See

https://trpc.io/docs/server/validators#input-validators

***

### meta()

> **meta**(`meta`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `TCaller`, `TErrorShape`\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:278](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L278)

Sets the procedure's metadata, which middlewares can read. It's
shallow-merged with any metadata set before.

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `meta` | `TMeta` |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `TCaller`, `TErrorShape`\>

#### See

https://trpc.io/docs/server/metadata

***

### mutation()

> **mutation**\<`$Output`\>(`resolver`): `TCaller` *extends* `true` ? (`input`) => `Promise`\<`DefaultValue`\<`TOutputOut`, `$Output`\>\> : [`TRPCMutationProcedure`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCMutationProcedure.md)\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: `DefaultValue`\<`TOutputOut`, `$Output`\>; \}\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:453](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L453)

Ends the builder with a mutation: a procedure that changes data.

#### Type Parameters

| Type Parameter |
| ------ |
| `$Output` |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `resolver` | `ProcedureResolver`\<`TContext`, `TMeta`, `TContextOverrides`, `TInputOut`, `TOutputIn`, `$Output`\> |

#### Returns

`TCaller` *extends* `true` ? (`input`) => `Promise`\<`DefaultValue`\<`TOutputOut`, `$Output`\>\> : [`TRPCMutationProcedure`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCMutationProcedure.md)\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: `DefaultValue`\<`TOutputOut`, `$Output`\>; \}\>

#### See

https://trpc.io/docs/server/procedures#writing-procedures

***

### output()

> **output**\<`$Parser`\>(`schema`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `IntersectIfDefined`\<`TOutputIn`, `inferParser`\<`$Parser`\>\[`"in"`\]\>, `IntersectIfDefined`\<`TOutputOut`, `inferParser`\<`$Parser`\>\[`"out"`\]\>, `TCaller`, `TErrorShape`\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:260](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L260)

Adds a validator for the output, which checks what the resolver
returns.

#### Type Parameters

| Type Parameter |
| ------ |
| `$Parser` *extends* `Parser` |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `schema` | `$Parser` |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `TContextOverrides`, `TInputIn`, `TInputOut`, `IntersectIfDefined`\<`TOutputIn`, `inferParser`\<`$Parser`\>\[`"in"`\]\>, `IntersectIfDefined`\<`TOutputOut`, `inferParser`\<`$Parser`\>\[`"out"`\]\>, `TCaller`, `TErrorShape`\>

#### See

https://trpc.io/docs/server/validators#output-validators

***

### query()

> **query**\<`$Output`\>(`resolver`): `TCaller` *extends* `true` ? (`input`) => `Promise`\<`DefaultValue`\<`TOutputOut`, `$Output`\>\> : [`TRPCQueryProcedure`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCQueryProcedure.md)\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: `DefaultValue`\<`TOutputOut`, `$Output`\>; \}\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:429](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L429)

Ends the builder with a query: a procedure that reads data.

#### Type Parameters

| Type Parameter |
| ------ |
| `$Output` |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `resolver` | `ProcedureResolver`\<`TContext`, `TMeta`, `TContextOverrides`, `TInputOut`, `TOutputIn`, `$Output`\> |

#### Returns

`TCaller` *extends* `true` ? (`input`) => `Promise`\<`DefaultValue`\<`TOutputOut`, `$Output`\>\> : [`TRPCQueryProcedure`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCQueryProcedure.md)\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: `DefaultValue`\<`TOutputOut`, `$Output`\>; \}\>

#### See

https://trpc.io/docs/server/procedures#writing-procedures

***

### subscription()

#### Call Signature

> **subscription**\<`$Output`\>(`resolver`): `TCaller` *extends* `true` ? `TypeError`\<`"Not implemented"`\> : [`TRPCSubscriptionProcedure`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCSubscriptionProcedure.md)\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: `inferSubscriptionOutput`\<`DefaultValue`\<`TOutputOut`, `$Output`\>\>; \}\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:478](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L478)

Ends the builder with a subscription: a procedure that streams events
from an async iterable, such as an async generator.

##### Type Parameters

| Type Parameter |
| ------ |
| `$Output` *extends* `AsyncIterable`\<`any`, `void`, `any`\> |

##### Parameters

| Parameter | Type |
| ------ | ------ |
| `resolver` | `ProcedureResolver`\<`TContext`, `TMeta`, `TContextOverrides`, `TInputOut`, `TOutputIn`, `$Output`\> |

##### Returns

`TCaller` *extends* `true` ? `TypeError`\<`"Not implemented"`\> : [`TRPCSubscriptionProcedure`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCSubscriptionProcedure.md)\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: `inferSubscriptionOutput`\<`DefaultValue`\<`TOutputOut`, `$Output`\>\>; \}\>

##### See

https://trpc.io/docs/server/subscriptions

#### Call Signature

> **subscription**\<`$Output`\>(`resolver`): `TCaller` *extends* `true` ? `TypeError`\<`"Not implemented"`\> : `LegacyObservableSubscriptionProcedure`\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: [`inferObservableValue`](https://trpc.io/docs/typedoc/server/observable/type-aliases/inferObservableValue.md)\<`DefaultValue`\<`TOutputOut`, `$Output`\>\>; \}\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:501](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L501)

Ends the builder with a subscription that returns an observable.

##### Type Parameters

| Type Parameter |
| ------ |
| `$Output` *extends* [`Observable`](https://trpc.io/docs/typedoc/server/observable/interfaces/Observable.md)\<`any`, `any`\> |

##### Parameters

| Parameter | Type |
| ------ | ------ |
| `resolver` | `ProcedureResolver`\<`TContext`, `TMeta`, `TContextOverrides`, `TInputOut`, `TOutputIn`, `$Output`\> |

##### Returns

`TCaller` *extends* `true` ? `TypeError`\<`"Not implemented"`\> : `LegacyObservableSubscriptionProcedure`\<\{ `errorShape`: `TErrorShape`; `input`: `DefaultValue`\<`TInputIn`, `void`\>; `meta`: `TMeta`; `output`: [`inferObservableValue`](https://trpc.io/docs/typedoc/server/observable/type-aliases/inferObservableValue.md)\<`DefaultValue`\<`TOutputOut`, `$Output`\>\>; \}\>

##### Deprecated

Return an async generator instead. Observable subscriptions
will be removed in v12.

##### See

https://trpc.io/docs/server/subscriptions

***

### ~~unstable\_concat()~~

> **unstable\_concat**\<`$Context`, `$Meta`, `$ContextOverrides`, `$InputIn`, `$InputOut`, `$OutputIn`, `$OutputOut`, `$ErrorShape`\>(`builder`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `Overwrite`\<`TContextOverrides`, `$ContextOverrides`\>, `IntersectIfDefined`\<`TInputIn`, `$InputIn`\>, `IntersectIfDefined`\<`TInputOut`, `$InputOut`\>, `IntersectIfDefined`\<`TOutputIn`, `$OutputIn`\>, `IntersectIfDefined`\<`TOutputOut`, `$OutputOut`\>, `TCaller`, `FoldErrorShape`\<`TErrorShape`, `$ErrorShape`\>\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:347](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L347)

#### Type Parameters

| Type Parameter |
| ------ |
| `$Context` |
| `$Meta` |
| `$ContextOverrides` |
| `$InputIn` |
| `$InputOut` |
| `$OutputIn` |
| `$OutputOut` |
| `$ErrorShape` |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `builder` | `Overwrite`\<`TContext`, `TContextOverrides`\> *extends* `$Context` ? `TMeta` *extends* `$Meta` ? [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`$Context`, `$Meta`, `$ContextOverrides`, `$InputIn`, `$InputOut`, `$OutputIn`, `$OutputOut`, `TCaller`, `$ErrorShape`\> : `TypeError`\<`"Meta mismatch"`\> : `TypeError`\<`"Context mismatch"`\> |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `Overwrite`\<`TContextOverrides`, `$ContextOverrides`\>, `IntersectIfDefined`\<`TInputIn`, `$InputIn`\>, `IntersectIfDefined`\<`TInputOut`, `$InputOut`\>, `IntersectIfDefined`\<`TOutputIn`, `$OutputIn`\>, `IntersectIfDefined`\<`TOutputOut`, `$OutputOut`\>, `TCaller`, `FoldErrorShape`\<`TErrorShape`, `$ErrorShape`\>\>

#### Deprecated

Use [concat](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md#concat) instead.

***

### use()

> **use**\<`$ContextOverridesOut`\>(`fn`): [`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `Overwrite`\<`TContextOverrides`, `$ContextOverridesOut`\>, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `TCaller`, `TErrorShape`\>

Defined in: [packages/server/src/unstable-core-do-not-import/procedureBuilder.ts:317](https://github.com/trpc/trpc/blob/7c907acfd8b31929214792e3b8c2ad7a8ac72563/packages/server/src/unstable-core-do-not-import/procedureBuilder.ts#L317)

Adds a middleware, which runs before the resolver and can change the
context.

#### Type Parameters

| Type Parameter |
| ------ |
| `$ContextOverridesOut` |

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `fn` | `MiddlewareBuilder`\<`Overwrite`\<`TContext`, `TContextOverrides`\>, `TMeta`, `$ContextOverridesOut`, `TInputOut`\> \| `MiddlewareFunction`\<`TContext`, `TMeta`, `TContextOverrides`, `$ContextOverridesOut`, `TInputOut`\> |

#### Returns

[`TRPCProcedureBuilder`](https://trpc.io/docs/typedoc/server/index/interfaces/TRPCProcedureBuilder.md)\<`TContext`, `TMeta`, `Overwrite`\<`TContextOverrides`, `$ContextOverridesOut`\>, `TInputIn`, `TInputOut`, `TOutputIn`, `TOutputOut`, `TCaller`, `TErrorShape`\>

#### See

https://trpc.io/docs/server/middlewares
