Schema Validation
Schema Validation
All server function inputs are validated with Zod via TanStack Start's inputValidator.
How it works
import { z } from 'zod';
import { createServerFn } from '@tanstack/react-start';
export const createItem = createServerFn({ method: 'POST' })
.inputValidator(
z.object({
title: z.string().min(1).max(200),
})
)
.handler(async ({ data }) => {
// data.title is guaranteed to be a string of 1–200 chars
});
inputValidator runs before the handler. Invalid input returns a 400 error automatically: no manual checking needed.
Server route validation
TanStack Start server routes (createFileRoute + server.handlers) validate with Zod manually:
import { z } from 'zod';
const schema = z.object({ email: z.string().email() });
const body = await request.json();
const parsed = schema.safeParse(body);
if (!parsed.success) {
return Response.json({ error: 'Invalid email' }, { status: 400 });
}
// parsed.data.email is safe
Conventions
- Validate at system boundaries only (user input, webhooks, external APIs)
- Trust internal function calls: don't validate data that comes from your own DB
- Use
.min()/.max()on strings to prevent oversized payloads - Use
.email()for email fields: Zod validates format, not deliverability