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

# WhatsApp echo message created

> Store outbound text and media echoes and correlate their later status updates.

## What it is

Subscribe to `whatsapp.echo_message.created`.

You receive this event when YCloud records an outbound echo for an Agent onboarded through the Public REST API. Read the standard message-shaped content from `whatsappMessage`; do not use this event for customer inbound messages.

The current contract keeps the event name unchanged while exposing the echo as a
standard WhatsApp message. Agent, handover, and Inbox routing fields are not part
of this payload.

## Before you begin

1. Onboard the Agent through the [Public REST API](/en/api-reference/meta-business-agents/onboard).
2. Subscribe an active webhook endpoint in the same account to `whatsapp.echo_message.created`.
3. Verify `YCloud-Signature` against the raw request body, durably accept each event, and process it idempotently.

<Warning>
  Console-created Agents do not emit this customer webhook. Their Inbox synchronization is a separate flow.
</Warning>

See [Configure webhooks](/en/api-reference/guides/api-fundamentals/configure-webhooks#subscribe-to-echo-and-handover-events) for endpoint setup.

## How it works

All examples use placeholder identifiers. Route by the outer `type` and read
`whatsappMessage`, not `whatsappMetaBusinessAgent`, `whatsappEchoMessage`, or `data`.

Deduplicate repeated deliveries with the outer `id`. The outer `createTime` is the
webhook event time; nested message time fields are RFC 3339 source times.

* Use `id` or `wamid` to correlate later status events.
* Read text from `text.body`. For media, inspect `type` and the corresponding content object. Media IDs are not public download URLs.
* The customer phone and BSUID are independent. When the source callback supplies both, the event includes `to` together with `recipientUserId` or `parentRecipientUserId`. Missing identities are omitted and are not inferred from each other.
* `from` is the business display phone number when the source callback supplies a valid phone number. It is not derived from `phoneNumberId`.
* Reply context is normalized to the standard message contract. For example, source `context.id` is exposed as `context.message_id`.
* Agent, handover, routing, pricing, and conversation fields are not included.
* `status` is the stored status when the echo is processed; it is not guaranteed to be `sent`.
* Customer inbound messages use [`whatsapp.inbound_message.received`](/en/api-reference/guides/examples/webhook-examples/whatsapp-inbound-message-webhook-examples). Business App echoes use [`whatsapp.smb.message.echoes`](/en/api-reference/guides/examples/webhook-examples/whatsapp-business-app-sent-message-sync-webhook-examples).

## Request

YCloud sends these JSON bodies in HTTP `POST` requests to your configured webhook URL.

## Response

Return a `2xx` response after durably accepting each event. Process slow work asynchronously.

## Outbound text echo

### Request

Store the text from whatsappMessage.text.body. id and wamid link subsequent status events.

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "id": "evt_example_echo_text",
  "type": "whatsapp.echo_message.created",
  "apiVersion": "v2",
  "createTime": "2026-09-09T02:00:00.000Z",
  "whatsappMessage": {
    "id": "MESSAGE_ID",
    "wamid": "wamid.EXAMPLE",
    "wabaId": "WABA_ID",
    "from": "+12025550123",
    "to": "+12025550124",
    "recipientUserId": "GB.898232076600896",
    "type": "text",
    "text": {
      "body": "Hello! How can I help you?"
    },
    "status": "sent",
    "createTime": "2026-09-09T02:00:00.000Z",
    "sendTime": "2026-09-09T02:00:00.000Z"
  }
}
```

### Response

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
```

### Explanation

Read the echoed text from `whatsappMessage.text.body`. Use `id` or `wamid` to correlate later status events.

## Outbound image echo

### Request

Message content varies by type. Treat media IDs as provider references, not public download URLs.

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "id": "evt_example_echo_image",
  "type": "whatsapp.echo_message.created",
  "apiVersion": "v2",
  "createTime": "2026-09-09T02:00:00.000Z",
  "whatsappMessage": {
    "id": "IMAGE_MESSAGE_ID",
    "wamid": "wamid.IMAGE_EXAMPLE",
    "wabaId": "WABA_ID",
    "from": "+12025550123",
    "to": "+12025550124",
    "recipientUserId": "GB.898232076600896",
    "type": "image",
    "image": {
      "id": "MEDIA_ID",
      "mime_type": "image/jpeg"
    },
    "status": "sent",
    "createTime": "2026-09-09T02:00:00.000Z",
    "sendTime": "2026-09-09T02:00:00.000Z"
  }
}
```

### Response

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
```

### Explanation

Use `type` to select the matching content object. Treat the media `id` as a provider reference.

### Related examples

* [WhatsApp echo message updated](/en/api-reference/guides/examples/webhook-examples/whatsapp-echo-message-updated)
* [WhatsApp Agent handover updated](/en/api-reference/guides/examples/webhook-examples/whatsapp-meta-business-agent-handover-updated)
* [Echo and Agent handover examples](/en/api-reference/guides/examples/webhook-examples/overview#echo-and-agent-handover-events)
* [Complete payload catalog](/en/api-reference/guides/examples/webhook-examples/webhook-payload-examples)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.