Guides
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.
Mis à jour le 12 novembre 2026Voir en Markdown
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).
L'événement#
{
"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. |
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.
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#
curl "$INBOX_API/messages" \
-H "Authorization: Bearer $INBOX_KEY"const res = await fetch(`${process.env.INBOX_API}/messages`, {
headers: {
Authorization: `Bearer ${process.env.INBOX_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
f"{os.environ['INBOX_API']}/messages",
headers={
"Authorization": f"Bearer {os.environ['INBOX_KEY']}",
},
)
print(res.json())<?php
$ch = curl_init(getenv('INBOX_API') . '/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);{
"data": [
{
"id": "a9691d7a-ee51-4da9-87b2-24cce79a9313",
"direction": "outbound",
"status": "sent",
"type": "location",
"phoneNumberId": "4d8e654e-d744-4bf3-8211-9ceffcccfe87",
"to": "237611111111",
"waMessageId": "wamid.HBgMXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"content": {
"type": "location",
"location": {
"name": "Cabinet Dentaire Zokem",
"address": "Akwa, Douala",
"latitude": 4.0511,
"longitude": 9.7679
}
},
"error": null,
"createdAt": "2026-11-12T08:33:46.131Z",
"sentAt": "2026-11-12T08:33:46.251Z",
"deliveredAt": null,
"readAt": null
},
{
"id": "9e09a76b-537b-4d5f-8454-4305ba8748a6",
"direction": "outbound",
"status": "sent",
"type": "document",
"phoneNumberId": "4d8e654e-d744-4bf3-8211-9ceffcccfe87",
"to": "237611111111",
"waMessageId": "wamid.HBgMXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"content": {
"type": "document",
"media": {
"link": "https://exemple.com/ordonnance.pdf",
"caption": "Votre ordonnance",
"filename": "ordonnance.pdf"
}
},
"error": null,
"createdAt": "2026-11-12T08:33:46.098Z",
"sentAt": "2026-11-12T08:33:46.221Z",
"deliveredAt": null,
"readAt": null
}
],
"nextCursor": "MjAyNi0xMS0xMlQwODozMzo0Ni4wOThafGMwYmU4NDdlLWQyNDQtNGUyOS04N2M1LTAyNTE3ODk1Yzg5OQ"
}Ajoutez ?direction=inbound pour ne voir que les messages reçus.
Tester sans téléphone#
Le bac à sable fait « arriver » un message à la demande et déclenche votre vrai webhook :
curl -X POST "$INBOX_API/sandbox/simulate/inbound-message" \
-H "Authorization: Bearer $INBOX_KEY" \
-H "Content-Type: application/json" \
-d '{
"phoneNumberId": "4d8e654e-d744-4bf3-8211-9ceffcccfe87",
"from": "+237611111111",
"text": "Bonjour, je voudrais déplacer mon rendez-vous"
}'const res = await fetch(`${process.env.INBOX_API}/sandbox/simulate/inbound-message`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INBOX_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"phoneNumberId": "4d8e654e-d744-4bf3-8211-9ceffcccfe87",
"from": "+237611111111",
"text": "Bonjour, je voudrais déplacer mon rendez-vous"
}),
});
const data = await res.json();import os
import requests
res = requests.post(
f"{os.environ['INBOX_API']}/sandbox/simulate/inbound-message",
headers={
"Authorization": f"Bearer {os.environ['INBOX_KEY']}",
},
json={
"phoneNumberId": "4d8e654e-d744-4bf3-8211-9ceffcccfe87",
"from": "+237611111111",
"text": "Bonjour, je voudrais déplacer mon rendez-vous",
},
)
print(res.json())<?php
$ch = curl_init(getenv('INBOX_API') . '/sandbox/simulate/inbound-message');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'phoneNumberId' => '4d8e654e-d744-4bf3-8211-9ceffcccfe87',
'from' => '+237611111111',
'text' => 'Bonjour, je voudrais déplacer mon rendez-vous',
]),
]);
$data = json_decode(curl_exec($ch), true);{
"messageId": "3f3baf5a-f93e-42e8-8263-ce62dc4aadd6",
"from": "237611111111",
"status": "received",
"simulated": true
}