# Recevoir des messages

> Recevez les messages de vos clients par webhook, répondez dans la fenêtre de 24 heures et retrouvez-les dans l'historique.

Quand un client écrit à l'un de vos numéros, Bref Point Inbox enregistre le message et envoie un événement **`message.received`** à vos destinations de webhooks. Déclarez-en une avant tout (voir [Webhooks](/docs/guides/webhooks)).

## L'événement

```json title="message.received"
{
  "id": "8dc9eca4-2eff-46de-80aa-0ac9674dd1ae",
  "type": "message.received",
  "createdAt": "2026-11-12T06:09:17.388Z",
  "data": {
    "messageId": "4f21edc3-047e-4f75-819a-1e69953f40a3",
    "waMessageId": "wamid.HBgM…",
    "phoneNumberId": "fb10613a-8a2c-4340-87ff-192082ffaf1f",
    "from": "237611111111",
    "type": "text",
    "content": { "text": { "body": "Bonjour, je voudrais déplacer mon rendez-vous" } },
    "contactName": "Awa",
    "occurredAt": "2026-11-12T06:09:17.402Z"
  }
}
```

| Champ de `data` | Description |
|---|---|
| `messageId` | Identifiant du message chez Bref Point Inbox. |
| `waMessageId` | Identifiant du message chez WhatsApp. |
| `phoneNumberId` | Le numéro qui a reçu le message (`id` du numéro, comme pour l'envoi). |
| `from` | Le numéro de l'expéditeur, sans « + ». |
| `type` | `text`, `image`, `document`, `audio`, `video`, `location`, `sticker`, `button`… tel que Meta le déclare. |
| `content` | Le contenu, sous une clé du nom du type : `{ "text": { "body": … } }`, `{ "image": { "id": …, "caption": … } }`… La forme exacte est celle de Meta. |
| `contactName` | Le nom de profil WhatsApp de l'expéditeur, s'il est connu. |

<Callout type="note" title="Médias reçus">
Pour un média reçu, `content` contient l'identifiant du média chez Meta. Le téléchargement du fichier par l'API n'est pas encore disponible.
</Callout>

## Répondre

Un message reçu **ouvre la fenêtre de 24 heures** pour ce numéro et cet expéditeur : vous pouvez lui répondre par un message libre.

```bash
curl -X POST "$INBOX_API/messages" \
  -H "Authorization: Bearer $INBOX_KEY" -H "Content-Type: application/json" \
  -d '{ "phoneNumberId": "<data.phoneNumberId>", "to": "+<data.from>", "type": "text",
        "text": { "body": "Bien sûr, quel créneau vous conviendrait ?" } }'
```

La fenêtre est calculée **par expéditeur et par numéro** : un message d'un autre client n'ouvre pas la fenêtre de celui-ci.

## Ne pas traiter deux fois

Les événements peuvent arriver **plus d'une fois** (nouvel essai après un délai d'attente, rejeu manuel, renvoi par Meta). Bref Point Inbox dédoublonne les messages reçus à l'enregistrement, mais **votre récepteur** doit aussi être tolérant : l'`id` de l'événement (et `data.messageId`) est stable, ignorez ce que vous avez déjà traité.

## Retrouver les messages reçus

<ApiExample method="GET" path="/messages" />

Ajoutez `?direction=inbound` pour ne voir que les messages reçus.

## Tester sans téléphone

Le [bac à sable](/docs/guides/sandbox) fait « arriver » un message à la demande et déclenche votre vrai webhook :

<ApiExample method="POST" path="/sandbox/simulate/inbound-message" />
