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

FieldDescription
eventcall.completed or call.missed.
call.idCallTracker's ID for the call.
call.callerNumberThe caller's number in E.164 format.
call.durationCall length in seconds (0 for missed calls).
call.statusFinal call status reported by the carrier.
call.timestampWhen the call started (ISO 8601, UTC).
call.recordingUrlUsually null: recordings are processed after the call ends, so they are rarely ready when the event is sent.
call.transcriptionTextUsually 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.trafficSourceDetected 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 / msclkidGoogle, Meta and Microsoft click IDs, when present.
attribution.referrerUrl / landingPageReferring 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

  1. Open Settings → CRM and click Connect on the Custom Webhook card.
  2. Paste your endpoint URL and choose which events to send.
  3. 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.