POST requests that Timely.ai automatically sends to the URL you configure whenever a relevant event occurs in your workspace. Instead of polling the API, you receive data instantly — no latency, no wasted requests.
Why use webhooks
With webhooks you can:- Sync your CRM every time a new contact comes in or a conversation changes status
- Trigger external automations (Make, n8n, Zapier, your own backend) in response to events
- Feed BI dashboards with real-time data
- Integrate your own support systems by receiving messages as soon as they arrive
- Monitor channel health when a connection drops or encounters an error
How it works
You register an endpoint
Create a webhook in the dashboard or via API by providing your server URL and selecting which event categories you want to receive.
An event occurs
A contact sends a message, a conversation is closed, an appointment is created — anything you subscribed to.
Timely.ai sends a POST
We send a
POST with the event’s JSON payload to your URL, including the X-Timely-Signature header so you can validate authenticity.Development vs Production
- Development
- Production
Security: HMAC signature validation
Every delivery includes theX-Timely-Signature header in the format sha256=HEX. This value is the HMAC-SHA256 of the request body using the secret generated when the webhook was created.
Never skip validation. Any server on the internet could post fake data to your URL if you don’t verify the signature.
Automatic retries
If your URL does not respond with2xx within 10 seconds, Timely.ai automatically retries with exponential backoff:
| Attempt | Wait before retry |
|---|---|
| 1st failure | 5 seconds |
| 2nd failure | 15 seconds |
| 3rd failure | 60 seconds |
| 4th failure | 5 minutes |
| 5th failure | 15 minutes |
failing and you receive an alert email. The webhook remains active — new events continue to be queued — but you need to check the endpoint before more deliveries fail.
Check the delivery history at
GET /v1/webhooks/{id}/deliveries to see the status of each attempt, the HTTP code returned, and the response time.How to create a webhook
- Dashboard
- API
- Go to Settings → Webhooks in the sidebar
- Click New webhook
- Enter the destination URL and select the events you want to receive
- Copy the generated secret — it is shown only once
- Save and use the Test button to validate delivery
Best practices
Respond fast
Return
200 OK immediately and process the event asynchronously (queue, worker, task). Never make database calls or third-party API calls before responding.Idempotency via event_id
Every payload includes a unique
event_id field. Store processed IDs and ignore duplicates — retries may re-deliver the same event.Secret in a vault
Never expose the secret in unencrypted environment variables in CI, logs, or source code. Use a dedicated secret manager.
Monitor failures
Set up alerts on your end as well. Use
GET /v1/webhooks/{id}/deliveries periodically or integrate with your observability system.Event categories
See the detailed documentation for each event category:Conversations
conversation.created, .assigned, .closed, .reopenedMessages
message.received, .sent, .failed, .delivered, .readContacts
contact.created, .updated, .deletedAgent
agent.handoff_started, .handoff_completed, .transferredAppointments
appointment.scheduled, .rescheduled, .canceled, .reminder_sentChannels
channel.connected, .disconnected, .errorBilling
credit.low, .depleted, plan.changed, trial.expiring, .expired