> 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/rcs-scenario.md).

# Scénario RCS

Cette requête démarre un scénario RCS pour une liste de numéros à partir de son identifiant (token).

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

## Présentation

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.

Cette route **démarre un scénario** pour une liste de numéros en fournissant simplement son identifiant (`scenarioToken`), sans avoir à reconstruire son contenu. Une fois le message d’entrée envoyé, la suite du dialogue (réponses du bot aux clics) est **gérée automatiquement** côté plateforme.

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

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

L’identifiant se récupère dans **Scénarios RCS** (`/dashboard/rcs/scenario`), colonne **« Identifiant API »**, bouton **Copier l’identifiant**.

## URL

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

Rate limit : 30 requêtes / 60 secondes *(voir* [Limites de débit)](/api/sms-partner/rate-limiting.md)*)*

{% 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 %}

#### **Paramètres obligatoires**

<table data-full-width="false"><thead><tr><th width="180">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.smspartner.fr/dashboard/api/paramaters">Votre clé API</a></td></tr><tr><td><code>scenarioToken</code></td><td>Identifiant du scénario RCS à démarrer. Le scénario doit être <strong>validé / activé</strong> sur la plateforme.</td></tr><tr><td><code>phoneNumbers</code></td><td><p>Numéros de téléphone des destinataires.<br>Pour l’envoi vers plusieurs destinataires les numéros doivent être séparés par des virgules. <strong>La limite d’envoi sur une seule requête est de 500 numéros.</strong><br>Ils peuvent être :</p><ul><li>au format national (06xxxxxxxx) ou international (+336xxxxxxxx), pour des numéros français.</li><li>au format international (+496xxxxxxxx), pour des numéros hors France.</li></ul></td></tr></tbody></table>

{% hint style="info" %}
Vous n’envoyez **pas** de `richContent` : le contenu vient du scénario.
{% endhint %}

#### **Paramètres optionnels**

<table><thead><tr><th width="227">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>tag</code></td><td>Étiquette libre pour retrouver l’envoi (3 à 20 caractères, sans espace).</td></tr><tr><td><code>scheduledDeliveryDate</code></td><td><strong>(Déprécié)</strong> Date d’envoi au format <code>dd/mm/YYYY</code> (envoi différé).</td></tr><tr><td><code>time</code></td><td><p><strong>(Déprécié)</strong> Heure d’envoi (format 0-24).</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> est défini, ce paramètre est obligatoire.</p></div></td></tr><tr><td><code>minute</code></td><td><p><strong>(Déprécié)</strong> Minute d’envoi (format 0-55, par intervalle de cinq minutes).</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> est défini, ce paramètre est obligatoire.</p></div></td></tr><tr><td><code>scheduledAt</code></td><td>Envoi différé en une seule valeur : date absolue (<code>2026-05-20 10:15</code>, <code>20/05/2026 10:15</code>, ISO 8601…) ou délai relatif (<code>+2 hours</code>, <code>+3 jours</code>…). Remplace <code>scheduledDeliveryDate</code> / <code>time</code> / <code>minute</code>. La date obtenue doit être dans le futur et au maximum 3 mois à l’avance.</td></tr><tr><td><code>sandbox</code></td><td><code>true</code> = simulation, aucun envoi réel.</td></tr><tr><td><code>urlDlr</code></td><td>URL de callback pour les accusés de réception.</td></tr><tr><td><code>urlResponse</code></td><td>URL de callback pour les réponses / interactions.</td></tr><tr><td><code>failover</code></td><td>SMS de repli si le RCS n’est pas délivré : <code>{ "message": "...", "sender": "..." }</code>.</td></tr></tbody></table>

#### Requêtes

{% tabs fullWidth="true" %}
{% tab title="PHP" %}

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'scenarioToken'=> 'SCENARIO_TOKEN',
            'phoneNumbers'=> '+336xxxxxxxx',
            'tag'=> 'relance-panier',
            'failover'=> array(
                'sender'=> 'MaMarque',
                'message'=> 'Votre panier vous attend : https://exemple.com/panier'
            )
        );


        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/rcs/scenario/to/send');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS,json_encode($fields));

        $result = curl_exec($curl);
        curl_close($curl);

        // Process your response here
        echo $result;
