TL;DR: A Webhook trigger gives a playbook a unique HTTP endpoint. External systems POST to that URL to start a run, and the request body is available to the playbook's steps as input. Use webhooks to start playbooks from services that emit outbound events, and use the runs stream to react when a run finishes.
Developers connecting Ballet to systems that emit outbound webhooks (helpdesks, CRMs, CI, payment processors).
curl https://api.ballet.dev/api/webhooks/<your-webhook-path> \
-H "Content-Type: application/json" \
-d '{ "ticketId": "123", "subject": "Refund request" }'
Configure the exact endpoint from the playbook's Trigger panel — it is unique per playbook. Webhook endpoints are served from api.ballet.dev, not app.ballet.dev.
For admin-facing steps in each system, use these Connecting Tools guides:
For your own backend or CI, prefer the authenticated REST execute endpoint.
Subscribe to GET /api/playbooks/:id/runs/stream and watch for the run_stop event, which carries success and output. This lets an external observer act on completion without being the caller that started the run. See Stream run events.