Webhooks Overview
Webhooks let Truedy push events to your server in real time when important things happen — a call ends, a batch campaign completes, a voice clone finishes training. Instead of polling the API every few seconds, your server gets notified the moment the event occurs.When to use webhooks
| Use case | Webhook to use |
|---|---|
| Update your CRM when a call completes | call.ended |
| Send a follow-up email after an outbound call | call.ended |
| Trigger a workflow when a campaign finishes | batch.completed |
| Monitor live call activity in your ops dashboard | call.started, call.joined |
| Alert on call failures | call.failed |
| Enable a voice once training is done | voice.training.completed |
How it works
You create a webhook endpoint in your app
A publicly accessible HTTPS URL that accepts
POST requests with a JSON body.You register the endpoint in Truedy
Dashboard → Settings → Webhooks → Add Endpoint. Paste your URL and choose which event types to receive.
Truedy dispatches the event
Truedy bundles the event data, signs it with HMAC-SHA256, and sends an HTTP
POST to your URL.Your server processes the event
Verify the signature, extract the event type and data, run your business logic.
Minimal working receiver
Here is a minimal webhook handler to get you started:Event payload structure
Every event Truedy sends has this envelope:| Field | Description |
|---|---|
event | Event type string, e.g. call.ended |
timestamp | ISO 8601 timestamp when the event was dispatched |
data | Event-specific payload — structure varies by event type |
Reliability guarantees
Truedy delivers webhooks at-least-once. Your receiver must be idempotent — the same event may arrive more than once if a delivery fails or times out.
- Extract a dedupe key from the payload (
data.call.callId,data.batch_id, etc.) - Before processing, check whether that key is already in your database
- If yes: return
204immediately - If no: process, then record the key atomically
Event families
| Family | Events |
|---|---|
| Calls | call.started, call.joined, call.ended, call.failed, call.billed |
| Batch/Campaigns | batch.status.changed, batch.completed |
| Voice training | voice.training.completed, voice.training.failed |
Next steps
Available Webhooks
Complete event catalogue with payload shapes
Securing Webhooks
Node.js, Python & Flask HMAC verification examples
Error Handling & Retries
Idempotent receiver implementation with DB example
Idempotency
Platform-wide idempotency patterns