?>
```

{% endtab %}

{% tab title="VB.net" %}

```vbnet
Imports System.IO
Imports System.Net

Module Module1

  Sub Main()

    Dim base_url As String = "https://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"

    #start rcs scenario
    url = base_url & "rcs/scenario/to/send"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""scenarioToken"":""{1}"",""phoneNumbers"":""{2}""}}",
        apiKey,
        "SCENARIO_TOKEN",
        "+33XXXXXXXXX")
    Console.Write(parameters)
    apiRequest("POST", url, parameters)

  End Sub

  Function apiRequest(method As String, url As String, parameters As String) As String

    Dim request As HttpWebRequest
    request = WebRequest.Create(url)
    request.Method = method
    request.Timeout = 10000   # timeout in ms
    request.ContentType = "application/json; charset=utf-8"
    request.ContentLength = 0

    #set POST data
    If Not String.IsNullOrEmpty(parameters) Then
      request.ContentLength = parameters.Length
      Using reqStream As StreamWriter = New StreamWriter(request.GetRequestStream())
        reqStream.Write(parameters)
      End Using
    End If

    #get response
    Dim returnValue As String = Nothing
    Using response As HttpWebResponse = request.GetResponse()
      If response.StatusCode = HttpStatusCode.OK Then
        Using resStream = response.GetResponseStream()
          If resStream IsNot Nothing Then
            Using reader As New StreamReader(resStream)
              returnValue = reader.ReadToEnd()
            End Using
          End If
        End Using
      End If
    End Using
    apiRequest = returnValue

  End Function

End Module
```

{% endtab %}

{% tab title="Python" %}

```python
# std
import json
from collections import OrderedDict

# 3p
import requests

API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"


def start_scenario(scenario_token, phone_numbers):
    data = OrderedDict([
        ("apiKey", API_KEY),
        ("scenarioToken", scenario_token),
        ("phoneNumbers", phone_numbers),
    ])

    r = requests.post(URL + "/rcs/scenario/to/send", data=json.dumps(data))
    r_json = r.json()
    print(r_json)
    return r_json.get("success") is True
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","scenarioToken":"SCENARIO_TOKEN","phoneNumbers":"+336xxxxxxxx"}' https://api.smspartner.fr/v1/rcs/scenario/to/send
```

{% endtab %}

{% tab title="Nodejs" %}

```javascript
const https = require('https');

// Préparer les données pour la requête POST
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  // identifiant du scénario RCS créé et activé dans votre compte SMS Partner
  scenarioToken: 'SCENARIO_TOKEN',
  phoneNumbers: '+336XXXXXXXX',
  tag: 'relance-panier',
  failover: {
    sender: 'MaMarque',
    message: 'Votre panier vous attend : https://exemple.com/panier'
  }
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/rcs/scenario/to/send',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': data.length
  }
};

let req = https.request(options, (res) => {
  let data = '';
  res.on('data', (chunk) => {
    data += chunk;
  });

  res.on('end', () => {
    console.log(JSON.parse(data));
  });

}).on("error", (err) => {
  console.log("Erreur: " + err.message);
});

