Validate workflow payloads
Parse and validate request payloads before starting a workflow.
Validate payloads before calling runWorkflow() so workflow definitions can focus on background work instead of request cleanup.
Use a parser function
import { validatePayload } from '@vitehub/workflow'
const payload = await validatePayload(rawPayload, (value) => {
if (!value || typeof value !== 'object') {
throw new TypeError('Expected an object payload.')
}
return value as { email: string }
})
Use a schema
validatePayload() and readValidatedPayload() accept schema objects with parse() or safeParse().
import { validatePayload } from '@vitehub/workflow'
import { z } from 'zod'
const welcomePayload = z.object({
email: z.string().email(),
marker: z.string().optional(),
})
const payload = await validatePayload(rawPayload, welcomePayload)
Validate inside framework routes
Framework helpers are still a good fit when they already expose body parsing. Read the request body with the framework helper, validate the parsed value, then call runWorkflow().
Full route examples
server/api/welcome.post.ts
import { runWorkflow, validatePayload } from '@vitehub/workflow'
import { z } from 'zod'
const welcomePayload = z.object({
email: z.string().email(),
marker: z.string().optional(),
})
export default defineEventHandler(async (event) => {
const rawPayload = await readBody(event)
const payload = await validatePayload(rawPayload, welcomePayload)
const run = await runWorkflow('welcome', payload)
return { ok: true, run }
})
The validation helpers throw the parser or schema error directly so the route can map it to the framework's normal error response.

