Vorel posts JSON webhooks to URLs you register, on tenant-scoped lifecycle events (lead created, conversation handoff requested, booking rescheduled, etc.). Bodies are HMAC-SHA256 signed; consumers dedupe on the envelope id; we run a 6-attempt backoff ladder before dead-lettering.Documentation Index
Fetch the complete documentation index at: https://docs.vorel.ai/llms.txt
Use this file to discover all available pages before exploring further.
Subscribe to events
Register webhook endpoints at/(dashboard)/settings/integrations/webhooks. Each subscription
carries:
target_url— your HTTPS endpoint. Vorel POSTs the envelope here.secret— auto-generated; used as the HMAC key. Surfaced once at create time, after that only the prefix is visible (rotate by recreating).- Subscribed event list — pick the subset you want; ignore the rest.
The 12 event types
| Event | Fires when |
|---|---|
lead.created | A lead row is created (qualification sub-agent or POST /v1/leads). |
lead.updated | Slot changes via the agent’s update_lead tool or PATCH /v1/leads/:id. |
lead.qualified | Lead status moves off 'new' (to qualified/booked/converted/etc.). |
conversation.created | First inbound from a new (tenant, customer) pair, or explicit POST /v1/conversations. |
conversation.handoff_requested | Handoff sub-agent fires or the request_handoff tool runs. |
conversation.closed | An operator action closes the conversation. |
booking.created | An appointment is booked (agent’s book_appointment tool or POST /v1/appointments). |
booking.rescheduled | scheduled_start or scheduled_end changes via PATCH. |
booking.cancelled | status transitions to 'cancelled'. |
booking.completed | status transitions to 'completed'. |
offering.created | A catalog offering is created via POST /v1/offerings. |
offering.updated | An offering is updated via PATCH /v1/offerings/:id. |
conversation.created fires today only on the public-API write path
(POST /v1/conversations). Internal ingest paths (inbound WhatsApp, inbound voice, webform
handler) don’t emit it yet — adding emission there has wider blast radius (every existing
customer message would suddenly produce a webhook). When that lands, the emission point is
the conversation-row insert in the inbound message handlers; the enum already covers it.Envelope shape
Every webhook body is a JSON object of this shape:id— a unique event id. Use it as your idempotency key. Vorel’s retry ladder may redeliver the same event up to 6 times; a 5xx that succeeded server-side but failed at the network layer will replay. Idempotent processing onidis non-negotiable.event— one of the 12 names above.created_at— ISO 8601 UTC.tenant_id— the tenant whose data triggered the event. Useful when one URL receives events for multiple tenants (or for sanity-checking).data— event-specific payload. Shapes are documented per-event (TODO: per-event payload schemas live in the OpenAPI spec at the corresponding resource).
Signature verification
Every request carries a header:Retry ladder
| Attempt | Behaviour |
|---|---|
| 1 | Immediate POST. |
| 2 | Retry after 60 seconds (5xx, timeout, or network error on attempt 1). |
| 3 | Retry after 5 minutes. |
| 4 | Retry after 30 minutes. |
| 5 | Retry after 2 hours. |
| 6 | Retry after 12 hours. |
| Past 6 | Dead-letter. The delivery moves to webhook_deliveries.status='dead_letter'; a tenant-admin alert fires. |
- 2xx response →
delivered. Terminal.delivered_atrecorded. - 4xx response →
permanent_fail. Terminal. No retry — a 4xx means we built a request the consumer rejected, and replaying it won’t change that. - 5xx response, timeout, or network error → retry per the ladder if budget remains; else
dead_letter.
Dead-letter handling
When a delivery exhausts the 6-attempt ladder:- The row’s
statusflips todead_letter. - The
response_bodycarries the last error text (truncated). - A tenant-admin alert fires (Sentry capture + dashboard surface).
Recommended consumer behaviour
- Idempotency on
idis a contract, not a suggestion. We will redeliver under transient failure. - Verify before parsing. Tampered bodies must return 4xx + we won’t retry them.
- Ack fast. 5xx triggers a retry; 4xx triggers
permanent_fail. If your processing is slow, enqueue and ack — don’t make Vorel wait.
Around-the-brain workflows
The post-booking-confirmation n8n template wiresbooking.created to a
24-hour-before-reminder via Vorel’s outbound conversation send. See Automation
for the v1 template set.
What’s NOT supported today
- Replay individual deliveries via API. Operator-only via the dashboard.
- Multi-event filters per subscription beyond the event-name set. No “deliver lead.created
only when
attributes.budget_max > 5_000_000” today — filter consumer-side. offering.deleted— there’s no DELETE-offering API path; soft-delete happens via the operator dashboard. The event will be added in lockstep when the tenant-side delete surface lands.- Per-event payload schemas in this docs site. Documented in the OpenAPI spec per-resource for now; a dedicated payload page is roadmap.
Related docs
- API introduction — surface overview
- Rate limits — outbound webhook delivery is itself rate-limited
- Automation — v1 templates that consume webhooks
- How it works — where webhook emission fits