company logo

Help center

Go to K3X
All collectionsMessaging & VoiceWebhooks for inbound calls and SMS

Webhooks for inbound calls and SMS

Trigger Agents and external tools the moment a call rings or an SMS arrives — the bridge between Messaging & Voice and the rest of your stack.

When someone calls or texts your K3X number, you usually want something to happen automatically: an Agent qualifies the lead, your team gets a Slack ping, a row lands in a sheet. Webhooks are the bridge.

If you've read Webhooks in K3X — the basics in the Integrations collection, this article is the inbound-channel-specific version: which events fire for calls and SMS, what's in each payload, and the patterns that show up most often.

Inbound events you can wire up.

For each phone number, K3X emits webhook events for these inbound moments:

  • sms.received — inbound SMS arrived (text body, sender, recipient, message ID).

  • mms.received — inbound MMS arrived (same as above plus attachment URLs).

  • call.ringing — inbound call is ringing your number, hasn't been answered yet.

  • call.answered — someone (a user or an Agent) picked up.

  • call.completed — call ended. Payload includes duration, recording URL (if recorded), transcript URL (if transcribed).

  • call.missed — call wasn't answered within the ring window.

  • voicemail.received — caller left a voicemail. Payload includes audio URL, transcript, and the lead it was attached to.

Two ways to react.

1. Trigger a K3X Agent. The most common pattern. Open the Agent, add a trigger for the event you care about, and the Agent runs every time it fires. See Webhooks in K3X — the basics.

2. POST to an external URL. If you want a Make/Zapier/n8n scenario to react (notify Slack, sync to a sheet, log to a data warehouse), add an outbound webhook to the number under Settings → Phone Numbers → [number] → Webhooks. Pick the events you want and the destination URL. See Connect K3X with Make.com / Zapier / n8n.io.

You can do both at once — an Agent handles the in-K3X work, an outbound webhook tells the rest of your stack.

Example payload (sms.received).

{
  "event": "sms.received",
  "event_id": "evt_01HZB9C8X4",
  "timestamp": "2026-05-18T14:23:51Z",
  "data": {
    "message_id": "msg_8f4a2",
    "from": "+14155550123",
    "to": "+14155550100",
    "body": "Hi, wanted to follow up on yesterday's demo.",
    "lead_id": "lead_xyz789",
    "contact_id": "con_abc456"
  }
}

Example payload (call.completed):

{
  "event": "call.completed",
  "event_id": "evt_01HZB9C8X5",
  "timestamp": "2026-05-18T14:28:14Z",
  "data": {
    "call_id": "call_9d3b8",
    "direction": "inbound",
    "from": "+14155550123",
    "to": "+14155550100",
    "duration_seconds": 263,
    "status": "answered",
    "answered_by_user_id": "usr_mke7q",
    "recording_url": "https://api.k3x.ai/v1/recordings/rec_2a8f1",
    "transcript_url": "https://api.k3x.ai/v1/transcripts/tsc_2a8f1",
    "lead_id": "lead_xyz789"
  }
}

All inbound payloads are signed with HMAC-SHA256 — verify the X-K3X-Signature header on your end before trusting the body. See Webhooks in K3X — the basics for the verification snippet.

Recipes that show up most.

  • Auto-qualify inbound calls. An Agent listens for call.answered, waits for call.completed, reads the transcript, and updates the lead's qualification status. Slack channel gets a one-line summary.

  • Missed call recovery. Agent on call.missed texts the caller within 30 seconds: "Sorry we missed you — here's a link to book a callback." Bumps conversion meaningfully.

  • SMS conversation handoff. Agent on sms.received classifies intent. If it's a support question, it routes the conversation to a support tool via outbound webhook. If it's a sales reply, it pings the lead's owner.

  • Voicemail auto-summarize. Agent on voicemail.received reads the transcript, generates a 1-line summary, and posts to the team's Slack channel with the lead link.

  • Compliance log. Outbound webhook on every sms.received POSTs to a Make scenario that appends to a Google Sheet — instant audit trail outside K3X for legal review.

Throughput and retries.

  • K3X delivers events within ~1 second of them happening in real life.

  • On 5xx responses from your endpoint, K3X retries with exponential backoff: 1s, 5s, 30s, 2m, 10m, 1h, 6h. After 7 failed attempts the event is dead-lettered.

  • On 4xx responses, K3X treats it as "sender misunderstood me, don't retry" and gives up immediately.

  • Dead-lettered events are visible under Settings → Phone Numbers → [number] → Webhooks → Failures. You can replay them manually.

Per-number vs org-wide.

By default, webhooks are configured per number. If you have 10 numbers and want the same Slack notification for all of them, you have to add the webhook to each.

For events that should fire across all your numbers (compliance logging, central data sync), use Settings → Compliance → Org-wide webhooks instead. These fire once per event regardless of which number it came from.

Security notes.

  • Always verify the HMAC signature before acting on a payload. Without verification, anyone who guesses your endpoint URL can fake events.

  • Your destination URL should be HTTPS only. K3X refuses to send to http:// URLs.

  • Consider IP-allowlisting K3X's webhook senders if your endpoint is behind a firewall. The current IPs are documented on the K3X status page.

  • Phone number webhook URLs are visible to anyone with edit access to the number. Don't put secrets in the URL itself — use a signing secret instead.

That's the Messaging & Voice collection. The Integrations collection has the deeper dive on building Agent webhook triggers and on connecting Make, Zapier, and n8n.

Did this answer your question?
😞
😐
😁