Documentation développeur

API RCS : cartes, carrousels et repli SMS automatique

Un seul appel envoie un message enrichi aux mobiles compatibles et un SMS aux autres. Ce guide donne le contrat réel de l'endpoint : les trois formats, les quatre types de boutons, la mécanique du repli, et la façon de mesurer ce qui est réellement parti en RCS.

POST /messages/rcs
{
  "type": "card",
  "data": {
    "title": "Commande #4821",
    "media_message_url": "…",
    "choices": [ … ]
  },
  "fallback": { "content": … }
}
✓ rcs: 842 · sms: 158
3
formats : texte, carte, carrousel
4
boutons maximum par carte
85 %
du parc mobile français compatible
1
appel pour le RCS et le repli SMS

Ce qui change par rapport à l'endpoint SMS

Si vous avez déjà intégré /messages/sms, l'authentification et la logique générale sont identiques : mêmes en-têtes X-APP-ID et X-API-KEY, même mécanique de déduplication par external_id, même scheduleAt en UTC.

Trois différences comptent, et la première est celle qui casse les intégrations recopiées d'un endpoint à l'autre :

 /messages/sms/messages/rcs
Destinatairesrecipients : un tableau de chaînescontacts : un tableau d'objets, ou contactlist
Contenucontent : du textetype + data, dont la forme dépend du type
Réponseun credits_useddeux compteurs séparés, rcs et sms

1. Le premier envoi : le format texte

Le format text est le plus simple, et le bon point de départ pour valider vos identifiants : aucun média à héberger, aucun bouton à concevoir.

curl -X POST https://api.conexteo.com/messages/rcs \
  -H "X-APP-ID: VOTRE_APP_ID" \
  -H "X-API-KEY: VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Test RCS",
    "type": "text",
    "data": { "text": "Bonjour, votre commande est prête." },
    "fallback": {
      "content": "Bonjour, votre commande est prête.",
      "sender": "MaBoutique"
    },
    "contacts": [ { "recipient": "+33612345678" } ]
  }'

Chiffrer une campagne sans la déclencher. Ajoutez ?resumeBefore=true à l'URL : l'API retourne les crédits que l'envoi consommerait, ventilés entre RCS et SMS, sans envoyer un seul message. Sur une campagne RCS, c'est plus utile que sur un SMS — cela vous donne une estimation du taux de repli avant de payer.

2. La carte : image, texte long et boutons

C'est le format qui justifie le RCS. Une carte porte un visuel, un titre, une description et jusqu'à quatre boutons d'action :

{
  "name": "Expédition commande",
  "type": "card",
  "data": {
    "title": "Votre commande #4821 est expédiée",
    "description": "Livraison prévue demain entre 9 h et 13 h.",
    "media_message_url": "https://cdn.exemple.fr/colis.png",
    "choices": [
      { "type": "url",  "title": "Suivre le colis", "url": "https://…" },
      { "type": "call", "title": "Nous appeler", "phoneNumber": "+33176411075" },
      { "type": "text", "text": "Reporter" }
    ]
  },
  "fallback": {
    "content": "Votre commande #4821 est expédiée. Suivi : https://…",
    "sender": "MaBoutique"
  },
  "external_id": "order-4821-shipped",
  "contacts": [ { "recipient": "+33612345678" } ]
}

Trois limites à connaître avant de faire valider la maquette. Le titre d'un bouton est plafonné à 25 caractères — c'est court, et cela se découvre en général une fois les libellés arbitrés. Quatre boutons maximum par carte. Et le média doit être accessible publiquement à l'URL fournie : un fichier derrière une authentification ou une URL signée qui expire produit une carte sans visuel.

Le format d'image le plus piégeux est le WebP : il n'est pas accepté. Les formats admis sont le JPEG, le JPG, le PNG et le GIF pour les images, le MP4 et quelques variantes pour la vidéo. Or beaucoup de chaînes de publication convertissent automatiquement en WebP — y compris certains plugins d'optimisation WordPress. Vérifiez l'extension réellement servie par votre CDN, pas celle du fichier d'origine.

3. Le carrousel : jusqu'à dix cartes défilantes

Le carrousel reprend la structure de la carte, en tableau. C'est le format des catalogues produits, des cartes de restaurant et des sélections de biens : le destinataire fait défiler horizontalement, chaque carte gardant ses propres boutons.

{
  "type": "carousel",
  "data": {
    "cards": [
      {
        "title": "Manteau laine",
        "description": "129 € — tailles 36 à 44",
        "media_message_url": "https://cdn.exemple.fr/manteau.jpg",
        "choices": [
          { "type": "url", "title": "Voir le produit", "url": "https://…" }
        ]
      },
      {
        "title": "Bottines cuir",
        "description": "89 € — tailles 36 à 41",
        "media_message_url": "https://cdn.exemple.fr/bottines.jpg",
        "choices": [
          { "type": "url", "title": "Voir le produit", "url": "https://…" }
        ]
      }
    ]
  }
}

