Skip to content
tRPC

Error Formatting

On this page

The error formatting in your router will be inferred all the way to your client.

Usage example highlighted

Adding custom formatting

server.ts
import { const initTRPC: TRPCBuilder<object, object>initTRPC } from '@trpc/server';
import { 
interface ZodError<T = unknown>
const ZodError: $constructor<ZodError<unknown>, $ZodIssue[]>
ZodError
} from 'zod';
export const
const t: TRPCRootObject<object, object, {
    errorFormatter(opts: ErrorFormatterOptions<object | undefined>): {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}, {
    ctx: object;
    meta: object;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
    transformer: false;
}>
t
= const initTRPC: TRPCBuilder<object, object>initTRPC.
TRPCBuilder<object, object>.create<{
    errorFormatter(opts: ErrorFormatterOptions<object | undefined>): {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>(opts?: {
    errorFormatter(opts: ErrorFormatterOptions<object | undefined>): {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
} | undefined): TRPCRootObject<...>
create
({
function errorFormatter(opts: ErrorFormatterOptions<object | undefined>): {
    data: {
        zodError: $ZodFlattenedError<unknown, string> | null;
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
}
errorFormatter
(opts: ErrorFormatterOptions<object | undefined>opts) {
const { const shape: DefaultErrorShapeshape, const error: TRPCErrorerror } = opts: ErrorFormatterOptions<object | undefined>opts; return { ...const shape: DefaultErrorShapeshape,
data: {
    zodError: $ZodFlattenedError<unknown, string> | null;
    code: TRPC_ERROR_CODE_KEY;
    httpStatus: number;
    path?: string;
    stack?: string;
}
data
: {
...const shape: DefaultErrorShapeshape.TRPCErrorShape<DefaultErrorData>.data: DefaultErrorDatadata, zodError: $ZodFlattenedError<unknown, string> | nullzodError: const error: TRPCErrorerror.TRPCError.code: "BAD_GATEWAY" | "BAD_REQUEST" | "CLIENT_CLOSED_REQUEST" | "CONFLICT" | "FORBIDDEN" | "GATEWAY_TIMEOUT" | "INTERNAL_SERVER_ERROR" | "METHOD_NOT_SUPPORTED" | "NOT_FOUND" | "NOT_IMPLEMENTED" | "PARSE_ERROR" | "PAYLOAD_TOO_LARGE" | "PAYMENT_REQUIRED" | "PRECONDITION_FAILED" | "PRECONDITION_REQUIRED" | "SERVICE_UNAVAILABLE" | "TIMEOUT" | "TOO_MANY_REQUESTS" | "UNAUTHORIZED" | "UNPROCESSABLE_CONTENT" | "UNSUPPORTED_MEDIA_TYPE"code === 'BAD_REQUEST' && const error: TRPCErrorerror.TRPCError.cause?: Error | undefinedcause instanceof const ZodError: $constructor<ZodError<unknown>, $ZodIssue[]>ZodError ? const error: TRPCErrorerror.TRPCError.cause?: ZodError<unknown>cause.ZodError<unknown>.flatten(): $ZodFlattenedError<unknown, string> (+1 overload)flatten() : null, }, }; }, });

Usage in React

components/MyComponent.tsx
import { function useEffect(effect: React.EffectCallback, deps?: React.DependencyList): voiduseEffect } from 'react';
import { 
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
    transformer: false;
}, DecorateCreateRouterOptions<{
    addPost: MutationProcedure<{
        input: {
            title: string;
        };
        output: {
            title: string;
        };
        meta: object;
        errorShape: {
            data: {
                zodError: $ZodFlattenedError<unknown, string> | null;
                code: TRPC_ERROR_CODE_KEY;
                httpStatus: number;
                path?: string;
                stack?: string;
            };
            message: string;
            code: TRPC_ERROR_CODE_NUMBER;
        };
    }>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
} from '../utils/trpc';
export function function MyComponent(): React.JSX.ElementMyComponent() { const
const mutation: UseTRPCMutationResult<{
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>, {
    title: string;
}, unknown>
mutation
=
const trpc: CreateTRPCReactBase<BuiltRouter<{
    ctx: object;
    meta: object;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
    transformer: false;
}, DecorateCreateRouterOptions<{
    addPost: MutationProcedure<{
        input: {
            title: string;
        };
        output: {
            title: string;
        };
        meta: object;
        errorShape: {
            data: {
                zodError: $ZodFlattenedError<unknown, string> | null;
                code: TRPC_ERROR_CODE_KEY;
                httpStatus: number;
                path?: string;
                stack?: string;
            };
            message: string;
            code: TRPC_ERROR_CODE_NUMBER;
        };
    }>;
}>>, unknown> & DecorateRouterRecord<...>
trpc
.
addPost: DecoratedMutation<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>
addPost
.
useMutation: <unknown>(opts?: UseTRPCMutationOptions<{
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>, {
    title: string;
}, unknown> | undefined) => UseTRPCMutationResult<{
    title: string;
}, TRPCClientErrorLike<...>, {
    title: string;
}, unknown>
useMutation
();
function useEffect(effect: React.EffectCallback, deps?: React.DependencyList): voiduseEffect(() => {
const mutation: UseTRPCMutationResult<{
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>, {
    title: string;
}, unknown>
mutation
.
mutate: (variables: {
    title: string;
}, options?: MutateOptions<{
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>, {
    title: string;
}, unknown> | undefined) => void
mutate
({ title: stringtitle: 'example' });
}, []); if (
const mutation: UseTRPCMutationResult<{
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>, {
    title: string;
}, unknown>
mutation
.
error: TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}> | null
error
?.
TRPCClientErrorBase<{ data: { zodError: $ZodFlattenedError<unknown, string> | null; code: TRPC_ERROR_CODE_KEY; httpStatus: number; path?: string; stack?: string; }; message: string; code: TRPC_ERROR_CODE_NUMBER; }>.data: Maybe<{
    zodError: $ZodFlattenedError<unknown, string> | null;
    code: TRPC_ERROR_CODE_KEY;
    httpStatus: number;
    path?: string;
    stack?: string;
}>
data
?.zodError: $ZodFlattenedError<unknown, string> | null | undefinedzodError) {
// zodError will be inferred return ( <React.JSX.IntrinsicElements.pre: React.DetailedHTMLProps<React.HTMLAttributes<HTMLPreElement>, HTMLPreElement>pre>Error: {var JSON: JSONJSON.JSON.stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string (+1 overload)stringify(
const mutation: TRPCHookResult & Override<MutationObserverErrorResult<{
    title: string;
}, TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>, {
    title: string;
}, unknown>, {
    ...;
}> & {
    ...;
}
mutation
.
error: TRPCClientErrorLike<{
    input: {
        title: string;
    };
    output: {
        title: string;
    };
    transformer: false;
    errorShape: {
        data: {
            zodError: $ZodFlattenedError<unknown, string> | null;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    };
}>
error
.
TRPCClientErrorBase<{ data: { zodError: $ZodFlattenedError<unknown, string> | null; code: TRPC_ERROR_CODE_KEY; httpStatus: number; path?: string; stack?: string; }; message: string; code: TRPC_ERROR_CODE_NUMBER; }>.data: {
    zodError: $ZodFlattenedError<unknown, string> | null;
    code: TRPC_ERROR_CODE_KEY;
    httpStatus: number;
    path?: string;
    stack?: string;
}
data
.zodError: $ZodFlattenedError<unknown, string>zodError, null, 2)}</React.JSX.IntrinsicElements.pre: React.DetailedHTMLProps<React.HTMLAttributes<HTMLPreElement>, HTMLPreElement>pre>
); } return <>[...]</>; }

Per-procedure error formatting

Errors can be formatted on a per-procedure basis using the .errors() method, which can be chained to produce a union of possible error shapes for each procedure.

When a middleware or procedure throws an error, it bubbles upward through all .errors() handlers until one returns a shape or the global errorFormatter is reached.

server.ts
const 
const rateLimitedProcedure: ProcedureBuilder<object, object, {}, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<DefaultErrorShape, {
    data: {
        kind: "RATE_LIMIT";
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>>
rateLimitedProcedure
=
const t: TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, {
    ctx: object;
    meta: object;
    errorShape: DefaultErrorShape;
    transformer: false;
}>
t
.TRPCRootObject<object, object, RuntimeConfigOptions<object, object>, { ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }>.procedure: ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>procedure
.
ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, DefaultErrorShape>.errors<{
    data: {
        kind: "RATE_LIMIT";
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>(formatter: ProcedureErrorFormatter<object, object, {
    data: {
        kind: "RATE_LIMIT";
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>): ProcedureBuilder<...>
errors
((opts: ErrorFormatterOptions<{}>opts) => {
if (opts: ErrorFormatterOptions<{}>opts.ErrorFormatterOptions<{}>.error: TRPCErrorerror.TRPCError.cause?: Error | undefinedcause instanceof class RateLimitErrorRateLimitError) { return { ...opts: ErrorFormatterOptions<{}>opts.ErrorFormatterOptions<{}>.shape: DefaultErrorShapeshape,
data: {
    kind: "RATE_LIMIT";
    code: TRPC_ERROR_CODE_KEY;
    httpStatus: number;
    path?: string;
    stack?: string;
}
data
: { ...opts: ErrorFormatterOptions<{}>opts.ErrorFormatterOptions<{}>.shape: DefaultErrorShapeshape.TRPCErrorShape<DefaultErrorData>.data: DefaultErrorDatadata, kind: "RATE_LIMIT"kind: 'RATE_LIMIT' as type const = "RATE_LIMIT"const },
}; } return var undefinedundefined; }) .
ProcedureBuilder<object, object, object, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<DefaultErrorShape, { ...; } | undefined>>.use<object>(fn: MiddlewareBuilder<{}, object, object, UnsetMarker> | MiddlewareFunction<object, object, object, object, UnsetMarker>): ProcedureBuilder<object, object, {}, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<DefaultErrorShape, {
    data: {
        kind: "RATE_LIMIT";
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>>
use
(
opts: {
    ctx: {};
    type: ProcedureType;
    path: string;
    input: UnsetMarker;
    getRawInput: GetRawInputFn;
    meta: object | undefined;
    signal: AbortSignal | undefined;
    batchIndex: number;
    next: {
        (): Promise<MiddlewareResult<object>>;
        <$ContextOverride>(opts: {
            ctx?: $ContextOverride | undefined;
            input?: unknown;
        }): Promise<MiddlewareResult<$ContextOverride>>;
        (opts: {
            getRawInput: GetRawInputFn;
        }): Promise<...>;
    };
}
opts
=> {
// Important: errors bubble up so a throwing middleware must come after the .errors() handler if (function isRateLimited(opts: any): booleanisRateLimited(
opts: {
    ctx: {};
    type: ProcedureType;
    path: string;
    input: UnsetMarker;
    getRawInput: GetRawInputFn;
    meta: object | undefined;
    signal: AbortSignal | undefined;
    batchIndex: number;
    next: {
        (): Promise<MiddlewareResult<object>>;
        <$ContextOverride>(opts: {
            ctx?: $ContextOverride | undefined;
            input?: unknown;
        }): Promise<MiddlewareResult<$ContextOverride>>;
        (opts: {
            getRawInput: GetRawInputFn;
        }): Promise<...>;
    };
}
opts
)) {
throw new constructor RateLimitError(message?: string, options?: ErrorOptions): RateLimitError (+1 overload)RateLimitError(); } return
opts: {
    ctx: {};
    type: ProcedureType;
    path: string;
    input: UnsetMarker;
    getRawInput: GetRawInputFn;
    meta: object | undefined;
    signal: AbortSignal | undefined;
    batchIndex: number;
    next: {
        (): Promise<MiddlewareResult<object>>;
        <$ContextOverride>(opts: {
            ctx?: $ContextOverride | undefined;
            input?: unknown;
        }): Promise<MiddlewareResult<$ContextOverride>>;
        (opts: {
            getRawInput: GetRawInputFn;
        }): Promise<...>;
    };
}
opts
.next: () => Promise<MiddlewareResult<object>> (+2 overloads)next();
}); const
const billedProcedure: ProcedureBuilder<object, object, {}, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<FoldErrorShape<DefaultErrorShape, {
    data: {
        kind: "RATE_LIMIT";
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>, {
    data: {
        kind: "PAYMENT_REQUIRED";
        amountDue: number;
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>>
billedProcedure
=
const rateLimitedProcedure: ProcedureBuilder<object, object, {}, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<DefaultErrorShape, {
    data: {
        kind: "RATE_LIMIT";
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>>
rateLimitedProcedure
.
ProcedureBuilder<object, object, {}, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<DefaultErrorShape, { ...; } | undefined>>.errors<{
    data: {
        kind: "PAYMENT_REQUIRED";
        amountDue: number;
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>(formatter: ProcedureErrorFormatter<object, {}, {
    data: {
        kind: "PAYMENT_REQUIRED";
        amountDue: number;
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>): ProcedureBuilder<...>
errors
((opts: ErrorFormatterOptions<{}>opts) => {
if (opts: ErrorFormatterOptions<{}>opts.ErrorFormatterOptions<TContext>.error: TRPCErrorerror.TRPCError.cause?: Error | undefinedcause instanceof class PaymentRequiredErrorPaymentRequiredError) { return { ...opts: ErrorFormatterOptions<{}>opts.ErrorFormatterOptions<TContext>.shape: DefaultErrorShapeshape,
data: {
    kind: "PAYMENT_REQUIRED";
    amountDue: number;
    code: TRPC_ERROR_CODE_KEY;
    httpStatus: number;
    path?: string;
    stack?: string;
}
data
: {
...opts: ErrorFormatterOptions<{}>opts.ErrorFormatterOptions<TContext>.shape: DefaultErrorShapeshape.TRPCErrorShape<DefaultErrorData>.data: DefaultErrorDatadata, kind: "PAYMENT_REQUIRED"kind: 'PAYMENT_REQUIRED' as type const = "PAYMENT_REQUIRED"const, amountDue: numberamountDue: opts: ErrorFormatterOptions<{}>opts.ErrorFormatterOptions<TContext>.error: TRPCErrorerror.TRPCError.cause?: PaymentRequiredErrorcause.PaymentRequiredError.amountDue: numberamountDue, }, }; } return var undefinedundefined; }); const
const addPostProcedure: MutationProcedure<{
    input: void;
    output: {
        success: boolean;
    };
    meta: object;
    errorShape: FoldErrorShape<FoldErrorShape<DefaultErrorShape, {
        data: {
            kind: "RATE_LIMIT";
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    } | undefined>, {
        data: {
            kind: "PAYMENT_REQUIRED";
            amountDue: number;
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    } | undefined>;
}>
addPostProcedure
=
const billedProcedure: ProcedureBuilder<object, object, {}, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<FoldErrorShape<DefaultErrorShape, {
    data: {
        kind: "RATE_LIMIT";
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>, {
    data: {
        kind: "PAYMENT_REQUIRED";
        amountDue: number;
        code: TRPC_ERROR_CODE_KEY;
        httpStatus: number;
        path?: string;
        stack?: string;
    };
    message: string;
    code: TRPC_ERROR_CODE_NUMBER;
} | undefined>>
billedProcedure
.
ProcedureBuilder<object, object, {}, UnsetMarker, UnsetMarker, UnsetMarker, UnsetMarker, false, FoldErrorShape<FoldErrorShape<DefaultErrorShape, { ...; } | undefined>, { ...; } | undefined>>.mutation<{
    success: boolean;
}>(resolver: ProcedureResolver<object, object, {}, UnsetMarker, UnsetMarker, {
    success: boolean;
}>): MutationProcedure<{
    input: void;
    output: {
        success: boolean;
    };
    meta: object;
    errorShape: FoldErrorShape<FoldErrorShape<DefaultErrorShape, {
        data: {
            kind: "RATE_LIMIT";
            code: TRPC_ERROR_CODE_KEY;
            httpStatus: number;
            path?: string;
            stack?: string;
        };
        message: string;
        code: TRPC_ERROR_CODE_NUMBER;
    } | undefined>, {
        ...;
    } | undefined>;
}>
mutation
(opts: ProcedureResolverOptions<object, object, {}, UnsetMarker>opts => {
if (function isPaymentRequired(opts: any): booleanisPaymentRequired(opts: ProcedureResolverOptions<object, object, {}, UnsetMarker>opts)) { throw new constructor PaymentRequiredError(amountDue: number): PaymentRequiredErrorPaymentRequiredError(100); } return { success: booleansuccess: true, }; });

All properties sent to errorFormatter()

tRPC is compliant with JSON-RPC 2.0

interface ErrorFormatterOpts {
  ErrorFormatterOpts.error: TRPCErrorerror: class TRPCErrorTRPCError;
  ErrorFormatterOpts.type: "query" | "mutation" | "subscription" | "unknown"type: 'query' | 'mutation' | 'subscription' | 'unknown';
  ErrorFormatterOpts.path: string | undefinedpath: string | undefined;
  ErrorFormatterOpts.input: unknowninput: unknown;
  ErrorFormatterOpts.ctx: unknownctx: unknown;
  
ErrorFormatterOpts.shape: {
    message: string;
    code: number;
    data: unknown;
}
shape
: { message: stringmessage: string; code: numbercode: number; data: unknowndata: unknown };
}

DefaultErrorShape:

type 
type DefaultErrorData = {
    code: TRPC_ERROR_CODE_KEY;
    httpStatus: number;
    path?: string;
    stack?: string;
}
DefaultErrorData
= {
code: "PARSE_ERROR" | "BAD_REQUEST" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_SUPPORTED" | "TIMEOUT" | "CONFLICT" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "UNSUPPORTED_MEDIA_TYPE" | "UNPROCESSABLE_CONTENT" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "CLIENT_CLOSED_REQUEST"code: type TRPC_ERROR_CODE_KEY = "PARSE_ERROR" | "BAD_REQUEST" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_SUPPORTED" | "TIMEOUT" | "CONFLICT" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "UNSUPPORTED_MEDIA_TYPE" | "UNPROCESSABLE_CONTENT" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "CLIENT_CLOSED_REQUEST"TRPC_ERROR_CODE_KEY; httpStatus: numberhttpStatus: number; /** * Path to the procedure that threw the error */ path?: string | undefinedpath?: string; /** * Stack trace of the error (only in development) */ stack?: string | undefinedstack?: string; }; interface DefaultErrorShape { DefaultErrorShape.message: stringmessage: string; DefaultErrorShape.code: TRPC_ERROR_CODE_NUMBERcode: type TRPC_ERROR_CODE_NUMBER = -32700 | -32600 | -32603 | -32001 | -32002 | -32003 | -32004 | -32005 | -32008 | -32009 | -32012 | -32013 | -32015 | -32022 | -32028 | -32029 | -32099TRPC_ERROR_CODE_NUMBER; DefaultErrorShape.data: DefaultErrorDatadata:
type DefaultErrorData = {
    code: TRPC_ERROR_CODE_KEY;
    httpStatus: number;
    path?: string;
    stack?: string;
}
DefaultErrorData
;
}