We use optional, privacy-safe analytics to understand which pages help visitors. Nothing optional runs until you choose. Privacy policy

Skip to content
Webhooks

iMessage webhooks

Receive customer replies and delivery outcomes as signed HTTP events. SendiMessage posts to your endpoint when an inbound message arrives and when an outbound message reaches a final state.

How do iMessage webhooks work?

You register an endpoint and subscribe to events. When a customer replies, SendiMessage posts a signed receive event to your URL; when an outbound message reaches a final state, it posts an outbound event. Each delivery carries a X-SMSBridge-Signature header you verify before trusting the body.

Events

receive

An inbound message arrived on one of your lines.

outbound

An outbound message reached a final state.

line_blocked / line_unblocked

A line was blocked, or recovered.

Inbound payload

receive event
{
"event": "receive",
"message_handle": "96699B14-AFDB-4B33-AA66-C4B093533DA3",
"from": "+14155550123",
"to": "+15555550100",
"content": "Can we move it to 3 PM?",
"media_url": null,
"service": "iMessage",
"is_outbound": false,
"status": "RECEIVED",
"date_sent": "2026-08-21T09:07:35Z",
"conversation_handle": "ee60f9b5-2ddb-4ea8-8ad7-bc70cf85727f"
}

Signatures

When a webhook has a secret configured, each delivery includes X-SMSBridge-Signature — the hex HMAC-SHA256 of the raw request body computed with your webhook secret. Verify against the exact raw bytes received using a constant-time comparison.

Delivery semantics

Each event is delivered as exactly one POST with a 10-second timeout — there are no automatic retries, and your response status is not inspected. Treat webhooks as a low-latency hint and the API as the source of truth: everything an event carries is also queryable from GET /v2/messages (and GET /lines for block state), so a missed delivery is always recoverable by reconciliation.

FAQ

What signature header is used?

X-SMSBridge-Signature is the only signature header the API emits — an HMAC-SHA256 of the raw request body you verify with your webhook secret.

How do I test my endpoint?

Send a message and reply from a test recipient on your provisioned line, then verify the signature on the delivered event. See the webhook docs for verification code.

Implement webhooks

The full reference has verification examples in Node.js and Python.

Related