> For the complete documentation index, see [llms.txt](https://www.docpartner.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.docpartner.dev/api/sms-partner/rcs.md).

# RCS

{% hint style="info" %}
Pour activer cette fonctionnalité merci de [contacter l'équipe technique](https://www.smspartner.fr/contact/)
{% endhint %}

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/rcs/send`

{% hint style="warning" %}
La plateforme n’envoie pas de SMS commerciaux entre **20h et 8h en semaine et les dimanches et jours fériés** (restriction légale). Si un message SMS est envoyé, le message est **en pause jusqu’au prochain jour ouvrable à 8h**.\
Vous n’envoyez pas de SMS commerciaux ? Contactez nous pour désactiver cette restriction : <help@smspartner.fr>
{% endhint %}

Rate limit : 30 requêtes / 60 secondes

#### Paramètres obligatoires

<table><thead><tr><th width="220">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td>Votre clé API.</td></tr><tr><td><code>phoneNumbers</code></td><td>Numéros de téléphone des destinataires. Pour l'envoi de plusieurs SMS les numéros doivent être séparés par des virgules. La limite d'envoi sur une seule requête est de 500 numéros. Ils peuvent être : au format national (06xxxxxxxx) ou international (+336xxxxxxxx), pour des numéros français ; au format international (+496xxxxxxxx), pour des numéros hors France.</td></tr><tr><td><code>isUnicode</code></td><td><code>1</code></td></tr><tr><td><code>richContent</code></td><td>Le contenu enrichi du message RCS. Voir la section <a href="#contenu-enrichi">Contenu enrichi</a>. Obligatoire, sauf si <code>modelToken</code> est fourni (voir <a href="#envoyer-a-partir-dun-modele-modeltoken">Envoyer à partir d'un modèle</a>).</td></tr></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="220">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>modelToken</code></td><td>Identifiant (32 caractères) d'un modèle RCS enregistré sur la plateforme. À utiliser <strong>à la place de</strong> <code>richContent</code> : le contenu du message provient alors du modèle. Voir la section <a href="#envoyer-a-partir-dun-modele-modeltoken">Envoyer à partir d'un modèle</a>. Récupérable dans <a href="https://my.smspartner.fr/dashboard/model/list">Modèles de message</a> (colonne « Identifiant ») ou dans la fiche du modèle (panneau « Identifiant API »). Seuls les modèles de type <code>RCS</code> (texte, carte enrichie, carrousel, fichier) possèdent un identifiant ; les modèles <code>SMS</code> ne sont pas utilisables ici. <code>modelToken</code> et <code>richContent</code> sont mutuellement exclusifs.</td></tr><tr><td><code>scheduledDeliveryDate</code></td><td><strong>(Déprécié)</strong> Date d'envoi du SMS, au format <code>dd/mm/YYYY</code>. À définir uniquement si vous souhaitez que les SMS soient envoyés en différé.</td></tr><tr><td><code>time</code></td><td><strong>(Déprécié)</strong> Heure d'envoi du SMS (format 0-24), obligatoire si <code>scheduledDeliveryDate</code> est défini.</td></tr><tr><td><code>minute</code></td><td><strong>(Déprécié)</strong> Minute d'envoi du SMS (format 0-55, par intervalle de cinq minutes), obligatoire si <code>scheduledDeliveryDate</code> est défini.</td></tr><tr><td><code>urlResponse</code></td><td>Url de retour des évènements RCS (ex : http://www.monurldereponse) — Les clics — Les lectures — Les demandes de désinscription (STOP) — Les réponses des destinataires.</td></tr><tr><td><code>urlDlr</code></td><td>Url de retour des accusés de réception (ex : http://www.monurldedlr).</td></tr><tr><td><code>scheduledAt</code></td><td>Permet de différer l'envoi du SMS, en une seule valeur, sous deux formes possibles :<br><br><strong>1. Date absolue</strong> — formats acceptés :<br>– <code>2026-05-20 10:15</code> ou <code>2026-05-20 10:15:00</code><br>– <code>2026-05-20T10:15:00</code> (ISO 8601)<br>– <code>20/05/2026 10:15</code><br>– <code>2026-05-20</code> ou <code>20/05/2026</code> (envoi à minuit ce jour-là)<br><br><strong>2. Délai relatif</strong> — envoi dans X unités de temps à partir de maintenant :<br>– <code>+10 minutes</code>, <code>+2 hours</code>, <code>+3 days</code>, <code>+1 week</code>, <code>+1 month</code> (anglais)<br>– <code>+10 minutes</code>, <code>+2 heures</code>, <code>+3 jours</code>, <code>+1 semaine</code>, <code>+1 mois</code>, <code>+1 an</code> (français, avec abréviations tolérées : min, mn, h, j, hrs)<br>– Le <code>+</code> est optionnel (<code>10 minutes</code> équivaut à <code>+10 minutes</code>)<br><br><strong>Comportement :</strong><br>– Si <code>scheduledAt</code> est renseigné, il remplace les anciens paramètres <code>scheduledDeliveryDate</code> / <code>time</code> / <code>minute</code> (conservés pour rétrocompatibilité, mais <code>scheduledAt</code> est désormais recommandé).<br>– L'horaire calculé est arrondi au créneau de 5 minutes supérieur (un envoi n'est programmable que toutes les 5 minutes : 10h15, 10h20, 10h25...).<br>– La date obtenue doit être dans le futur, et au maximum 3 mois à l'avance.<br><br><strong>Exemple :</strong> <code>{ "apiKey": "xxxxx", "phoneNumbers": "+33600000000", "message": "Votre rendez-vous approche", "scheduledAt": "+2 hours" }</code><br><br><strong>Erreurs :</strong> si le format n'est reconnu ni comme date absolue ni comme délai relatif, ou si la date résolue est dans le passé / au-delà de 3 mois, l'API renvoie le code d'erreur <code>49</code> avec un message explicite.</td></tr></tbody></table>

## Contenu enrichi

{% tabs %}
{% tab title="Envoyer un texte" %}

```json
{
    "apiKey": "",
    "isUnicode": 1,
    "phoneNumbers": [
        "+33....."
    ],
    "richContent": {
        "conversation": {
            "text": "",
            "suggestions": [
                //Voir la section suggestions (4 maximum)
            ]
        }
    },

    //optionnel : Permet d'envoyer un SMS si le RCS n'est pas accepté sur l'appareil du destinataire
    "failover": {
        "sender": "...",
        "message": "ceci est un sms de basculement"
    }
}
```

{% endtab %}

{% tab title="Envoyer un fichier" %}

```json
{
    "apiKey": "",
    "phoneNumbers": [
        ""
    ],
    "isUnicode": 1,
    "richContent": {
        "conversation": {
            "file": {
                "media": {
                    "fileUrl": ""
                }
            },
            "suggestions": [
                //Voir la section suggestions (4 maximum)
            ]
        }
    },
    //optionnel : Permet d'envoyer un SMS si le RCS n'est pas accepté sur l'appareil du destinataire
    "failover": {
        "sender": "...",
        "message": "ceci est un sms de basculement"
    }
}
```

{% endtab %}

{% tab title="Envoyer une carte enrichie" %}

```json
{
    "apiKey": "",
    "phoneNumbers": [
        ""
    ],
    "isUnicode": 1,
    "richContent": {
        "conversation": {
            "richCard": {
                "orientation": "VERTICAL", //VERTICAL ou HORIZONTAL
                "thumbnailImageAlignment": "LEFT", //Seulement si orientation == HORIZONTAL, LEFT ou RIGHT
                "title": "", //200 caractères maximum
                "description": "", //500 caractères maximum
                "media": {
                    "height": "MEDIUM", //uniquement si orientation == VERTICAL
                    "mediaUrl": ""
                },
                "suggestions": [
                    //Voir la section suggestions (4 maximum)
                ]
            },

            //suggestions globales (8 maximum)
            "suggestions": [
                //Voir la section suggestions (8 maximum)
            ]
        }
    },

    //optionnel : Permet d'envoyer un SMS si le RCS n'est pas accepté sur l'appareil du destinataire
    "failover": {
        "sender": "...",
        "message": "ceci est un sms de basculement"
    }
}
```

{% endtab %}

{% tab title="Envoyer un carrousel" %}

```json
{
    "apiKey": "",
    "phoneNumbers": [
        ""
    ],
    "isUnicode": 1,
    "richContent": {
        "conversation": {
            "carousel": {
                "cardWidth": "MEDIUM", //MEDIUM ou SMALL

                // 8 cartes maximum
                "cards": [
                    {
                        "title": "", //200 caractères maximum
                        "description": "", //500 caractères maximum
                        "media": {
                            "height": "MEDIUM",
                            "mediaUrl": ""
                        },
                        "suggestions": [
                            //Voir la section suggestions (4 maximum)
                        ]
                    },
                    {
                        "title": "", //200 caractères maximum
                        "description": "", //500 caractères maximum
                        "media": {
                            "height": "MEDIUM",
                            "mediaUrl": ""
                        },
                        "suggestions": [
                            //Voir la section suggestions (4 maximum)
                        ]
                    }
                ]
            },

            //suggestions globales (8 maximum)
            "suggestions": [
                //Voir la section suggestions (8 maximum)
            ]
        }
    },

    //optionnel : Permet d'envoyer un SMS si le RCS n'est pas accepté sur l'appareil du destinataire
    "failover": {
        "sender": "...",
        "message": "ceci est un sms de basculement"
    }
}
```

{% endtab %}
{% endtabs %}

## Suggestions

{% tabs %}
{% tab title="Réponse" %}

```json
{
    "reply": {
        "text": "Réponse 2",
        "postbackData": "postback_..." //Valeur unique qui sera envoyée en réponse à une suggestion.
    }
}
```

{% endtab %}

{% tab title="Action : Ouvrir une URL" %}

```json
{
    "action": {
        "text": "Open SMSPartner",
        "postbackData": "postback_...", //Valeur unique qui sera envoyée en réponse à une suggestion.
        "openUrlAction": {
            "url": "https://www.smspartner.fr", //URL qui s'ouvrira sur le téléphone lorsque la suggestion est sélectionnée. URI valide au sens de la RFC 3986. Tous les formats d'URI ne sont pas pris en charge par tous les réseaux.
            "application": "WEBVIEW", //optionnel : BROWSER (défaut, navigateur externe) ou WEBVIEW (fenêtre intégrée à la conversation)
            "webviewViewMode": "FULL", //requis si WEBVIEW : FULL (plein écran), HALF (moitié) ou TALL (3/4)
            "description": "Site SMSPartner" //optionnel : texte d'accessibilité, 100 caractères maximum, recommandé en WEBVIEW
        }
    }
}
```

Voir la section [Ouverture d'une URL en WebView](#ouverture-dune-url-en-webview) pour le détail des paramètres.
{% endtab %}

{% tab title="Action : Appeler" %}

```json
{
    "action": {
        "text": "Appeler SMSPartner",
        "postbackData": "postback_...", //Valeur unique qui sera envoyée en réponse à une suggestion.
        "dialAction": {
            "phoneNumber": "+33......." //Numéro de téléphone valide
        }
    }
}
```

{% endtab %}

{% tab title="Action : Localisation" %}

```json
{
    "action": {
        "text": "Emplacement",
        "postbackData": "postback_...", //Valeur unique qui sera envoyée en réponse à une suggestion.
        "viewLocationAction": {
            "label": "Ici !!!", //Label de l'emplacement.
            "latLong": {
                "latitude": 2.4220188, //Latitude du lieu
                "longitude": -122.0844786 //Longitude du lieu
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

### Ouverture d'une URL en WebView

L'action « Ouvrir une URL » (`openUrlAction`) peut ouvrir le lien **dans une WebView intégrée à la conversation** au lieu du navigateur externe, grâce à des paramètres optionnels.

{% hint style="info" %}
Ces paramètres sont facultatifs et rétrocompatibles : sans eux, le lien s'ouvre dans le navigateur (`application` = `BROWSER`).
{% endhint %}

<table><thead><tr><th width="220">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>url</code></td><td><strong>Obligatoire.</strong> URL à ouvrir. Doit être une URL valide (http/https).</td></tr><tr><td><code>application</code></td><td>Optionnel. Mode d'ouverture du lien : <code>BROWSER</code> (défaut, navigateur externe) ou <code>WEBVIEW</code> (fenêtre intégrée à la conversation).</td></tr><tr><td><code>webviewViewMode</code></td><td>Taille de la WebView : <code>FULL</code> (plein écran), <code>TALL</code> (3/4) ou <code>HALF</code> (moitié). <strong>Requis</strong> lorsque <code>application</code> = <code>WEBVIEW</code>, et à ne pas fournir sinon.</td></tr><tr><td><code>description</code></td><td>Optionnel. Texte d'accessibilité décrivant la WebView (recommandé en mode <code>WEBVIEW</code>). 100 caractères maximum.</td></tr></tbody></table>

Ces paramètres sont valables partout où une suggestion `openUrlAction` est acceptée : suggestions de message texte, boutons de rich-card et boutons de chaque carte d'un carrousel.

En cas de valeur invalide, l'API retourne une erreur avec l'un des codes suivants : `24` (`application` invalide), `25` (`webviewViewMode` invalide), `26` (`webviewViewMode` fourni sans `application` = `WEBVIEW`), `27` (`webviewViewMode` manquant alors que `application` = `WEBVIEW`), `28` (`description` de plus de 100 caractères).

## Envoyer à partir d'un modèle (modelToken) <a href="#envoyer-a-partir-dun-modele-modeltoken" id="envoyer-a-partir-dun-modele-modeltoken"></a>

Plutôt que de fournir tout le contenu dans `richContent` à chaque appel, vous pouvez enregistrer ce contenu **une seule fois** sous forme de **modèle RCS** sur la plateforme, puis l'envoyer via l'API en indiquant simplement son identifiant (`modelToken`). À chaque envoi, c'est la **version actuelle** du modèle qui est utilisée.

L'identifiant peut aussi être collé dans nos modules et connecteurs (PrestaShop, WooCommerce, Zapier, Make…) partout où un « identifiant de modèle RCS » est demandé.

{% hint style="info" %}
L'identifiant désigne uniquement le modèle à utiliser. Il n'expire pas, n'est pas un secret d'authentification et n'est reconnu que pour le compte propriétaire du modèle (résolution basée sur la `apiKey`). La `apiKey` reste obligatoire.
{% endhint %}

{% hint style="danger" %}
`modelToken` et `richContent` sont **mutuellement exclusifs**. Si les deux sont présents dans la même requête, l'API renvoie une erreur **HTTP 400 (code 62)** et le message n'est pas envoyé. Un `richContent` vide (`{}` ou `null`) est considéré comme non fourni.
{% endhint %}

{% tabs %}
{% tab title="Exemple minimal" %}

```json
{
    "apiKey": "",
    "phoneNumbers": [
        "+33....."
    ],
    "modelToken": "9f8c2b1a7d4e6f30a1b2c3d4e5f60718"
}
```

{% endtab %}

{% tab title="Exemple complet" %}

```json
{
    "apiKey": "",
    "phoneNumbers": [
        "+33....."
    ],
    "modelToken": "9f8c2b1a7d4e6f30a1b2c3d4e5f60718",
    "tag": "campagne-ete",
    "scheduledAt": "+2 hours",
    "sandbox": false,
    "urlDlr": "https://exemple.com/callback/dlr",
    "urlResponse": "https://exemple.com/callback/response",

    //optionnel : Permet d'envoyer un SMS si le RCS n'est pas accepté sur l'appareil du destinataire
    "failover": {
        "sender": "MaMarque",
        "message": "Votre RCS n'a pas pu être remis. Retrouvez notre offre sur https://exemple.com"
    }
}
```

{% endtab %}
{% endtabs %}

Le `modelToken` fournit **le contenu**, l'appel API continue de piloter le reste (destinataires, émetteur de repli, programmation, tag, sandbox, callbacks…). Les autres validations (numéros, programmation, tailles de champs, suggestions…) restent identiques à un envoi RCS classique et s'appliquent après l'injection du contenu du modèle.

<table><thead><tr><th width="234">Code de réponse</th><th>Réponse</th></tr></thead><tbody><tr><td><code>60</code></td><td>Modèle RCS introuvable : l'identifiant ne correspond à aucun modèle RCS de votre compte, ou il pointe vers un modèle SMS.</td></tr><tr><td><code>61</code></td><td>Le modèle RCS est vide : le modèle existe mais son contenu est vide ou invalide (à ré-enregistrer sur la plateforme).</td></tr><tr><td><code>62</code></td><td><code>modelToken</code> et <code>richContent</code> ont été envoyés dans la même requête (mutuellement exclusifs).</td></tr></tbody></table>

## Scénario RCS

Un **scénario RCS** est un dialogue automatisé configuré sur la plateforme : un message d'entrée, des suggestions cliquables et des réponses du bot selon les choix du destinataire. Pour démarrer un scénario par son identifiant (`scenarioToken`), utilisez la route dédiée :

{% content-ref url="/pages/hh61YQoJxxMkBwvyNTDy" %}
[Scénario RCS](/api/sms-partner/rcs/rcs-scenario.md)
{% endcontent-ref %}

## Réponse

```json
{
    "success": true,
    "code": 200,
    "message_id": 1,
    "nb_rcs": 1,
    "cost": 0.12,
    "currency": "EUR"
}
```

## Types de fichiers multimédias acceptés

RBM est compatible avec les types de médias suivants :

| Type de contenu | Type de document     | Extension   | Compatible avec les cartes enrichies |
| --------------- | -------------------- | ----------- | ------------------------------------ |
| application/ogg | Audio OGG            | .ogx        | Non                                  |
| application/pdf | PDF                  | .pdf        | Non                                  |
| audio/aac       | Audio AAC            | .aac        | Non                                  |
| audio/mp3       | Format audio MP3     | .mp3        | Non                                  |
| audio/mpeg      | Audio MPEG           | .mpeg       | Non                                  |
| audio/mpg       | Audio MPG            | .mp3        | Non                                  |
| audio/mp4       | Audio MP4            | .mp4        | Non                                  |
| audio/mp4-latm  | Audio MP4-latm       | .mp4        | Non                                  |
| audio/3gpp      | Audio 3GPP           | .3gp        | Non                                  |
| image/jpeg      | JPEG                 | .jpeg, .jpg | Oui                                  |
| image/gif       | GIF                  | .gif        | Oui                                  |
| image/png       | PNG                  | .png        | Oui                                  |
| video/h263      | Vidéo H263           | .h263       | Oui                                  |
| video/m4v       | Vidéo M4V            | .m4v        | Oui                                  |
| video/mp4       | Vidéo MP4            | .mp4        | Oui                                  |
| video/mpeg4     | Vidéo MPEG-4         | .mp4, .m4p  | Oui                                  |
| video/mpeg      | Vidéo MPEG           | .mpeg       | Oui                                  |
| video/webm      | Vidéo au format WebM | .webm       | Oui                                  |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://www.docpartner.dev/api/sms-partner/rcs.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
