Delivery behavior
All events share the same delivery contract:| Property | Value |
|---|---|
| Method | POST |
| Content-Type | application/json |
| Timeout | 5 seconds |
| Retry attempts | 5 (exponential backoff) |
| Deduplication | Events may be delivered more than once; use event + payload IDs to deduplicate |
Event categories
- SMS Messages — inbound, sent, delivered, failed
- WhatsApp Messages — inbound and outbound message status
- WhatsApp Templates — template lifecycle
- WhatsApp Contacts — contact lifecycle and preferences
- WhatsApp Groups — group lifecycle, participants, and settings
- WhatsApp Account — account connected/disconnected, alerts
- WhatsApp WABA — business account capability and review changes
- WhatsApp Phone Numbers — phone number quality, name, security, deregistration
- Partner & Payment — partner solutions and payment config (log-only)
- Calling — call lifecycle, participants, recordings, voicemails
SMS Messages
SMS message events fire for inbound and outbound SMS/MMS messages.messages.sms.received
Fires immediately when an inbound SMS or MMS message arrives on one of your phone numbers.
messages.sms.received
type is mms and mediaUrl / mediaId reference the attached media.
messages.sms.sent
Fires when a message you sent has been accepted by the carrier.
messages.sms.sent
messages.sms.delivered
Fires when the carrier confirms delivery to the recipient’s device.
messages.sms.delivered
messages.sms.failed
Fires when message delivery fails. The error field uses the same structure as API error responses.
messages.sms.failed
WhatsApp Messages
WhatsApp message events use a single payload shape (data.message) for both inbound and outbound messages. The direction and timestamp fields tell you which lifecycle stage you’re at.
messages.whatsapp.received
Fires immediately when an inbound WhatsApp message arrives on one of your phone numbers.
messages.whatsapp.received
type is image, video, audio, document, sticker, location, contacts, reaction, interactive, order, or system), the corresponding nested object on data.message is populated. See Receiving WhatsApp messages for examples of every type.
messages.whatsapp.sent
Fires when a message you sent has been accepted by WhatsApp servers.
messages.whatsapp.sent
messages.whatsapp.delivered
Fires when WhatsApp confirms the message was delivered to the recipient’s device.
messages.whatsapp.delivered
messages.whatsapp.read
Fires when the recipient opens and reads the message.
messages.whatsapp.read
messages.whatsapp.failed
Fires when message delivery fails. The error field uses the same structure as API error responses.
messages.whatsapp.failed
account_restricted or display_name_not_approved, Chirp enriches the error.provider field with Health Status details. See WhatsApp webhooks for the enriched shape.
WhatsApp Templates
Template events fire when Meta updates a template’s status, quality, category, or components.templates.whatsapp.created
Fires when a template is approved or first synced to Chirp.
templates.whatsapp.created
templates.whatsapp.updated
Fires when any template field changes: status, quality score, category, or components. The change.type field describes what changed.
templates.whatsapp.updated (quality change)
templates.whatsapp.deleted
Fires when a template is deleted from Meta.
templates.whatsapp.deleted
templates.whatsapp.connected
Fires when an existing Meta template is linked to one of your Chirp apps.
templates.whatsapp.connected
WhatsApp Contacts
Contact events track the lifecycle of contacts you’ve interacted with via WhatsApp.contacts.whatsapp.created
Fires when Chirp first sees a contact (first message sent or received with that phone number).
contacts.whatsapp.created
contacts.whatsapp.updated
Fires when a contact’s profile name changes.
contacts.whatsapp.updated
contacts.whatsapp.deleted
Fires when a contact is removed (e.g., opt-out or data deletion).
contacts.whatsapp.deleted
whatsapp.contact.preferences_updated New
Fires when a contact changes their marketing message preferences (opt-in/opt-out). Meta delivers this in real-time.
whatsapp.contact.preferences_updated
preferences.marketing.status is "stop" when the contact opts out of marketing messages and "resume" when they opt back in. Stop sending marketing messages immediately to remain compliant with WhatsApp’s policies.
whatsapp.contact.automatic_event New
Fires when a Click-to-WhatsApp (CTWA) ad triggers a conversion event (e.g., Purchase). Used for ads attribution. Meta delivers this in real-time.
whatsapp.contact.automatic_event
ctwaClid is the click ID from the ad — pass it back to Meta’s Conversions API to close the attribution loop. It is null for Status ad placements.
WhatsApp Groups
Group events fire when WhatsApp groups owned by your phone numbers change. Every payload includes the affectedgroup, the owning whatsappPhoneNumber, and the app. See WhatsApp Groups for the corresponding REST API.
groups.whatsapp.created
Fires when a new group is created and owned by one of your phone numbers.
groups.whatsapp.created
groups.whatsapp.deleted
Fires when a group is deleted.
The payload shape is identical to groups.whatsapp.created with event set to groups.whatsapp.deleted.
groups.whatsapp.suspended
Fires when WhatsApp suspends a group (e.g., for policy violations).
The payload shape is identical to groups.whatsapp.created with group.suspended set to true.
groups.whatsapp.suspension_cleared
Fires when WhatsApp lifts a previous suspension.
The payload shape is identical to groups.whatsapp.created with group.suspended set to false.
groups.whatsapp.participant_added
Fires when one or more participants join the group.
groups.whatsapp.participant_added
participants[].waId is the participant’s WhatsApp ID (phone number without the +). joinedAt may be null when WhatsApp does not provide a timestamp.
groups.whatsapp.participant_removed
Fires when one or more participants are removed by an admin.
groups.whatsapp.participant_removed
initiatedBy is "business" when an admin removed the participant, or "participant" when the participant left voluntarily (in which case groups.whatsapp.participant_left typically fires instead).
groups.whatsapp.participant_left
Fires when a single participant voluntarily leaves the group.
groups.whatsapp.participant_left
groups.whatsapp.join_request_created
Fires when someone requests to join a group whose joinApprovalMode is approval_required.
groups.whatsapp.join_request_created
POST /v1/whatsapp/groups/{groupId}/join-requests/approve or /reject.
groups.whatsapp.join_request_revoked
Fires when a pending join request is revoked (either by the requester or the admin).
The payload shape is identical to groups.whatsapp.join_request_created with event set to groups.whatsapp.join_request_revoked.
groups.whatsapp.settings_updated
Fires when the group subject, description, or profile picture changes.
groups.whatsapp.settings_updated
changes may contain any of subject, description, or profilePicture. When an update fails, updateSuccessful is false and the corresponding errors array is populated.
WhatsApp Account
Account events fire when a WhatsApp Business Account (WABA) is connected or disconnected via Embedded Signup, or when Meta raises an alert.whatsapp.account.connected
Fires immediately when a customer completes Embedded Signup and grants your app access to their WABA.
whatsapp.account.connected
state and metadata are values you passed during the Embedded Signup flow to correlate the event with your internal user.
whatsapp.account.disconnected
Fires when a WABA is disconnected — either by the customer revoking access or by your app removing it.
whatsapp.account.disconnected
whatsapp.account.alert_raised New
Fires when Meta raises a compliance or policy alert against a WABA or phone number. Meta delivers this in real-time.
whatsapp.account.alert_raised
alert may be null if Meta does not provide it for that alert type.
WhatsApp WABA
whatsapp.waba.review_updated New
Fires when Meta completes a policy review of the WABA. Meta delivers this in real-time.
whatsapp.waba.review_updated
review.decision is one of APPROVED, REJECTED, PENDING, or DEFERRED.
whatsapp.waba.capability_changed New
Fires when a WABA capability value changes — for example, when your daily conversation limit is upgraded. Meta delivers this in real-time.
whatsapp.waba.capability_changed
oldValue is null if this is the first time Chirp has observed the capability.
WhatsApp Phone Numbers
Phone number events track quality, name verification, security, and registration changes.whatsapp.phone_number.name_updated New
Fires when Meta makes a decision on a display name change request. Meta delivers this in real-time.
whatsapp.phone_number.name_updated
nameStatus is one of APPROVED, REJECTED, PENDING, or DEFERRED. When nameStatus is REJECTED, nameRejectionReason contains Meta’s reason code.
whatsapp.phone_number.quality_changed New
Fires when Meta updates the quality rating or throughput tier for a phone number. Meta delivers this in real-time.
whatsapp.phone_number.quality_changed
qualityRating is GREEN, YELLOW, or RED, or null for newly-onboarded phones with no rating yet. qualityEvent describes what triggered the change: FLAGGED, ONBOARDED, ONBOARDING, UPGRADE, or THROUGHPUT_UPGRADE.
whatsapp.phone_number.security_event New
Fires when a two-step verification PIN event occurs on a phone number. Meta delivers this in real-time.
whatsapp.phone_number.security_event
eventType is one of:
PIN_CHANGED— two-step PIN was changedPIN_RESET_REQUEST— a PIN reset was requestedPIN_REQUEST_SUCCESS— PIN reset completed successfully
requester is the Meta Business Suite user ID who triggered the event, or null if not provided by Meta.
whatsapp.phone_number.deregistered New
Fires when Chirp detects that a phone number’s verification status has changed from verified to unverified. This event is poll-driven — phones with messages in the last 7 days are checked every 15 minutes; idle phones every 6 hours. Delivery may lag by up to ~6 hours for idle numbers.
whatsapp.phone_number.deregistered
Partner & Payment
These events are delivered as-is from Meta. Chirp logs them for observability but does not currently take automated action on them.whatsapp.partner_solution.updated New
Fires when a Meta multi-partner solution linked to the WABA is created or updated. Meta delivers this in real-time.
whatsapp.partner_solution.updated
whatsapp.payment_config.updated New
Fires when the payment gateway configuration for the WABA changes. Meta delivers this in real-time.
whatsapp.payment_config.updated
Calling
Calling events track the lifecycle of voice calls. Every payload includes aneventId for idempotency and a data.call object with the call’s identifiers and channel routing. See Calling Webhooks Setup for handler examples.
calls.initiated
Fires when a call is created (outbound) or an incoming call is received (inbound).
calls.initiated
calls.ringing
Fires when an outbound call is ringing at the destination.
calls.answered
Fires when the call is answered. The data.call object includes answeredAt and answeredBy.
calls.completed
Fires when a call ends normally. The data.call object includes duration, endReason, and endedAt.
calls.failed
Fires when a call fails. The payload includes a data.error object with type, code, and message.
calls.no_answer
Fires when no one answers a ringing outbound call before it times out.
calls.participant_joined
Fires when a participant joins the call.
calls.participant_joined
calls.participant_left
Fires when a participant leaves the call. The participant object includes duration and leftAt.
calls.recording.completed
Fires when a call recording has finished processing and a signed download URL is available.
calls.recording.completed
calls.voicemail.received
Fires when a voicemail is left. The payload includes the audio URL and an optional transcription.
Recording and voicemail
url fields are time-limited signed URLs. To access them later, use the Recordings API to mint a fresh URL.Full event list
| Event | Category | Trigger | Cadence |
|---|---|---|---|
messages.sms.received | SMS Messages | Telnyx webhook | Real-time |
messages.sms.sent | SMS Messages | Internal | Real-time |
messages.sms.delivered | SMS Messages | Telnyx webhook | Real-time |
messages.sms.failed | SMS Messages | Telnyx webhook | Real-time |
messages.whatsapp.received | WhatsApp Messages | Meta webhook | Real-time |
messages.whatsapp.sent | WhatsApp Messages | Internal | Real-time |
messages.whatsapp.delivered | WhatsApp Messages | Meta webhook | Real-time |
messages.whatsapp.read | WhatsApp Messages | Meta webhook | Real-time |
messages.whatsapp.failed | WhatsApp Messages | Meta webhook | Real-time |
templates.whatsapp.created | Templates | Meta webhook | Real-time |
templates.whatsapp.updated | Templates | Meta webhook | Real-time |
templates.whatsapp.deleted | Templates | Meta webhook | Real-time |
templates.whatsapp.connected | Templates | Internal | Real-time |
contacts.whatsapp.created | Contacts | Internal | Real-time |
contacts.whatsapp.updated | Contacts | Internal | Real-time |
contacts.whatsapp.deleted | Contacts | Internal | Real-time |
whatsapp.contact.preferences_updated ✦ | Contacts | Meta webhook | Real-time |
whatsapp.contact.automatic_event ✦ | Contacts | Meta webhook | Real-time |
groups.whatsapp.created | Groups | Meta webhook | Real-time |
groups.whatsapp.deleted | Groups | Meta webhook | Real-time |
groups.whatsapp.suspended | Groups | Meta webhook | Real-time |
groups.whatsapp.suspension_cleared | Groups | Meta webhook | Real-time |
groups.whatsapp.participant_added | Groups | Meta webhook | Real-time |
groups.whatsapp.participant_removed | Groups | Meta webhook | Real-time |
groups.whatsapp.participant_left | Groups | Meta webhook | Real-time |
groups.whatsapp.join_request_created | Groups | Meta webhook | Real-time |
groups.whatsapp.join_request_revoked | Groups | Meta webhook | Real-time |
groups.whatsapp.settings_updated | Groups | Meta webhook | Real-time |
whatsapp.account.connected | Account | Internal | Real-time |
whatsapp.account.disconnected | Account | Internal | Real-time |
whatsapp.account.alert_raised ✦ | Account | Meta webhook | Real-time |
whatsapp.waba.review_updated ✦ | WABA | Meta webhook | Real-time |
whatsapp.waba.capability_changed ✦ | WABA | Meta webhook | Real-time |
whatsapp.phone_number.name_updated ✦ | Phone Numbers | Meta webhook | Real-time |
whatsapp.phone_number.quality_changed ✦ | Phone Numbers | Meta webhook | Real-time |
whatsapp.phone_number.security_event ✦ | Phone Numbers | Meta webhook | Real-time |
whatsapp.phone_number.deregistered ✦ | Phone Numbers | Poll | ≤15 min (active) / ≤6 h (idle) |
whatsapp.partner_solution.updated ✦ | Partner & Payment | Meta webhook | Real-time |
whatsapp.payment_config.updated ✦ | Partner & Payment | Meta webhook | Real-time |
calls.initiated | Calling | Internal | Real-time |
calls.ringing | Calling | Internal | Real-time |
calls.answered | Calling | Internal | Real-time |
calls.completed | Calling | Internal | Real-time |
calls.failed | Calling | Internal | Real-time |
calls.no_answer | Calling | Internal | Real-time |
calls.participant_joined | Calling | LiveKit | Real-time |
calls.participant_left | Calling | LiveKit | Real-time |
calls.recording.completed | Calling | LiveKit | Near real-time |
calls.voicemail.received | Calling | Internal | Real-time |
events array to receive.