Platform Events Reference
This section is the definitive source for all webhook event types emitted by Sent.
Event Structure
Every event that your webhook endpoint will receive has a consistent envelope:
{
"field": "message",
"sub_type": "message.delivered",
"timestamp": "2025-10-31T10:10:42Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"message_id": "8ba7b830-9dad-11d1-80b4-00c04fd430c8",
"message_status": "DELIVERED",
"channel": "sms",
"inbound_number": "+1234567890",
"outbound_number": "+1987654321",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8"
}
}{
"field": "message",
"sub_type": "message.received",
"timestamp": "2025-10-31T10:10:42Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"from": "+1234567890",
"to": "+1987654321",
"text": "Hello, I have a question about my order",
"channel": "sms",
"provider": "Telnyx",
"received_at": "2025-10-31T10:10:40Z"
}
}{
"field": "templates",
"timestamp": "2025-10-31T12:18:14Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8",
"template_name": "order_confirmation",
"whatsapp_template_id": "1234567890123456",
"status": "APPROVED",
"language": "en_US",
"category": "UTILITY",
"channel": "whatsapp",
"reason": null
}
}| Field | Type | Description |
|---|---|---|
field | string | The parent event type: message or templates |
sub_type | string | omitted | Granular sub-type (e.g. message.delivered). Present for all message events; omitted for template events |
timestamp | string | ISO 8601 timestamp of event creation |
payload | object | Nested object containing event-specific data |
Event Types & Details
Below you will find the details of the events that you will receive in your webhook endpoint.
Your handler receives the full event object — field, timestamp, and the nested payload. The Sent Dashboard also tracks delivery metadata (HTTP status, attempts, response body) separately from the event payload itself.
message
Triggered whenever a message's delivery status changes, or when an inbound message is received. Each status transition fires a separate event with a matching sub_type.
Outbound message status events:
{
"field": "message",
"sub_type": "message.queued",
"timestamp": "2025-10-31T12:10:05Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"message_id": "8ba7b830-9dad-11d1-80b4-00c04fd430c8",
"message_status": "QUEUED",
"channel": "sms",
"inbound_number": "+1234567890",
"outbound_number": "+1987654321",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8"
}
}{
"field": "message",
"sub_type": "message.routed",
"timestamp": "2025-10-31T12:10:22Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"message_id": "8ba7b830-9dad-11d1-80b4-00c04fd430c8",
"message_status": "ROUTED",
"channel": "sms",
"inbound_number": "+1234567890",
"outbound_number": "+1987654321",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8"
}
}{
"field": "message",
"sub_type": "message.sent",
"timestamp": "2025-10-31T12:12:33Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"message_id": "8ba7b830-9dad-11d1-80b4-00c04fd430c8",
"message_status": "SENT",
"channel": "sms",
"inbound_number": "+1234567890",
"outbound_number": "+1987654321",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8"
}
}{
"field": "message",
"sub_type": "message.delivered",
"timestamp": "2025-10-31T12:15:42Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"message_id": "8ba7b830-9dad-11d1-80b4-00c04fd430c8",
"message_status": "DELIVERED",
"channel": "sms",
"inbound_number": "+1234567890",
"outbound_number": "+1987654321",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8"
}
}{
"field": "message",
"sub_type": "message.read",
"timestamp": "2025-10-31T11:45:06Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"message_id": "8ba7b830-9dad-11d1-80b4-00c04fd430c8",
"message_status": "READ",
"channel": "whatsapp",
"inbound_number": "+1234567890",
"outbound_number": "+1987654321",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8"
}
}{
"field": "message",
"sub_type": "message.failed",
"timestamp": "2025-10-31T09:52:24Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"message_id": "8ba7b830-9dad-11d1-80b4-00c04fd430c8",
"message_status": "FAILED",
"channel": "sms",
"inbound_number": "+1234567890",
"outbound_number": "+1987654321",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8"
}
}Outbound Message Event Fields (message.queued through message.failed):
| Field | Type | Description |
|---|---|---|
field | string | Parent event type: message |
sub_type | string | Granular sub-type — one of message.queued, message.routed, message.sent, message.delivered, message.read, message.failed |
timestamp | string | ISO 8601 timestamp of the event |
payload.account_id | string | Your account UUID |
payload.message_id | string | Message UUID — use this to look up the message in your DB |
payload.message_status | string | QUEUED, ROUTED, SENT, DELIVERED, READ, FAILED |
payload.channel | string | sms or whatsapp |
payload.inbound_number | string | Recipient phone number (E.164 format) |
payload.outbound_number | string | Sender phone number |
payload.template_id | string | null | UUID of the template used (null if no template) |
Note: The Sent Dashboard shows additional metadata about webhook delivery (attempts, HTTP status, response body) that is not part of the event payload itself.
Inbound message event (message.received):
Fires when an end-user sends a message to one of your provisioned numbers — for example, a reply to an outbound campaign, or a STOP/START/HELP keyword. The payload shape is different from outbound status events:
{
"field": "message",
"sub_type": "message.received",
"timestamp": "2025-10-31T10:10:42Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"from": "+1234567890",
"to": "+1987654321",
"text": "Hello, I have a question about my order",
"channel": "sms",
"provider": "Telnyx",
"received_at": "2025-10-31T10:10:40Z"
}
}Inbound Message Event Fields (message.received):
| Field | Type | Description |
|---|---|---|
field | string | Parent event type: message |
sub_type | string | Always message.received |
timestamp | string | ISO 8601 timestamp of the event |
payload.account_id | string | Your account UUID |
payload.from | string | Sender's phone number (the contact) in E.164 format |
payload.to | string | Your provisioned number that received the message |
payload.text | string | null | Message body text |
payload.channel | string | sms |
payload.provider | string | Underlying carrier provider (Telnyx, Sinch, or Vibes) |
payload.received_at | string | ISO 8601 timestamp when the provider received the message |
Status Definitions:
| Status | Sub-type | Direction | Description |
|---|---|---|---|
QUEUED | message.queued | Outbound | Message accepted and waiting to be dispatched |
ROUTED | message.routed | Outbound | Message assigned to a carrier or provider |
SENT | message.sent | Outbound | Message sent to carrier or WhatsApp |
DELIVERED | message.delivered | Outbound | Message delivered to recipient's device |
READ | message.read | Outbound | Message read by recipient (WhatsApp only) |
FAILED | message.failed | Outbound | Message delivery failed permanently |
RECEIVED | message.received | Inbound | Inbound message received from a contact |
templates
Triggered when a WhatsApp template moves through the approval process.
{
"field": "templates",
"timestamp": "2025-10-31T12:18:14Z",
"payload": {
"account_id": "7ba7b820-9dad-11d1-80b4-00c04fd430c8",
"template_id": "9ba7b840-9dad-11d1-80b4-00c04fd430c8",
"template_name": "order_confirmation",
"whatsapp_template_id": "1234567890123456",
"status": "APPROVED",
"language": "en_US",
"category": "UTILITY",
"channel": "whatsapp",
"reason": null
}
}Template Event Fields:
| Field | Type | Description |
|---|---|---|
field | string | Event type: templates |
timestamp | string | ISO 8601 timestamp of the event |
payload.account_id | string | Your account UUID |
payload.template_id | string | Template UUID in Sent |
payload.template_name | string | Template name |
payload.whatsapp_template_id | string | Meta's WhatsApp template ID (empty string until approved) |
payload.status | string | Template status: DRAFT, PENDING, APPROVED, REJECTED |
payload.language | string | Template language code (e.g. en_US) |
payload.category | string | Template category: MARKETING, UTILITY, AUTHENTICATION |
payload.channel | string | Channel: whatsapp |
payload.reason | string | null | Rejection reason (non-null only when status is REJECTED) |
Event Filtering
You can configure which events to receive in the webhook settings in your Sent Dashboard to reduce noise and improve performance.
Subscribe to specific event types when creating or updating a webhook by setting event_types and, optionally, event_filters:
{
"event_types": ["message", "templates"],
"event_filters": {
"message": ["delivered", "failed", "read", "received"]
}
}The event_filters map accepts a parent event_type as the key and a list of sub-type suffixes as values. In the example above only message.delivered, message.failed, message.read, and message.received events are delivered — message.queued, message.routed, and message.sent are suppressed.
Available Sub-type Filters for message:
| Value | Fires for | Direction |
|---|---|---|
queued | message.queued | Outbound |
routed | message.routed | Outbound |
sent | message.sent | Outbound |
delivered | message.delivered | Outbound |
read | message.read | Outbound (WhatsApp only) |
failed | message.failed | Outbound |
received | message.received | Inbound |
Available Filters:
- Message — Subscribe to all or specific
message.*sub-types (outbound status + inboundmessage.received) - Templates — Filter by specific template names
Rate Limits
Webhook delivery is subject to rate limits to ensure reliability:
- Per endpoint: 200 requests per minute
- Retry backoff: Exponential backoff on failures
- Max payload size: 10MB per event
Rate Limit Handling
If your endpoint consistently exceeds rate limits, webhook delivery may be temporarily suspended. Ensure your endpoint can handle the expected event volume.