Skip to main content

Envoyer et recevoir des messages

Ce guide vous emmène d’une clé API à un flux de messages bidirectionnel qui fonctionne : envoyez un message sortant, suivez sa livraison et recevez la réponse sur votre propre serveur. L’exemple utilise le SMS — le même schéma en trois étapes (envoyer → suivre → recevoir) s’applique à WhatsApp, RCS, Viber et e-mail, chacun sur son propre endpoint. Vous allez :
  1. Envoyer un message
  2. Suivre la livraison
  3. Recevoir des messages entrants
  4. Répondre à un message entrant

Prérequis

  • Une clé API depuis Paramètres → Clés API. Utilisez une clé sandbox (dv_test_sk_…) pendant le développement — les envois sandbox sont gratuits et simulés, et renvoient des accusés de livraison déterministes pour que vous puissiez exercer les deux chemins, succès et erreur. Passez à une clé live (dv_live_sk_…) pour la production.
  • Un numéro expéditeur capable d’envoyer sur le canal utilisé. Pour le SMS, c’est un numéro SMS-compatible que vous possédez (recherchez-le et achetez-le via l’API Numbers ou via Dashboard → Numéros). Si vous omettez from, Orbit choisit un expéditeur éligible pour la destination.
  • Une URL HTTPS publique pour l’étape de réception. Tout outil de tunnel convient en développement.
Toutes les requêtes visent une seule URL de base — le sandbox utilise le même hôte, sélectionné par votre clé et non par un autre domaine :
Chaque requête porte votre clé dans l’en-tête X-API-Key.

1. Envoyer un message

Envoyez un SMS avec POST /messages/sms. Seuls to et body sont obligatoires ; from est facultatif.
La réponse est 202 Accepted — le message est persisté et mis en file pour la livraison, pas encore remis à l’opérateur. Les champs vivent sous data ; meta porte le request_id que vous devez journaliser pour le support.
L’id (msg_ suivi de 32 caractères hexadécimaux) est l’identifiant utilisé par tous les appels qui suivent — les requêtes de statut, les webhooks de livraison et la trace du message l’utilisent tous. Les réponses sandbox ajoutent "test_mode": true à meta.
Envoyez toujours une Idempotency-Key lors des envois. Rejouer la même clé et le même corps dans les 24 heures renvoie la réponse originale au lieu d’envoyer un doublon ; rejouer avec un corps différent renvoie 409 IDEMPOTENCY_KEY_REUSED.

Autres canaux

Chaque canal a son propre endpoint sous le préfixe /messages, avec une forme de corps adaptée à ce canal. Il n’y a pas de route unique polymorphe sur le canal — choisissez l’endpoint qui correspond à votre canal :

2. Suivre la livraison

Un message en file traverse un cycle de statuts avant d’atteindre le destinataire :
Vous avez deux moyens de le suivre : Interrogez le message par id :
Abonnez-vous aux webhooks (recommandé — pas de polling). Un événement est émis à chaque transition de statut, chacun portant l’id du message et le nouveau status :
  • message.sent — accepté par l’opérateur
  • message.delivered — livraison confirmée au terminal
  • message.failed — échec terminal (le status du payload distingue failed, undelivered, expired et submitted_no_receipt ; error_code / error_message portent la raison du fournisseur lorsqu’elle est présente)
Enregistrez un endpoint webhook une seule fois, puis laissez les événements arriver :
Un événement de livraison ressemble à ceci :
Vérifiez l’en-tête X-Orbit-Signature avant d’accepter une payload, et dédupliquez sur l’id de l’événement — la livraison est au moins une (at-least-once). Voir Sécurité des webhooks pour l’extrait de validation.

3. Recevoir des messages entrants

Lorsque quelqu’un répond à votre numéro (ou vous écrivent en premier), Orbit enregistre un message entrant et — si vous êtes abonné à message.received à l’étape précédente — le POST vers votre URL webhook :
Le message entrant est aussi requêtable — listez tout ce que vous avez reçu avec le filtre direction=inbound :
Le routage entrant est automatique pour les numéros que vous possédez sur Orbit — une réponse à l’un de vos numéros expéditeurs est capturée et, avec un abonnement message.received, livrée à votre webhook. Aucun branchement d’URL entrant par numéro n’est nécessaire.

4. Répondre à un message entrant

Répondre n’est qu’un autre envoi, adressé en retour au from entrant. Échangez to et from et appelez POST /messages/sms une nouvelle fois :
Les deux messages partagent une conversation, donc une fois le fil de discussion créé vous pouvez récupérer l’intégralité de l’échange avec le filtre conversation_id sur GET /messages.

Erreurs courantes

Toute erreur utilise la même forme — faites correspondre sur error.code (une constante en MAJUSCULES) et journalisez meta.request_id : Liste complète : Codes d’erreur.

Prochaines étapes