What's new, 21 October 2026: A customer who sends several messages before the bot's first reply no longer gets the opening sequence of a Chat Flow twice
WASync · Developers

Votre premier message

Envoyez un texte WhatsApp, relisez la conversation et affichez les coches bleues chez le client.

Envoyer un texte

POST /messages
curl -X POST https://developers.wasync.app/api/v1/messages \
  -H "Authorization: Bearer $WASYNC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"connectionId":"conn_8f3a21","to":"40700000000","text":"Hi from my app 👋"}'
200 response
{
  "messageId": "cmqj3k2ab0001xyz",
  "waMessageId": "[email protected]_3EB0A1B2C3",
  "status": "sent"
}

to contient uniquement des chiffres au format international, sans + — par exemple 40700000000. text ne dépasse pas 4096 caractères. Pour un média, fournissez media à la place de text : { filename, mimetype, data (base64, ≤ 16 MB), caption? } — l'un des deux, exactement. Les messages vocaux utilisent mimetype: audio/ogg et un nom de fichier voice-*.ogg. Utilise whatsapp.send.

Réglez votre délai d'expiration HTTP à 180 secondes minimum

Un envoi qr prend normalement 1 à 7 s, jusqu'à 20 s environ pour les textes longs, et le mécanisme d'auto-réparation peut durer ~2,5 minutes. Un envoi cloud_api prend environ 1 s. Un envoi lent n'est pas un échec — un client qui abandonne au bout de 30 s et réessaie envoie le message deux fois au destinataire. Passez toujours un idempotencyKey (un UUID par envoi logique) et réessayez avec la même clé.

Deux identifiants — joignez sur le bon

La réponse contient deux identifiants, qui ne sont pas interchangeables.

IdOù il apparaîtÀ utiliser pour
messageId (un cuid)messageId sur POST, id sur GET, message.id dans les deux webhooksLe seul identifiant utilisable pour les jointures. Stockez-le à l'envoi, dédupliquez avec lui, rapprochez-y les événements message.status.
waMessageIdwaMessageId (REST), wa_id (webhooks), wa_message_id (envoi de média)Tickets de support et débogage. Il peut valoir null — ne joignez ni ne dédupliquez jamais dessus.

Un cas dégradé mérite d'être géré dans votre code : { "messageId": null, "waMessageId": "…", "status": …, "persisted": false } avec un HTTP 200 signifie que le message a été livré mais n'a pas été enregistré. Ne le renvoyez pas.

Relire la conversation

GET /messages
curl "https://developers.wasync.app/api/v1/messages?connectionId=conn_8f3a21&limit=20" \
  -H "Authorization: Bearer $WASYNC_API_KEY"
200 response
{
  "messages": [
    {
      "id": "cmqj3k2ab0001xyz",
      "waMessageId": "[email protected]_3EB0A1B2C3",
      "connectionId": "conn_8f3a21",
      "direction": "outgoing",
      "text": "Hi from my app 👋",
      "mediaUrl": null,
      "mediaType": null,
      "status": "delivered",
      "errorMessage": null,
      "createdAt": "2026-07-22T10:00:00.000Z"
    }
  ],
  "nextCursor": "cmqj3k2ab0001xyz",
  "hasMore": true
}

Du plus récent au plus ancien, avec pagination par curseur : limit va de 1 à 100 (20 par défaut), et cursor reçoit le nextCursor de la réponse précédente. Utilise whatsapp.read.

Afficher les coches bleues chez le client

POST /messages/read
curl -X POST https://developers.wasync.app/api/v1/messages/read \
  -H "Authorization: Bearer $WASYNC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"connectionId":"conn_8f3a21","phone":"40700000000"}'

Appelez cette route lorsqu'un opérateur ouvre la conversation dans votre interface — sinon personne n'ouvre jamais le chat dans WhatsApp, les messages du client restent sur les deux coches grises et la conversation semble ignorée. Le corps est { connectionId, phone?, messageId? }, avec au moins l'un de phone / messageId (le cuid d'un message entrant ; messageId l'emporte si les deux sont fournis). Elle utilise whatsapp.send, et non whatsapp.read, car elle transmet un accusé de lecture au client. Idempotente, sans clé, sans limite de débit. Renvoie { "ok": true, "marked": 3 }.

Étapes suivantes

  • Être averti des messages entrants plutôt que d'interroger l'API en boucle : Webhooks.
  • Le construire sans code : n8n ou MCP.
  • Générer un client à partir du contrat : npx @openapitools/openapi-generator-cli generate -i https://developers.wasync.app/openapi.json -g typescript-fetch -o ./wasync-client
Cette page vous a-t-elle été utile ?

On this page