GET /v1/triggers/new-message-received
Messages entrants les plus récents de vos contacts, utilisé par les intégrations de polling comme n8n et Zapier.
Renvoie jusqu'à 100 messages entrants les plus récents pour le tenant, triés par created_at DESC. C'est la source de polling pour le nœud trigger Qyvo de n8n et les intégrations équivalentes.
GET /api/v1/triggers/new-message-received
Paramètres de requête
| Paramètre | Type | Description |
|---|---|---|
message_type |
string | Optionnel. Filtre par text, image, audio, document, video, location, contacts, interactive |
Requête
curl 'https://www.qyvo.io/api/v1/triggers/new-message-received?message_type=text' \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
const messages = await fetch(
'https://www.qyvo.io/api/v1/triggers/new-message-received?message_type=text',
{ headers: { Authorization: `Bearer ${process.env.QYVO_TOKEN}` } },
).then((r) => r.json());
$messages = Http::withToken(env('QYVO_TOKEN'))
->get('https://www.qyvo.io/api/v1/triggers/new-message-received', [
'message_type' => 'text',
])
->json();
import os, httpx
messages = httpx.get(
'https://www.qyvo.io/api/v1/triggers/new-message-received',
params={'message_type': 'text'},
headers={'Authorization': f"Bearer {os.environ['QYVO_TOKEN']}"},
).json()
Réponse — 200 OK
Un tableau (et non une enveloppe). [] vide quand il n'y a aucun message.
[
{
"id": "01J4M...",
"direction": "inbound",
"type": "text",
"content": { "body": "Hi, do you ship to Canada?" },
"status": "received",
"contact_id": "01J1Y...",
"contact_phone": "+14155550123",
"contact_name": "Romain",
"contact_email": null,
"sent_at": null,
"delivered_at": null,
"read_at": null,
"created_at": "2026-05-07T08:14:23+00:00"
}
]
| Champ | Type | Notes |
|---|---|---|
id |
UUID | Id de message Qyvo |
direction |
string | Toujours inbound |
type |
string | text, image, audio, … |
content |
object | La forme dépend de type — {body} pour le texte, {url, mime_type} pour les médias |
status |
string | received pour les entrants normaux ; jamais sent/delivered/read (ceux-ci s'appliquent aux sortants) |
contact_* |
divers | Champs dénormalisés du contact joint |
created_at |
ISO 8601 | Heure d'insertion serveur — le champ que vous comparez pour les nouveaux depuis le dernier poll |
Pattern de polling
Mémorisez l'id le plus récent que vous avez traité. Au poll suivant, arrêtez l'itération quand vous l'atteignez. Voir Pagination pour le pattern canonique.
Alternative webhook
Si vous pouvez recevoir des callbacks HTTPS, utilisez plutôt le webhook message.received — même payload, sans polling.
