Developers
Webhook documentation
CallTracker sends an HTTP POST with a JSON body to your URL when a tracked call ends. Webhooks are the way to get call and attribution data into your own systems: CallTracker does not have a public REST API.
When webhooks fire
- call.completed — when a connected call ends. Enabled by default.
- call.missed — when a forwarded call is not answered. Off by default; enable it per integration.
- You can set a minimum duration so short completed calls are not sent.
Request
- Method: POST, body: JSON (Content-Type: application/json).
- X-Event-Type: the event name, for example call.completed.
- X-Webhook-Secret: a secret generated for your integration (whsec_…). It is not yet shown in the dashboard; email [email protected] if you need it to verify requests.
Example payload
{
"event": "call.completed",
"call": {
"id": "clx2k9d0f0001",
"callerNumber": "+4791234567",
"duration": 184,
"status": "completed",
"timestamp": "2026-10-01T09:14:03.000Z",
"recordingUrl": null,
"transcriptionText": null
},
"placement": {
"id": "clx2k8z1a0000",
"name": "Google Ads - Search",
"trackingNumber": "+4721000000"
},
"attribution": {
"trafficSource": "GOOGLE_ADS",
"utmSource": "google",
"utmMedium": "cpc",
"utmCampaign": "plumbing-oslo",
"utmTerm": "emergency plumber",
"utmContent": null,
"gclid": "Cj0KCQjw...",
"fbclid": null,
"msclkid": null,
"referrerUrl": "https://www.google.com/",
"landingPage": "https://example.com/emergency"
},
"workspace": {
"id": "clx2k7y2b0000",
"name": "Example Plumbing"
}
}Values above are illustrative.
Fields
| Field | Description |
|---|---|
| event | call.completed or call.missed. |
| call.id | CallTracker's ID for the call. |
| call.callerNumber | The caller's number in E.164 format. |
| call.duration | Call length in seconds (0 for missed calls). |
| call.status | Final call status reported by the carrier. |
| call.timestamp | When the call started (ISO 8601, UTC). |
| call.recordingUrl | Usually null: recordings are processed after the call ends, so they are rarely ready when the event is sent. |
| call.transcriptionText | Usually null for the same reason; transcripts are generated after the call. |
| placement.* | ID, name and tracking number of the placement that received the call. |
| attribution.trafficSource | Detected traffic source for website calls (null for offline placements). |
| attribution.utm* | UTM source, medium, campaign, term and content captured by the website snippet. |
| attribution.gclid / fbclid / msclkid | Google, Meta and Microsoft click IDs, when present. |
| attribution.referrerUrl / landingPage | Referring URL and first page of the visit. |
| workspace.* | ID and name of the workspace that owns the placement. |
Delivery
- Respond with any 2xx status to mark the delivery successful.
- Non-2xx responses and network errors are recorded, and the last error is shown on the integration in Settings → CRM.
- Failed deliveries are not retried automatically.
- New and changed endpoints must use https://; URLs that resolve to private or internal network addresses are rejected.
Set up a webhook
- Open Settings → CRM and click Connect on the Custom Webhook card.
- Paste your endpoint URL and choose which events to send.
- Call one of your tracking numbers and check that your endpoint receives the payload.
Prefer no code? The Zapier integration receives the same payload, and Slack and Microsoft Teams receive a formatted message instead.
Start sending call data to your stack
Webhooks are included in CallTracker Pro at no extra cost.