Dix cartes est le maximum. En pratique, en prévoir au moins deux : un carrousel d'une seule carte n'apporte rien de plus qu'une carte simple, et l'affichage y perd. Un carrousel reste facturé comme un seul message, pas comme dix envois — c'est ce qui rend ce format économiquement intéressant sur un catalogue.

Les quatre types de boutons

TypeChampsCe qu'il déclenche
texttext (≤ 25 car.)Une réponse rapide. Le clic vous revient comme un message entrant, sur le webhook reply.
urltitle (≤ 25), url (≤ 2048)Ouvre un lien. Combiné au raccourcisseur en mode unique, il donne un suivi de clic par destinataire.
calltitle (≤ 25), phoneNumberCompose le numéro. Utile sur les rappels de rendez-vous et le service après-vente.
locationtitle, label, latitude, longitudeOuvre un point sur la carte. Le format le plus sous-utilisé, et le plus efficace en retrait en magasin.

Le repli SMS : la partie qu'il faut comprendre

Environ 85 % du parc mobile français reçoit le RCS — Android via Google Messages, iPhone depuis iOS 18. Les 15 % restants doivent recevoir autre chose, sinon votre campagne a des trous. C'est le rôle de l'objet fallback : un contenu SMS et un expéditeur, utilisés pour les destinataires non compatibles.

Deux stratégies existent, et le paramètre checkCapability tranche entre les deux :

checkCapability: false
Par défaut — on envoie à tout le monde

Le RCS part vers l'ensemble des contacts, et le repli SMS se déclenche au retour de l'opérateur pour ceux qui ne l'ont pas reçu. Aucune préparation, aucune liste à analyser. C'est le mode à utiliser pour un envoi ponctuel ou transactionnel.

checkCapability: true
On ne cible en RCS que les compatibles connus

Seuls les contacts déjà analysés comme pleinement compatibles reçoivent le RCS ; les autres reçoivent directement le SMS de repli. Cela suppose une liste préalablement analysée, mais rend le résultat prévisible avant l'envoi.

Rédigez le repli comme un vrai message, pas comme une copie tronquée. C'est l'erreur la plus commune : on reprend le titre de la carte, on perd l'image et les boutons, et 15 % des destinataires reçoivent une phrase qui ne veut plus rien dire. Un repli efficace remplace le bouton par un lien court, et l'image par la mention qui comptait. Souvenez-vous que cette fraction du fichier n'a que ce message.

Lire la réponse : votre taux de repli réel

C'est le détail le plus utile de cet endpoint, et celui qu'on oublie de regarder. La réponse ne renvoie pas un compteur, mais deux :

{
  "success": true,
  "message": "message created",
  "message_id": 123456,
  "sms": { "credits_used": 158, "sms_count": 158 },
  "rcs": { "credits_used": 842, "rcs_count": 842 }
}

Sur cet envoi, 842 destinataires ont reçu le message enrichi et 158 le SMS de repli : un taux de compatibilité de 84 %, cohérent avec le parc français. Journalisez ces deux valeurs à chaque campagne : leur évolution dans le temps mesure la progression du RCS sur votre base, ce qu'aucune statistique de marché ne vous dira. Notez que message_id peut être null selon le mode d'envoi : ne le supposez pas toujours présent.

Personnaliser : chaque contact porte ses variables

Le tableau contacts n'accepte pas des numéros, mais des objets. Seul recipient est obligatoire ; toute autre propriété que vous ajoutez devient une variable réutilisable dans le message :

"contacts": [
  { "recipient": "+33612345678", "prenom": "Alice", "commande": "4821" },
  { "recipient": "0606060606",   "prenom": "Karim", "commande": "4822" }
]

// Ou, si vos listes vivent déjà dans Conexteo :
"contactlist": [1, 2]

C'est ici que se casse une intégration recopiée depuis l'endpoint SMS. En SMS, recipients attend un tableau de chaînes. En RCS, contacts attend un tableau d'objets avec une clé recipient. Le code qui marchait en SMS renvoie un 400 en RCS, et le message d'erreur porte sur un champ qu'on croyait avoir rempli. Un million d'entrées maximum, comme pour le SMS.

Les codes de retour

CodeCause la plus probable
200Campagne acceptée. Conserver message_id et les deux compteurs.
400contacts envoyé comme un tableau de chaînes, data qui ne correspond pas au type déclaré, titre de bouton au-delà de 25 caractères, ou plus de 4 boutons.
401App ID et clé API intervertis entre les deux en-têtes — bien plus souvent qu'une clé invalide.
404Un identifiant de contactlist qui n'existe pas sur le compte.

Avant le premier envoi : l'agent RCS

Le RCS n'a pas d'expéditeur alphanumérique libre comme le SMS : c'est un agent vérifié, portant le nom et le logo de votre marque, qui est assigné à votre compte. Sa création passe par une validation de Google : comptez deux à quatre semaines. Conexteo prend en charge le montage et la soumission du dossier. Pendant ce délai, vos envois partent en SMS classique : rien ne bloque le développement, vous pouvez intégrer et tester l'API avant que l'agent ne soit actif — c'est même l'ordre recommandé.

