> ## Documentation Index
> Fetch the complete documentation index at: https://docs.surge.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook Events

> A categorized index of webhook event types with links to each event's detailed reference page.

Surge sends 13 event types. All events arrive at your configured webhook endpoint as HTTP POST requests with a JSON body.

See [Receiving Messages & Webhooks](/receiving/index) for endpoint configuration and signature verification. See [Webhooks Overview](/api-reference/webhooks/intro) for the shared event envelope and retry behavior.

## Message events

| Event                                                            | When it fires                                                           |
| ---------------------------------------------------------------- | ----------------------------------------------------------------------- |
| [`message.sent`](/api-reference/webhooks/message/sent)           | Surge accepts an outbound message and passes it to the carrier network. |
| [`message.delivered`](/api-reference/webhooks/message/delivered) | The carrier confirms delivery to the recipient's handset.               |
| [`message.failed`](/api-reference/webhooks/message/failed)       | An outbound message cannot be delivered.                                |
| [`message.received`](/api-reference/webhooks/message/received)   | An inbound message arrives from a contact to one of your phone numbers. |

## Contact events

| Event                                                            | When it fires                                                              |
| ---------------------------------------------------------------- | -------------------------------------------------------------------------- |
| [`contact.opted_in`](/api-reference/webhooks/contact/opted_in)   | A contact opts back in by sending a keyword like START, YES, or UNSTOP.    |
| [`contact.opted_out`](/api-reference/webhooks/contact/opted_out) | A contact opts out by sending a keyword like STOP, CANCEL, or UNSUBSCRIBE. |

## Conversation events

| Event                                                                  | When it fires                                                                              |
| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| [`conversation.created`](/api-reference/webhooks/conversation/created) | A new conversation thread is created, usually on the first inbound message from a contact. |

## Campaign events

| Event                                                            | When it fires                                            |
| ---------------------------------------------------------------- | -------------------------------------------------------- |
| [`campaign.approved`](/api-reference/webhooks/campaign/approved) | A campaign transitions to active after carrier approval. |

## Phone number events

| Event                                                                                            | When it fires                                                                                |
| ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| [`phone_number.attached_to_campaign`](/api-reference/webhooks/phone_number/attached_to_campaign) | A phone number is successfully attached to a campaign and is ready for production messaging. |

## Link events

| Event                                                    | When it fires                                                      |
| -------------------------------------------------------- | ------------------------------------------------------------------ |
| [`link.followed`](/api-reference/webhooks/link/followed) | A contact clicks a shortened link in a message for the first time. |

## Voice events

| Event                                                                | When it fires                                                                     |
| -------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| [`call.ended`](/api-reference/webhooks/call/ended)                   | A call ends, regardless of direction or how it was terminated.                    |
| [`recording.completed`](/api-reference/webhooks/recording/completed) | A non-voicemail call recording finishes processing and is available for download. |
| [`voicemail.received`](/api-reference/webhooks/voicemail/received)   | A voicemail recording finishes processing and is available for download.          |