req.write(data);
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class ScenarioRcs {
    public static void main(String[] args) {
        try {
            String apiKey = "your_api_key";
            String scenarioToken = "SCENARIO_TOKEN";
            String phoneNumbers = "+336XXXXXXXX";

            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"scenarioToken\": \"" + scenarioToken +
                    "\", \"phoneNumbers\": \"" + phoneNumbers + "\"}";

            URL url = new URL("https://api.smspartner.fr/v1/rcs/scenario/to/send");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();

            System.out.println(response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import Foundation

let apiKey = "YOUR_API_KEY"
let scenarioToken = "SCENARIO_TOKEN"
let phoneNumber = "+336xxxxxxxx"

let url = URL(string: "https://api.smspartner.fr/v1/rcs/scenario/to/send")!

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

let parameters: [String: Any] = [
    "apiKey": apiKey,
    "scenarioToken": scenarioToken,
    "phoneNumbers": phoneNumber
]

request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    if let error = error {
        print("Error: \(error)")
    } else if let data = data {
        print(String(data: data, encoding: .utf8) ?? "")
    }
}

task.resume()
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	data := map[string]interface{}{
		"apiKey":        "YOUR API KEY",
		"scenarioToken": "SCENARIO_TOKEN",
		"phoneNumbers":  "+336xxxxxxxx",
	}

	payload, err := json.Marshal(data)
	if err != nil {
		log.Fatalf("Error preparing data: %v", err)
	}

	client := &http.Client{Timeout: 10 * time.Second}
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/rcs/scenario/to/send", bytes.NewBuffer(payload))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}

	req.Header.Set("Content-Type", "application/json")

	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("Error reading response body: %v", err)
	}

	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

class Program
{
    private static readonly HttpClient client = new HttpClient();

    static async Task Main(string[] args)
    {
        var request = new
        {
            apiKey = "YOUR_API_KEY",
            scenarioToken = "SCENARIO_TOKEN",
            phoneNumbers = "+336xxxxxxxx"
        };

        var content = new StringContent(
            JsonConvert.SerializeObject(request),
            Encoding.UTF8,
            "application/json");

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/rcs/scenario/to/send", content);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("POST request failed with status code: " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### Exemple avec repli SMS et programmation

```json
{
    "apiKey": "VOTRE_CLE_API",
    "scenarioToken": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0",
    "phoneNumbers": ["+33612345678"],
    "tag": "relance-panier",
    "scheduledAt": "+1 hour",
    "failover": {
        "message": "Votre panier vous attend : https://exemple.com/panier",
        "sender": "MaMarque"
    }
}
```

#### Ce qui se passe ensuite

1. Le **message d’entrée** du scénario est envoyé aux numéros fournis.
2. Quand un destinataire **clique sur une suggestion**, le webhook RCS déclenche automatiquement l’envoi du **nœud suivant** du scénario.

#### **Réponse**

{% tabs %}
{% tab title="json" %}

```json
{
   "success": true,
   "code": 200,
   "message_id": 123456,
   "nb_rcs": 2,
   "cost": 0.10,
   "cost_conversation": 0.04,
   "currency": "EUR"
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

{% tabs %}
{% tab title="json" %}

```json
{
    "success": false,
    "code": 64,
    "message": "Le scénario RCS n'est pas activé"
}
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

<table><thead><tr><th width="234">Code de réponse</th><th>Réponse</th></tr></thead><tbody><tr><td>1</td><td>La Clé API est requise</td></tr><tr><td>2</td><td><code>phoneNumbers</code> est requis</td></tr><tr><td>13</td><td>Aucun prix par défaut vers cette destination</td></tr><tr><td>14</td><td>Numéro dans la liste STOP</td></tr><tr><td>50</td><td><code>scenarioToken</code> est requis (paramètre absent)</td></tr><tr><td>55</td><td>Aucun numéro valide à envoyer</td></tr><tr><td>63</td><td>Scénario RCS introuvable : le token ne correspond à aucun scénario de votre compte</td></tr><tr><td>64</td><td>Le scénario RCS n’est pas activé : le scénario existe mais n’a pas été validé / activé sur la plateforme</td></tr><tr><td>65</td><td>Le scénario RCS n’a pas de message d’entrée / est vide : aucun premier nœud valide (à compléter sur la plateforme)</td></tr><tr><td>96</td><td>IP non autorisée</td></tr><tr><td>401</td><td>Compte non autorisé pour le RCS</td></tr><tr><td>403</td><td>Utilisateur non autorisé (clé API invalide, compte désactivé…)</td></tr></tbody></table>

Les autres validations (numéros, programmation, tailles de champs, crédits…) restent identiques à un envoi RCS classique.


---

# 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/rcs-scenario.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.
