Local Delivery
Webhook endpoints are server-answered: OtterKit answers the sender whether or not anything of yours is running. --deliver adds a local mirror on top - every capture is also sent to a server on your machine, so your app under development receives real events while the public URL keeps answering on its own. If your app is down, the sender still gets its 200; you just miss the mirror (the capture is in history either way).
# Mirror every capture to localhost:3000 (port, host:port, or full URL)
npx otterkit webhook --deliver 3000
# Mirror to a specific route
npx otterkit webhook --deliver http://localhost:8787/stripe-eventsRun a command per capture
--deliver-exec runs a shell command for each capture instead of (or alongside) --deliver. The request body arrives on stdin; metadata comes in OTTERKIT_* environment variables (method, path, headers, verification verdict) - enough to script a rebuild, a test run, or a notification without any HTTP server at all.
# Kick a script whenever a verified Stripe event lands
npx otterkit webhook --verify stripe:whsec_… --deliver-exec './on-payment.sh'
# Combine both: mirror to the app AND log a line per event
npx otterkit webhook --deliver 3000 --deliver-exec 'jq -r .type >> events.log'--forward (server-side, survives your machine sleeping) rather than replacing it. Use --forward for durability, --deliver for development speed.Schema inference
Once an endpoint has stored history, OtterKit can tell you what the sender actually delivers: TypeScript types and JSON Schema inferred from the captured bodies, field by field, with optionality taken from real traffic. In the console it's the Types card on any endpoint; agents get the same thing as the schema_infer MCP tool or GET /schema on the agent API.