Suivre ce qui se passe après l'envoi

Le RCS remonte plus d'information que le SMS : en plus de la livraison, vous récupérez la lecture et les clics sur les boutons. Trois types d'événements sont poussés sur l'URL que vous déclarez : ack_rcs pour les statuts RCS — remis, lu, échec, repli SMS —, reply pour les réponses entrantes, y compris les clics sur les boutons de réponse rapide, et ack_sms pour les accusés de réception des messages de repli.

Le mode signé n'est pas optionnel en RCS. Contrairement aux accusés SMS, les statuts ack_rcs ne sont disponibles qu'en webhook signé — celui qui porte une signature HMAC et bénéficie des réessais, jusqu'à huit tentatives réparties sur environ dix-huit heures. Si vous ne recevez aucun statut RCS alors que vos campagnes partent, c'est la première chose à vérifier. La mise en œuvre côté serveur est détaillée sur les guides PHP, C# et Python.

Questions fréquentes

Comment envoyer un message RCS par API ?
Par une requête POST vers https://api.conexteo.com/messages/rcs, authentifiée par les en-têtes X-APP-ID et X-API-KEY. Le corps déclare un typetext, card ou carousel — un objet data dont la forme dépend de ce type, et un tableau contacts.

Aucun SDK n'est nécessaire : n'importe quel client HTTP suffit. Le même appel gère le repli SMS vers les mobiles non compatibles, à condition de renseigner l'objet fallback.
Que se passe-t-il si le destinataire n'est pas compatible RCS ?
Il reçoit le SMS que vous avez défini dans l'objet fallback, sans que vous ayez à faire un second appel. Environ 15 % du parc mobile français est concerné aujourd'hui — les mobiles hors Google Messages et les iPhone antérieurs à iOS 18.

Le paramètre checkCapability détermine le moment où ce tri s'opère : à false, le RCS part vers tous et le repli se déclenche au retour opérateur ; à true, seuls les contacts déjà analysés comme compatibles reçoivent le RCS, ce qui suppose une liste préalablement analysée.
Comment savoir combien de destinataires ont reçu le RCS et combien le SMS ?
La réponse de l'API contient deux compteurs distincts : un objet rcs et un objet sms, chacun avec son nombre de messages et ses crédits consommés. Le rapport entre les deux est votre taux de compatibilité réel.

C'est une donnée qu'aucune statistique de marché ne remplace : elle porte sur votre base à vous. Journalisez-la à chaque campagne — sa progression dans le temps est le meilleur indicateur du moment où le repli SMS cessera de peser dans votre budget.
Combien de boutons peut-on mettre dans un message RCS ?
Quatre au maximum par carte, et le titre de chacun est plafonné à 25 caractères. Quatre types existent : réponse rapide, ouverture d'un lien, appel téléphonique et affichage d'une localisation.

La contrainte des 25 caractères est celle qui surprend le plus : elle se découvre souvent après que les libellés ont été arbitrés en interne. Prévoyez-la dès la conception de la maquette, en gardant à l'esprit qu'un bouton court est de toute façon plus cliqué qu'une phrase.
Quels formats d'image le RCS accepte-t-il ?
Le JPEG, le JPG, le PNG et le GIF pour les images, le MP4 et quelques variantes pour la vidéo. Le fichier doit être accessible publiquement à l'URL que vous fournissez dans media_message_url.

Le WebP n'est pas accepté, et c'est le piège le plus fréquent : beaucoup de chaînes de publication et de plugins d'optimisation convertissent automatiquement les images en WebP. Vérifiez le format réellement servi par votre CDN, pas celui du fichier d'origine — une carte sans visuel vient presque toujours de là.
Faut-il un agent RCS validé avant de développer l'intégration ?
Non, et c'est même l'inverse qui est recommandé. La création de l'agent RCS — le profil vérifié qui porte le nom et le logo de votre marque — demande deux à quatre semaines de validation par Google. Conexteo monte et soumet le dossier.

Pendant ce délai, vos envois partent en SMS classique : vous pouvez intégrer l'API, tester vos payloads et brancher vos webhooks sans attendre. Le jour où l'agent est actif, votre code n'a pas besoin de changer.
Peut-on personnaliser un message RCS par destinataire ?
Oui. Le tableau contacts attend des objets, pas de simples numéros : seule la clé recipient est obligatoire, et toute propriété supplémentaire que vous ajoutez devient une variable exploitable dans le message — prénom, numéro de commande, date de rendez-vous.

C'est la différence structurante avec l'endpoint SMS, où recipients n'accepte qu'un tableau de chaînes. Une intégration recopiée d'un endpoint à l'autre sans adapter ce champ renvoie un 400.

Testez le RCS avant de monter votre agent

Inscription gratuite, messages de test offerts, sans carte bancaire. L'API est accessible immédiatement : vous pouvez intégrer et valider vos payloads pendant que le dossier d'agent suit son cours.

Créer un compte gratuitement →
À lire aussi