# Bienvenue

Bienvenue sur la documentation de nos API SMS Partner, Voice Partner et Mail Partner.

### Découvrir

<table data-column-title-hidden data-view="cards" data-full-width="false"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>SMS Partner</strong></td><td>Découvrez l'api SMS</td><td></td><td></td><td><a href="/pages/JOPXH3RvDKsINlPzXsda">/pages/JOPXH3RvDKsINlPzXsda</a></td></tr><tr><td><strong>Voice Partner</strong></td><td>Découvrez l'api Voice</td><td></td><td></td><td><a href="/pages/NjbOz7uUFwZ278BwXW2p">/pages/NjbOz7uUFwZ278BwXW2p</a></td></tr><tr><td><strong>Mail Partner</strong></td><td>Découvrez l'api Mail</td><td></td><td></td><td><a href="/pages/EoaTBrIDcLu5qM8SFBTR">/pages/EoaTBrIDcLu5qM8SFBTR</a></td></tr><tr><td><strong>Codes d'erreur</strong></td><td>Découvrez la liste des codes d'erreur</td><td></td><td></td><td><a href="/pages/t9UocnsyRwI1MRgv4VPO">/pages/t9UocnsyRwI1MRgv4VPO</a></td></tr><tr><td><strong>SDKS</strong></td><td>Découvrez nos SDKS</td><td></td><td></td><td><a href="/pages/AvpXEtyiyWSwB5CaStJE">/pages/AvpXEtyiyWSwB5CaStJE</a></td></tr></tbody></table>


# SMS Partner

Introduction à l'api SMS Partner

Les envois de SMS sont effectués à partir de l’API SMS de [SMS Partner](https://smspartner.fr). Depuis le site, vous avez un accès immédiat à notre API gratuite : elle vous permet d’intégrer facilement nos services de SMS à votre site web, logiciel ou application CRM en PHP, ASP, .NET, Java ou tout autre langage.

### Paramètres obligatoires

Chaque demande d’API prend en charge au minimum les paramètres suivants :

| Nom      | Description                                                                                                     |
| -------- | --------------------------------------------------------------------------------------------------------------- |
| `apiKey` | Clé API de votre compte. Vous l’obtenez dans votre [dashboard SMS Partner](https://my.smspartner.fr/dashboard). |

### Paramètres optionnels

| Nom       | Description                                          |
| --------- | ---------------------------------------------------- |
| `_format` | Format de la réponse : `json` (par défaut) ou `xml`. |

**Exemple d’appel :**

```
https://api.smspartner.fr/v1/me?apiKey=YOUR_API_KEY&_format=json
```

### Format de la réponse et Content-Type

Vous pouvez formater votre requête en `json` ou en `xml`.\
Vous devez renseigner l’en-tête (`Content-Type`) en conséquence :

| `_format` | Content-Type       |
| --------- | ------------------ |
| json      | `application/json` |
| xml       | `application/xml`  |

**Exemple de requête JSON :**

```http
POST /v1/send HTTP/1.1
Host: api.smspartner.fr
Content-Type: application/json

{
    "apiKey": "API_KEY",
    "phoneNumbers": "+33600000000",
    "message": "Hello world"
}
```

### Requêtes

Toutes les demandes API doivent être envoyées vers :

```
http://api.smspartner.fr/v1/{commande}
```

`{commande}` correspond à l’appel API que vous souhaitez exécuter, avec les paramètres inclus dans le body (`POST`) ou dans l’URL (`GET`).

***

### Télécharger un exemple PHP

Téléchargez directement un exemple d’utilisation en PHP :

***

N’hésitez pas à consulter nos SDK disponibles sur ce site.

{% content-ref url="/pages/AvpXEtyiyWSwB5CaStJE" %}
[SDKS](/sdks)
{% endcontent-ref %}


# Webhooks

Gérer les statuts et réponses de vos campagnes SMS

## Réponse sur un numéro court

Après l’envoi d’une campagne depuis notre numéro court, SMS Partner vous permet de recevoir des réponses.\
Pour en savoir plus, [**contactez nous**](https://www.smspartner.fr/contact).

{% hint style="info" %}

#### À noter

Pour recevoir les réponses, vous devez paramétrer votre URL de réception des réponses

dans votre onglet [API SMS](https://my.smspartner.fr/dashboard/api/paramaters)
{% endhint %}

<figure><img src="/files/VmSory8ppZK3IsbGoc5V" alt=""><figcaption></figcaption></figure>

**Exemple de réponse JSON envoyé en POST**

```json
{
"type":"response",
"phone_number":"+336....",
"text":"test",
"message_id":1111111
}

```

**Pour un STOP SMS la réponse du webhook sera**

```json
{
"type":"stop",
"phone_number":"+336...",
"text":"Stop",
"message_id":111111
}
```

## Réponse sur numéro long (numéro virtuel)

SMS Partner vous propose la location d'un numéro long (exemple: 06 XX XX XX XX)\
Pour en savoir plus sur la création d'un numéro long dédié, [contactez nous](https://www.smspartner.fr/contact/).

#### Exemple de réponse simple (160 caractères maximum)

```json
{
  "msisdn": "33xxxxxxxxx",
  "to": "33xxxxxxxxx",
  "messageId": "1235-1234-1233-4665",
  "text": "Test",
  "type": "text",
  "keyword": "Test",
  "message-timestamp": "2016-03-10 09:51:46"
}
```

#### Exemple de réponse sur SMS long (+160 caractères)

```json
{
  "msisdn": "33xxxxxxxxx",
  "to": "33xxxxxxxxx",
  "messageId": "a1b2c3d4-e5f6-40a1-80b2-c9d0e1f....", //au format UUID
  "concat": "true",
  "concat-ref": "171",
  "concat-total": "2",
  "concat-part": "1",
  "text": "   Message long....",
  "type": "text",
  "keyword": "MESSAGELONG",
  "message-timestamp": "2016-03-09 16:00:30"
}
 
{
  "msisdn": "33xxxxxxxxx",
  "to": "33xxxxxxxxx",
  "messageId": "a1b2c3d4-e5f6-40a1-80b2-c9d0e1...", //au format UUID
  "concat": "true",
  "concat-ref": "171",
  "concat-total": "2",
  "concat-part": "2",
  "text": "....très long",
  "type": "text",
  "keyword": "TRESLONG",
  "message-timestamp": "2016-03-09 16:00:31"
}
```

## DLR - récupération des statuts des SMS

**Le statut de délivrabilité des SMS peut être envoyé via le webhook en POST**

<pre class="language-json" data-overflow="wrap"><code class="lang-json"><strong>{
</strong>"status":"delivered",
"msgId":"11111111",
"date":1764768485,
"phone":"+336.......",
"cost":"0.049",
"currency":"EUR",
"tag":"...."
}
</code></pre>

Les différents statuts sont

* delivered : Le SMS a été délivré
* not delivered : Le SMS n'a pas été délivré
* waiting: Le SMS est en attente chez l'opérateur


# Crédits

Cette requête est utilisée pour récupérer votre crédit disponible de SMS, ainsi que le nombre de SMS en instance de départ.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/me`

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

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

<table><thead><tr><th width="142">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></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/me?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "me" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_balance(self):
		url = URL + "/me?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/me?apiKey=xxx
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Préparer les données pour la requête GET
let data = 'apiKey=YOUR API KEY';
let url = 'https://api.smspartner.fr/v1/me?' + data;

https.get(url, (res) => {
  let data = '';

  // Un morceau de données a été reçu.
  res.on('data', (chunk) => {
    data += chunk;
  });

  // La totalité de la réponse a été reçue. Imprimer le résultat.
  res.on('end', () => {
    console.log(JSON.parse(data));
  });

}).on("error", (err) => {
  // Un message d'erreur sera imprimé en cas d'erreur.
  console.log("Erreur: " + err.message);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class CreditsSms {
    public static void main(String[] args) {
        try {
            String apiKey = "your_api_key";
            String url = "https://api.smspartner.fr/v1/me?apiKey=" + apiKey;

            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");

            int responseCode = con.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println(response.toString());
            } else {
                System.out.println("GET request failed. Response Code: " + responseCode);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct Credits: View {
    @State private var credit: String = "Loading..."

    var body: some View {
        VStack {
            Text("Mon crédit")
                .font(.title)
                .padding()

            Text(credit)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: getCredit)
    }

    func getCredit() {
        let apiKey = "Your-api-key"
        let urlString = "https://api.smspartner.fr/v1/me?apiKey=\(apiKey)"

        guard let url = URL(string: urlString) else {
            print("URL inválida")
            return
        }

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

        task.resume()
    }
}

struct CreditView_Previews: PreviewProvider {
    static var previews: some View {
        Credits()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	apiKey := "your_api_key"
	url := "https://api.smspartner.fr/v1/me?apiKey=" + apiKey

	response, err := http.Get(url)
	if err != nil {
		fmt.Println("GET request failed:", err)
		return
	}
	defer response.Body.Close()

	if response.StatusCode == http.StatusOK {
		bodyBytes, err := ioutil.ReadAll(response.Body)
		if err != nil {
			fmt.Println("Failed to read response body:", err)
			return
		}
		fmt.Println(string(bodyBytes))
	} else {
		fmt.Println("GET request failed. Response Code:", response.StatusCode)
	}
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var uri = new Uri($"https://api.smspartner.fr/v1/me?apiKey={apiKey}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "user": {
        "username": "exemple@email.com",
        "firstname": "John",
        "lastname": "Doe"
    },
    "credits": {
        "creditSms": 269082,
        "creditSmsECO": 444570,
        "creditHlr": 2045023,
        "toSend": 0,
        "solde": "10225.119",
        "currency": "EUR",
        "balance": "10225.119"
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <username>exemple@email.com</username>
        <firstname>John</firstname>
        <lastname>Doe</lastname>
    </entry>
    <entry>
        <entry>269070</entry>
        <entry>444551</entry>
        <entry>2044937</entry>
        <entry>0</entry>
        <entry>
            <![CDATA[10224.688]]>
        </entry>
        <entry>
            <![CDATA[EUR]]>
        </entry>
        <entry>
            <![CDATA[10224.688]]>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 10              | Clé API incorrecte      |
| 200             | Tout s’est bien passé ! |


# Sous-comptes

Gérer vos sous-comptes.

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Activation</strong></td><td>Comment activer la fonctionnalité sous-compte</td><td><a href="/pages/BkoaF8tXHdxQomdYp50E">/pages/BkoaF8tXHdxQomdYp50E</a></td></tr><tr><td><strong>Création d'un sous-compte</strong></td><td>Créer un sous-compte sur votre compte</td><td><a href="/pages/2GBgSPoCU5KHk5PMTgQV">/pages/2GBgSPoCU5KHk5PMTgQV</a></td></tr><tr><td><strong>Supprimer un sous-compte</strong></td><td>Supprimer un sous-compte sur votre compte</td><td><a href="/pages/DyVqqDKKc4SFetnxB3jz">/pages/DyVqqDKKc4SFetnxB3jz</a></td></tr><tr><td><strong>Liste des sous-comptes</strong></td><td>Lister vos sous-comptes</td><td><a href="/pages/twbmaYILN60tYnk46sEY">/pages/twbmaYILN60tYnk46sEY</a></td></tr><tr><td>G<strong>érer les crédits</strong></td><td>Gérer les crédits de vos sous-comptes</td><td><a href="/pages/bGlkY2xUptnGDF6gg36S">/pages/bGlkY2xUptnGDF6gg36S</a></td></tr></tbody></table>


# Activation

Découvrez comment activer la fonctionnalité création de sous-comptes.

### Demande d'activation de la fonctionnalité sous-comptes

{% hint style="info" %}

#### Comment activer cette fonctionnalité ?

Veuillez contacter [l'équipe technique](https://www.smspartner.fr/contact/).
{% endhint %}

SMS Partner vous donne la possibilité de créer des sous-comptes. Ainsi vous pouvez gérer un nombre illimité de sous-compte à partir de votre compte principal.

### Création des sous-comptes

{% hint style="info" %}
Pour créer des sous-compte à partir de votre compte maitre, il y a trois solutions possibles.
{% endhint %}

* Via notre API : Voir la [page création de sous-comptes](/api/sms-partner/sous-comptes/creation-dun-sous-compte)
* Via le fichier Excel : Veuillez télécharger, compléter et nous renvoyer le [fichier modèle](https://my.smspartner.fr/subaccount_model.xls).
* Via la plateforme : Une fois l'option activé vous pouvez en créer [ici](https://my.smspartner.fr/dashboard/sous-compte/liste-sous-compte).


# Création d'un sous compte

Cette requête est utilisée pour créer un sous-compte.

## URL

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

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

#### **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>type</code></td><td><p>Type de sous-compte : ce choix est définitif, il ne sera plus possible de le modifier</p><ul><li>simple:<br>– Le sous compte ne recevra aucun email ni SMS.<br>– Aucun numéros de téléphone demandé.<br>– L’achat n’est pas permis.</li><li>advanced :<br>– Un email valide est demandé.<br>– Le processus d’inscription est identique à celui d’un compte standard.<br>– Un numéro de téléphone mobile sera demandé à l’inscription.</li></ul></td></tr><tr><td><code>parameters</code></td><td><div data-gb-custom-block data-tag="tabs"><div data-gb-custom-block data-tag="tab" data-title="Sous-compte simple"><ul><li><code>email</code> (optionnel) : Si ce champ est vide, un email sera généré automatiquement (ex: 98755587@smspartner.fr)</li><li><code>creditToAttribute</code> (optionnel) : Crédits en euro ajouté au sous-compte lors de la création. Ce crédit sera déduit du solde de votre compte principal.</li><li><code>title</code> (optionnel) : Nom du sous-compte</li><li><code>firstname</code> (optionnel) : Prénom du titulaire du sous-compte</li><li><code>lastname</code> (optionnel) : Nom du titulaire du sous-compte</li></ul></div><div data-gb-custom-block data-tag="tab" data-title="Sous-compte advanced"><ul><li><code>email</code> : Email valide du titulaire du compte</li><li><code>isBuyer</code> : <code>1</code> ou <code>0</code>, si isBuyer=1 alors le sous-compte pour acheter ses propres SMS</li><li><code>creditToAttribute</code> (optionnel) : Crédits en euro ajouté au sous-compte lors de la création. Ce crédit sera déduit du solde de votre compte principal.</li><li><code>title</code> (optionnel) : Nom du sous-compte</li><li><code>firstname</code> (optionnel) : Prénom du titulaire du sous-compte</li><li><code>lastname</code> (optionnel) : Nom du titulaire du sous-compte</li></ul></div></div></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',
            'type'=> 'advanced',
            'parameters'=>array(
                'email':'aaaa@bbb.ccc',
    	        'creditToAttribute':10,
    	        'isBuyer':0,
    	        'firstname':'prenom',
    	        'lastname':'nom'
            ));
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/create');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/create"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""type"":""{1}"",""parameters"":""{2}""}}",
        apiKey,
        "advanced",
        {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"})
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def create(self,creditToAdd,userId):
 
		data = {"apiKey":APIKEY,"type":"advanced","parameters": {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}
 
 
		url = URL + "/subaccount/create"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","type":"advanced","parameters":{"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}' https://api.smspartner.fr/v1/subaccount/create
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Remplacez par votre clé API
const apiKey = "VOTRE_CLÉ_API";

// Préparer les données pour la requête POST
const data = JSON.stringify({
  apiKey: apiKey,
  type: "advanced",
  parameters: {
    email: "aaaa@bbb.ccc",
    creditToAttribute: 10,
    isBuyer: 0,
    firstname: "prenom",
    lastname: "nom",
  },
});

// Définir les options pour la requête HTTP POST vers l'API SMS Partner
const options = {
  hostname: "api.smspartner.fr",
  port: 443,
  path: "/v1/subaccount/create",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": data.length,
    "cache-control": "no-cache",
  },
};

// Effectuer la requête HTTP POST avec les options et données définies précédemment
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  // Afficher les données de réponse de l'API sur la sortie standard
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

// Afficher en cas d'erreur lors de l'exécution de la requête HTTP POST
req.on("error", (error) => {
  console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;


public class SubAccountCreation {
    public static void main(String[] args) {
        try {
            // Remplacez par votre clé API
            String apiKey = "VOTRE_CLÉ_API";

            // Préparer les données pour la requête POST
            JSONObject parameters = new JSONObject();
            parameters.put("email", "aaaa@bbb.ccc");
            parameters.put("creditToAttribute", 10);
            parameters.put("isBuyer", 0);
            parameters.put("firstname", "prenom");
            parameters.put("lastname", "nom");

            JSONObject json = new JSONObject();
            json.put("apiKey", apiKey);
            json.put("type", "advanced");
            json.put("parameters", parameters);

            URL url = new URL("https://api.smspartner.fr/v1/subaccount/create");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

            // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream();
            os.write(json.toString().getBytes());
            os.flush();

            // Lecture de la réponse de l'API
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());

            // Afficher la réponse JSON
            System.out.println(response);

            // Fermeture de la connexion HTTP
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

// Structure pour la vue "CreationSubCompte"
struct CreationSubCompte: View {
    var body: some View {
        // Un bouton qui appelle la fonction createSubaccount() lorsqu'il est pressé
        Button(action: {
            createSubaccount()
        }) {
            Text("Créer sous-compte")
                .font(.system(size: 20))
                .foregroundColor(.white)
                .frame(minWidth: 0, maxWidth: .infinity)
                .padding()
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                .cornerRadius(10)
                .padding(.horizontal)
        }
    }

    // Fonction pour créer un sous-compte
    func createSubaccount() {
        let url = URL(string: "https://api.smspartner.fr/v1/subaccount/create")! // URL pour créer un sous-compte

        // Paramètres pour la requête
        let parameters: [String: Any] = [
            "apiKey": "TU_CLAVE_API", // Votre clé API
            "type": "advanced",
            "parameters": [
                "email": "aaaa@bbb.ccc", // Adresse e-mail du sous-compte
                "creditToAttribute": 10, // Crédit à attribuer
                "isBuyer": 0, // Indique si le sous-compte est un acheteur
                "firstname": "prenom", // Prénom de l'utilisateur du sous-compte
                "lastname": "nom" // Nom de l'utilisateur du sous-compte
            ] as [String : Any]
        ]

        // Création de la requête
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("no-cache", forHTTPHeaderField: "cache-control")

        // Ajout du corps de la requête
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
        } catch let error {
            print(error.localizedDescription)
        }

        // Tâche pour envoyer la requête et recevoir la réponse
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            // Si une erreur survient, on l'affiche
            if let error = error {
                print("Erreur : \(error)")
            }
            // Sinon, on traite les données reçues
            else if let data = data {
                do {
                    // On tente de convertir les données reçues en JSON
                    if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                        print(json) // On affiche le JSON obtenu
                    }
                } catch let error {
                    print("Erreur : \(error)")
                }
            }
        }

        task.resume() // On lance la tâche
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type Fields struct {
	APIKey     string      `json:"apiKey"`
	Type       string      `json:"type"`
	Parameters Parameters `json:"parameters"`
}

type Parameters struct {
	Email            string `json:"email"`
	CreditToAttribute int    `json:"creditToAttribute"`
	IsBuyer          int    `json:"isBuyer"`
	Firstname        string `json:"firstname"`
	Lastname         string `json:"lastname"`
}

func main() {
	// Prepare data for POST request
	data := Fields{
		APIKey: "YOUR_API_KEY",
		Type:   "advanced",
		Parameters: Parameters{
			Email:            "aaaa@bbb.ccc",
			CreditToAttribute: 10,
			IsBuyer:          0,
			Firstname:        "prenom",
			Lastname:         "nom",
		},
	}

	payloadBuf := new(bytes.Buffer)
	json.NewEncoder(payloadBuf).Encode(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/create", payloadBuf)
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Add("Content-Type", "application/json")

	// Create HTTP client and send the request
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Print the response status and body
	log.Printf("Response status: %s", resp.Status)
	log.Printf("Response body: %s", string(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 fields = new
        {
            apiKey = "VOTRE_CLÉ_API",
            type = "advanced",
            parameters = new 
            {
                email = "aaaa@bbb.ccc",
                creditToAttribute = 10,
                isBuyer = 0,
                firstname = "prenom",
                lastname = "nom"
            }
        };

        var json = JsonConvert.SerializeObject(fields);

        var uri = new Uri("https://api.smspartner.fr/v1/subaccount/create");
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        HttpResponseMessage response = await client.PostAsync(uri, content);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("La requête POST a échoué avec le code d'état : " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
 "success":true,
 "code":200,
 "subaccount":
 {
    "email":"aaaa@bbb.ccc",
    "token":"token"
 },
 "sendConfirmMailTo":"aaaa@bbb.ccc",
 "parent_email":"emailparent@ddd.eee"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>
    <entry><![CDATA[aaaa@bbb.ccc]]></entry>
    <entry><![CDATA[token]]></entry>
  </entry>
  <entry><![CDATA[aaaa@bbb.ccc]]></entry>
  <entry><![CDATA[emailparent@ddd.eee]]></entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>3</td><td>isBuyer est requis</td></tr><tr><td>4</td><td>Le type est requis (simple ou advanced)</td></tr><tr><td>5</td><td>Le type de sous-compte n'existe pas (simple ou advanced)</td></tr><tr><td>6</td><td>L'email est requis</td></tr><tr><td>7</td><td>Un compte existe déjà avec cet email</td></tr><tr><td>8</td><td>creditToAttribute doit être supérieure à 0</td></tr><tr><td>9</td><td>La balance doit être supérieure à 0</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Supprimer un sous-compte

Cette requête est utilisée pour supprimer un sous-compte.

## URL

<mark style="color:red;">`DELETE`</mark> `https://api.smspartner.fr/v1/subaccount/remove`

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

#### **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>token</code></td><td>Identifiant du sous-compte</td></tr></tbody></table>

#### Requêtes

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

```
curl --location --request DELETE 'https://api.smspartner.fr/v1/subaccount/remove' \
--header 'Content-Type: application/json' \
--data-raw '{
   "apiKey": "YOUR_API_KEY",
   "token": "TOKEN SUBACCOUNT"}'
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
   "success": true,
   "code": 200
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le Token est requis</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr><tr><td>404</td><td>Le sous-compte n'existe pas</td></tr></tbody></table>


# Liste des sous-comptes

Cette requête est utilisée pour lister les sous-comptes de votre compte principal.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/subaccount/list`

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

#### **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>page</code></td><td>Le numéro de la page, il y a 20 résultats par page. Si ce paramètre est laissé vide la page 1 sera retourné.</td></tr></tbody></table>

#### **Paramètre optionnel**

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/list?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "subaccount/list" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_list_subaccount(self):
		url = URL + "/subaccount/list?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/subaccount/list?apiKey=xxx&page=1
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Permets de récupérer la liste des sous-comptes
let data = 'apiKey=YOUR_API_KEY';
let url = 'https://api.smspartner.fr/v1/subaccount/list?' + data;

https.get(url, (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);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class RécupérationDesSousComptes {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/subaccount/list?" +
                    "apiKey=" + apiKey;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct ListeDesSousComptes: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Liste Des Sous Comptes")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: loadSubAccounts)
    }

    func loadSubAccounts() {
        let apiKey = "YOUR_API_KEY"
        let urlString = "https://api.smspartner.fr/v1/subaccount/list?apiKey=\(apiKey)"

        guard let url = URL(string: urlString) else {
            print("Invalid URL")
            return
        }

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print("Error: \(error)")
            } else if let data = data {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct ListeDesSousComptes_Previews: PreviewProvider {
    static var previews: some View {
        ListeDesSousComptes()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	apiKey := "YOUR_API_KEY"
	url := "https://api.smspartner.fr/v1/subaccount/list?apiKey=" + apiKey

	// Create GET request
	resp, err := http.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Print the response body
	log.Printf("Response body: %s", string(body))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        string apiKey = "YOUR_API_KEY";
        var uri = new Uri($"https://api.smspartner.fr/v1/subaccount/list?apiKey={apiKey}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "total": 29,
  "nb_per_page": 20,
  "page": 1,
  "data": [
    {
      "id": 1,
      "email": "email1",
      "type": "simple",
      "token": "token1", //Est utilisé comme identifiant du sous-compte pour ajouter des crédits
      "apiKey": "ApiKey sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "0.800",
          "currency": "EUR"
      }
    },
    {
      "id": 2,
      "email": "email2",
      "type": "simple",
      "token": "token2",
      "apiKey": "ApiKey2 du sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "10.245",
          "currency": "EUR"
      }
    }
  ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
    <entry>true</entry>
    <entry>200</entry>
    <entry>20</entry>
    <entry>1</entry>
    <entry>2</entry>
    <entry>
        <entry>
            <entry>1</entry>
            <entry>
                <![CDATA[email1]]>
            </entry>
            <entry>
                <![CDATA[2016-03-04 11:23:14]]>
            </entry>
            <entry>
                <entry>670</entry>
                <entry>
                    <![CDATA[4]]>
                </entry>
                <entry>666</entry>
 
            </entry>
 
        </entry>
        <entry>
            <entry>2</entry>
            <entry>
                <![CDATA[email2]]>
            </entry>
            <entry xsi:nil="true"/>
            <entry>
                <![CDATA[2016-03-05 09:14:47]]>
            </entry>
            <entry>
                <entry>110</entry>
                <entry>0</entry>
                <entry>110</entry>
 
            </entry>
 
        </entry>
 
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 1               | La Clé API est requise  |
| 10              | Clé API incorrecte      |
| 200             | Tout s'est bien passé ! |


# Gérer les crédits des sous-comptes

Cette requête est utilisée pour créer un sous-compte.

## Ajouter des crédits

{% hint style="info" %}
Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/subaccount/credit/add`

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

#### **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>credit</code></td><td>Nombre de crédit en Euro à ajouter au sous-compte</td></tr><tr><td><code>tokenSubaccount</code></td><td>Identifiant du sous compte</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',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/credit/add');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/add"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/add"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.smspartner.fr/v1/subaccount/credit/add
```

{% endtab %}

{% tab title="Nodejs" %}

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

// permet d'ajouter des crédits à un sous-compte
//Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  credit: '100',
  tokenSubaccount: 'identifiant du sous-compte'
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/subaccount/credit/add',
  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("Error: " + 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 AjouterRetirerDesCredits {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "YOUR API KEY";
            int credit = 100;
            String tokenSubaccount = "identifiant du sous-compte";

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"credit\": " + credit + ", \"tokenSubaccount\": \"" + tokenSubaccount + "\"}";

            // Create POST request
            URL url = new URL("https://api.smspartner.fr/v1/subaccount/credit/add");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AjoutCreditSousCompte: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Ajout Credit Sous Compte")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: ajoutCreditSousCompte)
    }

    func ajoutCreditSousCompte() {
        let apiKey = "YOUR_API_KEY"
        let credit = "100"
        let tokenSubaccount = "identifiant du sous-compte"

        let urlString = "https://api.smspartner.fr/v1/subaccount/credit/add"
        let url = URL(string: urlString)!

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "credit": credit,
            "tokenSubaccount": tokenSubaccount
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct AjoutCreditSousCompte_Previews: PreviewProvider {
    static var previews: some View {
        AjoutCreditSousCompte()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type SubaccountData struct {
	APIKey         string `json:"apiKey"`
	Credit         string `json:"credit"`
	TokenSubaccount string `json:"tokenSubaccount"`
}

func main() {
	apiKey := "YOUR_API_KEY"
	credit := "100"
	tokenSubaccount := "identifiant du sous-compte"

	// Create POST request data
	data := SubaccountData{
		APIKey:         apiKey,
		Credit:         credit,
		TokenSubaccount: tokenSubaccount,
	}
	jsonData, _ := json.Marshal(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/credit/add", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Set("Content-Type", "application/json")

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

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

	// Print the response body
	log.Printf("Response body: %s", string(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 data = new
        {
            apiKey = "YOUR API KEY",
            credit = "100",
            tokenSubaccount = "Subaccount ID"
        };

        string jsonString = JsonConvert.SerializeObject(data);

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/subaccount/credit/add", content);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le crédit est requis</td></tr><tr><td>3</td><td>L'identifiant du sous-compte est requis</td></tr><tr><td>4</td><td>Vous n'avez pas l'autorisation</td></tr><tr><td>5</td><td>Le crédit à attribuer doit être supérieur à 0</td></tr><tr><td>6</td><td>La balance doit être supérieur à 0</td></tr><tr><td>7</td><td>Le sous-compte n'existe pas</td></tr><tr><td>8</td><td>Crédit insufisant</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>

## Supprimer des crédits

{% hint style="info" %}
Depuis votre compte, il vous est possible de supprimer des crédits de vos sous comptes. Les crédits seront ajoutés à votre compte principal.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/subaccount/credit/remove`

#### **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>credit</code></td><td>Nombre de crédit en Euro à supprimer du sous-compte</td></tr><tr><td><code>tokenSubaccount</code></td><td>Identifiant du sous compte</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/credit/remove');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/remove"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/remove"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.smspartner.fr/v1/subaccount/credit/remove
```

{% endtab %}

{% tab title="Nodejs" %}

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

// permet d'ajouter des crédits à un sous-compte
//Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  credit: '100',
  tokenSubaccount: 'identifiant du sous-compte'
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/subaccount/credit/remove',
  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("Error: " + 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 AjouterRetirerDesCredits {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "YOUR API KEY";
            int credit = 100;
            String tokenSubaccount = "identifiant du sous-compte";

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"credit\": " + credit + ", \"tokenSubaccount\": \"" + tokenSubaccount + "\"}";

            // Create POST request
            URL url = new URL("https://api.smspartner.fr/v1/subaccount/credit/remove");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AjoutCreditSousCompte: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Ajout Credit Sous Compte")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: ajoutCreditSousCompte)
    }

    func ajoutCreditSousCompte() {
        let apiKey = "YOUR_API_KEY"
        let credit = "100"
        let tokenSubaccount = "identifiant du sous-compte"

        let urlString = "https://api.smspartner.fr/v1/subaccount/credit/remove"
        let url = URL(string: urlString)!

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "credit": credit,
            "tokenSubaccount": tokenSubaccount
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct AjoutCreditSousCompte_Previews: PreviewProvider {
    static var previews: some View {
        AjoutCreditSousCompte()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type SubaccountData struct {
	APIKey         string `json:"apiKey"`
	Credit         string `json:"credit"`
	TokenSubaccount string `json:"tokenSubaccount"`
}

func main() {
	apiKey := "YOUR_API_KEY"
	credit := "100"
	tokenSubaccount := "identifiant du sous-compte"

	// Create POST request data
	data := SubaccountData{
		APIKey:         apiKey,
		Credit:         credit,
		TokenSubaccount: tokenSubaccount,
	}
	jsonData, _ := json.Marshal(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/credit/remove", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Set("Content-Type", "application/json")

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

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

	// Print the response body
	log.Printf("Response body: %s", string(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 data = new
        {
            apiKey = "YOUR API KEY",
            credit = "100",
            tokenSubaccount = "Subaccount ID"
        };

        string jsonString = JsonConvert.SerializeObject(data);

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/subaccount/credit/remove", content);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le crédit est requis</td></tr><tr><td>3</td><td>L'identifiant du sous-compte est requis</td></tr><tr><td>4</td><td>Vous n'avez pas l'autorisation</td></tr><tr><td>5</td><td>Le crédit à attribuer doit être supérieur à 0</td></tr><tr><td>6</td><td>La balance doit être supérieur à 0</td></tr><tr><td>7</td><td>Le sous-compte n'existe pas</td></tr><tr><td>8</td><td>Crédit insufisant</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Rate limiting

Afin de garantir la stabilité et la disponibilité de l'API pour l'ensemble de nos utilisateurs, chaque endpoint de l'API SMS Partner applique une limite de débit (*rate limiting*). Cette limite définit le nombre maximum de requêtes que vous pouvez effectuer sur un endpoint donné, sur une fenêtre de temps donnée.

## Comment ça fonctionne

La limite est appliquée **par endpoint** et **par adresse IP appelante**. Chaque endpoint dispose de son propre quota, indépendant des autres : consommer votre quota sur un endpoint n'affecte pas votre quota sur un autre.

Le quota est réinitialisé automatiquement à l'expiration de la fenêtre de temps associée à l'endpoint appelé — il n'y a rien à faire de votre côté pour le réinitialiser.

Les limites exactes (nombre de requêtes autorisées et durée de la fenêtre) varient selon les endpoints, en fonction de leur nature et de leur coût pour notre infrastructure. Si vous avez besoin d'un quota plus élevé pour un cas d'usage spécifique, contactez notre support.

## Dépassement de la limite

Lorsque le quota d'un endpoint est dépassé, l'API répond avec le code HTTP **`429 Too Many Requests`** et un corps de réponse JSON de la forme :

```json
{
  "success": false,
  "code": 429,
  "message": "Too many requests, please slow down.",
  "readableLimit": "30 request per 60 secondes"
}
```

Dans ce cas, aucune action n'est effectuée côté serveur : la requête est simplement rejetée, sans effet de bord.

## Headers de réponse

Sur une réponse `429`, l'API renvoie également les headers suivants, qui vous permettent de connaître précisément l'état de votre quota :

| Header                  | Description                                                                 |
| ----------------------- | --------------------------------------------------------------------------- |
| `X-RateLimit-Limit`     | Nombre maximum de requêtes autorisées sur la fenêtre de temps de l'endpoint |
| `X-RateLimit-Remaining` | Nombre de requêtes restantes sur la fenêtre en cours                        |
| `X-RateLimit-Timeleft`  | Nombre de secondes avant la réinitialisation du quota                       |

Exemple de réponse complète :

```http
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Timeleft: 42
Content-Type: application/json

{
  "success": false,
  "code": 429,
  "message": "Too many requests, please slow down.",
  "readableLimit": "30 request per 60 secondes"
}
```

{% hint style="info" %}
Ces headers ne sont garantis que sur les réponses `429`. Ne vous basez pas sur leur présence systématique sur les réponses de succès pour anticiper votre quota restant.
{% endhint %}

## Bonnes pratiques

* **Respectez `X-RateLimit-Timeleft`** avant de retenter votre requête plutôt que de retenter immédiatement en boucle.
* **Mettez en place un backoff** (délai croissant entre les tentatives) en cas de réponses `429` répétées.
* **Évitez le polling agressif** : privilégiez, quand c'est possible, les webhooks plutôt que l'interrogation régulière d'un endpoint de statut.
* **Regroupez vos appels** lorsque l'endpoint le permet (ex : envoi en masse plutôt que plusieurs appels unitaires), afin de limiter le nombre de requêtes nécessaires.

## Besoin d'un quota plus élevé ?

Si les limites par défaut ne conviennent pas à votre volume d'utilisation, contactez notre [support](mailto:contact@smspartner.fr) en précisant l'endpoint concerné et votre besoin : nous étudierons la possibilité d'ajuster votre quota.


# Envoyer des SMS

Les différentes méthode d'envoi de SMS

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Envoi unitaire</strong></td><td>Envoyer un SMS instantanément</td><td><a href="/pages/5U064j4bkxMl43sfjdxe">/pages/5U064j4bkxMl43sfjdxe</a></td></tr><tr><td><strong>Envoi par lots</strong></td><td>Envoyer plusieurs SMS en même temps</td><td><a href="/pages/VIqqusz8WBfJAedMocgU">/pages/VIqqusz8WBfJAedMocgU</a></td></tr><tr><td><strong>Envoi par numéro long</strong></td><td>Envoyer un SMS via un numéro long en émetteur</td><td><a href="/pages/l35VMqe6yv1bGmBGXp9E">/pages/l35VMqe6yv1bGmBGXp9E</a></td></tr><tr><td><strong>Envoi de sondages</strong></td><td>Envoyer un Sondage par SMS</td><td><a href="/pages/B7wVufOj68xba6mxZ8Kw">/pages/B7wVufOj68xba6mxZ8Kw</a></td></tr><tr><td><strong>Annuler l'envoi d'un SMS différé</strong></td><td>Annuler l'envoi d'un SMS différé</td><td><a href="/pages/lrW5vcfhWkGNdmfuu1v7">/pages/lrW5vcfhWkGNdmfuu1v7</a></td></tr><tr><td><strong>Caractères spéciaux</strong></td><td>Liste des caractères spéciaux remplacés à l'envoi d'un SMS</td><td><a href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a></td></tr></tbody></table>


# Envoi unitaire

Cette requête est utilisée pour envoyer des SMS en temps réel ou en différé.

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/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 *(voir* [Limites de débit)](/api/sms-partner/rate-limiting)*)*

#### **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>phoneNumbers</code></td><td><p>Numéros de téléphone des destinataires.<br>Pour l’envoi de plusieurs SMS 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><tr><td><code>Message</code></td><td><p>Contenu du SMS. <strong>160 caractères</strong> maximum par SMS (au delà, il vous sera décompté un SMS supplémentaire par tranche de 153 caractères).</p><p>Saut d'une ligne → :br: <strong>Attention, le saut de ligne compte pour deux caractères.</strong></p><p>Symbole € → :euro:</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Le caractère ” doit obligatoirement être échappé (\”) pour que le texte du SMS soit valide. Dans le cas contraire une erreur 400 sera retournée</p><p>Certains <a data-mention href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a> seront remplacés à l'envoi, merci de les consulter.</p></div></td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>sender</code></td><td><p>Nom d’émetteur du message. Si l’émetteur est laissé vide, vos SMS seront acheminés avec un shortcode opérateur en guise d’expéditeur (exemple : 36xxx).</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Le nombre de caractères pour le nom d’émetteur doit être compris <strong>entre 3 et 11 inclus</strong> et ne <strong>doit pas comporter de caractères spéciaux</strong>.<br>Certains modèles de téléphone portable n’interprètent pas les espaces.</p></div></td></tr><tr><td><code>tag</code></td><td>Chaine de caractères de 20 caractères maximum sans espace(s) et en minuscule(s)</td></tr><tr><td><code>scheduledDeliveryDate</code></td><td>dd/mm/YYYY (envoi différé)</td></tr><tr><td><code>time</code></td><td><p>Format : 0-24 (l'heure de l'envoi)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> est activé ce paramètre est obligatoire</p></div></td></tr><tr><td><code>minute</code></td><td><p>Format : 0-55 (intervalle 5min)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> ce paramètre est obligatoire</p></div></td></tr><tr><td><code>urlResponse</code></td><td>Url de retour des Réponses (ex: http://www.monurldereponse)</td></tr><tr><td><code>urlDlr</code></td><td>Url de retour des Accusé de réceptions (ex: http://www.monurldedlr)</td></tr><tr><td><code>isStopSms</code></td><td>1 pour ajouter la mention STOP à la fin du SMS (obligatoire et automatique pour des SMS commerciaux).</td></tr><tr><td><code>isUnicode</code></td><td><p>Si 1: Active le mode Unicode, le nombre de caractères maximum par SMS sera de 70.</p><p><em>Important : le SMS unicode doit être activé sur votre compte par un administrateur pour que les envois soient disponibles. Merci de prendre contact avec le service technique pour l’activation de cette fonctionnalité.</em></p><p><a href="https://www.smspartner.fr/blog/liste-complete-des-emoticones-a-copier-coller/">> Voir liste complète des émoticônes / emojis</a></p></td></tr><tr><td><code>sandbox</code></td><td><p><code>1</code> pour le mode Bac à Sable</p><div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Aucun SMS ne sera envoyé, et il n’y aura aucun débit sur votre compte. Ces SMS seront supprimés de vos listes d’envois automatiquement tous les jours.</p></div></td></tr><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr><tr><td><code>scheduledAt</code></td><td><p>Permet de différer l'envoi du SMS, en une seule valeur, sous deux formes possibles :</p><p><br></p><p>1. Date absolue — formats acceptés :</p><p>- 2026-05-20 10:15 ou 2026-05-20 10:15:00</p><p>- 2026-05-20T10:15:00 (ISO 8601)</p><p>- 20/05/2026 10:15</p><p>- 2026-05-20 ou 20/05/2026 (envoi à minuit ce jour-là)</p><p><br></p><p>2. Délai relatif — envoi dans X unités de temps à partir de maintenant :</p><p>- +10 minutes, +2 hours, +3 days, +1 week, +1 month (anglais)</p><p>- +10 minutes, +2 heures, +3 jours, +1 semaine, +1 mois, +1 an (français, avec abréviations tolérées : min, mn, h, j, hrs)</p><p>- Le + est optionnel (10 minutes équivaut à +10 minutes)</p><p><br></p><p><strong>Comportement</strong> :</p><p>- Si scheduledAt est renseigné, il remplace les anciens paramètres scheduledDeliveryDate / time / minute (conservés pour rétrocompatibilité, mais scheduledAt est désormais</p><p>recommandé).</p><p>- 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...).</p><p>- La date obtenue doit être dans le futur, et au maximum 3 mois à l'avance.<br><br><code>Exemple de requête :</code></p><p><code>{</code></p><p><code>"apiKey": "xxxxx",</code></p><p><code>"phoneNumbers": "+33600000000",</code></p><p><code>"message": "Votre rendez-vous approche",</code></p><p><code>"scheduledAt": "+2 hours"</code></p><p><code>}</code></p><p><br></p><p><strong>Erreurs</strong> :</p><p>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 49 avec un</p><p>message explicite.<br></p></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',
       'phoneNumbers' => '+336xxxxxxxx',
       'message' => 'This is your message',
       'sender' => 'mycompany',
       'scheduledDeliveryDate' => '21/10/2014',
       'time' => 9,
       'minute' => 0
   );

   $curl = curl_init(); 
   curl_setopt($curl, CURLOPT_URL, 'https://api.smspartner.fr/v1/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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "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}"",""phoneNumbers"":""{1}"",""message"":""{2}""}}",
        apiKey,
        "+33XXXXXXXXX",
        "message de test")
    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
import http.client
import json
conn = http.client.HTTPSConnection("api.smspartner.fr")

payload = json.dumps({
"apiKey": "your api key smspartner", #remplacez par votre clé API SMSPartner
"phoneNumbers": "+336xxxxxxxx", #remplacez par votre numéro de téléphone
"sender": "Your sender name",
"gamme": 1,
"message": "Cest un message test PYTHON", #remplacez par votre message
 "webhookUrl": "https://webhook.site/TOKEN" #remplacez TOKEN par votre token webhook.site
})

headers = {
'Content-Type': 'application/json',
'Content-Length': str(len(payload)),
'cache-control': 'no-cache'
}

conn.request("POST", "/v1/send", payload, headers) #Une requête POST est envoyée au serveur SMSPartner avec le chemin d'URL "/v1/send"

res = conn.getresponse() #La réponse est ensuite stockée dans la variable res.

data = res.read() 

print(data.decode("utf-8")) #Cette ligne lit les données de la réponse HTTP.
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumbers":"xxxx","message":"test","sender":"mycompany"}' https://api.smspartner.fr/v1/send
```

{% endtab %}

{% tab title="Nodejs" %}

```javascript
// Importer le module 'https' de Node.js
const https = require('https');

// Objet JSON qui contient les informations nécessaires pour envoyer le SMS
const data = JSON.stringify({
    apiKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', //remplacez par votre clé API
    phoneNumbers: '+336XXXXXXXX',  //remplacez par votre numéro de téléphone
    sender: 'NodeJS',
    gamme: 1,
    message: "Cest un message test NodeJS" //remplacez par votre message
});

// Définir les options pour la requête HTTP POST vers l'API SMS Partner
const options = {
  hostname: 'api.smspartner.fr',
  port: 443,
  path: '/v1/send',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': data.length,
    'cache-control': 'no-cache',
    'webhookUrl': 'https://webhook.site/TOKEN' // Webhook URL *cette ligne est optionnel*
  }
};

// Demande HTTP POST avec les options et les données définies précédemment
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
  
  // Afficher les données de réponse de l'API sur la sortie standard
  res.on('data', (d) => {
    process.stdout.write(d);
  });
});

// Affichage en cas d'erreur lors de l'exécution de la requête HTTP POST
req.on('error', (error) => {
  console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;

public class SMSRequest {
    public static void main(String[] args) {
        try {
        // Création de l'objet URL avec l'adresse de l'API SMS
            URL url = new URL("https://api.smspartner.fr/v1/send");
        // Ouverture de la connexion HTTP avec l'API
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

        // Création de l'objet JSON contenant les paramètres du SMS à envoyer   
            JSONObject json = new JSONObject();
            json.put("apiKey", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); //your api key smspartner
            json.put("phoneNumbers", "+336XXXXXXXX"); //your phone number
            json.put("virtualNumber", "+336XXXXXXXX");
            json.put("sender", "demo JAVA");
            json.put("gamme", 1);
            json.put("message", "C'est un message test en JAVA !");
            json.put("webhookUrl", "https://webhook.site/TOKEN"); //your webhook url
        
        // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream(); 
            os.write(json.toString().getBytes());
            os.flush();

        // Lecture de la réponse de l'API
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());
            System.out.println(response);
            
        // Fermeture de la connexion HTTP
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct SMSUnitaire: View {
    var body: some View {
        // Un bouton qui appelle la fonction sendSMS() lorsqu'il est pressé
        Button(action: {
            sendSMS()
        }) {
            Text("Envoyer SMS unitaire")
                .font(.system(size: 20)) // Taille du texte
                .foregroundColor(.white) // Couleur du texte
                .frame(minWidth: 0, maxWidth: .infinity) // Taille du bouton, qui s'ajuste automatiquement
                .padding() // Padding autour du texte
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom)) // Fond du bouton, un dégradé de bleu
                .cornerRadius(10) // Coins arrondis du bouton
                .padding(.horizontal) // Espacement horizontal autour du bouton
        }
    }

    func sendSMS() {
        // Objet JSON contenant les informations nécessaires pour envoyer le SMS
        let data = [
            "apiKey": "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX", // remplacez par votre clé API
            "phoneNumbers": "+336XXXXXXXX", // remplacez par votre numéro de téléphone
            "sender": "Swift",
            "gamme": 1,
            "message": "C'est un message test Swift" // remplacez par votre message
        ] as [String : Any]
        
        // Conversion de l'objet JSON en données
        guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {
            fatalError("Erreur lors de la conversion des données en JSON.")
        }
        
        // Définition des options pour la requête HTTP POST à l'API SMS Partner
        let url = URL(string: "https://api.smspartner.fr/v1/send")!
        var request = URLRequest(url: url)
        request.httpMethod = "POST" // Méthode HTTP
        request.httpBody = jsonData // Corps de la requête
        request.addValue("application/json", forHTTPHeaderField: "Content-Type") // Type de contenu
        request.addValue("\(jsonData.count)", forHTTPHeaderField: "Content-Length") // Longueur du contenu
        request.addValue("no-cache", forHTTPHeaderField: "cache-control") // Contrôle du cache
        request.addValue("https://webhook.site/TOKEN", forHTTPHeaderField: "webhookUrl") // URL du webhook *cette ligne est facultative*
        
        // Exécution de la requête HTTP POST avec les options et données définies précédemment
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            guard let httpResponse = response as? HTTPURLResponse else {
                fatalError("Erreur : réponse HTTP non valide.")
            }
            print("statusCode: \(httpResponse.statusCode)") // Impression du statut HTTP
            
            if let error = error {
                print("Error: \(error.localizedDescription)") // Impression de l'erreur, si elle existe
            }
            
            if let data = data {
                if let responseString = String(data: data, encoding: .utf8) {
                    print("Réponse : \(responseString)") // Impression de la réponse, si elle existe
                }
            }
        }
        task.resume() // Démarrage de la tâche
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"fmt"
	"net/http"
)

func main() {
	apiKey := "VOTRE CLE API"
	phoneNumbers := "+336xxxxxxxx"
	message := "Ceci est votre message"
	sender := "monentreprise"
	scheduledDeliveryDate := "21/10/2014"
	time := 9
	minute := 0

	// Construire le corps JSON pour la requête POST
	jsonData := fmt.Sprintf(`{
		"apiKey": "%s",
		"phoneNumbers": "%s",
		"message": "%s",
		"sender": "%s",
		"scheduledDeliveryDate": "%s",
		"time": %d,
		"minute": %d
	}`, apiKey, phoneNumbers, message, sender, scheduledDeliveryDate, time, minute)

	// Effectuer la requête POST
	url := "https://api.smspartner.fr/v1/send"
	req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(jsonData)))
	if err != nil {
		fmt.Println("Erreur lors de la création de la requête:", err)
		return
	}
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Erreur lors de l'envoi de la requête:", err)
		return
	}
	defer resp.Body.Close()

	// Traiter la réponse
	if resp.StatusCode == http.StatusOK {
		body := new(bytes.Buffer)
		_, err := body.ReadFrom(resp.Body)
		if err != nil {
			fmt.Println("Erreur lors de la lecture de la réponse:", err)
			return
		}
		fmt.Println(body.String())
	} else {
		fmt.Println("La requête POST a échoué. Code de réponse:", resp.StatusCode)
	}
}
```

{% 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",
            phoneNumbers = "+336xxxxxxxx",
            message = "This is your message",
            sender = "mycompany",
            scheduledDeliveryDate = "21/10/2014",
            time = 9,
            minute = 0
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/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 %}

#### **Réponse**

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

```json
{
   "success": true,
   "code": 200,
   "message_id": 307,
   "nb_sms": 1,
   "cost": 0.038,
   "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>306</entry>
  <entry>1</entry>
  <entry>0.038</entry>
  <entry>
        <![CDATA[EUR]]>
  </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code":9,
    "errors": [{
        "elementId": "children[message].data",
        "message": "Le message est requis"
    }, {
        "elementId": "children[phoneNumbers].data",
        "message": "Ce numero de telephone n'est pas valide (922264)"
    }, {
        "elementId": "children[sender].data",
        "message": "L'emetteur ne peut pas etre plus long que 11 caracteres"
    }, {
        "elementId": "children[scheduledDeliveryDate].data",
        "message": "La date (21/11/2014 \u00e0 :) est anterieure a la date actuelle."
    }, {
        "elementId": "children[minute].data",
        "message": "La minute est requise"
    }, {
        "elementId": "children[time].data",
        "message": "L'heure est requise"
    }]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
 <result>
          <entry>false</entry>
          <entry>9</entry>
          <entry>
                <entry>
                  <entry>children[message].data</entry>
                  <entry>Le message est requis</entry>
                </entry>
                <entry>
                   <entry>children[phoneNumbers].data</entry>
                   <entry>Ce numéro de téléphone n'est pas valide (922264)</entry>
                </entry>
                <entry>
                    <entry>children[sender].data</entry>
                    <entry>L'émetteur ne peut pas être plus long que 11 caractères</entry>
                </entry>
                <entry>
                    <entry>children[scheduledDeliveryDate].data</entry>
                    <entry>La date (21/11/2014 à :) est anterieure à la date actuelle. Si vous souhaitez l'envoyer maintenant vous devez sélectionner [Envoi immédiat]</entry>
                </entry>
                <entry>
                    <entry>children[minute].data</entry>
                    <entry>La minute est requise</entry>
                </entry>
                <entry>
                    <entry>children[time].data</entry>
                    <entry>L'heure est requise</entry>
                </entry>
      </entry>
</result>
```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>9</td><td>Au moins une contrainte n’a pas été respectée lors de l’envoi : - L’émetteur ne peut pas être plus long que 11 caractères. - Numéro de téléphone non valide. - Si <code>scheduledDeliveryDate</code> est défini : La date (dd/mm/yyyy) est antérieure à la date actuelle. La minute est requise. L’heure est requise.</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>11</td><td>Manque de crédits</td></tr></tbody></table>


# Envoi par lots

Cette requête est utilisée pour envoyer des SMS en temps réel ou en différé.

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/bulk-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 *(voir* [Limites de débit)](/api/sms-partner/rate-limiting)*)*

#### **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>SMSList</code></td><td><p><code>phoneNumber</code> → Numéro de téléphone du destinataire, la limite d'envoi sur une seule requête est de 500 numéros.<br>Il doit être :</p><ul><li>au format national (06xxxxxxxx) ou international (+336xxxxxxxx), pour un numéro français ;</li><li>au format international (+496xxxxxxxx), pour un numéro hors France.</li></ul><p><code>message</code> → Contenu du SMS. <strong>160 caractères</strong> maximum par SMS (au delà, il vous sera décompté un SMS supplémentaire par tranche de 153 caractères).</p><p>Saut d'une ligne → :br: <strong>Attention, le saut de ligne compte pour deux caractères.</strong></p><p>Symbole € → :euro:</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Le caractère ” doit obligatoirement être échappé (\”) pour que le texte du SMS soit valide. Dans le cas contraire une erreur 400 sera retournée</p><p>Certains <a data-mention href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a> seront remplacés à l'envoi, merci de les consulter.</p></div></td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>sender</code></td><td><p>Nom d’émetteur du message. Si l’émetteur est laissé vide, vos SMS seront acheminés avec un shortcode opérateur en guise d’expéditeur (exemple : 36xxx).</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Le nombre de caractères pour le nom d’émetteur doit être compris <strong>entre 3 et 11 inclus</strong> et ne <strong>doit pas comporter de caractères spéciaux</strong>.<br>Certains modèles de téléphone portable n’interprètent pas les espaces.</p></div></td></tr><tr><td><code>tag</code></td><td>Chaine de caractères de 20 caractères maximum sans espace(s) et en minuscule(s)</td></tr><tr><td><code>scheduledDeliveryDate</code></td><td>dd/mm/YYYY (envoi différé)</td></tr><tr><td><code>time</code></td><td><p>Format : 0-24 (l'heure de l'envoi)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> est activé ce paramètre est obligatoire</p></div></td></tr><tr><td><code>minute</code></td><td><p>Format : 0-55 (intervalle 5min)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> ce paramètre est obligatoire</p></div></td></tr><tr><td><code>isStopSms</code></td><td>1 pour ajouter la mention STOP à la fin du SMS (obligatoire et automatique pour des SMS commerciaux).</td></tr><tr><td><code>isUnicode</code></td><td><p>Si 1: Active le mode Unicode, le nombre de caractères maximum par SMS sera de 70.</p><p><em>Important : le SMS unicode doit être activé sur votre compte par un administrateur pour que les envois soient disponibles. Merci de prendre contact avec le service technique pour l’activation de cette fonctionnalité.</em></p><p><a href="https://www.smspartner.fr/blog/liste-complete-des-emoticones-a-copier-coller/">> Voir liste complète des émoticônes / emojis</a></p></td></tr><tr><td><code>sandbox</code></td><td><p><code>1</code> pour le mode Bac à Sable</p><div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Aucun SMS ne sera envoyé, et il n’y aura aucun débit sur votre compte. Ces SMS seront supprimés de vos listes d’envois automatiquement tous les jours.</p></div></td></tr><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</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',
            'sender' => 'mycompany',
            'scheduledDeliveryDate'=> '21/10/2014',
            'time'=> 9,
            'minute'=> 0,
            'SMSList'=> array(
                array(
                    'phoneNumber'=> '06xxxxxxx1',
                    'message'=> 'msg 0'
                ),
                array(
                    'phoneNumber'=> '06xxxxxxx2',
                    'message'=> 'msg 1'
                )
 
            )
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/bulk-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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "bulk-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}"",""sender"":""{1}"",""SMSList"":""{2}""}}",
        apiKey,
        "mycompany",
        {{ ""phoneNumber"":"06xxxxxxx1",""message"":"msg1"},{ ""phoneNumber"":"06xxxxxxx2",""message"":"msg2"}}
        )
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def send_sms(self,phone_numbers, msg, sender = "SMSPartner"):
		#sender = "DEMOSMS"
		print(phone_numbers)
 
 
		data = {"apiKey":APIKEY,"sender":sender,"SMSList":[{"phoneNumber":"06xxxxxxx1","message":"msg1"},{"phoneNumber":"06xxxxxxx2","message":"msg2"}]}
 
 
		url = URL + "/bulk-send"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print("SMS msg {} not delivered to {}".format(msg, phone_numbers))
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumber":"xxxx","message":"test","sender":"mycompany"}' https://api.smspartner.fr/v1/send
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Remplacez par votre clé API
const apiKey = 'VOTRE_CLÉ_API';

// Objet JSON qui contient les informations nécessaires pour envoyer les SMS en lots
const data = JSON.stringify({
    apiKey: apiKey,
    sender: 'mycompany',
    scheduledDeliveryDate: '21/10/2014',
    time: 9,
    minute: 0,
    SMSList: [
        {
            phoneNumber: '06xxxxxxx1',
            message: 'msg 0',
        },
        {
            phoneNumber: '06xxxxxxx2',
            message: 'msg 1',
        },
    ],
});

// Définir les options pour la requête HTTP POST vers l'API SMS Partner
const options = {
    hostname: 'api.smspartner.fr',
    port: 443,
    path: '/v1/bulk-send',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': data.length,
        'cache-control': 'no-cache',
    },
};

// Demande HTTP POST avec les options et les données définies précédemment
const req = https.request(options, (res) => {
    console.log(`statusCode: ${res.statusCode}`);

    // Afficher les données de réponse de l'API sur la sortie standard
    res.on('data', (d) => {
        process.stdout.write(d);
    });
});

// Affichage en cas d'erreur lors de l'exécution de la requête HTTP POST
req.on('error', (error) => {
    console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONArray;
import org.json.JSONObject;

public class SMSparLots {
    public static void main(String[] args) {
        try {
            // Création de l'objet URL avec l'adresse de l'API SMS
            URL url = new URL("https://api.smspartner.fr/v1/bulk-send");
            // Ouverture de la connexion HTTP avec l'API
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

            // Création de l'objet JSON contenant les paramètres des SMS à envoyer en lot
            JSONObject json = new JSONObject();
            json.put("apiKey", "VOTRE_API_KEY"); // Remplacez par votre clé API
            json.put("sender", "mycompany");
            json.put("scheduledDeliveryDate", "21/10/2014");
            json.put("time", 9);
            json.put("minute", 0);

            JSONArray SMSList = new JSONArray();
            JSONObject sms1 = new JSONObject();
            sms1.put("phoneNumber", "06xxxxxxx1");
            sms1.put("message", "msg 0");
            SMSList.put(sms1);

            JSONObject sms2 = new JSONObject();
            sms2.put("phoneNumber", "06xxxxxxx2");
            sms2.put("message", "msg 1");
            SMSList.put(sms2);

            json.put("SMSList", SMSList);

            // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream();
            os.write(json.toString().getBytes());
            os.flush();

            // Lecture de la réponse de l'API
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());
            System.out.println(response);

            // Fermeture de la connexion HTTP
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

// Cette requête est utilisée pour envoyer des SMS par lot de 500 en temps réel ou en différé
struct SMSParLotsView: View {
    var body: some View {
        // Un bouton qui appelle la fonction sendSMSParLots() lorsqu'il est pressé
        Button(action: {
            sendSMSParLots()
        }) {
            Text("Send Bulk SMS")
                .font(.system(size: 20))
                .foregroundColor(.white)
                .frame(minWidth: 0, maxWidth: .infinity)
                .padding()
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                .cornerRadius(10)
                .padding(.horizontal)
        }
    }
    

    func sendSMSParLots() {
        // Liste des SMS à envoyer
        let smsList: [[String: String]] = [
            [
                "phoneNumber": "06XXXXXXXX", // Numéro de téléphone du destinataire
                "message": "msg 0 en temps réel" // Message à envoyer
            ],
            [
                "phoneNumber": "06XXXXXXXX", // Un autre numéro de téléphone
                "message": "msg 1 en temps réel" // Un autre message
            ]
        ]

        // Données à envoyer à l'API
        let data: [String: Any] = [
            "apiKey": "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX", // Votre clé API
            "sender": "mycompany", // L'expéditeur du SMS
            // Ces 3 lignes permettent de programmer un envoi différé.
            //"scheduledDeliveryDate": "12/05/2023", // Date de livraison prévue
            //"time": 9, // Heure de livraison
            //"minute": 0, // Minute de livraison
            "SMSList": smsList // La liste des SMS à envoyer
        ]

        // Conversion des données en JSON
        guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {
            fatalError("Error converting data to JSON.")
        }

        // Création de la requête HTTP
        let url = URL(string: "https://api.smspartner.fr/v1/bulk-send")! // URL de l'API
        var request = URLRequest(url: url)
        request.httpMethod = "POST" // Méthode HTTP
        request.httpBody = jsonData // Corps de la requête
        request.addValue("application/json", forHTTPHeaderField: "Content-Type") // Type de contenu
        request.addValue("\(jsonData.count)", forHTTPHeaderField: "Content-Length") // Longueur du contenu
        request.addValue("no-cache", forHTTPHeaderField: "cache-control") // Contrôle du cache

        // Envoi de la requête HTTP
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            // Vérification de la réponse HTTP
            guard let httpResponse = response as? HTTPURLResponse else {
                fatalError("Error: Invalid HTTP response.")
            }
            print("statusCode: \(httpResponse.statusCode)") // Impression du code d'état HTTP

            // Gestion des erreurs éventuelles
            if let error = error {
                print("Error: \(error.localizedDescription)")
            }

            // Impression de la réponse de l'API
            if let data = data {
                if let responseString = String(data: data, encoding: .utf8) {
                    print("Response: \(responseString)")
                }
            }
        }
        task.resume()
    }
}
// Un aperçu de la vue
struct BulkSMSView_Previews: PreviewProvider {
    static var previews: some View {
        SMSParLotsView()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	apiKey := "VOTRE CLE API"
	sender := "monentreprise"
	scheduledDeliveryDate := "21/10/2014"
	time := 9
	minute := 0

	// Construire les données JSON pour la requête POST
	data := map[string]interface{}{
		"apiKey":               apiKey,
		"sender":               sender,
		"scheduledDeliveryDate": scheduledDeliveryDate,
		"time":                 time,
		"minute":               minute,
		"SMSList": []map[string]string{
			{"phoneNumber": "06xxxxxxx1", "message": "msg 0"},
			{"phoneNumber": "06xxxxxxx2", "message": "msg 1"},
		},
	}

	// Convertir les données en JSON
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("Erreur lors de la conversion en JSON:", err)
		return
	}

	// Effectuer la requête POST
	url := "https://api.smspartner.fr/v1/bulk-send"
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println("Erreur lors de l'envoi de la requête:", err)
		return
	}
	defer resp.Body.Close()

	// Traiter la réponse
	if resp.StatusCode == http.StatusOK {
		body := new(bytes.Buffer)
		_, err := body.ReadFrom(resp.Body)
		if err != nil {
			fmt.Println("Erreur lors de la lecture de la réponse:", err)
			return
		}
		fmt.Println(body.String())
	} else {
		fmt.Println("La requête POST a échoué. Code de réponse:", resp.StatusCode)
	}
}
```

{% 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",
            sender = "mycompany",
            scheduledDeliveryDate = "21/10/2014",
            time = 9,
            minute = 0,
            SMSList = new[]
            {
                new
                {
                    phoneNumber = "06xxxxxxx1",
                    message = "msg 0"
                },
                new
                {
                    phoneNumber = "06xxxxxxx2",
                    message = "msg 1"
                }
            }
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/bulk-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 %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "message_id": "xxxxxx",
    "currency": "EUR",
    "cost": 0.076,
    "nbSMS": 2,
    "SMSResponse_List": [
        {
            "success": true,
            "code": 200,
            "nbSms": 1,
            "cost": 0.038,
            "phoneNumber": "+336xxxxxxx1"
        },
        {
            "success": true,
            "code": 200,
            "nbSms": 1,
            "cost": 0.038,
            "phoneNumber": "+336xxxxxxx2"
        }
    ]
}

```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>xxxxxx</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
    <entry>0.076</entry>
    <entry>2</entry>
    <entry>
        <entry>
            <entry>true</entry>
            <entry>200</entry>
            <entry>1</entry>
            <entry>0.038</entry>
            <entry>
                <![CDATA[+336xxxxxxx1]]>
            </entry>
        </entry>
        <entry>
            <entry>true</entry>
            <entry>200</entry>
            <entry>1</entry>
            <entry>0.038</entry>
            <entry>
                <![CDATA[+336xxxxxxx2]]>
            </entry>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code":9,
    "error": [{
        "elementId": "children[message].data",
        "message": "Le message est requis"
    }, {
        "elementId": "children[phoneNumber].data",
        "message": "Ce numero de telephone n'est pas valide (922264)"
    }, {
        "elementId": "children[sender].data",
        "message": "L'emetteur ne peut pas etre plus long que 11 caracteres"
    }, {
        "elementId": "children[scheduledDeliveryDate].data",
        "message": "La date (21/11/2014 \u00e0 :) est anterieure a la date actuelle."
    }, {
        "elementId": "children[minute].data",
        "message": "La minute est requise"
    }, {
        "elementId": "children[time].data",
        "message": "L'heure est requise"
    }]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
 <result>
          <entry>false</entry>
          <entry>9</entry>
          <entry>
                <entry>
                  <entry>children[message].data</entry>
                  <entry>Le message est requis</entry>
                </entry>
                <entry>
                   <entry>children[phoneNumber].data</entry>
                   <entry>Ce numéro de téléphone n'est pas valide (922264)</entry>
                </entry>
                <entry>
                    <entry>children[sender].data</entry>
                    <entry>L'émetteur ne peut pas être plus long que 11 caractères</entry>
                </entry>
                <entry>
                    <entry>children[scheduledDeliveryDate].data</entry>
                    <entry>La date (21/11/2014 à :) est anterieure à la date actuelle. Si vous souhaitez l'envoyer maintenant vous devez sélectionner [Envoi immédiat]</entry>
                </entry>
                <entry>
                    <entry>children[minute].data</entry>
                    <entry>La minute est requise</entry>
                </entry>
                <entry>
                    <entry>children[time].data</entry>
                    <entry>L'heure est requise</entry>
                </entry>
      </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                                                                                                                                                                                                                                                                                                    |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1               | La Clé API est requise                                                                                                                                                                                                                                                                                     |
| 2               | Le numéro de téléphone est requis                                                                                                                                                                                                                                                                          |
| 9               | Au moins une contrainte n’a pas été respectée lors de l’envoi : - L’émetteur ne peut pas être plus long que 11 caractères. - Numéro de téléphone non valide. - Si `scheduledDeliveryDate` est défini : La date (dd/mm/yyyy) est antérieure à la date actuelle. La minute est requise. L’heure est requise. |
| 10              | Clé API incorrecte                                                                                                                                                                                                                                                                                         |
| 11              | Manque de crédits                                                                                                                                                                                                                                                                                          |


# Envoi par numéro long

Cette requête est utilisée pour envoyer des SMS avec un numéro long. Un numéro long est un numéro sous cette forme : +337XXXXXXXX

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/vn/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 *(voir* [Limites de débit)](/api/sms-partner/rate-limiting)*)*

#### **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>to</code></td><td><p>Numéro de téléphone du destinataire.</p><ul><li>au format national (06xxxxxxxx) ou international (+336xxxxxxxx), pour un numéro français.</li><li>au format international (+496xxxxxxxx), pour un numéro hors France.</li></ul></td></tr><tr><td><code>from</code></td><td>Votre numéro virtuel au format international (336xxxxxxxx)</td></tr><tr><td><code>message</code></td><td><p><code>message</code> → Contenu du SMS. <strong>160 caractères</strong> maximum par SMS (au delà, il vous sera décompté un SMS supplémentaire par tranche de 153 caractères).</p><p>Saut d'une ligne → :br: <strong>Attention, le saut de ligne compte pour deux caractères.</strong></p><p>Symbole € → :euro:</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Le caractère ” doit obligatoirement être échappé (\”) pour que le texte du SMS soit valide. Dans le cas contraire une erreur 400 sera retournée</p><p>Certains <a data-mention href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a> seront remplacés à l'envoi, merci de les consulter.</p></div></td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>tag</code></td><td>Chaine de caractères de 20 caractères maximum sans espace(s) et en minuscule(s)</td></tr><tr><td><code>urlResponse</code></td><td>Url de retour des Réponses (ex: http://www.monurldereponse)</td></tr><tr><td><code>urlDlr</code></td><td>Url de retour des Accusé de réceptions (ex: http://www.monurldedlr)</td></tr><tr><td><code>isStopSms</code></td><td>1 pour ajouter la mention STOP à la fin du SMS (obligatoire et automatique pour des SMS commerciaux).</td></tr><tr><td><code>sandbox</code></td><td><p><code>1</code> pour le mode Bac à Sable</p><div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Aucun SMS ne sera envoyé, et il n’y aura aucun débit sur votre compte. Ces SMS seront supprimés de vos listes d’envois automatiquement tous les jours.</p></div></td></tr><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</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',
            'to'=> '336xxxxxxxx',
            'from' => '336xxxxxxxx',
            'message'=> 'This is your message'
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/vn/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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "vn/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}"",""to"":""{1}"",""from"":""{2}"",""message"":""{3}""}}",
        apiKey,
        "336xxxxxxxx",
        "336xxxxxxxx",
        "message de test")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def send_sms(self, to, from, msg):
		print(to)
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("to", to),
			("from",from),
			("message", msg)
		])
 
		url = URL + "/vn/send"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print("SMS msg {} not delivered to {}".format(msg, to))
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","to":"xxxx","from":"xxx","message":"test"}' https://api.smspartner.fr/v1/vn/send
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Remplacez par votre clé API
const apiKey = "VOTRE_CLÉ_API";

// Préparer les données pour la requête POST
const data = JSON.stringify({
  apiKey: apiKey,
  to: "336xxxxxxxx",
  from: "336xxxxxxxx",
  message: "Ceci est votre message",
});

// Définir les options pour la requête HTTP POST vers l'API SMS Partner
const options = {
  hostname: "api.smspartner.fr",
  port: 443,
  path: "/v1/vn/send",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": data.length,
    "cache-control": "no-cache",
  },
};

// Effectuer la requête HTTP POST avec les options et données définies précédemment
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  // Afficher les données de réponse de l'API sur la sortie standard
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

// Afficher en cas d'erreur lors de l'exécution de la requête HTTP POST
req.on("error", (error) => {
  console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;

public class EnvoyerSMSLong {
    public static void main(String[] args) {
        try {
            // Remplacez par votre clé API
            String apiKey = "VOTRE_CLÉ_API";

            // Création de l'objet URL avec l'adresse de l'API SMS
            URL url = new URL("https://api.smspartner.fr/v1/vn/send");

            // Ouverture de la connexion HTTP avec l'API
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

            // Création de l'objet JSON contenant les paramètres du SMS à envoyer
            JSONObject json = new JSONObject();
            json.put("apiKey", apiKey);
            json.put("to", "336xxxxxxxx");
            json.put("from", "336xxxxxxxx");
            json.put("message", "Ceci est votre message");

            // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream();
            os.write(json.toString().getBytes());
            os.flush();

            // Lecture de la réponse de l'API
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());
            System.out.println(response);

            // Fermeture de la connexion HTTP
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI
import Foundation

// Struct pour la vue "EnvoieSMSParNumeroLong"
struct EnvoieSMSParNumeroLong: View {
    var body: some View {
        NavigationView {
            VStack {
                // Un bouton qui appelle la fonction EnvoieSMSParNumeroLong() lorsqu'il est pressé
                Button(action: {
                    EnvoieSMSParNumeroLong()
                }) {
                    Text("Envoyer SMS")
                        .font(.system(size: 20))
                        .foregroundColor(.white)
                        .frame(minWidth: 0, maxWidth: .infinity)
                        .padding()
                        .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                        .cornerRadius(10)
                        .padding(.horizontal)
                }
            }
        }
    }
    
    // Fonction pour envoyer un SMS par numéro long
    func EnvoieSMSParNumeroLong() {
        let apiKey = "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX" // Votre clé API
        let destinataire = "33XXXXXXXXX" // Le numéro du destinataire
        let expediteur = "33XXXXXXXXX" // Votre numéro
        let message = "status" // Le message à envoyer

        let url = URL(string: "https://api.smspartner.fr/v1/vn/send")! // URL pour envoyer le SMS
        var requete = URLRequest(url: url)
        requete.httpMethod = "POST"
        requete.addValue("application/json", forHTTPHeaderField: "Content-Type") // Ajout du type de contenu dans l'en-tête de la requête

        // Paramètres pour l'envoi du SMS
        let params: [String: Any] = [
            "apiKey": apiKey,
            "to": destinataire,
            "from": expediteur,
            "message": message
        ]
        
        // Ajout des paramètres dans le corps de la requête
        requete.httpBody = try? JSONSerialization.data(withJSONObject: params)
        
        let session = URLSession.shared
        // Tâche pour envoyer la requête
        let task = session.dataTask(with: requete) { (data, response, error) in
            // Si une erreur survient, on l'affiche
            if let erreur = error {
                print("Erreur : \(erreur.localizedDescription)")
                return
            }
            
            // Sinon, on affiche les données reçues
            if let donnees = data {
                if let resultat = String(data: donnees, encoding: .utf8) {
                    print(resultat) // Impression du résultat
                }
            }
        }
        
        task.resume() // On lance la tâche
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"fmt"
	"net/http"
)

func main() {
	apiKey := "YOUR API KEY"
	to := "336xxxxxxxx"
	from := "336xxxxxxxx"
	message := "This is your message"

	// Construire les données JSON pour la requête POST
	data := map[string]interface{}{
		"apiKey":  apiKey,
		"to":      to,
		"from":    from,
		"message": message,
	}

	// Convertir les données en JSON
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("Erreur lors de la conversion en JSON:", err)
		return
	}

	// Effectuer la requête POST
	url := "https://api.smspartner.fr/v1/vn/send"
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println("Erreur lors de l'envoi de la requête:", err)
		return
	}
	defer resp.Body.Close()

	// Traiter la réponse
	if resp.StatusCode == http.StatusOK {
		body := new(bytes.Buffer)
		_, err := body.ReadFrom(resp.Body)
		if err != nil {
			fmt.Println("Erreur lors de la lecture de la réponse:", err)
			return
		}
		fmt.Println(body.String())
	} else {
		fmt.Println("La requête POST a échoué. Code de réponse:", resp.StatusCode)
	}
}
```

{% 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",
            to = "336xxxxxxxx",
            from = "336xxxxxxxx",
            message = "This is your message"
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/vn/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 %}

#### **Réponse**

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

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

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>xxx</entry>
  <entry>1</entry>
  <entry>xxx</entry>
  <entry>
        <![CDATA[EUR]]>
  </entry>
</result>
```

{% endtab %}
{% endtabs %}


# Envoi de sondages

Cette requête est utilisée pour envoyer un sondage en temps réel ou en différé.

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/sondage/to/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 *(voir* [Limites de débit)](/api/sms-partner/rate-limiting)*)*

#### **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>phoneNumbers</code></td><td><p>Numéros de téléphone des destinataires.<br>Pour l’envoi de plusieurs SMS 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><tr><td><code>sondageIdent</code></td><td>Identifiant du sondage</td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>tag</code></td><td>Chaine de caractères de 20 caractères maximum sans espace(s) et en minuscule(s)</td></tr><tr><td><code>scheduledDeliveryDate</code></td><td>dd/mm/YYYY (envoi différé)</td></tr><tr><td><code>time</code></td><td><p>Format : 0-24 (l'heure de l'envoi)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> est activé ce paramètre est obligatoire</p></div></td></tr><tr><td><code>minute</code></td><td><p>Format : 0-55 (intervalle 5min)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Si <code>scheduledDeliveryDate</code> ce paramètre est obligatoire</p></div></td></tr><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</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',
            'phoneNumbers'=> '+336xxxxxxxx',
            'sondageIdent'=> 'SONDAGE_IDENT',
            'scheduledDeliveryDate'=> '21/10/2014',
            'time'=> 9,
            'minute'=> 0
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/sondage/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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "sondage/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}"",""phoneNumbers"":""{1}"",""sondageIdent"":""{2}""}}",
        apiKey,
        "+33XXXXXXXXX",
        "SONDAGE_IDENT")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def send_sms(self,phone_numbers, sondageIdent):
		#sender = "DEMOSMS"
		print(phone_numbers)
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("phoneNumbers", phone_numbers),
			("sondageIdent", sondageIdent)
		])
 
		url = URL + "/send"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print("SMS msg {} not delivered to {}".format(msg, phone_numbers))
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumbers":"xxxx","sondageIdent":"SONDAGE_IDENT"}' https://api.smspartner.fr/v1/sondage/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',
  phoneNumbers: '+336XXXXXXXX',
  // identifiant du sondage que vous avez créé dans votre compte SMS Partner
  sondageIdent: 'SONDAGE ID',
  scheduledDeliveryDate: '04/07/2023',
  time: 11,
  minute: 55 //tous les 5 minutes ex: 00, 05, 10, 15, 20, etc.
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/sondage/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 SondageParSMS {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "your_api_key";
            String phoneNumbers = "+336XXXXXXXX";
            String sondageIdent = "your_sondage_ident";
            String scheduledDeliveryDate = "05/07/2023";
            int time = 10;
            int minute = 35;

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"phoneNumbers\": \"" + phoneNumbers +
                    "\", \"sondageIdent\": \"" + sondageIdent + "\", \"scheduledDeliveryDate\": \"" +
                    scheduledDeliveryDate + "\", \"time\": " + time + ", \"minute\": " + minute + "}";

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

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct SondageSMS: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Sondage SMS")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: sendSondage)
    }

    func sendSondage() {
        let apiKey = "YOUR_API_KEY"
        let phoneNumber = "+336xxxxxxxx"
        let sondageIdent = "SONDAGE_IDENT"
        let scheduledDeliveryDate = "05/07/2023"
        let time = 9
        let minute = 0

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

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "phoneNumbers": phoneNumber,
            "sondageIdent": sondageIdent,
            "scheduledDeliveryDate": scheduledDeliveryDate,
            "time": time,
            "minute": minute
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct SondageSMS_Previews: PreviewProvider {
    static var previews: some View {
        SondageSMS()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

func main() {
	// Prepare data for POST request
	data := map[string]interface{}{
		"apiKey":                "YOUR API KEY",
		"phoneNumbers":          "+336xxxxxxxx",
		"sondageIdent":          "SONDAGE_IDENT",
		"scheduledDeliveryDate": "21/10/2024",
		"time":                  9,
		"minute":                0,
	}

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

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

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

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

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

	// Process your response here
	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",
            phoneNumbers = "+336xxxxxxxx",
            sondageIdent = "SONDAGE_IDENT",
            scheduledDeliveryDate = "21/10/2014",
            time = 9,
            minute = 0
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/sondage/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 %}

#### **Réponse**

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

```json
{
   "success":true,
   "code":200,
   "message_id":307,
   "nb_sms": 1,
   "cost": 0.038,
   "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>306</entry>
  <entry>1</entry>
  <entry>0.038</entry>
  <entry>
        <![CDATA[EUR]]>
  </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code":9,
    "error": [{
        "elementId": "children[message].data",
        "message": "Le message est requis"
    }, {
        "elementId": "children[phoneNumbers].data",
        "message": "Ce numero de telephone n'est pas valide (922264)"
    }, {
        "elementId": "children[sender].data",
        "message": "L'emetteur ne peut pas etre plus long que 11 caracteres"
    }, {
        "elementId": "children[scheduledDeliveryDate].data",
        "message": "La date (21/11/2014 \u00e0 :) est anterieure a la date actuelle."
    }, {
        "elementId": "children[minute].data",
        "message": "La minute est requise"
    }, {
        "elementId": "children[time].data",
        "message": "L'heure est requise"
    }]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
 <result>
          <entry>false</entry>
          <entry>9</entry>
          <entry>
                <entry>
                  <entry>children[message].data</entry>
                  <entry>Le message est requis</entry>
                </entry>
                <entry>
                   <entry>children[phoneNumbers].data</entry>
                   <entry>Ce numéro de téléphone n'est pas valide (922264)</entry>
                </entry>
                <entry>
                    <entry>children[sender].data</entry>
                    <entry>L'émetteur ne peut pas être plus long que 11 caractères</entry>
                </entry>
                <entry>
                    <entry>children[scheduledDeliveryDate].data</entry>
                    <entry>La date (21/11/2014 à :) est anterieure à la date actuelle. Si vous souhaitez l'envoyer maintenant vous devez sélectionner [Envoi immédiat]</entry>
                </entry>
                <entry>
                    <entry>children[minute].data</entry>
                    <entry>La minute est requise</entry>
                </entry>
                <entry>
                    <entry>children[time].data</entry>
                    <entry>L'heure est requise</entry>
                </entry>
      </entry>
</result>
```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>9</td><td>Au moins une contrainte n’a pas été respectée lors de l’envoi : - L’émetteur ne peut pas être plus long que 11 caractères. - Numéro de téléphone non valide. - Si <code>scheduledDeliveryDate</code> est défini : La date (dd/mm/yyyy) est antérieure à la date actuelle. La minute est requise. L’heure est requise.</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>11</td><td>Manque de crédits</td></tr></tbody></table>


# Annuler l'envoi d'un SMS différé

Cette requête est utilisée pour annuler l’envoi d’un SMS envoyé en différé.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/message-cancel`

{% hint style="danger" %}
Attention il n'est pas possible d'annuler l'envoi d'un SMS si celui-ci doit être envoyé dans moins de 5 minutes.
{% endhint %}

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

#### **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>messageId</code></td><td>ID du message. Il se situe dans la <a href="/pages/5U064j4bkxMl43sfjdxe#reponse">réponse de l'envoi</a>.</td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&messageId=300';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/message-cancel?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "message-cancel" & "?apiKey=" & apiKey & "&messageId=" & messageId
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,phone_numbers,message_id):
		url = URL + "/message-cancel?apiKey=" + API_KEY + "&messageId=" + message_id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/message-cancel?apiKey=xxx&messageId=300
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Préparer les données pour la requête GET
let data = 'apiKey=YOUR_API_KEY&messageId=300';
let url = 'https://api.smspartner.fr/v1/message-cancel?' + data;

https.get(url, (res) => {
  let data = '';

  // Un morceau de données a été reçu.
  res.on('data', (chunk) => {
    data += chunk;
  });

  // La totalité de la réponse a été reçue. Imprimer le résultat.
  res.on('end', () => {
    console.log(JSON.parse(data));
  });

}).on("error", (err) => {
  // Un message d'erreur sera imprimé en cas d'erreur.
  console.log("Erreur: " + err.message);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class AnnulerEnvoiSMS {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";
            String messageId = "300";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/message-cancel?" +
                    "apiKey=" + apiKey + "&messageId=" + messageId;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AnnulerEnvoi: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Annuler Envoi")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: cancelMessage)
    }

    func cancelMessage() {
        let apiKey = "YOUR_API_KEY"
        let messageId = "300"
        let urlString = "https://api.smspartner.fr/v1/message-cancel?apiKey=\(apiKey)&messageId=\(messageId)"

        guard let url = URL(string: urlString) else {
            print("URL inválida")
            return
        }

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

        task.resume()
    }
}

struct AnnulerEnvoi_Previews: PreviewProvider {
    static var previews: some View {
        AnnulerEnvoi()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	messageId := "300"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/message-cancel?" +
		"apiKey=" + apiKey + "&messageId=" + messageId

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var messageId = "300";
        var uri = new Uri($"https://api.smspartner.fr/v1/message-cancel?apiKey={apiKey}&messageId={messageId}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "message": "L'envoi du SMS a été annulé."
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <![CDATA[L'envoi du SMS a été annulé.]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% 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>3</td><td>L'ID du message est requis</td></tr><tr><td>4</td><td>Message introuvable</td></tr><tr><td>5</td><td>L'envoi du SMS a déjà été annulé</td></tr><tr><td>6</td><td>Il n'est pas possible d'annuler l'envoi d'un SMS si celui-ci doit être envoyé dans moins de 5 minutes.</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>11</td><td>Manque de crédits</td></tr></tbody></table>


# Caractères spéciaux

Liste des caractères spéciaux remplacés lors de l'envoi du SMS.

### Liste des caractères

| Caractères | Remplacé par |
| ---------- | ------------ |
| ÿ          | y            |
| ç          | Ç            |
| û          | u            |
| ü          | u            |
| ï          | i            |
| ô          | o            |
| ö          | o            |
| ó          | o            |
| î          | i            |
| ë          | e            |
| ê          | e            |
| \[         | (            |
| ]          | )            |
| {          | (            |
| }          | )            |
| \`         | ‘            |
| µ          | u            |
| Ä          | A            |
| À          | A            |
| Á          | A            |
| Â          | A            |
| Ã          | A            |
| È          | E            |
| Ê          | E            |
| Ë          | E            |
| Ü          | U            |
| Ù          | U            |
| Ú          | U            |
| Û          | U            |
| Ý          | Y            |
| ä          | a            |
| á          | a            |
| â          | a            |
| ã          | a            |
| Ö          | O            |
| Ô          | O            |
| œ          | oe           |
| ^          | Supprimé     |
| \~         | Supprimé     |
| \|         | Supprimé     |
| \\         | Supprimé     |
| ¨          | Supprimé     |
| °          | .            |
| ‘          | ‘            |
| “          | ‘            |


# Statut & Statistiques

Les différentes méthode d'envoi de SMS

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Statut unitaire</strong></td><td>Récupérer le statut d'un SMS</td><td><a href="/pages/5OQgWUz9U0pmHvLqf9kx">/pages/5OQgWUz9U0pmHvLqf9kx</a></td></tr><tr><td><strong>Statut multiple</strong></td><td>Récupérer le statut de plusieurs SMS</td><td><a href="/pages/Nn8jYABt8fAs4qnHOuDP">/pages/Nn8jYABt8fAs4qnHOuDP</a></td></tr><tr><td><strong>Statut par message</strong></td><td>Récupérer le statut via l'id d'un message</td><td><a href="/pages/WpR4Ux5MvqHC37v8otdg">/pages/WpR4Ux5MvqHC37v8otdg</a></td></tr><tr><td><strong>Statut par tag</strong></td><td>Récupérer le statut via un tag</td><td><a href="/pages/uXTQckHkKcvxdQeUQOV1">/pages/uXTQckHkKcvxdQeUQOV1</a></td></tr><tr><td><strong>Statistiques des envois</strong></td><td>Récupérer les statistiques des envois</td><td><a href="/pages/PfPcBtLqIU1id6fTlEMP">/pages/PfPcBtLqIU1id6fTlEMP</a></td></tr></tbody></table>


# Statut unitaire

Cette requête permet de récupérer le statut d’un SMS.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/message-status`

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

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

<table><thead><tr><th width="184">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>messageId</code></td><td>ID du message. Il se situe dans la <a href="/pages/5U064j4bkxMl43sfjdxe#reponse">réponse de l'envoi</a>.</td></tr><tr><td><code>phoneNumber</code></td><td>Numéro de téléphone portable du destinataire</td></tr></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&messageId=300&phoneNumber=06xxxxxxxx';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/message-status?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim phoneNumber As String = "06XXXXXXXX"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "message-status" & "?apiKey=" & apiKey & "&phoneNumber=" & phoneNumber & "&messageId=" & messageId
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,phone_numbers,message_id):
		url = URL + "/message-status?apiKey=" + API_KEY + "&phoneNumber=" + phone_numbers + "&messageId=" + message_id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/message-status?apiKey=xxx&messageId=300&phoneNumber=06xxxxxxxx
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Remplacez par votre clé API et autres données
const apiKey = "VOTRE_CLÉ_API";
const messageId = "300";
const phoneNumber = "06xxxxxxxx";

// Préparer les données pour la requête GET
const data = `apiKey=${apiKey}&messageId=${messageId}&phoneNumber=${phoneNumber}`;

// Définir les options pour la requête HTTP GET vers l'API SMS Partner
const options = {
  hostname: "api.smspartner.fr",
  port: 443,
  path: `/v1/message-status?${data}`,
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "cache-control": "no-cache",
  },
};

// Effectuer la requête HTTP GET avec les options et données définies précédemment
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  // Afficher les données de réponse de l'API sur la sortie standard
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

// Afficher en cas d'erreur lors de l'exécution de la requête HTTP GET
req.on("error", (error) => {
  console.error(error);
});

// Terminer la requête HTTP GET
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;

public class SMSSTatus {
    public static void main(String[] args) {
        try {
            // Remplacez par votre clé API et autres données
            String apiKey = "VOTRE_CLÉ_API";
            String messageId = "300";
            String phoneNumber = "06xxxxxxxx";

            // Préparer les données pour la requête GET
            String data = String.format("apiKey=%s&messageId=%s&phoneNumber=%s", apiKey, messageId, phoneNumber);
            URL url = new URL("https://api.smspartner.fr/v1/message-status?" + data);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");

            // Lecture de la réponse de l'API
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());

            // Afficher la réponse JSON
            System.out.println(response);

            // Fermeture de la connexion HTTP
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

// Structure pour la vue "StatutSMS"
struct StatutSMS: View {
   var body: some View {
       // Un bouton qui appelle la fonction StatutSMS() lorsqu'il est pressé
       Button(action: {
           StatutSMS()
       }) {
           Text("Check SMS Status")
               .font(.system(size: 20))
               .foregroundColor(.white)
               .frame(minWidth: 0, maxWidth: .infinity)
               .padding()
               .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
               .cornerRadius(10)
               .padding(.horizontal)
       }
   }
   
   // Fonction pour vérifier le statut d'un SMS
   func StatutSMS() {
       let apiKey = "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX" // Votre clé API
       let messageId = "your msg ID" // ID de votre message
       let phoneNumber = "06XXXXXXXX" // Numéro de téléphone

       // URL pour vérifier le statut du SMS
       let urlString = "https://api.smspartner.fr/v1/message-status?apiKey=\(apiKey)&messageId=\(messageId)&phoneNumber=\(phoneNumber)"

       // On vérifie que l'URL est correctement formée
       guard let url = URL(string: urlString) else {
           print("Erreur : impossible de créer l'URL")
           return
       }

       // Tâche pour récupérer les données de l'URL
       let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
           // Si une erreur se produit, on l'affiche
           if let error = error {
               print("Erreur : \(error)")
           }
           // Sinon, on affiche les données reçues
           else if let data = data {
               let str = String(data: data, encoding: .utf8)
               print("Données reçues :\n\(str ?? "")")
           }
       }
       
       task.resume() // On lance la tâche
   }
}

// Aperçu de la vue
struct StatutSMS_Previews: PreviewProvider {
   static var previews: some View {
       StatutSMS()
   }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	messageId := "300"
	phoneNumber := "06xxxxxxxx"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/message-status?" +
		"apiKey=" + apiKey + "&messageId=" + messageId + "&phoneNumber=" + phoneNumber

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var messageId = "300";
        var phoneNumber = "06xxxxxxxx";
        var uri = new Uri($"https://api.smspartner.fr/v1/message-status?apiKey={apiKey}&messageId={messageId}&phoneNumber={phoneNumber}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "number": "0600000000",
    "messageId": "1111",
    "stopSms": false,
    "date": "2015-02-07 22:39:46",
    "statut": "Delivered",
    "cost": 0.045,
    "countryCode": "FR",
    "currency": "EUR"
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <![CDATA[0600000000]]>
    </entry>
    <entry>
        <![CDATA[1111]]>
    </entry>
    <entry>false</entry>
    <entry>
        <![CDATA[2015-02-07 22:39:46]]>
    </entry>
    <entry>
        <![CDATA[Delivered]]>
    </entry>
    <entry>0.045</entry>
    <entry>
        <![CDATA[FR]]>
    </entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

* Delivered (Livré) : Ce statut indique que le message a été livré avec succès au destinataire. Cela signifie que le message a été envoyé correctement et qu’il a été reçu sur l’appareil ou la plateforme du destinataire. La date et l’heure de la réception est normalement disponible.
* Not delivered (Non livré) : Ce statut fait référence aux messages qui n’ont pas pu être livrés au destinataire. Il peut y avoir plusieurs raisons pour lesquelles un message n’est pas livré : comme un numéro de téléphone non valide ou un problème opérateurs chez un opérateur.
* Waiting (En attente) : Ce statut indique que le message est en cours de livraison et qu’il n’a pas encore été confirmé s’il sera livré ou non. Cela peut se produire en cas de retards sur le réseau ou lorsque des confirmations supplémentaires sont nécessaires avant de pouvoir marquer le message comme livré ou non livré.

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                           |
| --------------- | --------------------------------- |
| 1               | La Clé API est requise            |
| 2               | Le numéro de téléphone est requis |
| 3               | L'ID du message est requis        |
| 4               | Message introuvable               |
| 10              | Clé API incorrecte                |
| 200             | Tout s’est bien passé !           |


# Statut multiple

Cette requête permet de récupérer le statut de plusieurs SMS (maximum 500 numéros).

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/multi-status`

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

{% hint style="info" %}
Les comptes-rendus sont habituellement reçus en quelques secondes après l'envoi du SMS. Cependant, selon les opérateurs et la charge de notre plateforme, ce délai peut parfois aller jusqu'à 48 heures.
{% endhint %}

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

<table><thead><tr><th width="197">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>SMSStatut_List</code></td><td><p><code>phoneNumber</code> → Numéros de téléphone des destinataire, la limite sur une seule requête est de 500 numéros.<br>Ils doivent être :</p><ul><li>au format international (+336xxxxxxxx)</li></ul><p><code>messageId</code> → ID du message. Il se situe dans la <a href="/pages/5U064j4bkxMl43sfjdxe#reponse">réponse de l'envoi</a>.</p></td></tr></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'SMSStatut_List'=>>array(
                array('phoneNumber'=>'+336xxxxxxxx','messageId'=>messageId1),
                array('phoneNumber'=>'+336xxxxxxxx','messageId'=>messageId2)
             )
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/multi-status');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "multi-status"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""SMSStatut_List"":""{1}""}}",
        apiKey,
        {{ ""phoneNumber"":"06xxxxxxx1",""messageId"":"msgId1"},{ ""phoneNumber"":"06xxxxxxx2",""message"":"msgId2"}}
        )
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def send_sms(self,phone_number, phone_number2, msgId1, msgId2):
		print(phone_number)
 
 
		data = {"apiKey":APIKEY,"SMSStatut_List":[{"phoneNumber":phone_number,"messageId":msgId1},{"phoneNumber":phone_number2,"messageId":msgId2}]}
 
		url = URL + "/multi-status"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print("SMS msg {} not delivered to {}".format(msg, phone_numbers))
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -X POST https://api.smspartner.fr/v1/multi-status -H "Content-Type: application/json" -d '{"apiKey": "Votre clé API","SMSStatut_List": [{"phoneNumber": "0619922264", "messageId": 199897},{"phoneNumber": "06xxxxxxx2", "messageId": 1000},{"phoneNumber": "06xxxxxxx1", "messageId": 1222}]}'
```

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "StatutResponse_List": [
        {
            "success": true,
            "code": 200,
            "phoneNumber": "+33699999993",
            "messageId": 111111,
            "status": "Delivered",
            "date": "1517934416",
            "stopSms": "0",
            "isSpam": "0"
        },
        {
            "success": false,
            "code": 4,
            "phoneNumber": "+33699999992",
            "messageId": 1000,
            "status": "Numéro introuvable"
        },
        {
            "success": false,
            "code": 4,
            "phoneNumber": "+33699999991",
            "messageId": 1222,
            "status": "Numéro introuvable"
        }
    ]
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <entry>
            <entry>true</entry>
            <entry>200</entry>
            <entry>
                <![CDATA[+33619922264]]>
            </entry>
            <entry>1226613</entry>
            <entry>
                <![CDATA[Delivered]]>
            </entry>
            <entry>
                <![CDATA[1517934416]]>
            </entry>
            <entry>
                <![CDATA[0]]>
            </entry>
            <entry>
                <![CDATA[0]]>
            </entry>
        </entry>
        <entry>
            <entry>false</entry>
            <entry>4</entry>
            <entry>
                <![CDATA[+33699999992]]>
            </entry>
            <entry>1000</entry>
            <entry>
                <![CDATA[Numéro introuvable]]>
            </entry>
        </entry>
        <entry>
            <entry>false</entry>
            <entry>4</entry>
            <entry>
                <![CDATA[+33699999991]]>
            </entry>
            <entry>1222</entry>
            <entry>
                <![CDATA[Numéro introuvable]]>
            </entry>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

* Delivered (Livré) : Ce statut indique que le message a été livré avec succès au destinataire. Cela signifie que le message a été envoyé correctement et qu’il a été reçu sur l’appareil ou la plateforme du destinataire. La date et l’heure de la réception est normalement disponible.
* Not delivered (Non livré) : Ce statut fait référence aux messages qui n’ont pas pu être livrés au destinataire. Il peut y avoir plusieurs raisons pour lesquelles un message n’est pas livré : comme un numéro de téléphone non valide ou un problème opérateurs chez un opérateur.
* Waiting (En attente) : Ce statut indique que le message est en cours de livraison et qu’il n’a pas encore été confirmé s’il sera livré ou non. Cela peut se produire en cas de retards sur le réseau ou lorsque des confirmations supplémentaires sont nécessaires avant de pouvoir marquer le message comme livré ou non livré.

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                |
| --------------- | ---------------------- |
| 1               | La Clé API est requise |
| 4               | Message introuvable    |
| 10              | Clé API incorrecte     |


# Statut par message

Cette requête permet de récupérer les statuts de plusieurs SMS à partir d’un ID.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/bulk-status`

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

{% hint style="info" %}
Les comptes-rendus sont habituellement reçus en quelques secondes après l'envoi du SMS. Cependant, selon les opérateurs et la charge de notre plateforme, ce délai peut parfois aller jusqu'à 48 heures.
{% endhint %}

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

<table><thead><tr><th width="197">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>messageId</code></td><td><code>messageId</code> → ID du message. Il se situe dans la <a href="/pages/5U064j4bkxMl43sfjdxe#reponse">réponse de l'envoi</a>.</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&messageId=300';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/bulk-status?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "bulk-status" & "?apiKey=" & apiKey & "&messageId=" & messageId
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,message_id):
		url = URL + "/bulk-status?apiKey=" + API_KEY +  "&messageId=" + message_id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/bulk-status?apiKey=xxx&messageId=300
```

{% endtab %}

{% tab title="Nodejs" %}

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

//Cette requête permet de récupérer les statuts de plusieurs SMS à partir d’un ID.

// Préparer les données pour la requête GET
let data = 'apiKey=YOUR_API_KEY&messageId=300';
let url = 'https://api.smspartner.fr/v1/bulk-status?' + data;

https.get(url, (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);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class StatutSmsParID {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";
            String messageId = "300";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/bulk-status?" +
                    "apiKey=" + apiKey + "&messageId=" + messageId;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct StatutSmsParID: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Statut SMS Par ID")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: getStatusById)
    }

    func getStatusById() {
        let apiKey = "YOUR_API_KEY"
        let messageId = "300"
        let urlString = "https://api.smspartner.fr/v1/bulk-status?apiKey=\(apiKey)&messageId=\(messageId)"

        guard let url = URL(string: urlString) else {
            print("URL inválida")
            return
        }

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

        task.resume()
    }
}

struct StatutSmsParID_Previews: PreviewProvider {
    static var previews: some View {
        StatutSmsParID()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	messageId := "300"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/bulk-status?" +
		"apiKey=" + apiKey + "&messageId=" + messageId

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var messageId = "300";
        var uri = new Uri($"https://api.smspartner.fr/v1/bulk-status?apiKey={apiKey}&messageId={messageId}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "message_id": "111",
    "StatutResponse_List": [
        {
            "phoneNumber": "+336XXXXXXX1",
            "status": "Delivered",
            "stopSMS": false,
            "date": "1517989111"
        },
        {
            "phoneNumber": "+336XXXXXXX2",
            "status": "Delivered",
            "stopSMS": false,
            "date": "1517989101"
        }
             ...
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <![CDATA[11]]>
    </entry>
    <entry>
        <entry>
            <entry>
                <![CDATA[+336XXXXXXX1]]>
            </entry>
            <entry>
                <![CDATA[Delivered]]>
            </entry>
            <entry>false</entry>
            <entry>
                <![CDATA[1517989111]]>
            </entry>
        </entry>
 
        <entry>
            <entry>
                <![CDATA[+336XXXXXXX2]]>
            </entry>
            <entry>
                <![CDATA[Delivered]]>
            </entry>
            <entry>false</entry>
            <entry>
                <![CDATA[1517989086]]>
            </entry>
        </entry>
        ...
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

* Delivered (Livré) : Ce statut indique que le message a été livré avec succès au destinataire. Cela signifie que le message a été envoyé correctement et qu’il a été reçu sur l’appareil ou la plateforme du destinataire. La date et l’heure de la réception est normalement disponible.
* Not delivered (Non livré) : Ce statut fait référence aux messages qui n’ont pas pu être livrés au destinataire. Il peut y avoir plusieurs raisons pour lesquelles un message n’est pas livré : comme un numéro de téléphone non valide ou un problème opérateurs chez un opérateur.
* Waiting (En attente) : Ce statut indique que le message est en cours de livraison et qu’il n’a pas encore été confirmé s’il sera livré ou non. Cela peut se produire en cas de retards sur le réseau ou lorsque des confirmations supplémentaires sont nécessaires avant de pouvoir marquer le message comme livré ou non livré.

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                    |
| --------------- | -------------------------- |
| 1               | La Clé API est requise     |
| 3               | l'ID du message est requis |
| 4               | Message introuvable        |
| 10              | Clé API incorrecte         |
| 200             | Tout s'est bien passé !    |


# Statut par tag

Cette requête permet de récupérer les statuts de plusieurs SMS à partir d’un Tag.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/bulk-status-by-tag`

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

{% hint style="info" %}
Les comptes-rendus sont habituellement reçus en quelques secondes après l'envoi du SMS. Cependant, selon les opérateurs et la charge de notre plateforme, ce délai peut parfois aller jusqu'à 48 heures.
{% endhint %}

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

<table><thead><tr><th width="197">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>tag</code></td><td>Le tag du message</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&tag=montag';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/bulk-status-by-tag?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim tag As String = "montag"
 
    #check credits
    Dim url As String
    url = base_url & "bulk-status-by-tag" & "?apiKey=" & apiKey & "&tag=" & tag
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,tag):
		url = URL + "/bulk-status-by-tag?apiKey=" + API_KEY +  "&tag=" + tag
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/bulk-status-by-tag?apiKey=xxx&tag=montag
```

{% endtab %}

{% tab title="Nodejs" %}

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

//Cette requête permet de récupérer les statuts de plusieurs SMS à partir d’un tag.
let data = 'apiKey=YOUR_API_KEY&tag=montag';
let url = 'https://api.smspartner.fr/v1/bulk-status-by-tag?' + data;

https.get(url, (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);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class StatutParTag {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";
            String tag = "montag";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/bulk-status-by-tag?" +
                    "apiKey=" + apiKey + "&tag=" + tag;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct StatutSmsParTag: View {
    @State private var result: String = "Loading..."
    
    var body: some View {
        VStack {
            Text("Statut Sms Par Tag")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: getStatusByTag)
    }

    func getStatusByTag() {
        let apiKey = "YOUR_API_KEY"
        let tag = "montag"
        let urlString = "https://api.smspartner.fr/v1/bulk-status-by-tag?apiKey=\(apiKey)&tag=\(tag)"

        guard let url = URL(string: urlString) else {
            print("URL inválida")
            return
        }

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

        task.resume()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	tag := "montag"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/bulk-status-by-tag?" +
		"apiKey=" + apiKey + "&tag=" + tag

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var tag = "montag";
        var uri = new Uri($"https://api.smspartner.fr/v1/bulk-status-by-tag?apiKey={apiKey}&tag={tag}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "currentPage": 1,
    "total": 2,
    "StatutResponse_List": [
        {
            "phoneNumber": "+336XXXXXXX1",
            "status": "Delivered",
            "stopSMS": false,
            "date": "1517989111"
        },
        {
            "phoneNumber": "+336XXXXXXX2",
            "status": "Delivered",
            "stopSMS": false,
            "date": "1517989101"
        }
             ...
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>1</entry>
    <entry>2</entry>
    <entry>
        <entry>
            <entry>
                <![CDATA[+336XXXXXXX1]]>
            </entry>
            <entry>
                <![CDATA[Delivered]]>
            </entry>
            <entry>false</entry>
            <entry>
                <![CDATA[1517989111]]>
            </entry>
        </entry>
 
        <entry>
            <entry>
                <![CDATA[+336XXXXXXX2]]>
            </entry>
            <entry>
                <![CDATA[Delivered]]>
            </entry>
            <entry>false</entry>
            <entry>
                <![CDATA[1517989086]]>
            </entry>
        </entry>
        ...
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

* Delivered (Livré) : Ce statut indique que le message a été livré avec succès au destinataire. Cela signifie que le message a été envoyé correctement et qu’il a été reçu sur l’appareil ou la plateforme du destinataire. La date et l’heure de la réception est normalement disponible.
* Not delivered (Non livré) : Ce statut fait référence aux messages qui n’ont pas pu être livrés au destinataire. Il peut y avoir plusieurs raisons pour lesquelles un message n’est pas livré : comme un numéro de téléphone non valide ou un problème opérateurs chez un opérateur.
* Waiting (En attente) : Ce statut indique que le message est en cours de livraison et qu’il n’a pas encore été confirmé s’il sera livré ou non. Cela peut se produire en cas de retards sur le réseau ou lorsque des confirmations supplémentaires sont nécessaires avant de pouvoir marquer le message comme livré ou non livré.

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                    |
| --------------- | -------------------------- |
| 1               | La Clé API est requise     |
| 3               | l'ID du message est requis |
| 4               | Message introuvable        |
| 10              | Clé API incorrecte         |
| 200             | Tout s'est bien passé !    |


# Statistique des envois

Cette requête est utilisée pour récupérer les statistiques des envois sur une période précise. Elle permet de récupérer le nombre de SMS envoyés et le cout associé à ces envoi

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/statistics/cost-resume?apiKey=API_KEY&interval=custom&from=21-10-2022&to=21-10-2022`

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

{% hint style="info" %}
Limite de 5 requêtes par minute.
{% endhint %}

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

<table><thead><tr><th width="197">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>interval</code></td><td><code>last_month</code> → Le mois précédent<br><code>last_twelve_months</code> → 12 derniers mois<br><code>custom</code> → &#x26;from=21-10-2022&#x26;to=21-10-2022 (vous devez ajouter from et to pour la date de début et de fin du filtre)</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
$apiKey = 'YOUR_API_KEY';
$url = 'https://api.smspartner.fr/v1/statistics/cost-resume?apiKey=' . $apiKey . '&interval=last_twelve_months'; 

// Initialise cURL session
$ch = curl_init($url);

// Set cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Execute cURL session and fetch the result
$response = curl_exec($ch);

// Handle errors
if (curl_errno($ch)) {
    echo 'Erreur: ' . curl_error($ch);
} else {
    // Decode the result
    $data = json_decode($response, true);
    print_r($data);
}

// Close cURL session
curl_close($ch);
?>
```

{% endtab %}

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

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

Module Module1

    Sub Main()
        Dim apiKey As String = "YOUR_API_KEY"
        Dim baseUrl As String = "https://api.smspartner.fr/v1/statistics/cost-resume"
        Dim url As String = baseUrl & "?apiKey=" & apiKey & "&interval=last_twelve_months"

        Dim response As String = apiRequest("GET", url, Nothing)
        Console.WriteLine(response)
    End Sub

    Function apiRequest(method As String, url As String, parameters As String) As String
        Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
        request.Method = method
        request.Timeout = 10000 ' Timeout en ms
        request.ContentType = "application/json; charset=utf-8"

        ' Ajouter les paramètres si nécessaire (POST)
        If Not String.IsNullOrEmpty(parameters) Then
            request.ContentLength = Encoding.UTF8.GetByteCount(parameters)
            Using reqStream As StreamWriter = New StreamWriter(request.GetRequestStream())
                reqStream.Write(parameters)
            End Using
        End If

        ' Obtenir la réponse
        Try
            Using response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
                If response.StatusCode = HttpStatusCode.OK Then
                    Using resStream As Stream = response.GetResponseStream()
                        If resStream IsNot Nothing Then
                            Using reader As New StreamReader(resStream)
                                Return reader.ReadToEnd()
                            End Using
                        End If
                    End Using
                End If
            End Using
        Catch ex As WebException
            If ex.Response IsNot Nothing Then
                Using response As HttpWebResponse = CType(ex.Response, HttpWebResponse)
                    Using resStream As Stream = response.GetResponseStream()
                        If resStream IsNot Nothing Then
                            Using reader As New StreamReader(resStream)
                                Return "Erreur: " & reader.ReadToEnd()
                            End Using
                        End If
                    End Using
                End Using
            End If
            Return "Erreur: " & ex.Message
        End Try
    End Function

End Module
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

apiKey = 'YOUR_API_KEY'
url = f'https://api.smspartner.fr/v1/statistics/cost-resume?apiKey={apiKey}&interval=last_twelve_months'

try:
    response = requests.get(url)
    response.raise_for_status()
    data = response.json()
    print(data)
except requests.exceptions.RequestException as e:
    print(f"Erreur: {e}")


Ou avec la bibliothèque 'urllib':

import json
from urllib import request, error

apiKey = 'YOUR_API_KEY'
url = f'https://api.smspartner.fr/v1/statistics/cost-resume?apiKey={apiKey}&interval=last_twelve_months'

try:
    with request.urlopen(url) as response:
        data = json.load(response)
        print(data)
except error.URLError as e:
    print(f"Erreur: {e.reason}")
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H "Content-Type: application/json" -X GET "https://api.smspartner.fr/v1/statistics/cost-resume?apiKey=YOUR_API_KEY&interval=last_twelve_months"
```

{% endtab %}

{% tab title="Nodejs" %}

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

let apiKey = 'YOUR_API_KEY';
let url = `https://api.smspartner.fr/v1/statistics/cost-resume?apiKey=${apiKey}&interval=last_twelve_months`; // 12 derniers mois
//interval=last_month // 1 dernier mois
//interval=custom&from=21-10-2022&to=21-10-2022 // intervalle personnalisé

https.get(url, (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);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class StatistiqueDesEnvois {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";
            String interval = "last_twelve_months";
            //interval=last_month // 1 dernier mois
//interval=custom&from=21-10-2022&to=21-10-2022 // intervalle personnalisé

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/statistics/cost-resume?" +
                    "apiKey=" + apiKey + "&interval=" + interval;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct StatistiqueDesEnvois: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Statistique Des Envois")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: getStatistics)
    }

    func getStatistics() {
        let apiKey = "YOUR_API_KEY"
        let interval = "last_twelve_months"
        let urlString = "https://api.smspartner.fr/v1/statistics/cost-resume?apiKey=\(apiKey)&interval=\(interval)"

        guard let url = URL(string: urlString) else {
            print("Invalid URL")
            result = "Invalid URL"
            return
        }

        var request = URLRequest(url: url)
        request.httpMethod = "GET"

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

        task.resume()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	interval := "last_twelve_months" // last month: "last_month", custom interval: "custom&from=21-10-2022&to=21-10-2022"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/statistics/cost-resume?" +
		"apiKey=" + apiKey + "&interval=" + interval

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "VOTRE_CLÉ_API";
        var interval = "last_twelve_months"; // Changer à "last_month" pour le dernier mois, "custom" pour un intervalle personnalisé
        var uri = new Uri($"https://api.smspartner.fr/v1/statistics/cost-resume?apiKey={apiKey}&interval={interval}"); // Ajoutez "&from=date&to=date" pour un intervalle personnalisé

        // Envoyer la requête GET
        HttpResponseMessage response = await client.GetAsync(uri);

        if (response.IsSuccessStatusCode)
        {
            // Lire la réponse
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            // Afficher un message en cas d'échec de la requête GET
            Console.WriteLine("La requête GET a échoué avec le code de statut: " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "datas": [
        {
            "month": "october",
            "year": "2021",
            "m": "10",
            "date": 1633039200,
            "type": "month",
            "cost": "49.174",
            "nb_send": "1210"
        },
        {
            "month": "november",
            "year": "2021",
            "m": "11",
            "date": 1635721200,
            "type": "month",
            "cost": "67.674",
            "nb_send": "1409"
        }
    ]
}
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Gestion des contacts

Gérer vos groupes et contacts

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Ajouter un groupe</strong></td><td>Ajouter un groupe de contact à votre compte</td><td><a href="/pages/kd2x5qMggSfYSWdl1dAG">/pages/kd2x5qMggSfYSWdl1dAG</a></td></tr><tr><td><strong>Ajouter un contact</strong></td><td>Ajouter un contact à votre compte</td><td><a href="/pages/IGqnTVBEzvXQtFTkUUbG">/pages/IGqnTVBEzvXQtFTkUUbG</a></td></tr><tr><td><strong>Supprimer un groupe</strong></td><td>Supprimer un groupe de votre compte</td><td><a href="/pages/uu11rEpMu9nk8ctIB5Cl">/pages/uu11rEpMu9nk8ctIB5Cl</a></td></tr><tr><td><strong>Ajouter un lot de contacts</strong></td><td>Ajouter plusieurs contacts à votre compte</td><td><a href="/pages/V1Am9hU80CLMWMYj2rAn">/pages/V1Am9hU80CLMWMYj2rAn</a></td></tr><tr><td><strong>Modifier un contact</strong></td><td>Modifier un contact présent sur votre compte</td><td><a href="/pages/0CGgLXErsvsbTDZSBnlj">/pages/0CGgLXErsvsbTDZSBnlj</a></td></tr><tr><td><strong>Supprimer un contact</strong></td><td>Supprimer un contact de son compte</td><td><a href="/pages/1DHOWcX0XUmZ3TfRejch">/pages/1DHOWcX0XUmZ3TfRejch</a></td></tr><tr><td><strong>Obtenir la liste des groupes</strong></td><td>Obtenir la liste de tous les groupes existant</td><td><a href="/pages/o6zYCGciLcczoBs8sKYA">/pages/o6zYCGciLcczoBs8sKYA</a></td></tr><tr><td><strong>Obtenir la liste des contacts</strong></td><td>Obtenir la liste de tous les contacts</td><td><a href="/pages/c1rLr7FdEGTpx8fFsWYX">/pages/c1rLr7FdEGTpx8fFsWYX</a></td></tr><tr><td><strong>Obtenir le détail d'un contact</strong></td><td>Obtenir le détail d'un contact déjà existant</td><td><a href="/pages/14Ri4RefhrVwiONHu679">/pages/14Ri4RefhrVwiONHu679</a></td></tr></tbody></table>


# Ajouter un groupe

Cette requête est utilisée pour créer un groupe de contacts

## URL

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

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

#### **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>name</code></td><td>Nom du compte</td></tr></tbody></table>

#### Requête

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

```
curl --location --request POST 'http://api.smspartner.fr/v1/group/add' \--header 'Content-Type: application/json' \--data-raw '{   "apiKey": "YOUR_API_KEY",
   "name": "Nom du groupe"}'
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 2,
  "name": "Nom du groupe",
  "groupId": "ID GROUPE"
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{ 
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

<table><thead><tr><th width="234">Code de réponse</th><th width="257">Réponse</th></tr></thead><tbody><tr><td>1</td><td>name est requis</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr></tbody></table>


# Ajouter un contact

Cette requête est utilisée pour créer un contact au sein d'un groupe

## URL

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

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

#### **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>groupId</code></td><td>L'id du groupe dans lequel sera le contact</td></tr><tr><td><code>phoneNumber</code></td><td><p>Numéros de téléphone du contact.<br>Il doit ê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>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>firstname</code></td><td>Prénom (32 caractères max.)</td></tr><tr><td><code>lastname</code></td><td>Nomm (32 caractères max.)</td></tr><tr><td><code>date</code></td><td>Date au format YYYY-MM-DD. Pourra être utilisé pour des envois automatique (ex: anniversaire )</td></tr><tr><td><code>url</code></td><td>Url , elle doit commencer par http:// ou https://</td></tr><tr><td><code>custom1</code></td><td>Champ personnalisé 1</td></tr><tr><td><code>custom2</code></td><td>Champ personnalisé 2</td></tr><tr><td><code>custom3</code></td><td>Champ personnalisé 3</td></tr><tr><td><code>custom4</code></td><td>Champ personnalisé 4</td></tr></tbody></table>

#### Requête

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

```json
{
  "curl_command": {
    "method": "POST",
    "url": "http://api.smspartner.fr/v1/contact/add",
    "headers": {
      "Content-Type": "application/json"
    },
    "data": {
      "apiKey": "YOUR_API_KEY",
      "groupId": "ID GROUP",
      "contact": {
        "phoneNumber": "xxxxxxxxx",
        "firstname": "prénom",
        "lastname": "nom",
        "date": "YYYY-MM-DD",
        "shortUrlPartnr": "http://",
        "url": "http://",
        "custom1": "custom 1",
        "custom2": "custom 2",
        "custom3": "custom 3",
        "custom4": "custom 4"
      }
    }
  }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "contact": {
    "phoneNumber": "xxxxxxxx",
    "firstname": "Prénom",
    "lastname": "Nom",
    "date": "YYYY-MM-DD",
    "shortUrlPartnr": "http://",
    "url": "http://",
    "custom1": "custom 1",
    "custom2": "custom 2",
    "custom3": "custom 3",
    "custom4": "custom 4",
    "contactId": "ID CONTACT"
  }
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le groupId est requis</td></tr><tr><td>2</td><td>Contact infos sont requises</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr><tr><td>15</td><td>Le numéro est déjà dans le groupe</td></tr></tbody></table>


# Supprimer un groupe

Cette requête est utilisée pour supprimer un groupe

## URL

<mark style="color:red;">`DELETE`</mark> `https://api.smspartner.fr/v1/group/delete`

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

#### **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>groupId</code></td><td>L'id du groupe dans lequel sera le contact</td></tr></tbody></table>

#### Requête

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

```
curl --location --request POST 'https://api.smspartner.fr/v1/group/delete' \
--header 'Content-Type: application/json' \
--data-raw '{
   "apiKey": "YOUR_API_KEY",
   "groupId": "ID GROUPE"
}'
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
   "success": true,
   "code": 200
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le groupId est requis</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr><tr><td>404</td><td>Le groupe n'existe pas</td></tr></tbody></table>


# Ajouter un lot de contacts

Cette requête est utilisée pour ajouter un lot de 500 contacts (maximum).

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/contact/multiple/add`

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

#### Requête

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

```
 {
   "apiKey": "API_KEY",
   "groupId": "GROUP_ID",
   "contactsList": [
       {
           "firstname":"firstname_1",
           "lastname":"lastname_1",
           "date": "2023-01-01",
           "url": "http:...",
           "phoneNumber": "0600000000",
           "custom1": "email"
       },
       {
           "firstname":"firstname_2",
           "lastname":"lastname_2",
           "date": "2023-01-01",
           "url": "http:...",
           "phoneNumber": "0600000001",
           "custom1": "email"
       },
       …
   ]
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
   "groupe": {
       "name": "NOM DU GROUPEl",
       "token": "GROUP_ID"
   },
   "results": [
       {
           "success": false,
           "code": 15,
           "phoneNumber": "+33600000000",
           "message": "Le numéro est déjà dans le groupe"
       },
       {
           "success": false,
           "code": 15,
           "phoneNumber": "+33600000001",
           "message": "Le numéro est déjà dans le groupe"
       }
   ],
   "rapport": 
       {
       "nbline": 2,
       "nbline_imported": 0,
       "nbline_updated": 0,
       "errors": 
       {
           "stopSms": 0,
           "invalidePhone": 0,
           "duplicatePhone": 0,
           "allreadyInGroupe": 2,
           "urlInvalide": 0,
           "dateInvalide": 0,
           "empty": 0,
           "unactivated": 0,
           "dateInvalid": 0
       }
   }
}
```

{% endtab %}
{% endtabs %}


# Modifier un contact

Cette requête est utilisée pour modifier un contact déjà existant

## URL

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

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

#### **Paramètres**

<table><thead><tr><th width="262">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>contactId</code></td><td>L'id du contact à modifier</td></tr><tr><td><code>firstname</code></td><td>Prénom (32 caractères max.)</td></tr><tr><td><code>lastname</code></td><td>Nomm (32 caractères max.)</td></tr><tr><td><code>date</code></td><td>Date au format YYYY-MM-DD. Pourra être utilisé pour des envois automatique (ex: anniversaire )</td></tr><tr><td><code>url</code></td><td>Url , elle doit commencer par http:// ou https://</td></tr><tr><td><code>custom1</code></td><td>Champ personnalisé 1</td></tr><tr><td><code>custom2</code></td><td>Champ personnalisé 2</td></tr><tr><td><code>custom3</code></td><td>Champ personnalisé 3</td></tr><tr><td><code>custom4</code></td><td>Champ personnalisé 4</td></tr></tbody></table>

#### Requête

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

```
{
  "url": "http://api.smspartner.fr/v1/contact/update",
  "method": "POST",
  "headers": {
    "Content-Type": "application/json"
  },
  "data": {
    "apiKey": "YOUR_API_KEY",
    "contactId": "ID CONTACT",
    "contact": {
      "phoneNumber": "+xxxxxxxxx",
      "firstname": "prénom",
      "lastname": "nom",
      "url": "",
      "date": "12-06-2020",
      "custom2": "custom2"
    }
  }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "contact": {
    "phoneNumber": "+xxxxxxxx",
    "firstname": "prénom",
    "lastname": "nom",
    "url": "",
    "date": "12-06-2020",
    "custom2": "custom2",
    "contactId": "ID CONTACT"
  }
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le groupId est requis</td></tr><tr><td>2</td><td>Les infos du contact sont requises</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr><tr><td>15</td><td>Le numéro est déjà dans le groupe</td></tr></tbody></table>


# Supprimer un contact

Cette requête est utilisée pour supprimer un contact

## URL

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

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

#### **Paramètres**

<table><thead><tr><th width="262">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>contactId</code></td><td>L'id du contact à supprimer</td></tr></tbody></table>

#### Requête

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

```
curl --location --request POST 'http://api.smspartner.fr/v1/contact/delete' \
--header 'Content-Type: application/json' \
--data-raw '{
   "apiKey": "YOUR_API_KEY",
   "contactId": "ID CONTACT"}'
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
   "success": true,
   "code": 200
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le contactId est requis</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr><tr><td>404</td><td>Le contact n'existe pas</td></tr></tbody></table>


# Obtenir la liste des groupes

Cette requête est utilisée pour obtenir la liste des groupes de contacts

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/group/list`

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

#### **Paramètre**

<table><thead><tr><th width="262">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></tbody></table>

#### Requête

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

```
{
  "curlCommand": {
    "location": true,
    "request": "GET",
    "url": "https://api.smspartner.fr/v1/group/list?apiKey=YOUR_API_KEY"
  }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "groups": [
    {
      "id": "identifiant du groupe",
      "name": "groupe name",
      "createdAt": "2020-10-02T16:40:05+02:00",
      "isSpecialFile": false,
      "isLocationFile": false
    }
  ]
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

<table><thead><tr><th width="234">Code de réponse</th><th>Réponse</th></tr></thead><tbody><tr><td>10</td><td>La Clé API est requise</td></tr></tbody></table>


# Obtenir la liste des contacts

Cette requête est utilisée pour obtenir la liste des contacts d'un groupe

## URL

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

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

#### **Paramètre**

<table><thead><tr><th width="262">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>groupId</code></td><td>L'id du groupe de contacts</td></tr></tbody></table>

#### Requête

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

```
{
  "curlCommand": {
    "location": true,
    "request": "GET",
    "url": "https://api.smspartner.fr/v1/group/list?apiKey=YOUR_API_KEY&groupId=group_id"
  }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "currentPage": 1,
  "total": "2",
  "datas": [
    {
      "contactId": "ID_CONTACT",
      "phone": "+33XXXXXXXXX",
      "firstname": "Michel",
      "lastname": "Dupont",
      "url": "",
      "shortUrl": "",
      "date": "",
      "custom1": "",
      "custom2": "",
      "custom3": "",
      "custom4": "",
      "createdAt": "2025-03-12T13:49:22+01:00",
      "stopSms": false
    },
    {
      "contactId": "ID_CONTACT",
      "phone": "+33XXXXXXXXX",
      "firstname": "Marie",
      "lastname": "Bertrand",
      "url": "",
      "shortUrl": "",
      "date": "",
      "custom1": "",
      "custom2": "",
      "custom3": "",
      "custom4": "",
      "createdAt": "2025-03-12T14:33:55+01:00",
      "stopSms": false
    }
  ]
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le groupId est requis</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr></tbody></table>


# Obtenir le détail d'un contact

Cette requête est utilisée pour obtenir le détail d'un contact

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/contact/detail`

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

#### **Paramètre**

<table><thead><tr><th width="262">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>contactId</code></td><td>Id du contact</td></tr></tbody></table>

#### Requête

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

```
{
  "url": "https://api.smspartner.fr/v1/contact/detail?apiKey=YOUR_API_KEY&contactId=ID_CONTACT",
  "method": "GET",
  "location": true
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
   "success": true,
   "code": 200,
   "contact": {
       "contactId": "ID CONTACT",
       "phone": "+xxxxxxxxxxx",
       "firstname": "",
       "lastname": "",
       "url": "",
       "shortUrl": "",
       "date": "",
       "custom1": "",
       "custom2": "",
       "custom3": "",
       "custom4": "",
       "createdAt": "2020-10-02T16:40:05+02:00",
       "stopSms": false,
       "groupId": 6363
   }
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

<table><thead><tr><th width="234">Code de réponse</th><th>Réponse</th></tr></thead><tbody><tr><td>10</td><td>La Clé API est requise</td></tr></tbody></table>


# Gestion des stops

Gérer vos réponses et stops sms

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Liste des stops SMS</strong></td><td>Liste des utilisateurs qui ont envoyé STOP</td><td><a href="/pages/O6Y2aKU7AUYCcqEzK0Kk">/pages/O6Y2aKU7AUYCcqEzK0Kk</a></td></tr><tr><td><strong>Ajouter un stop SMS</strong></td><td>Ajouter un numéro à la liste STOP SMS</td><td><a href="/pages/vycOuhherEEukCWeYM7T">/pages/vycOuhherEEukCWeYM7T</a></td></tr><tr><td><strong>Supprimer un STOP SMS</strong></td><td>Supprimer un numéro de la liste STOP SMS</td><td><a href="/pages/pfQnMBghR1TLViWz67xw">/pages/pfQnMBghR1TLViWz67xw</a></td></tr><tr><td><strong>Gestion des réponses</strong></td><td>Gérer les réponses aux SMS</td><td><a href="/pages/a9XxesItLuO5bVX2FhWu">/pages/a9XxesItLuO5bVX2FhWu</a></td></tr></tbody></table>


# Liste des stops

Cette requête est utilisée pour obtenir la liste des stops SMS

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/stop-sms/list`

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

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

<table><thead><tr><th width="142">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></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/stop-sms/list?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim phoneNumber As String = "06XXXXXXXX"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "stop-sms/list" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_list_stop(self):
		url = URL + "/stop-sms/list?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H "Content-Type: application/json" -X GET https://api.smspartner.fr/v1/stop-sms/list?apiKey=xxx
```

{% endtab %}

{% tab title="Nodejs" %}

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

const apiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

const options = {
  hostname: 'api.smspartner.fr',
  port: 443,
  path: `/v1/stop-sms/list?apiKey=${apiKey}`,
  method: 'GET',
};

const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  let rawData = '';
  res.on('data', (chunk) => {
    rawData += chunk;
  });

  res.on('end', () => {
    try {
      const parsedData = JSON.parse(rawData);
      // Process your response here
      console.log(parsedData);
    } catch (e) {
      console.error(e.message);
    }
  });
});

req.on('error', (error) => {
  console.error(error);
});

req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;

public class StopSMSList {
    public static void main(String[] args) {
        try {
            String apiKey = "YOUR_API_KEY";
            URL url = new URL("https://api.smspartner.fr/v1/stop-sms/list?apiKey=" + apiKey);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");

            // Reading API response
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());

            // Parse JSON response
            JSONObject jsonResponse = new JSONObject(response);

            // Display the JSON response
            System.out.println(jsonResponse.toString(2));

            // Closing HTTP connection
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
 import SwiftUI

// Structure pour la vue "ListStopSMS"
struct ListStopSMS: View {
    var body: some View {
        // Un bouton qui appelle la fonction ListStopSMS() lorsqu'il est pressé
        Button(action: {
            ListStopSMS()
        }) {
            Text("Check Stop SMS List")
                .font(.system(size: 20))
                .foregroundColor(.white)
                .frame(minWidth: 0, maxWidth: .infinity)
                .padding()
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                .cornerRadius(10)
                .padding(.horizontal)
        }
    }

    // Fonction pour récupérer la liste des SMS stoppés
    func ListStopSMS() {
        let apiKey = "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX" // Votre clé API
        let urlString = "https://api.smspartner.fr/v1/stop-sms/list?apiKey=\(apiKey)" // URL pour récupérer la liste des SMS stoppés

        // On vérifie que l'URL est correctement formée
        guard let url = URL(string: urlString) else {
            print("URL invalide")
            return
        }

        // Tâche pour récupérer les données de l'URL
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            // Si une erreur survient, on l'affiche
            if let error = error {
                print("Erreur : \(error)")
            }
            // Sinon, on affiche les données reçues
            else if let data = data {
                let str = String(data: data, encoding: .utf8)
                print("Données reçues :\n\(str ?? "")")
            }
        }

        task.resume() // On lance la tâche
    }
}

// Aperçu de la vue
struct StopSMSList_Previews: PreviewProvider {
    static var previews: some View {
        ListStopSMS()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/stop-sms/list?" +
		"apiKey=" + apiKey

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "VOTRE_CLÉ_API";
        var uri = new Uri($"https://api.smspartner.fr/v1/stop-sms/list?apiKey={apiKey}");

        HttpResponseMessage response = await client.GetAsync(uri);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("La requête GET a échoué avec le code de statut: " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
  "success": true,
  "code": 200,
  "nbData": 1,
  "data": [
    {
      "id": 19,
      "phoneNumber": "+33xxxxxxxxx",
      "createdAt": "2015-07-20 10:19:45"
    }
  ]
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>3</entry>
    <entry>
        <entry>
            <entry>19</entry>
            <entry>
                <![CDATA[+33xxxxxxxxx]]>
            </entry>
            <entry>
                <![CDATA[2015-07-20 10:19:45]]>
            </entry>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 1               | La Clé API est requise  |
| 10              | Clé API incorrecte      |
| 200             | Tout s’est bien passé ! |


# Ajouter un numéro au stop SMS

Cette requête permet d'ajouter un numéro à la liste des stops

{% hint style="info" %}

## Information importe concernant les comptes-rendus

Les comptes-rendus sont reçus en moyenne quelques secondes après l’envoi du SMS ; cependant, ce délai peut s’étendre jusqu’à 48h maximum selon les opérateurs et la charge de notre plateforme.
{% endhint %}

## URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/stop-sms/add`

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

#### **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>phoneNumber</code></td><td><p>Numéro<br>Il peut ê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>

#### **Paramètre optionnel**

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</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',
            'phoneNumber'=> '+336xxxxxxxx'
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/stop-sms/add');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "stop-sms/add"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""phoneNumbers"":""{1}""}}",
        apiKey,
        "+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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_stop(self,phone_numbers):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("phoneNumbers", phone_numbers)
		])
 
		url = URL + "/stop-sms/add"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumber":"xxxx"}' https://api.smspartner.fr/v1/stop-sms/add
```

{% endtab %}

{% tab title="Nodejs" %}

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

// ce code permet d'ajouter un numéro à la liste des numéros stop SMS
let data = JSON.stringify({
  apiKey: 'VOTRE_API_KEY',
  phoneNumber: '+336XXXXXXXX',
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/stop-sms/add',
  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("Error: " + err.message);
});

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

{% endtab %}

{% tab title="JAVA" %}

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

public class StopSmsAddList {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "YOUR_API_KEY";
            String phoneNumber = "+336xxxxxxxx";

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"phoneNumber\": \"" + phoneNumber + "\"}";

            // Create POST request
            URL url = new URL("https://api.smspartner.fr/v1/stop-sms/add");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

            // Get response
            int responseCode = connection.getResponseCode();
            if (responseCode >= 200 && responseCode <= 299) {
                // Process your successful response here
                System.out.println("Stop SMS request successful");
            } else {
                // Process your error response here
                System.out.println("Stop SMS request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct StopSmsAddList: View {
    @State private var result: String = "Loading..."
    
    var body: some View {
        VStack {
            Text("Stop SMS Add")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: addStopSms)
    }
    
    func addStopSms() {
        let apiKey = "YOUR API KEY"
        let phoneNumber = "+336xxxxxxxx"
        let urlString = "https://api.smspartner.fr/v1/stop-sms/add"
        
        guard let url = URL(string: urlString) else {
            print("Invalid URL")
            return
        }
        
        let fields = ["apiKey": apiKey, "phoneNumber": phoneNumber]
        
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: fields, options: [])
        } catch {
            print("Failed to serialize data: \(error.localizedDescription)")
            return
        }
        
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let error = error {
                print("Error: \(error)")
            } else if let data = data {
                let result = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = result ?? "Error"
                }
            }
        }
        
        task.resume()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

func main() {
	// Prepare data for POST request
	data := map[string]string{
		"apiKey":      "YOUR_API_KEY",
		"phoneNumber": "+336xxxxxxxx",
	}
	jsonData, err := json.Marshal(data)
	if err != nil {
		log.Fatalf("Error marshaling data: %v", err)
	}

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/stop-sms/add", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}

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

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

	// Process your response here
	log.Printf("Response status code: %d", resp.StatusCode)
}
```

{% 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 data = new
        {
            apiKey = "YOUR_API_KEY",
            phoneNumber = "+336xxxxxxxx"
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/stop-sms/add", content);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("La requête POST a échoué avec le code de statut: " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code":200
    "stopId": 300
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>300</entry>
</result>

```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>3</td><td>Le numéro est déjà dans la liste</td></tr><tr><td>9</td><td>Le numéro de téléphone est invalide</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Supprimer un numéro du STOP SMS

Cette requête permet de supprimer un numéro de la liste des stops.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/stop-sms/delete`

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

#### **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>id</code></td><td>ID du numéro à supprimer, il se situe dans la <a href="/pages/O6Y2aKU7AUYCcqEzK0Kk">liste des stops SMS</a>.</td></tr></tbody></table>

#### **Paramètre optionnel**

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&id=666';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/stop-sms/delete?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim id As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "stop-sms/delete" & "?apiKey=" & apiKey & "&id=" & id
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def del_stop(self,id):
		url = URL + "/stop-sms/delete?apiKey=" + API_KEY + "&id=" + id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/stop-sms/delete?apiKey=xxx&id=300
```

{% endtab %}

{% tab title="Nodejs" %}

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

let data = 'apiKey=your-api-key&id=333';
let url = 'https://api.smspartner.fr/v1/stop-sms/delete?' + data;

https.get(url, (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);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class StopSmsDeleteList {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";
            String id = "666";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/stop-sms/delete?" +
                    "apiKey=" + apiKey + "&id=" + id;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct StopSmsDeleteList: View {
    @State private var result: String = "Loading..."
    
    var body: some View {
        VStack {
            Text("Stop Sms Delete")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: deleteStopSms)
    }

    func deleteStopSms() {
        let apiKey = "YOUR_API_KEY"
        let id = "666"
        let urlString = "https://api.smspartner.fr/v1/stop-sms/delete?apiKey=\(apiKey)&id=\(id)"

        guard let url = URL(string: urlString) else {
            print("URL inválida")
            return
        }

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

        task.resume()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	id := "666"

	// Create HTTP client with timeout
	client := &http.Client{Timeout: 10 * time.Second}

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/stop-sms/delete?apiKey=" + apiKey + "&id=" + id

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

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

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "VOTRE_CLÉ_API";
        var id = "666";
        var uri = new Uri($"https://api.smspartner.fr/v1/stop-sms/delete?apiKey={apiKey}&id={id}");

        HttpResponseMessage response = await client.GetAsync(uri);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("La demande GET a échoué avec le code d'état : " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code":200
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
</result>

```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>3</td><td>L'id du numéro de téléphone est requis</td></tr><tr><td>4</td><td>L'id du numéro de téléphone est introuvable</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Vérification de numéros

Gérer vos réponses et stops sms

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Envoyer une vérification</strong></td><td>Vérifier un numéro de téléphone</td><td><a href="/pages/I8Yd8HZPUmAG11pSJHp3">/pages/I8Yd8HZPUmAG11pSJHp3</a></td></tr><tr><td><strong>Vérification du format</strong></td><td>Vérifier le format du numéro de téléphone</td><td><a href="/pages/x8YeXWSEYUWTPvMawKh0">/pages/x8YeXWSEYUWTPvMawKh0</a></td></tr></tbody></table>


# Envoyer une vérification

Cette requête est utilisée pour envoyer une vérification HLR.

## URL

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

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

#### **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>phoneNumbers</code></td><td>Numéros de mobile à vérifier. Ils doivent être au format international (+336xxxxxxxx). Pour l’envoi de plusieurs vérifications les numéros doivent être séparés par des virgules. 500 numéros peuvent être vérifiés par requête.</td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>tag</code></td><td>Chaine de caractères de 20 caractères maximum.</td></tr><tr><td><code>notifyUrl</code></td><td>Permet de récupérer le résultat de la requête HLR vers une URL de votre choixle résultat est envoyé en POST.<br>Exemple de notification d'une requête HLR</td></tr><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'phoneNumbers'=> '+336xxxxxxxx',
            'notifyUrl'=>'http://...'
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/hlr/notify');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "hlr/notify"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""phoneNumbers"":""{1}"",""notifyUrl"":""{2}""}}",
        apiKey,
        "+33XXXXXXXXX",
        "http://...")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_stop(self,phone_numbers):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("phoneNumbers", phone_numbers,
			"notifyUrl", notify_url)
		])
 
		url = URL + "/hlr/notify"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumbers":"xxxx","notifyUrl":"http://..."}' https://api.smspartner.fr/v1/hlr/notify
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "campaign_id": "HLR000000",
    "number": 1,
    "cost": 0.005,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <![CDATA[HLR0000000]]>
    </entry>
    <entry>1</entry>
    <entry>0.005</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>3</td><td>Les numéros doivent être séparés par une virgule</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>

#### Exemple de notification d'une requête HLR

```php
Array(
    'phone' => '+3300000000',
    'messageId'=>'1234-12344-1234-1234',
    'mccMnc' => '20815',
    'ported'=> 1,
    'errorGrpId'=> 0,
    'errorName'=> 'NO_ERROR ',
    'errorDesc'=>'No Error' ,
    'date'=>'2018-03-05T10:34:52.355+0000'
)
```

#### Code erreurs HLR

| Erreur | Nom de l'erreur                                                                                                                                                                                                                                                            |
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0      | `NO_ERROR`Aucune erreur.                                                                                                                                                                                                                                                   |
| 1      | `EC_UNKNOWN_SUBSCRIBER`Le numéro n’existe pas ou n’a été attribué à aucun abonné actif dans la base de données utilisateur de l’opérateur.                                                                                                                                 |
| 5      | `EC_UNIDENTIFIED_SUBSCRIBER`Abonné non identifié.                                                                                                                                                                                                                          |
| 6      | `EC_ABSENT_SUBSCRIBER_SM`Comme il n’y avait pas de réponse, l’abonné a été détecté comme indisponible. Cela est souvent dû au fait que le combiné est éteint ou dans une zone de faible signal.                                                                            |
| 7      | `EC_UNKNOWN_EQUIPMENT`Le périphérique mobile n’a pas été reconnu par EIR (Equipment Identity Register) lors de la vérification du périphérique au niveau du protocole MAP sur l’infrastructure de l’opérateur.                                                             |
| 8      | `EC_ROAMING_NOT_ALLOWED`L’abonné est actuellement en itinérance dans un autre pays ou utilise l’infrastructure d’un autre opérateur – la livraison en itinérance n’est pas garantie en raison de l’absence d’accords d’itinérance entre de nombreux opérateurs différents. |
| 9      | `EC_ILLEGAL_SUBSCRIBER`Abonné illégal.                                                                                                                                                                                                                                     |
| 12     | `EC_ILLEGAL_EQUIPMENT`Équipement illégal.                                                                                                                                                                                                                                  |
| 13     | `EC_CALL_BARRED`L’abonné est configuré sur le service NPD (Ne pas déranger), et ne reçoit aucun trafic de service vers son numéro.                                                                                                                                         |
| 27     | `EC_ABSENT_SUBSCRIBER`L’abonné est hors ligne. Cela est souvent dû au fait que le combiné est éteint.                                                                                                                                                                      |
| 255    | `EC_UNKNOWN_ERROR`Erreur inconnue.                                                                                                                                                                                                                                         |


# Vérification de format

Cette requête est utilisée pour vérifier le format d'un numéro de téléphone portable. Elle est disponible gratuitement.

## URL

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

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

#### **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>phoneNumbers</code></td><td>Numéros de mobile à vérifier. Ils doivent être au format international (+336xxxxxxxx). Pour l’envoi de plusieurs vérifications les numéros doivent être séparés par des virgules. 500 numéros peuvent être vérifiés par requête.</td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>testDromCom</code></td><td><p><code>1</code> pour activer la détection des numéros mobiles DROM-COM saisis avec un format métropolitain au lieu de leur indicatif international.</p><p>Voir <a href="#testdromcom">le détail ci-dessous</a>.</p></td></tr><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Le paramètre `testDromCom` <a href="#testdromcom" id="testdromcom"></a>

Par défaut, un numéro est validé selon le plan de numérotation de la France métropolitaine. Un numéro mobile des DROM-COM (Guadeloupe, Martinique, Guyane, La Réunion, Mayotte) saisi sans son véritable indicatif international par exemple `0619922264` au lieu de `+262619922264`, ne correspond alors à aucun format valide, et l'API renvoie `success: false`.

En passant `testDromCom: 1`, si la validation standard échoue, l'API tente en complément de reconnaître le numéro parmi les préfixes mobiles des territoires suivants :

| Territoire | Indicatif |
| ---------- | --------- |
| Mayotte    | +262      |
| Guadeloupe | +590      |
| La Réunion | +262      |
| Guyane     | +594      |
| Martinique | +596      |

Si le numéro correspond à l'un de ces préfixes, l'API le reformate automatiquement avec le bon indicatif et renvoie `success: true`, avec `countryCode`, `country` et `prefixCode` corrigés en conséquence (ex : `RE` / `La Réunion` / `262`) plutôt que de rejeter le numéro comme invalide.

**Exemple de requête :**

```json
{
    "apiKey": "YOUR_API_KEY",
    "testDromCom": 1,
    "phoneNumbers": "0619922264"
}
```

{% hint style="info" %}
Seuls ces 5 territoires sont couverts par cette détection. Les autres collectivités d'outre-mer (Polynésie française, Nouvelle-Calédonie, Saint-Pierre-et-Miquelon, etc.) ne sont pas reconnues par ce paramètre.
{% endhint %}

À utiliser si votre base de contacts ou d'import n'associe pas toujours le bon indicatif international aux numéros ultramarins, et que vous préférez que l'API les corrige plutôt que de les rejeter.

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'phoneNumbers'=> '+336xxxxxxxx'
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/lookup');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "lookup"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""phoneNumbers"":""{1}""}}",
        apiKey,
        "+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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_stop(self,phone_numbers):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("phoneNumbers", phone_numbers)
		])
 
		url = URL + "/lookup"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumbers":"xxxx"}' https://api.smspartner.fr/v1/lookup
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "lookup": [
        {
            "request": "336XXXXXXXX",
            "success": true,
            "countryCode": "France",
            "prefixCode": 33,
            "phoneNumber": "+336XXXXXXXX",
            "type": "Mobile",
            "network": "",
            "format": {
                "e164": "+336XXXXXXXX",
                "international": "+33 6 XX XX XX XX",
                "national": "06 XX XX XX XX",
                "rfc3966": "tel:+33-6-XX-XX-XX-XX"
            }
        }
    ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <entry>
            <entry>
                <![CDATA[336XXXXXXXX]]>
            </entry>
            <entry>true</entry>
            <entry>
                <![CDATA[France]]>
            </entry>
            <entry>33</entry>
            <entry>
                <![CDATA[+336XXXXXXXX]]>
            </entry>
            <entry>
                <![CDATA[Mobile]]>
            </entry>
            <entry>
                <![CDATA[]]>
            </entry>
            <entry>
                <entry>
                    <![CDATA[+336XXXXXXXX]]>
                </entry>
                <entry>
                    <![CDATA[+33 6 XX XX XX XX]]>
                </entry>
                <entry>
                    <![CDATA[06 XX XX XX XX]]>
                </entry>
                <entry>
                    <![CDATA[tel:+33-6-XX-XX-XX-XX]]>
                </entry>
            </entry>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>3</td><td>Les numéros doivent être séparés par une virgule</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>

#### Exemple de notification d'une requête HLR

```php
Array(
    'phone' => '+3300000000',
    'messageId'=>'1234-12344-1234-1234',
    'mccMnc' => '20815',
    'ported'=> 1,
    'errorGrpId'=> 0,
    'errorName'=> 'NO_ERROR ',
    'errorDesc'=>'No Error' ,
    'date'=>'2018-03-05T10:34:52.355+0000'
)
```

#### Code erreurs HLR

| Erreur | Nom de l'erreur                                                                                                                                                                                                                                                            |
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0      | `NO_ERROR`Aucune erreur.                                                                                                                                                                                                                                                   |
| 1      | `EC_UNKNOWN_SUBSCRIBER`Le numéro n’existe pas ou n’a été attribué à aucun abonné actif dans la base de données utilisateur de l’opérateur.                                                                                                                                 |
| 5      | `EC_UNIDENTIFIED_SUBSCRIBER`Abonné non identifié.                                                                                                                                                                                                                          |
| 6      | `EC_ABSENT_SUBSCRIBER_SM`Comme il n’y avait pas de réponse, l’abonné a été détecté comme indisponible. Cela est souvent dû au fait que le combiné est éteint ou dans une zone de faible signal.                                                                            |
| 7      | `EC_UNKNOWN_EQUIPMENT`Le périphérique mobile n’a pas été reconnu par EIR (Equipment Identity Register) lors de la vérification du périphérique au niveau du protocole MAP sur l’infrastructure de l’opérateur.                                                             |
| 8      | `EC_ROAMING_NOT_ALLOWED`L’abonné est actuellement en itinérance dans un autre pays ou utilise l’infrastructure d’un autre opérateur – la livraison en itinérance n’est pas garantie en raison de l’absence d’accords d’itinérance entre de nombreux opérateurs différents. |
| 9      | `EC_ILLEGAL_SUBSCRIBER`Abonné illégal.                                                                                                                                                                                                                                     |
| 12     | `EC_ILLEGAL_EQUIPMENT`Équipement illégal.                                                                                                                                                                                                                                  |
| 13     | `EC_CALL_BARRED`L’abonné est configuré sur le service NPD (Ne pas déranger), et ne reçoit aucun trafic de service vers son numéro.                                                                                                                                         |
| 27     | `EC_ABSENT_SUBSCRIBER`L’abonné est hors ligne. Cela est souvent dû au fait que le combiné est éteint.                                                                                                                                                                      |
| 255    | `EC_UNKNOWN_ERROR`Erreur inconnue.                                                                                                                                                                                                                                         |


# Location de contacts

Louer une base de donnée de numéros pour votre compagne SMS !

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Catégories</strong></td><td>Liste des catégories de numéros</td><td><a href="/pages/0pBzPg8GUt1433qW0u90">/pages/0pBzPg8GUt1433qW0u90</a></td></tr><tr><td><strong>Ciblage &#x26; calcul</strong></td><td>Calculer le ciblage et son coût</td><td><a href="/pages/N39a0FFZchOZkYjq3dy0">/pages/N39a0FFZchOZkYjq3dy0</a></td></tr><tr><td><strong>Statut d'une location</strong></td><td>Récupérer le statut d'une location de contacts</td><td><a href="/pages/DzK8j59e0gxS04nWVKT3">/pages/DzK8j59e0gxS04nWVKT3</a></td></tr><tr><td><strong>Télécharger le fichier</strong></td><td>Récupérer le fichier de la base de donnée loué</td><td><a href="/pages/vbs6sXdJr0ZhITJNu72l">/pages/vbs6sXdJr0ZhITJNu72l</a></td></tr></tbody></table>


# Catégories

Liste des catégories et sous-catégories.

## Catégories

<table><thead><tr><th width="138">Identifiant</th><th width="181">Label</th><th width="302">Description</th><th>Sous-catégories</th></tr></thead><tbody><tr><td><strong>11</strong></td><td>Astuces/Réductions</td><td>Ensemble des contacts à l’affût des bons plans, offres promotionnelles, jeux-concours, etc…</td><td></td></tr><tr><td><strong>12</strong></td><td>Banque et Finance</td><td>Contacts sensibles aux offres de produits bancaires, rachat de crédit, finance et fiscalité</td><td><a href="#banque-et-finance-12">Oui</a></td></tr><tr><td><strong>14</strong></td><td>Habitation</td><td>Rassemblement de contacts intéressés par les activités et offres relatives à l’habitat (intérieur et extérieur)</td><td><a href="#habitation-14">Oui</a></td></tr><tr><td><strong>16</strong></td><td>Assurance</td><td>Contacts à l’écoute des offres de différents types d’assurance</td><td><a href="#assurance-16">Oui</a></td></tr><tr><td><strong>18</strong></td><td>Alimentaire</td><td>Profils réactifs aux offres portées sur les produits alimentaires.</td><td></td></tr><tr><td><strong>25</strong></td><td>Immobilier</td><td>–</td><td><a href="#immobilier-25">Oui</a></td></tr><tr><td><strong>30</strong></td><td>Finance et fiscalité</td><td>Intérêt pour les services de défiscalisation et réduction d’impôts</td><td></td></tr><tr><td><strong>108</strong></td><td>Energies renouvelables</td><td>–</td><td></td></tr></tbody></table>

## Sous-catégories

Correspond au paramètre `subInterest`

#### Banque et Finance (12) :

| Identifiant | Label            | Description                                                                                                     |
| ----------- | ---------------- | --------------------------------------------------------------------------------------------------------------- |
| **28**      | Banque           | Profil adepte des produits bancaires tels que l’ouverture des comptes, la demande de crédit ou les comparateurs |
| **29**      | Rachat de crédit | Profil adepte des produits bancaires tels que le rachat de crédit                                               |

#### **Habitation (14) :**

| Identifiant | Label                          | Description                                                                                                   |
| ----------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------- |
| **34**      | Ameublement et Décoration      | –                                                                                                             |
| **35**      | Cuisine                        | Rassemblement de contacts intéressés par les activités et offres relatives aux cuisines et à l’électroménager |
| **36**      | Energie                        | Rassemblement de contacts intéressés par les activités et offres relatives à la climatisation et au chauffage |
| **38**      | Travaux                        | Rassemblement de contacts intéressés par les travaux (petit bricolage, porte et fenêtre, travaux gros œuvre)  |
| **39**      | Alarmes et sécurité            | Rassemblement de contacts intéressés par les activités et offres relatives aux cuisines et à l’électroménager |
| **109**     | Intérêt offres shopping maison | –                                                                                                             |
| **110**     | Linge de maison                | Rassemblement de contacts intéressés par les activités et offres relatives au linge de maison                 |

#### **Assurance (16) :**

| Identifiant | Label      | Description |
| ----------- | ---------- | ----------- |
| **43**      | Santé      | –           |
| **44**      | Animaux    | –           |
| **45**      | Automobile | –           |
| **46**      | Habitation | –           |

#### **Immobilier (25) :**

| Identifiant | Label               | Description |
| ----------- | ------------------- | ----------- |
| **65**      | Propriétaires       | –           |
| **66**      | Locataire           | –           |
| **67**      | Intérêt offres Immo | –           |


# Ciblage et calcul

Cette requête permet de calculer le ciblage, et le coût du ciblage.

## URL

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

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

#### **Paramètres**

<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>op</code></td><td><p>Opération à effectuer:</p><ul><li><code>Calcul</code> : Permet de calculer le coût et le nombre de contact concerné par le ciblage</li><li><code>price</code> : Permet de calculer le coût d’un ciblage</li><li><code>Rent</code> : Loue une base de contact</li></ul></td></tr><tr><td><code>parameters</code></td><td><p><code>sexe</code> <strong>:</strong></p><p>Sexe des contacts ciblés, doit être:<br>– <code>m</code> (mixte)<br>– ou <code>h</code> (homme)<br>– ou <code>f</code> (femme)</p><p><code>minAge</code> <strong>:</strong></p><p>Age minimum de la cible, doit être supérieur à 18.</p><p><code>maxAge</code> <strong>:</strong></p><p>Age maximum de la cible, doit être inférieur à 99.</p><p><code>interest</code> <strong>:</strong></p><p><a href="/pages/0pBzPg8GUt1433qW0u90#categories">Catégorie</a> principal de la cible.</p><p><code>subInterest</code> (optionnel) <strong>:</strong></p><p><a href="/pages/0pBzPg8GUt1433qW0u90#sous-categories">Sous catégorie</a> de la catégorie principal</p><p><code>category</code> (optionnel) <strong>:</strong></p><p>Catégorie sociaux professionnelle:<br>– <code>102</code>: CSP+<br>– <code>103</code>: CSP-</p><p><code>department</code> (optionnel) <strong>:</strong></p><p>Liste des départements ciblés. ex: 02,60, etc…</p><p><code>zipcode</code> (optionnel) <strong>:</strong></p><p>Liste des codes postaux ciblés. ex: 02200,60200, etc…</p></td></tr><tr><td><code>volumes</code></td><td><p>Ce paramètre est disponible uniquement si op = rent ou price.</p><p>Permet de choisir un volume souhaité par code postal ou département</p></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'op':'calcul',
            'parameters':{
            'sexe'=> 'm',
            'minAge'=> '25',
            'maxAge' => '35',
            'zipcode'=> '60200',
            'interest'=> 14, /*Habitation*/
            'subInterest'=> 35 /*Cuisine*/
            },
            'volumes':{
            '60200':20
            }
        );
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/location/optin');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR API KEY"
 
    #send sms
    url = base_url & "location/optin"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""op"":""{1}"",""parameters"":""{2}"",""volumes"":""{3}""}}",
        apiKey,
        "price",
        "{ "sexe"=> "m","minAge"=> "25","maxAge" => "35","zipcode"=> "60200","interest"=> 14,"subInterest"=> 35}",
        "{"60200":20}"
        )
        ""
    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 http.client
 
conn = http.client.HTTPConnection("api,smspartner,fr")
 
payload = "{"apiKey":"YOUR API KEY","op":"price","parameters":{"sexe":"f","minAge":25,"maxAge":35,"zipcode":"06200","interest":12,"subInterest":29,"category":103},"volumes":{"60200":20}}"
 
headers = {
    "Content-Type": "application/json"
    }
 
conn.request("POST", "v1,location,optin", payload, headers)
 
res = conn.getresponse()
data = res.read()
 
print(data.decode("utf-8"))
```

{% endtab %}

{% tab title="cURL" %}

```
curl -X POST https://api.smspartner.fr/v1/location/optin -H "Content-Type: application/json" -d '{"apiKey":"YOUR API KEY","op":"price","parameters":{"sexe":"f","minAge":25,"maxAge":35,"zipcode":"06200","interest":"12","subInterest":"29","category":103}}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "op": "price",
    "datas": [
        {
            "Type": "CP",
            "Localite": "06200",
            "Volume": 20
        },
        {
            "Type": "total",
            "Localite": "total",
            "Volume": 20
        }
    ],
    "cost": {
        "quantity": 20,
        "total": 2.52,
        "cost_unity": 0.09
    }
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>
        <![CDATA[price]]>
    </entry>
    <entry>
        <entry>
            <entry>
                <![CDATA[CP]]>
            </entry>
            <entry>
                <![CDATA[06200]]>
            </entry>
            <entry>28</entry>
        </entry>
        <entry>
            <entry>
                <![CDATA[total]]>
            </entry>
            <entry>
                <![CDATA[total]]>
            </entry>
            <entry>28</entry>
        </entry>
    </entry>
    <entry>
        <entry>28</entry>
        <entry>2.52</entry>
        <entry>0.09</entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Statut d'une location

Cette requête permet de récupérer permet de récupérer le statut d’une location de contacts.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/location/status`

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

#### **Paramètres**

<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>token</code></td><td>Identifiant de la location.</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&token=xxx';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/location/status?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim token As String = XXX
 
    #check credits
    Dim url As String
    url = base_url & "location/status" & "?apiKey=" & apiKey & "&token=" & token
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,token):
		url = URL + "/location/status?apiKey=" + API_KEY +  "&token=" + token
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/location/status?apiKey=xxx&token=xxx
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "token": "identifiant de la location",
    "status": "File downloaded by user from api",
    "location": {
        "sexe": "femme",
        "minAge": 31,
        "maxAge": 49,
        "zipcode": "60200",
        "interest": "12",
        "category": 103,
        "details_localisation": [
            {
                "Type": "cp",
                "Location": "60200",
                "VolumeDesired": "10",
                "Volume": "266"
            }
        ],
        "cost": {
            "quantity": 10,
            "total": "0.900",
            "cost_unity": "0.090"
        }
    },
    "file": {
        "phoneNumbers": "10"
    }
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>
        <![CDATA[b22b841a21624f4f452ba7fa8c822c0ed7cecfdb]]>
    </entry>
    <entry>
        <![CDATA[File downloaded by user from api]]>
    </entry>
    <entry>
        <entry>
            <![CDATA[femme]]>
        </entry>
        <entry>31</entry>
        <entry>49</entry>
        <entry>
            <![CDATA[60200]]>
        </entry>
        <entry>
            <![CDATA[12]]>
        </entry>
        <entry>103</entry>
        <entry>
            <entry>
                <entry>
                    <![CDATA[cp]]>
                </entry>
                <entry>
                    <![CDATA[60200]]>
                </entry>
                <entry>
                    <![CDATA[10]]>
                </entry>
                <entry>
                    <![CDATA[266]]>
                </entry>
            </entry>
        </entry>
        <entry>
            <entry>10</entry>
            <entry>
                <![CDATA[0.900]]>
            </entry>
            <entry>
                <![CDATA[0.090]]>
            </entry>
        </entry>
    </entry>
    <entry>
        <entry>
            <![CDATA[10]]>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Code de statut de location

<table><thead><tr><th width="234">Code de réponse</th><th>Réponse</th></tr></thead><tbody><tr><td>0</td><td>La demande de location a été effectué</td></tr><tr><td>1</td><td>Le fichier est en cours de création</td></tr><tr><td>2</td><td>La création du fichier est terminé. Vous pouvez le télécharger.</td></tr><tr><td>3</td><td>La demande de location a échoué</td></tr><tr><td>5</td><td>Le fichier a déjà été téléchargé</td></tr></tbody></table>

#### **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>10</td><td>Clé API incorrecte</td></tr><tr><td>31</td><td>Le token de la location est requis</td></tr><tr><td>32</td><td>Location introuvable</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Télécharger le fichier

Cette requête permet de télécharger le fichier de la location

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/location/file/download`

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

#### **Paramètres**

<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>token</code></td><td>Identifiant de la location.</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&token=xxx';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/location/file/download?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim token As String = XXX
 
    #check credits
    Dim url As String
    url = base_url & "location/file/download" & "?apiKey=" & apiKey & "&token=" & token
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,token):
		url = URL + "/location/file/download?apiKey=" + API_KEY +  "&token=" + token
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/location/file/download?apiKey=xxx&token=xxx
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "phoneNumbers": 10,
    "datas": [
        {
            "id": ...4314,
            "phone": "+336XXXXXX",
            "stopSms": false
        },
        {
            "id": ...4315,
            "phone": "+336XXXXXX",
            "stopSms": false
        },
        {
            "id": ...4316,
            "phone": "+336XXXXXX",
            "stopSms": false
        }...
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>10</entry>
    <entry>
        <entry>
            <entry>...4314</entry>
            <entry>
                <![CDATA[+336XXXXXX]]>
            </entry>
            <entry>false</entry>
        </entry>
        <entry>
            <entry>...4315</entry>
            <entry>
                <![CDATA[+33669106211]]>
            </entry>
            <entry>false</entry>
        </entry>
        <entry>
            <entry>...4316</entry>
            <entry>
                <![CDATA[+33781609201]]>
            </entry>
            <entry>false</entry>
        </entry>...
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>10</td><td>Clé API incorrecte</td></tr><tr><td>31</td><td>Le token de la location est requis</td></tr><tr><td>32</td><td>Location introuvable</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# RCS

Cette requête est utilisée pour envoyer un RCS en temps réel ou en différé.

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

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

{% 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>phoneNumbers</code></td><td><p>Numéros de téléphone des destinataires.<br>Pour l’envoi de plusieurs SMS 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><tr><td><code>isUnicode</code></td><td>1</td></tr><tr><td><code>richContent</code></td><td><a href="#contenu-enrich">Voir ci-dessous</a></td></tr></tbody></table>

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

<table data-full-width="false"><thead><tr><th width="227">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>scheduledDeliveryDate</code></td><td>Date d’envoi du SMS, au format <code>dd/mm/YYYY</code>. A définir uniquement si vous souhaitez que les SMS soient envoyés en différé.</td></tr><tr><td><code>time</code></td><td>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>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 évenements RCS (ex: http://www.monurldereponse)<br>- Les clics<br>- Les lectures<br>- Les demandes de désinscription (STOP)<br>- Les réponses des destinataires</td></tr><tr><td><code>urlDlr</code></td><td>Url de retour des Accusé de réceptions (ex: http://www.monurldedlr)</td></tr><tr><td><code>scheduledAt</code></td><td><p>Permet de différer l'envoi du SMS, en une seule valeur, sous deux formes possibles :</p><p><br></p><p>1. Date absolue — formats acceptés :</p><p>- 2026-05-20 10:15 ou 2026-05-20 10:15:00</p><p>- 2026-05-20T10:15:00 (ISO 8601)</p><p>- 20/05/2026 10:15</p><p>- 2026-05-20 ou 20/05/2026 (envoi à minuit ce jour-là)</p><p><br></p><p>2. Délai relatif — envoi dans X unités de temps à partir de maintenant :</p><p>- +10 minutes, +2 hours, +3 days, +1 week, +1 month (anglais)</p><p>- +10 minutes, +2 heures, +3 jours, +1 semaine, +1 mois, +1 an (français, avec abréviations tolérées : min, mn, h, j, hrs)</p><p>- Le + est optionnel (10 minutes équivaut à +10 minutes)</p><p><br></p><p><strong>Comportement</strong> :</p><p>- Si scheduledAt est renseigné, il remplace les anciens paramètres scheduledDeliveryDate / time / minute (conservés pour rétrocompatibilité, mais scheduledAt est désormais</p><p>recommandé).</p><p>- 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...).</p><p>- La date obtenue doit être dans le futur, et au maximum 3 mois à l'avance.<br><br><code>Exemple de requête :</code></p><p><code>{</code></p><p><code>"apiKey": "xxxxx",</code></p><p><code>"phoneNumbers": "+33600000000",</code></p><p><code>"message": "Votre rendez-vous approche",</code></p><p><code>"scheduledAt": "+2 hours"</code></p><p><code>}</code></p><p><br></p><p><strong>Erreurs</strong> :</p><p>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 49 avec un</p><p>message explicite.<br></p></td></tr></tbody></table>

#### Contenu enrichi

{% tabs fullWidth="true" %}
{% 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 globals (8 maxi)
           "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"
   }
  "apiKey": "",
```

{% endtab %}

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

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

               // 8 cards 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)
                       ]
                   },
                   {
                       "title": "", //200 caractères maximum
                       "description": "", //500 caractères maximum
                       "media": {
                           "height": "MEDIUM",
                           "mediaUrl": ""
                       },
                       "suggestions": [
                           //Voir la section suggestions  (4 maximum)
                       ]
                   }
               ]
           },

           //suggestions globals (8 maxi)
           "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 fullWidth="true" %}
{% 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 portable lorsque la suggestion est sélectionnée. Il doit s'agir d'un URI valide tel que défini dans la RFC 3986. Tous les formats d'URI ne sont pas pris en charge par tous les réseaux.
            }
    }
}
```

{% 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 lien
                 "longitude": -122.0844786 //Longitude du lieu
            }
      }
  }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

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

{% endtab %}
{% endtabs %}

#### **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                                  |
| vidéo/webm      | Vidéo au format WebM | .webm       | Oui                                  |


# Voice Partner

Introduction à l'api Voice Partner

L’API permet d’effectuer des envois de [SMS Vocaux](/api/voice-partner/envoyer-un-sms-vocal) ou d’effectuer des [dépôts de messages directement sur répondeur](/api/voice-partner/message-vocal). Ces fonctionnalités sont proposées à partir de la plateforme [Voice Partner](https://voicepartner.fr). Depuis le site, vous avez un accès immédiat à notre API gratuite : elle vous permet d’intégrer facilement nos services de voix à votre site web, logiciel ou application CRM.


# Webhooks

Recevoir les statuts de vos campagnes vocales

{% hint style="info" %}

#### À noter

Pour recevoir les statuts, vous devez paramétrer votre URL de retour (**notifyUrl**) dans la requête API
{% endhint %}

## Récupération des statuts des dépôts répondeurs

Après l’envoi d’une campagne VoicePartner vous permet de recevoir les statuts de vos campagnes.\
Pour en savoir plus, [**contactez nous**](https://www.smspartner.fr/contact).

**Exemple de statut envoyé en GET**

```
notifyUrl?campaign_token=oiTCpIVk2jvIY3xcfg&campaign_id=NDA_20230111_00811&delivered_quantity=1&total_quantity=1
```

## Récupération des statuts des SMS vocaux

**Exemple de réponse JSON envoyé en POST**

<pre class="language-json"><code class="lang-json"><strong>{
</strong>  "campaignId": "XHa7GXvhy6zkhQEf4HtHG",
  "status": "delivered",
  "additionnal_status": "VOICE_ANSWERED",
  "phoneNumber": "006.........",
  "sendAt": "2026-01-13 11:35:00",
  "doneAt": "2026-01-13 11:35:12",
  "duration": 6,
  //Si un fichier audio a été ajouté à la requête
  "audioFileComplementaire": {
    "status": "Deposit"
  }
}

</code></pre>

**status**

`pending`**`:`**` `` ``En attente du statut `

`delivered: l'appel a été transmit`

`undelivered: L'appel n'a pas été transmit`

**additionnal\_status**

`VOICE_ANSWERED: L'appel a été décroché`

`VOICE_NOT_ANSWERED: Appel non décroché`


# Crédits

Cette requête est utilisée pour récupérer votre crédit disponible de messages vocaux, dépôt de messages.

{% hint style="warning" %}
Limite : 5 requêtes par minute
{% endhint %}

## URL

<mark style="color:red;">`GET`</mark> `https://api.voicepartner.fr/v1/me`

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

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.voicepartner.fr/app/api">Votre clé API</a></td></tr></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.voicepartner.fr/v1/me/'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $result = curl_exec($curl);
        curl_close($curl);
 
        // Process your response here
        echo $result;
?>
```

{% endtab %}

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

```vbnet
cURL
Imports System.IO
Imports System.Net
 
Module Module1
 
  Sub Main()
 
    Dim base_url As String = "https://api.voicepartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "me" & "/" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.voicepartner.fr/v1"
 
class SMSPartner():
    def get_balance(self):
		url = URL + "/me/" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H "Content-Type: application/json" -X GET  https://api.voicepartner.fr/v1/me/xxx
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Replace 'YOUR_API_KEY' with your actual API key
const apiKey = 'YOUR_API_KEY';

// The URL of the API with the API key appended
const url = `https://api.voicepartner.fr/v1/me/${apiKey}`;

axios.get(url)
.then(response => {
console.log('Response:', response.data);
})
.catch(error => {
console.error('Error:', error.response ? error.response.data : error.message);
});
```

{% endtab %}

{% tab title="JAVA" %}

```java
package com.example.API;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;

public class CreditVoix {
    public static void main(String[] args) {
        // Replace 'YOUR_API_KEY' with your actual API key
        String apiKey = "YOUR_API_KEY";
        String url = "https://api.voicepartner.fr/v1/me/" + apiKey;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        client.sendAsync(request, BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .exceptionally(e -> {
                    System.out.println("Error: " + e.getMessage());
                    return null;
                })
                .join();
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	apiKey := "YOUR_API_KEY"
	url := fmt.Sprintf("https://api.voicepartner.fr/v1/me/%s", apiKey)

	response, err := http.Get(url)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	defer response.Body.Close()

	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}

	fmt.Printf("Response: %s\n", string(body))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace API.ApiClients
{
    public class CreditVoix
    {
        public static async Task Main()
        {
            var apiKey = "YOUR_API_KEY";
            var url = $"https://api.voicepartner.fr/v1/me/{apiKey}";

            using (var client = new HttpClient())
            {
                try
                {
                    var response = await client.GetAsync(url);
                    var content = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Response: " + content);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: " + ex.Message);
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "credit": "19",
    "currency": "€",
    "details": {
        "tts": {
            "h": 5,
            "m": 55,
            "s": 66
        },
        "tts_fixe": {
            "h": 3,
            "m": 44,
            "s": 55
        },
        "voice": {
            "message": 10
        }
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 10              | Clé API incorrecte      |
| 200             | Tout s’est bien passé ! |


# Sous-comptes

Gérer vos sous-comptes.

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Activation</strong></td><td>Comment activer la fonctionnalité sous-compte</td><td><a href="/pages/DfgVV5P46MS1lYoXN04y">/pages/DfgVV5P46MS1lYoXN04y</a></td></tr><tr><td><strong>Création d'un sous-compte</strong></td><td>Créer un sous-compte sur votre compte</td><td><a href="/pages/xXxvSLZNZTu8BwjNbrFX">/pages/xXxvSLZNZTu8BwjNbrFX</a></td></tr><tr><td><strong>Supprimer un sous-compte</strong></td><td>Supprimer un sous-compte sur votre compte</td><td><a href="/pages/dxMbFfmmosigLKGv2Q53">/pages/dxMbFfmmosigLKGv2Q53</a></td></tr><tr><td><strong>Liste des sous-comptes</strong></td><td>Lister vos sous-comptes</td><td><a href="/pages/9UPDbTW1mLji10w9MdwE">/pages/9UPDbTW1mLji10w9MdwE</a></td></tr><tr><td>G<strong>érer les crédits</strong></td><td>Gérer les crédits de vos sous-comptes</td><td><a href="/pages/99Cq68mCb0nEIAlXyc1R">/pages/99Cq68mCb0nEIAlXyc1R</a></td></tr></tbody></table>


# Activation

Découvrez comment activer la fonctionnalité création de sous-comptes.

### Demande d'activation de la fonctionnalité sous-comptes

{% hint style="info" %}

#### Comment activer cette fonctionnalité ?

Veuillez contacter [l'équipe technique](https://www.voicepartner.fr/contact/).
{% endhint %}

Voice Partner vous donne la possibilité de créer des sous-comptes. Ainsi vous pouvez gérer un nombre illimité de sous-compte à partir de votre compte principal.

### Création des sous-comptes

{% hint style="info" %}
Pour créer des sous-compte à partir de votre compte maitre, il y a trois solutions possibles.
{% endhint %}

* Via notre API : Voir la [page création de sous-comptes](/api/voice-partner/sous-comptes/creation-dun-sous-compte)
* Via le fichier Excel : Veuillez télécharger, compléter et nous renvoyer le [fichier modèle](https://my.smspartner.fr/subaccount_model.xls).
* Via la plateforme : Une fois l'option activé vous pouvez en créer [ici](https://my.voicepartner.fr/app/sous-comptes).


# Création d'un sous compte

Cette requête est utilisée pour créer un sous-compte.

## URL

<mark style="color:green;">`POST`</mark> `https://api.voicepartner.fr/v1/subaccount/create`

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

#### **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.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>type</code></td><td><p>Type de sous-compte : ce choix est définitif, il ne sera plus possible de le modifier</p><ul><li>simple:<br>– Le sous compte ne recevra aucun email ni SMS.<br>– Aucun numéros de téléphone demandé.<br>– L’achat n’est pas permis.</li><li>advanced :<br>– Un email valide est demandé.<br>– Le processus d’inscription est identique à celui d’un compte standard.<br>– Un numéro de téléphone mobile sera demandé à l’inscription.</li></ul></td></tr><tr><td><code>parameters</code></td><td><div data-gb-custom-block data-tag="tabs"><div data-gb-custom-block data-tag="tab" data-title="Sous-compte simple"><ul><li><code>email</code> (optionnel) : Si ce champ est vide, un email sera généré automatiquement (ex: 98755587@voicepartner.fr)</li><li><code>creditToAttribute</code> (optionnel) : Crédits en euro ajouté au sous-compte lors de la création. Ce crédit sera déduit du solde de votre compte principal.</li><li><code>title</code> (optionnel) : Nom du sous-compte</li><li><code>firstname</code> (optionnel) : Prénom du titulaire du sous-compte</li><li><code>lastname</code> (optionnel) : Nom du titulaire du sous-compte</li></ul></div><div data-gb-custom-block data-tag="tab" data-title="Sous-compte advanced"><ul><li><code>email</code> : Email valide du titulaire du compte</li><li><code>isBuyer</code> : <code>1</code> ou <code>0</code>, si isBuyer=1 alors le sous-compte pour acheter ses propres SMS</li><li><code>creditToAttribute</code> (optionnel) : Crédits en euro ajouté au sous-compte lors de la création. Ce crédit sera déduit du solde de votre compte principal.</li><li><code>title</code> (optionnel) : Nom du sous-compte</li><li><code>firstname</code> (optionnel) : Prénom du titulaire du sous-compte</li><li><code>lastname</code> (optionnel) : Nom du titulaire du sous-compte</li></ul></div></div></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',
            'type'=> 'advanced',
            'parameters'=>array(
                'email':'aaaa@bbb.ccc',
    	        'creditToAttribute':10,
    	        'isBuyer':0,
    	        'firstname':'prenom',
    	        'lastname':'nom'
            ));
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.voicepartner.fr/v1/subaccount/create');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/create"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""type"":""{1}"",""parameters"":""{2}""}}",
        apiKey,
        "advanced",
        {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"})
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def create(self,creditToAdd,userId):
 
		data = {"apiKey":APIKEY,"type":"advanced","parameters": {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}
 
 
		url = URL + "/subaccount/create"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","type":"advanced","parameters":{"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}' https://api.smspartner.fr/v1/subaccount/create
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Remplacez par votre clé API
const apiKey = "VOTRE_CLÉ_API";

// Préparer les données pour la requête POST
const data = JSON.stringify({
  apiKey: apiKey,
  type: "advanced",
  parameters: {
    email: "aaaa@bbb.ccc",
    creditToAttribute: 10,
    isBuyer: 0,
    firstname: "prenom",
    lastname: "nom",
  },
});

// Définir les options pour la requête HTTP POST vers l'API SMS Partner
const options = {
  hostname: "api.smspartner.fr",
  port: 443,
  path: "/v1/subaccount/create",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": data.length,
    "cache-control": "no-cache",
  },
};

// Effectuer la requête HTTP POST avec les options et données définies précédemment
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  // Afficher les données de réponse de l'API sur la sortie standard
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

// Afficher en cas d'erreur lors de l'exécution de la requête HTTP POST
req.on("error", (error) => {
  console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;


public class SubAccountCreation {
    public static void main(String[] args) {
        try {
            // Remplacez par votre clé API
            String apiKey = "VOTRE_CLÉ_API";

            // Préparer les données pour la requête POST
            JSONObject parameters = new JSONObject();
            parameters.put("email", "aaaa@bbb.ccc");
            parameters.put("creditToAttribute", 10);
            parameters.put("isBuyer", 0);
            parameters.put("firstname", "prenom");
            parameters.put("lastname", "nom");

            JSONObject json = new JSONObject();
            json.put("apiKey", apiKey);
            json.put("type", "advanced");
            json.put("parameters", parameters);

            URL url = new URL("https://api.smspartner.fr/v1/subaccount/create");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

            // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream();
            os.write(json.toString().getBytes());
            os.flush();

            // Lecture de la réponse de l'API
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());

            // Afficher la réponse JSON
            System.out.println(response);

            // Fermeture de la connexion HTTP
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

// Structure pour la vue "CreationSubCompte"
struct CreationSubCompte: View {
    var body: some View {
        // Un bouton qui appelle la fonction createSubaccount() lorsqu'il est pressé
        Button(action: {
            createSubaccount()
        }) {
            Text("Créer sous-compte")
                .font(.system(size: 20))
                .foregroundColor(.white)
                .frame(minWidth: 0, maxWidth: .infinity)
                .padding()
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                .cornerRadius(10)
                .padding(.horizontal)
        }
    }

    // Fonction pour créer un sous-compte
    func createSubaccount() {
        let url = URL(string: "https://api.smspartner.fr/v1/subaccount/create")! // URL pour créer un sous-compte

        // Paramètres pour la requête
        let parameters: [String: Any] = [
            "apiKey": "TU_CLAVE_API", // Votre clé API
            "type": "advanced",
            "parameters": [
                "email": "aaaa@bbb.ccc", // Adresse e-mail du sous-compte
                "creditToAttribute": 10, // Crédit à attribuer
                "isBuyer": 0, // Indique si le sous-compte est un acheteur
                "firstname": "prenom", // Prénom de l'utilisateur du sous-compte
                "lastname": "nom" // Nom de l'utilisateur du sous-compte
            ] as [String : Any]
        ]

        // Création de la requête
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("no-cache", forHTTPHeaderField: "cache-control")

        // Ajout du corps de la requête
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
        } catch let error {
            print(error.localizedDescription)
        }

        // Tâche pour envoyer la requête et recevoir la réponse
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            // Si une erreur survient, on l'affiche
            if let error = error {
                print("Erreur : \(error)")
            }
            // Sinon, on traite les données reçues
            else if let data = data {
                do {
                    // On tente de convertir les données reçues en JSON
                    if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                        print(json) // On affiche le JSON obtenu
                    }
                } catch let error {
                    print("Erreur : \(error)")
                }
            }
        }

        task.resume() // On lance la tâche
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type Fields struct {
	APIKey     string      `json:"apiKey"`
	Type       string      `json:"type"`
	Parameters Parameters `json:"parameters"`
}

type Parameters struct {
	Email            string `json:"email"`
	CreditToAttribute int    `json:"creditToAttribute"`
	IsBuyer          int    `json:"isBuyer"`
	Firstname        string `json:"firstname"`
	Lastname         string `json:"lastname"`
}

func main() {
	// Prepare data for POST request
	data := Fields{
		APIKey: "YOUR_API_KEY",
		Type:   "advanced",
		Parameters: Parameters{
			Email:            "aaaa@bbb.ccc",
			CreditToAttribute: 10,
			IsBuyer:          0,
			Firstname:        "prenom",
			Lastname:         "nom",
		},
	}

	payloadBuf := new(bytes.Buffer)
	json.NewEncoder(payloadBuf).Encode(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/create", payloadBuf)
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Add("Content-Type", "application/json")

	// Create HTTP client and send the request
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Print the response status and body
	log.Printf("Response status: %s", resp.Status)
	log.Printf("Response body: %s", string(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 fields = new
        {
            apiKey = "VOTRE_CLÉ_API",
            type = "advanced",
            parameters = new 
            {
                email = "aaaa@bbb.ccc",
                creditToAttribute = 10,
                isBuyer = 0,
                firstname = "prenom",
                lastname = "nom"
            }
        };

        var json = JsonConvert.SerializeObject(fields);

        var uri = new Uri("https://api.smspartner.fr/v1/subaccount/create");
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        HttpResponseMessage response = await client.PostAsync(uri, content);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("La requête POST a échoué avec le code d'état : " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
 "success":true,
 "code":200,
 "subaccount":
 {
    "email":"aaaa@bbb.ccc",
    "token":"token"
 },
 "sendConfirmMailTo":"aaaa@bbb.ccc",
 "parent_email":"emailparent@ddd.eee"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>
    <entry><![CDATA[aaaa@bbb.ccc]]></entry>
    <entry><![CDATA[token]]></entry>
  </entry>
  <entry><![CDATA[aaaa@bbb.ccc]]></entry>
  <entry><![CDATA[emailparent@ddd.eee]]></entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>3</td><td>isBuyer est requis</td></tr><tr><td>4</td><td>Le type est requis (simple ou advanced)</td></tr><tr><td>5</td><td>Le type de sous-compte n'existe pas (simple ou advanced)</td></tr><tr><td>6</td><td>L'email est requis</td></tr><tr><td>7</td><td>Un compte existe déjà avec cet email</td></tr><tr><td>8</td><td>creditToAttribute doit être supérieure à 0</td></tr><tr><td>9</td><td>La balance doit être supérieure à 0</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Supprimer un sous-compte

Cette requête est utilisée pour supprimer un sous-compte.

## URL

<mark style="color:red;">`DELETE`</mark> `https://api.voicepartner.fr/v1/subaccount/delete`

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

#### **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.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>token</code></td><td>Identifiant du sous-compte</td></tr></tbody></table>

#### Requêtes

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

```
curl --location --request DELETE 'http://api.voicepartner.fr/v1/subaccount/remove' \
--header 'Content-Type: application/json' \
--data-raw '{
   "apiKey": "YOUR_API_KEY",
   "token": "TOKEN SUBACCOUNT"}'
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
   "success": true,
   "code": 200
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le Token est requis</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr><tr><td>404</td><td>Le sous-compte n'existe pas</td></tr></tbody></table>


# Liste des sous-comptes

Cette requête est utilisée pour lister les sous-comptes de votre compte principal.

## URL

<mark style="color:red;">`GET`</mark> `https://api.voicepartner.fr/v1/subaccount/list`

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

#### **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.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>page</code></td><td>Le numéro de la page, il y a 20 résultats par page. Si ce paramètre est laissé vide la page 1 sera retourné.</td></tr></tbody></table>

#### **Paramètre optionnel**

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.voicepartner.fr/v1/subaccount/list?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "subaccount/list" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_list_subaccount(self):
		url = URL + "/subaccount/list?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/subaccount/list?apiKey=xxx&page=1
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Permets de récupérer la liste des sous-comptes
let data = 'apiKey=YOUR_API_KEY';
let url = 'https://api.smspartner.fr/v1/subaccount/list?' + data;

https.get(url, (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);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class RécupérationDesSousComptes {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/subaccount/list?" +
                    "apiKey=" + apiKey;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct ListeDesSousComptes: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Liste Des Sous Comptes")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: loadSubAccounts)
    }

    func loadSubAccounts() {
        let apiKey = "YOUR_API_KEY"
        let urlString = "https://api.smspartner.fr/v1/subaccount/list?apiKey=\(apiKey)"

        guard let url = URL(string: urlString) else {
            print("Invalid URL")
            return
        }

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print("Error: \(error)")
            } else if let data = data {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct ListeDesSousComptes_Previews: PreviewProvider {
    static var previews: some View {
        ListeDesSousComptes()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	apiKey := "YOUR_API_KEY"
	url := "https://api.smspartner.fr/v1/subaccount/list?apiKey=" + apiKey

	// Create GET request
	resp, err := http.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Print the response body
	log.Printf("Response body: %s", string(body))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        string apiKey = "YOUR_API_KEY";
        var uri = new Uri($"https://api.smspartner.fr/v1/subaccount/list?apiKey={apiKey}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "total": 29,
  "nb_per_page": 20,
  "page": 1,
  "data": [
    {
      "id": 1,
      "email": "email1",
      "type": "simple",
      "token": "token1", //Est utilisé comme identifiant du sous-compte pour ajouter des crédits
      "apiKey": "ApiKey sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "0.800",
          "currency": "EUR"
      }
    },
    {
      "id": 2,
      "email": "email2",
      "type": "simple",
      "token": "token2",
      "apiKey": "ApiKey2 du sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "10.245",
          "currency": "EUR"
      }
    }
  ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
    <entry>true</entry>
    <entry>200</entry>
    <entry>20</entry>
    <entry>1</entry>
    <entry>2</entry>
    <entry>
        <entry>
            <entry>1</entry>
            <entry>
                <![CDATA[email1]]>
            </entry>
            <entry>
                <![CDATA[2016-03-04 11:23:14]]>
            </entry>
            <entry>
                <entry>670</entry>
                <entry>
                    <![CDATA[4]]>
                </entry>
                <entry>666</entry>
 
            </entry>
 
        </entry>
        <entry>
            <entry>2</entry>
            <entry>
                <![CDATA[email2]]>
            </entry>
            <entry xsi:nil="true"/>
            <entry>
                <![CDATA[2016-03-05 09:14:47]]>
            </entry>
            <entry>
                <entry>110</entry>
                <entry>0</entry>
                <entry>110</entry>
 
            </entry>
 
        </entry>
 
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 1               | La Clé API est requise  |
| 10              | Clé API incorrecte      |
| 200             | Tout s'est bien passé ! |


# Gérer les crédits des sous-comptes

Cette requête est utilisée pour créer un sous-compte.

## Ajouter des crédits

{% hint style="info" %}
Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.voicepartner.fr/v1/subaccount/credit/add`

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

#### **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.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>credit</code></td><td>Nombre de crédit en Euro à ajouter au sous-compte</td></tr><tr><td><code>tokenSubaccount</code></td><td>Identifiant du sous compte</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',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.voicepartner.fr/v1/subaccount/credit/add');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/add"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/add"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.smspartner.fr/v1/subaccount/credit/add
```

{% endtab %}

{% tab title="Nodejs" %}

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

// permet d'ajouter des crédits à un sous-compte
//Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  credit: '100',
  tokenSubaccount: 'identifiant du sous-compte'
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/subaccount/credit/add',
  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("Error: " + 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 AjouterRetirerDesCredits {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "YOUR API KEY";
            int credit = 100;
            String tokenSubaccount = "identifiant du sous-compte";

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"credit\": " + credit + ", \"tokenSubaccount\": \"" + tokenSubaccount + "\"}";

            // Create POST request
            URL url = new URL("https://api.smspartner.fr/v1/subaccount/credit/add");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AjoutCreditSousCompte: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Ajout Credit Sous Compte")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: ajoutCreditSousCompte)
    }

    func ajoutCreditSousCompte() {
        let apiKey = "YOUR_API_KEY"
        let credit = "100"
        let tokenSubaccount = "identifiant du sous-compte"

        let urlString = "https://api.smspartner.fr/v1/subaccount/credit/add"
        let url = URL(string: urlString)!

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "credit": credit,
            "tokenSubaccount": tokenSubaccount
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct AjoutCreditSousCompte_Previews: PreviewProvider {
    static var previews: some View {
        AjoutCreditSousCompte()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type SubaccountData struct {
	APIKey         string `json:"apiKey"`
	Credit         string `json:"credit"`
	TokenSubaccount string `json:"tokenSubaccount"`
}

func main() {
	apiKey := "YOUR_API_KEY"
	credit := "100"
	tokenSubaccount := "identifiant du sous-compte"

	// Create POST request data
	data := SubaccountData{
		APIKey:         apiKey,
		Credit:         credit,
		TokenSubaccount: tokenSubaccount,
	}
	jsonData, _ := json.Marshal(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/credit/add", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Set("Content-Type", "application/json")

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

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

	// Print the response body
	log.Printf("Response body: %s", string(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 data = new
        {
            apiKey = "YOUR API KEY",
            credit = "100",
            tokenSubaccount = "Subaccount ID"
        };

        string jsonString = JsonConvert.SerializeObject(data);

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/subaccount/credit/add", content);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le crédit est requis</td></tr><tr><td>3</td><td>L'identifiant du sous-compte est requis</td></tr><tr><td>4</td><td>Vous n'avez pas l'autorisation</td></tr><tr><td>5</td><td>Le crédit à attribuer doit être supérieur à 0</td></tr><tr><td>6</td><td>La balance doit être supérieur à 0</td></tr><tr><td>7</td><td>Le sous-compte n'existe pas</td></tr><tr><td>8</td><td>Crédit insufisant</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>

## Supprimer des crédits

{% hint style="info" %}
Depuis votre compte, il vous est possible de supprimer des crédits de vos sous comptes. Les crédits seront ajoutés à votre compte principal.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.voicepartner.fr/v1/subaccount/credit/remove`

#### **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">Votre clé API</a></td></tr><tr><td><code>credit</code></td><td>Nombre de crédit en Euro à supprimer du sous-compte</td></tr><tr><td><code>tokenSubaccount</code></td><td>Identifiant du sous compte</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.voicepartner.fr/v1/subaccount/credit/remove');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/remove"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/remove"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.smspartner.fr/v1/subaccount/credit/remove
```

{% endtab %}

{% tab title="Nodejs" %}

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

// permet d'ajouter des crédits à un sous-compte
//Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  credit: '100',
  tokenSubaccount: 'identifiant du sous-compte'
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/subaccount/credit/remove',
  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("Error: " + 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 AjouterRetirerDesCredits {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "YOUR API KEY";
            int credit = 100;
            String tokenSubaccount = "identifiant du sous-compte";

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"credit\": " + credit + ", \"tokenSubaccount\": \"" + tokenSubaccount + "\"}";

            // Create POST request
            URL url = new URL("https://api.smspartner.fr/v1/subaccount/credit/remove");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AjoutCreditSousCompte: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Ajout Credit Sous Compte")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: ajoutCreditSousCompte)
    }

    func ajoutCreditSousCompte() {
        let apiKey = "YOUR_API_KEY"
        let credit = "100"
        let tokenSubaccount = "identifiant du sous-compte"

        let urlString = "https://api.smspartner.fr/v1/subaccount/credit/remove"
        let url = URL(string: urlString)!

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "credit": credit,
            "tokenSubaccount": tokenSubaccount
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct AjoutCreditSousCompte_Previews: PreviewProvider {
    static var previews: some View {
        AjoutCreditSousCompte()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type SubaccountData struct {
	APIKey         string `json:"apiKey"`
	Credit         string `json:"credit"`
	TokenSubaccount string `json:"tokenSubaccount"`
}

func main() {
	apiKey := "YOUR_API_KEY"
	credit := "100"
	tokenSubaccount := "identifiant du sous-compte"

	// Create POST request data
	data := SubaccountData{
		APIKey:         apiKey,
		Credit:         credit,
		TokenSubaccount: tokenSubaccount,
	}
	jsonData, _ := json.Marshal(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/credit/remove", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Set("Content-Type", "application/json")

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

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

	// Print the response body
	log.Printf("Response body: %s", string(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 data = new
        {
            apiKey = "YOUR API KEY",
            credit = "100",
            tokenSubaccount = "Subaccount ID"
        };

        string jsonString = JsonConvert.SerializeObject(data);

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/subaccount/credit/remove", content);

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

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le crédit est requis</td></tr><tr><td>3</td><td>L'identifiant du sous-compte est requis</td></tr><tr><td>4</td><td>Vous n'avez pas l'autorisation</td></tr><tr><td>5</td><td>Le crédit à attribuer doit être supérieur à 0</td></tr><tr><td>6</td><td>La balance doit être supérieur à 0</td></tr><tr><td>7</td><td>Le sous-compte n'existe pas</td></tr><tr><td>8</td><td>Crédit insufisant</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Message Vocal

Gérer vos messages vocaux

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Liste des fichiers audio</strong></td><td>Récupérer la liste des fichiers audios ajoutés et validés</td><td></td></tr><tr><td><strong>Renommer un fichier audio</strong></td><td>Renommer un fichier audio déjà existant</td><td></td></tr><tr><td><strong>Déposer un message vocal (VMS)</strong></td><td>Déposer un message vocal sur répondeur</td><td></td></tr><tr><td><strong>Supprimer un envoi différé</strong></td><td>Supprimer un envoi programmé</td><td></td></tr></tbody></table>


# Liste des fichiers audio

Récupéré la liste des fichiers audios ajoutés et validés

## URL

<mark style="color:red;">`GET`</mark> `https://api.voicepartner.fr/v1/audios`

{% hint style="warning" %}
Limite de 360 requêtes par minute. Si vous dépassez ces limites vous recevrez une réponse HTTP 429.
{% 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.voicepartner.fr/app/api">Votre clé API</a></td></tr></tbody></table>

#### Requêtes

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

```php
<?php

// L'URL de l'API où vous voulez envoyer la requête
$url = 'http://api.voicepartner.fr/v1/audios/YOUR_API_KEY';

// Initialisation de cURL
$curl = curl_init($url);

// Configuration des options de cURL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
    'Cache-Control: no-cache'
]);

// Exécution de la requête cURL et enregistrement de la réponse
$response = curl_exec($curl);

// Vérification s'il y a eu des erreurs pendant l'exécution de la requête
if ($response === false) {
    // Gérer l'erreur ici
    $error = curl_error($curl);
    curl_close($curl);
    die("Erreur cURL: $error");
}

// Fermeture de la session cURL
curl_close($curl);

// Affichage de la réponse
echo $response;
```

{% endtab %}

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

```vbnet
﻿Imports System.Net.Http

Public Class ListeFichierAudio
    Public Async Function GetAudios(client As HttpClient, apiKey As String) As Task
        Dim url As String = $"audios/{apiKey}"

        Try
            Dim response As HttpResponseMessage = Await client.GetAsync(url)
            If response.IsSuccessStatusCode Then
                Dim responseString As String = Await response.Content.ReadAsStringAsync()
                Console.WriteLine("Audios: " & responseString)
            Else
                Console.WriteLine("Error: " & response.ReasonPhrase)
            End If
        Catch ex As Exception
            Console.WriteLine("Exception: " & ex.Message)
        End Try
    End Function
End Class
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

# L'URL de l'API où vous voulez envoyer la requête
url = 'http://api.voicepartner.fr/v1/audios/YOUR_API_KEY'

# Configuration des en-têtes HTTP
headers = {
    'Cache-Control': 'no-cache'
}

# Exécution de la requête GET et enregistrement de la réponse
response = requests.get(url, headers=headers)

# Vérification du statut de la réponse
if response.status_code == 200:
    # Affichage de la réponse
    print(response.text)
else:
    # Gérer l'erreur ici
    print(f"Erreur lors de la requête: {response.status_code}")
```

{% endtab %}

{% tab title="cURL" %}

```
curl http://api.voicepartner.fr/v1/audios/YOUR_API_KEY
```

{% endtab %}

{% tab title="Nodejs" %}

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

// L'URL de l'API où vous voulez envoyer la requête
const url = 'http://api.voicepartner.fr/v1/audios/YOUR_API_KEY';

axios.get(url)
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error('Erreur lors de la requête:', error);
    });
```

{% endtab %}

{% tab title="JAVA" %}

```java
package com.example.API;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;

public class ListeFichierAudio {
    public static void main(String[] args) {
        // Replace 'YOUR_API_KEY' with your actual API key
        String url = "http://api.voicepartner.fr/v1/audios/YOUR_API_KEY";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        client.sendAsync(request, BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .exceptionally(e -> {
                    System.out.println("Erreur lors de la requête: " + e.getMessage());
                    return null;
                })
                .join();
    }
}
```

{% endtab %}

{% tab title="GO" %}

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	url := "http://api.voicepartner.fr/v1/audios/YOUR_API_KEY"

	response, err := http.Get(url)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	defer response.Body.Close()

	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}

	fmt.Printf("Response: %s\n", string(body))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace API.ApiClients
{
    public class ListeFichierAudio
    {
        public static async Task Main()
        {
            var url = "http://api.voicepartner.fr/v1/audios/YOUR_API_KEY";

            using (var client = new HttpClient())
            {
                try
                {
                    var response = await client.GetAsync(url);
                    var content = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Response: " + content);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: " + ex.Message);
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "nb_datas": 58,
    "datas": [
        {
            "name": "filename1",
            "token": "token1",
            "size": "104.5Ko",
            "duration": "0:07",
            "created_at": {
                "date": "2018-04-16 13:26:46.000000",
                "timezone_type": 3,
                "timezone": "Europe/Paris"
            }
        },
        {
            "name": "filename2",
            "token": "token2",
            "size": "762.7Ko",
            "duration": "0:49",
            "created_at": {
                "date": "2018-06-04 07:26:04.000000",
                "timezone_type": 3,
                "timezone": "Europe/Paris"
            }
        },...
    ]
}
```

{% endtab %}
{% endtabs %}


# Renommer un fichier audio

Renommer un fichier audio déjà existant

## URL

<mark style="color:green;">`POST`</mark> `https://api.voicepartner.fr/v1/audio-file/rename`

{% hint style="warning" %}
Limite : 5 requêtes par minute
{% endhint %}

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

<table data-full-width="false"><thead><tr><th width="232">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>tokenAudio</code></td><td>Identifiant du fichier audio</td></tr><tr><td><code>emailForNotification</code></td><td>La notification de fin de campagne sera envoyé vers cette adresse email</td></tr><tr><td><code>phoneNumbers</code></td><td><p>Numéros de téléphone mobile des destinataires.<br>Pour l’envoi de plusieurs SMS les numéros doivent être séparés par des virgules.<br>Ils peuvent être :</p><ul><li>au format national (06xxxxxxxx) ou international (+336xxxxxxxx), pour des numéros français.</li></ul></td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>sender</code></td><td>Numéro de téléphone portable qui peut être rappelé. Ce numéro doit être validé au préalable sur la plateforme <a href="https://my.voicepartner.fr">my.voicepartner.fr</a>.</td></tr><tr><td><code>scheduledDate</code></td><td>Date d’envoi du message, au format <code>YYYY-mm-dd H:m:00</code> (ex: <code>2021-02-02 14:15:00</code>). A définir uniquement si vous souhaitez que les dépôts soient envoyés en différé.</td></tr><tr><td><code>notifyUrl</code></td><td>Url de retour du statut de la campagne envoyé en GET</td></tr></tbody></table>

#### Requêtes

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

```php
<?php

// L'URL de l'API où vous voulez envoyer la requête
$url = 'https://api.voicepartner.fr/v1/audio-file/rename';

// Les données que vous souhaitez envoyer en JSON
$data = array(
    'apiKey' => 'YOUR_API_KEY',
    'tokenAudio' => 'TOKEN_DU_FICHIER_AUDIO',
    'filename' => 'Nom du fichier'
);

// Encodage des données en JSON
$data_json = json_encode($data);

// Initialisation de cURL
$curl = curl_init($url);

// Configuration des options de cURL pour envoyer du JSON
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data_json)
));

// Exécution de la requête cURL et enregistrement de la réponse
$response = curl_exec($curl);

// Fermeture de la session cURL
curl_close($curl);

// Affichage de la réponse
echo $response;
```

{% endtab %}

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

```vbnet
Imports System.Net.Http
Imports System.Text
Imports Newtonsoft.Json

Public Class RenommerFichierAudio
    Private ReadOnly _url As String = "https://api.voicepartner.fr/v1/audio-file/rename"
    Private ReadOnly _apiKey As String = "YOUR_API_KEY"
    Private ReadOnly _tokenAudio As String = "YOUR_TOKEN_AUDIO"
    Private ReadOnly _filename As String = "YOUR_FILE_NAME"

    Public Async Function RenameAudioFile() As Task
        Dim httpClient As New HttpClient()

        Dim data As New With {
            .apiKey = _apiKey,
            .tokenAudio = _tokenAudio,
            .filename = _filename
        }

        Dim jsonContent As String = JsonConvert.SerializeObject(data)
        Using content As New StringContent(jsonContent, Encoding.UTF8, "application/json")
            Try
                Dim response As HttpResponseMessage = Await httpClient.PostAsync(_url, content)
                If response.IsSuccessStatusCode Then
                    Dim responseContent As String = Await response.Content.ReadAsStringAsync()
                    Console.WriteLine(responseContent)
                Else
                    Console.WriteLine("Error: " & response.StatusCode)
                End If
            Catch ex As Exception
                Console.WriteLine("Erreur lors de la requête: " & ex.Message)
            End Try
        End Using
    End Function

End Class
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

# L'URL de l'API où vous voulez envoyer la requête
url = 'https://api.voicepartner.fr/v1/audio-file/rename'

# Les données que vous souhaitez envoyer en JSON
data = {
    'apiKey': 'YOUR_API_KEY',
    'tokenAudio': 'TOKEN_DU_FICHIER_AUDIO',
    'filename': 'Nom du fichier'
}

# Encodage des données en JSON
data_json = json.dumps(data)

# Envoi de la requête POST avec les données JSON
headers = {
    'Content-Type': 'application/json'
}
response = requests.post(url, data=data_json, headers=headers)

# Affichage de la réponse
print(response.text)
```

{% endtab %}

{% tab title="cURL" %}

```
curl -Method Post -Uri "https://api.voicepartner.fr/v1/audio-file/rename" -Headers @{"Content-Type"="application/json"} -Body '{"apiKey": "YOUR_API_KEY", "tokenAudio": "TOKEN_DU_FICHIER_AUDIO", "filename": "Nom du fichier"}'
```

{% endtab %}

{% tab title="Nodejs" %}

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

// L'URL de l'API pour renommer un fichier audio
const url = 'https://api.voicepartner.fr/v1/audio-file/rename';

// Les données à envoyer en JSON
const data = {
    apiKey: 'YOUR_API_KEY',
    tokenAudio: 'TOKEN_DU_FICHIER_AUDIO',
    filename: 'Nom du fichier'
};

axios.post(url, data)
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error('Erreur lors de la requête:', error);
    });
```

{% endtab %}

{% tab title="JAVA" %}

```java
package com.example.API;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;

public class RenommerFichierAudio {

    public static void main(String[] args) {
        // L'URL de l'API pour renommer un fichier audio
        String url = "https://api.voicepartner.fr/v1/audio-file/rename";

        // Vos données d'authentification et les informations du fichier
        String apiKey = "VOTRE_CLE_API";
        String tokenAudio = "VOTRE_TOKEN_AUDIO";
        String nouveauNom = "NouveauNomFichier";

        // Les données à envoyer en JSON
        String json = String.format(
                "{\"apiKey\":\"%s\",\"tokenAudio\":\"%s\",\"filename\":\"%s\"}",
                apiKey, tokenAudio, nouveauNom);

        // Créer une instance de HttpClient
        HttpClient client = HttpClient.newHttpClient();

        // Construire la requête
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Content-Type", "application/json")
                .POST(BodyPublishers.ofString(json))
                .build();

        // Envoyer la requête de manière asynchrone
        client.sendAsync(request, BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .exceptionally(e -> {
                    System.out.println("Erreur lors de la requête: " + e.getMessage());
                    return null;
                })
                .join(); // Attendre la fin de l'opération asynchrone
    }
}
```

{% endtab %}

{% tab title="GO" %}

```go
package main

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

type RenameData struct {
	ApiKey     string `json:"apiKey"`
	TokenAudio string `json:"tokenAudio"`
	Filename   string `json:"filename"`
}

func main() {
	url := "https://api.voicepartner.fr/v1/audio-file/rename"
	data := RenameData{
		ApiKey:     "YOUR_API_KEY",
		TokenAudio: "TOKEN_DU_FICHIER_AUDIO",
		Filename:   "Nom du fichier",
	}

	payloadBytes, err := json.Marshal(data)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	body := bytes.NewReader(payloadBytes)

	req, err := http.NewRequest("POST", url, body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	defer resp.Body.Close()

	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}

	fmt.Printf("Response: %s\n", string(respBody))
}
```

{% endtab %}

{% tab title="C#" %}

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

namespace API.ApiClients
{
    public class RenommerFichierAudio
    {
        public static async Task Main()
        {
            var url = "https://api.voicepartner.fr/v1/audio-file/rename";
            var data = new
            {
                apiKey = "YOUR_API_KEY",
                tokenAudio = "TOKEN_DU_FICHIER_AUDIO",
                filename = "Nom du fichier"
            };

            using (var client = new HttpClient())
            {
                try
                {
                    var json = JsonConvert.SerializeObject(data);
                    var content = new StringContent(json, Encoding.UTF8, "application/json");
                    var response = await client.PostAsync(url, content);
                    var responseContent = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Response: " + responseContent);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: " + ex.Message);
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "filename": "NOM DU FICHIER",
    "tokenAudio": "TOKEN DU FICHIER AUDIO"
}
```

{% endtab %}
{% endtabs %}


# Déposer un message vocal

Le dépôt d’un message vocal (VMS) est disponible sur l’API. Le dépôt fonctionne sur les fixes et sur les mobiles. Il est important de noter que le fonctionnement est différent.

{% hint style="info" %}
Pour rappel, sur un numéro mobile le message est directement déposé sur le répondeur alors que sur un numéro fixe, le téléphone sonne et le message est déposé uniquement si le destinataire ne répond pas.
{% endhint %}

## URL

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

{% hint style="warning" %}
Limite : 5 requêtes par minute et 500 numéros max par requête
{% endhint %}

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

<table data-full-width="false"><thead><tr><th width="232">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>tokenAudio</code></td><td>Identifiant du fichier audio</td></tr><tr><td><code>emailForNotification</code></td><td>La notification de fin de campagne sera envoyé vers cette adresse email</td></tr><tr><td><code>phoneNumbers</code></td><td><p>Numéros de téléphone mobile des destinataires.<br>Pour l’envoi de plusieurs SMS les numéros doivent être séparés par des virgules.<br>Ils peuvent être :</p><ul><li>au format national (06xxxxxxxx) ou international (+336xxxxxxxx), pour des numéros français.</li></ul></td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>sender</code></td><td>Numéro de téléphone portable qui peut être rappelé. Ce numéro doit être validé au préalable sur la plateforme <a href="https://my.voicepartner.fr">my.voicepartner.fr</a>.</td></tr><tr><td><code>scheduledDate</code></td><td>Date d’envoi du message, au format <code>YYYY-mm-dd H:m:00</code> (ex: <code>2021-02-02 14:15:00</code>). A définir uniquement si vous souhaitez que les dépôts soient envoyés en différé.</td></tr><tr><td><code>notifyUrl</code></td><td>Url de retour du statut de la campagne envoyé en GET</td></tr></tbody></table>

#### Requêtes

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

```php
<?php

// URL de l'API à laquelle effectuer la requête POST
$url = 'https://api.voicepartner.fr/v1/campaign/send';

// Les données à envoyer en JSON
$data = [
    'apiKey'            => 'YOUR_API_KEY', // Remplacez par votre clé API réelle
    'tokenAudio'        => 'TOKEN_AUDIO',  // Remplacez par le token audio réel
    'emailForNotification' => 'email@example.com', // Remplacez par l'email de notification souhaité
    'phoneNumbers'      => '06xxxxxxxx',   // Remplacez par le(s) numéro(s) de téléphone réel(s), séparés par des virgules si besoin
    // Ajoutez les autres paramètres optionnels si nécessaire
    // 'sender'         => 'VotreNuméro', // Optionnel
    // 'scheduledDate'  => 'YYYY-mm-dd H:i:s', // Optionnel
    // 'notifyUrl'      => 'https://your.notify.url', // Optionnel
];

// Encodage des données en JSON
$data_json = json_encode($data);

// Initialisation de cURL
$curl = curl_init($url);

// Configuration des options de cURL pour envoyer du JSON
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Cache-Control: no-cache'
));

// Exécution de la requête cURL et enregistrement de la réponse
$response = curl_exec($curl);

// Vérification s'il y a eu des erreurs pendant l'exécution de la requête
if (curl_errno($curl)) {
    echo 'Erreur cURL : ' . curl_error($curl);
} else {
    // Affichage de la réponse
    echo 'Réponse : ' . $response;
}

// Fermeture de la session cURL
curl_close($curl);
```

{% endtab %}

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

```vbnet
Imports System.Net.Http
Imports System.Threading.Tasks
Imports Newtonsoft.Json

Public Class DeposerMessageVocal
    Private Const ApiUrl As String = "https://api.voicepartner.fr/v1/campaign/send"
    Private Const ApiKey As String = "YOUR_API_KEY"
    Private Const TokenAudio As String = "YOUR_TOKEN_AUDIO"
    Private Const EmailForNotification As String = "your@mail.com"
    Private Const PhoneNumbers As String = "06XXXXXXXX"

    Public Shared Async Function SendCampaignAsync() As Task
        Using client As New HttpClient()
            Dim payload = New With {
                .apiKey = ApiKey,
                .tokenAudio = TokenAudio,
                .emailForNotification = EmailForNotification,
                .phoneNumbers = PhoneNumbers
            }
            Dim content = New StringContent(JsonConvert.SerializeObject(payload), Text.Encoding.UTF8, "application/json")

            Try
                Dim response = Await client.PostAsync(ApiUrl, content)
                If response.IsSuccessStatusCode Then
                    Dim responseContent = Await response.Content.ReadAsStringAsync()
                    ' Handle success
                    Console.WriteLine(responseContent)
                Else
                    ' Handle failure
                    Console.WriteLine($"Error: {response.StatusCode}")
                End If
            Catch ex As Exception
                ' Handle error
                Console.WriteLine($"Exception: {ex.Message}")
            End Try
        End Using
    End Function
End Class
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

# URL de l'API à laquelle effectuer la requête POST
url = 'https://api.voicepartner.fr/v1/campaign/send'

# Les données à envoyer en JSON
data = {
    'apiKey': 'YOUR_API_KEY',  # Remplacez par votre clé API réelle
    'tokenAudio': 'TOKEN_AUDIO',  # Remplacez par le token audio réel
    'emailForNotification': 'email@example.com',  # Remplacez par l'email de notification souhaité
    'phoneNumbers': '06xxxxxxxx',  # Remplacez par le(s) numéro(s) de téléphone réel(s)
    # Ajoutez les autres paramètres optionnels si nécessaire
    # 'sender': 'VotreNuméro',  # Optionnel
    # 'scheduledDate': 'YYYY-mm-dd H:i:s',  # Optionnel
    # 'notifyUrl': 'https://your.notify.url',  # Optionnel
}

# Configuration des en-têtes HTTP
headers = {
    'Content-Type': 'application/json',
    'Cache-Control': 'no-cache'
}

# Exécution de la requête POST avec les données JSON
response = requests.post(url, json=data, headers=headers)

# Vérification s'il y a eu des erreurs pendant l'exécution de la requête
if response.status_code != 200:
    print(f'Erreur cURL : {response.status_code}')
else:
    # Affichage de la réponse
    print(f'Réponse : {response.text}')
```

{% endtab %}

{% tab title="cURL" %}

```
curl -X POST 'https://api.voicepartner.fr/v1/campaign/send' \
     -H 'Content-Type: application/json' \
     -d '{
          "apiKey": "YOUR_API_KEY",
          "tokenAudio": "TOKEN_AUDIO",
          "emailForNotification": "email@example.com",
          "phoneNumbers": "06xxxxxxxx"
          // ... autres paramètres si nécessaire
         }'
```

{% endtab %}

{% tab title="Nodejs" %}

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

// URL de l'API à laquelle effectuer la requête POST
const url = 'https://api.voicepartner.fr/v1/campaign/send';

// Les données à envoyer en JSON
const data = {
    apiKey: 'YOUR_API_KEY',
    tokenAudio: 'TOKEN_AUDIO',
    emailForNotification: 'email@example.com',
    phoneNumbers: '06xxxxxxxx'
    // ... autres paramètres si nécessaire
};

axios.post(url, data)
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error('Erreur lors de la requête:', error);
    });
```

{% endtab %}

{% tab title="JAVA" %}

```java
package com.example.API;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.concurrent.CompletableFuture;

public class DeposerMessageVocal {

    public static void main(String[] args) {
        String url = "https://api.voicepartner.fr/v1/campaign/send";
        String json = """
                {
                    "apiKey": "YOUR_API_KEY",
                    "tokenAudio": "tokenAudio",
                    "emailForNotification": "email@example.com",
                    "phoneNumbers": "06XXXXXXXX"
                     // ... autres paramètres si nécessaire
                }
                """;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Content-Type", "application/json")
                .POST(BodyPublishers.ofString(json))
                .build();

        CompletableFuture future = client.sendAsync(request, BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .exceptionally(e -> {
                    System.out.println("Erreur lors de la requête: " + e.getMessage());
                    return null;
                });

        // Utiliser CompletableFuture.allOf pour attendre la fin de toutes les futures.
        CompletableFuture.allOf(future).join();
    }
}
```

{% endtab %}

{% tab title="GO" %}

```go
package main

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

type Message struct {
	ApiKey               string  `json:"apiKey"`
	TokenAudio           string  `json:"tokenAudio"`
	EmailForNotification string  `json:"emailForNotification"`
	PhoneNumbers         string  `json:"phoneNumbers"`
	ScheduledDate        *string `json:"scheduledDate,omitempty"` // Optional, use pointer to omit if nil
	Sender               *string `json:"sender,omitempty"`        // Optional, use pointer to omit if nil
	NotifyUrl            *string `json:"notifyUrl,omitempty"`     // Optional, use pointer to omit if nil
	// Additional fields can be added here
}

func main() {
	url := "https://api.voicepartner.fr/v1/campaign/send"
	//scheduledDate := "2024-04-12 14:30:00"       // Example Date and Time
	//sender := "VotreNumero"                      // Example sender number
	//notifyUrl := "https://yourdomain.com/notify" // Example notification URL

	data := Message{
		ApiKey:               "YOUR_API_KEY",
		TokenAudio:           "TOKEN_AUDIO",
		EmailForNotification: "email@exemple.com",
		PhoneNumbers:         "06xxxxxxxx",
		//ScheduledDate:        &scheduledDate, // Uncomment to use
		//Sender:               &sender,        // Uncomment to use
		//NotifyUrl:            &notifyUrl,     // Uncomment to use
	}

	payloadBytes, err := json.Marshal(data)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	body := bytes.NewReader(payloadBytes)

	req, err := http.NewRequest("POST", url, body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	defer resp.Body.Close()

	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}

	fmt.Printf("Response: %s\n", string(respBody))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using Newtonsoft.Json;
using System.Text;

public class DeposerMessageVocal
{
    public static async Task Main()
    {
        var url = "https://api.voicepartner.fr/v1/campaign/send";

        // Définissez la date et l'heure manuellement ici
        //var scheduledDate = "2024-04-12 14:30:00"; // Format 'yyyy-MM-dd HH:mm:ss'
        //var sender = "VotreNumero"; // Remplacez par votre numéro de téléphone validé
        //var notifyUrl = "https://yourdomain.com/notify"; // Votre URL de notification

        var data = new
        {
            apiKey = "YOUR_API_KEY",
            tokenAudio = "TOKEN_AUDIO",
            emailForNotification = "email@example.com",
            phoneNumbers = "06xxxxxxxx",
            // Ajoutez d'autres paramètres optionnels si nécessaire
            //scheduledDate,
            //sender, // Numéro de téléphone portable qui peut être rappelé
            //notifyUrl // URL de retour du statut de la campagne envoyée en GET
        };

        using (var client = new HttpClient())
        {
            try
            {
                var json = JsonConvert.SerializeObject(data);
                var content = new StringContent(json, Encoding.UTF8, "application/json");
                var response = await client.PostAsync(url, content);
                var responseContent = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Response: " + responseContent);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "campaignId": "campaignId",
    "cost": 0.15,
    "currency": "EUR",
    "nbSms": 1,
    "audioFile": {
        "filename": "filename.wav",
        "size": "135.8Ko"
    },
    "detail": {
        "33": {
            "nbSms": 1,
            "cost_unity": 0.15,
            "cost": 0.15
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Envoyer un SMS Vocal

Cette requête est utilisée pour envoyer un SMS Vocal sur mobile

## URL

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

{% hint style="warning" %}
Limite : 2000 requêtes par heure
{% endhint %}

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

<table data-full-width="false"><thead><tr><th width="232">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>text</code></td><td>Texte du message vocal. <a href="#pause-entre-les-mots">Une pause entre les mots est possible</a>.</td></tr><tr><td><code>tokenAudio</code></td><td>Identifiant du fichier audio, le paramètre "text" ne sera pas pris en compte</td></tr><tr><td><code>lang</code></td><td>La langue dans laquelle le message est envoyé</td></tr><tr><td><code>phoneNumbers</code></td><td><p>Numéros de téléphone mobile des destinataires.<br>Pour l’envoi de plusieurs SMS les numéros doivent être séparés par des virgules.<br>Ils peuvent être :</p><ul><li>au format national (06xxxxxxxx) ou international (+336xxxxxxxx), pour des numéros français.</li></ul></td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>speechRate</code></td><td>La vitesse de reproduction de la parole dans le message. Efficace uniquement lorsque vous utilisez du texte. La plage prise en charge va de 0.5 (parole ralentie) à 2 (accélération de la parole). Les valeurs inférieures à 0.5 seront remplacées par 0.5 et les valeurs supérieures à 2 seront remplacées par 2. La vitesse par défaut est 1.</td></tr><tr><td><code>notifyUrl</code></td><td>Url de retour du statut du SMS vocal envoyé en POST au format JSON</td></tr><tr><td><code>scheduledDate</code></td><td>Date d’envoi du message, au format <code>YYYY-mm-dd H:m:00</code> (ex: <code>2021-02-02 14:15:00</code>). A définir uniquement si vous souhaitez que les SMS soient envoyés en différé.</td></tr><tr><td><code>audioComplementary</code></td><td>Identifiant du fichier audio qui sera déposé si le destinataire ne décroche pas.</td></tr></tbody></table>

#### Pause entre les mots

{% hint style="info" %}
Il est possible d’ajouter des pauses entre les mots et d’allonger la durée du message vocal en utilisant la virgule «,».\
Par exemple, si vous souhaitez avoir une pause de 3 secondes après chaque mot, le paramètre text devrait alors ressembler à ceci: «un ,,,,,, deux ,,,,,, trois ,,,,,,». Chaque virgule crée une **pause de 0,5 seconde**.
{% endhint %}

#### Requêtes

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

```php
<?php

// Activer l'affichage des erreurs pour le débogage
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// L'URL de l'API pour envoyer le message vocal
$url = 'http://api.voicepartner.fr/v1/tts/send';

// Les données à envoyer en JSON
$data = [
    'apiKey' => 'YOUR_API_KEY',         // Remplacez par votre clé API réelle
    'phoneNumbers' => '06XXXXXXXX',     // Remplacez par le(s) numéro(s) de téléphone réel(s)
    'text' => 'Mon premier test',       // Remplacez par le texte que vous souhaitez convertir en parole
    // 'speed' => '1',                  // Optionnel: Vitesse de la parole
    // 'notifyUrl' => 'http://...',     // Optionnel: URL de notification
    // 'scheduledDate' => 'YYYY-mm-dd H:i:00', // Optionnel: Date prévue pour l'envoi
];

// Encodage des données en JSON
$data_json = json_encode($data);

// Initialisation de cURL
$curl = curl_init($url);

// Configuration des options de cURL pour envoyer du JSON
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Cache-Control: no-cache'
));

// Exécution de la requête cURL et enregistrement de la réponse
$response = curl_exec($curl);

// Vérification s'il y a eu des erreurs pendant l'exécution de la requête
if (curl_errno($curl)) {
    echo 'Erreur cURL : ' . curl_error($curl);
} else {
    // Affichage de la réponse
    echo 'Réponse : ' . $response;
}

// Fermeture de la session cURL
curl_close($curl);
```

{% endtab %}

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

```vbnet
Imports System.Net.Http
Imports System.Threading.Tasks
Imports Newtonsoft.Json
Imports System.Text

Public Class EnvoyerSmsVocal
    Private Const Url As String = "http://api.voicepartner.fr/v1/tts/send"

    Public Shared Async Function SendSmsVocalAsync() As Task
        Using client As New HttpClient()
            ' Remplacez ces valeurs par les vôtres
            Dim apiKey As String = "YOUR_API_KEY"
            Dim phoneNumbers As String = "06XXXXXXXX"
            Dim text As String = "Mon premier test"
            ' ... autres paramètres si nécessaire

            Dim data = New With {
                .apiKey = apiKey,
                .phoneNumbers = phoneNumbers,
                .text = text
            }

            Dim jsonContent = JsonConvert.SerializeObject(data)
            Using content As New StringContent(jsonContent, Encoding.UTF8, "application/json")
                Try
                    Dim response = Await client.PostAsync(Url, content)
                    Dim responseContent = Await response.Content.ReadAsStringAsync()

                    If response.IsSuccessStatusCode Then
                        Console.WriteLine(responseContent)
                    Else
                        Console.WriteLine($"Erreur lors de la requête: {response.StatusCode}")
                        Console.WriteLine($"Contenu: {responseContent}")
                    End If
                Catch ex As Exception
                    Console.WriteLine($"Exception: {ex.Message}")
                End Try
            End Using
        End Using
    End Function
End Class
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import json

# Activer l'affichage des erreurs pour le débogage
# En Python, les erreurs sont affichées par défaut lorsqu'elles se produisent.

# L'URL de l'API pour envoyer le message vocal
url = 'http://api.voicepartner.fr/v1/tts/send'

# Les données à envoyer en JSON
data = {
    'apiKey': 'YOUR_API_KEY',  # Remplacez par votre clé API réelle
    'phoneNumbers': '06XXXXXXXX',  # Remplacez par le(s) numéro(s) de téléphone réel(s)
    'text': 'Mon premier test',  # Remplacez par le texte que vous souhaitez convertir en parole
    # 'speed': '1',  # Optionnel: Vitesse de la parole
    # 'notifyUrl': 'http://...',  # Optionnel: URL de notification
    # 'scheduledDate': 'YYYY-mm-dd H:i:00',  # Optionnel: Date prévue pour l'envoi
}

# Encodage des données en JSON
data_json = json.dumps(data)

# Configuration des en-têtes HTTP
headers = {
    'Content-Type': 'application/json',
    'Cache-Control': 'no-cache'
}

# Exécution de la requête POST avec les données JSON
response = requests.post(url, data=data_json, headers=headers)

# Vérification s'il y a eu des erreurs pendant l'exécution de la requête
if response.status_code != 200:
    print(f'Erreur cURL : {response.status_code}')
else:
    # Affichage de la réponse
    print(f'Réponse : {response.text}')
```

{% endtab %}

{% tab title="cURL" %}

```
curl -X POST 'http://api.voicepartner.fr/v1/tts/send' \
     -H 'Content-Type: application/json' \
     -H 'Cache-Control: no-cache' \
     -d '{
          "apiKey": "YOUR_API_KEY",
          "phoneNumbers": "06XXXXXXXX",
          "text": "Mon premier test"
          // "speed": "1", // Optionnel
          // "notifyUrl": "http://...", // Optionnel
          // "scheduledDate": "YYYY-mm-dd H:i:00" // Optionnel
         }'
```

{% endtab %}

{% tab title="Nodejs" %}

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

// L'URL de l'API pour envoyer le message vocal
const url = 'http://api.voicepartner.fr/v1/tts/send';

// Les données à envoyer en JSON
const data = {
    apiKey: 'YOUR_API_KEY',
    phoneNumbers: '06XXXXXXXX',
    text: 'Mon premier test'
    // ... autres paramètres si nécessaire
};

axios.post(url, data)
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error('Erreur lors de la requête:', error);
    });
```

{% endtab %}

{% tab title="JAVA" %}

```java
package com.example.API;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;

public class EnvoyerSmsVocal {
    public static void main(String[] args) {
        // L'URL de l'API
        String apiUrl = "https://api.voicepartner.fr/v1/tts/send";

        // Les données à envoyer en JSON
        String json = """
                {
                    "apiKey": "YOUR_API_KEY",
                    "phoneNumbers": "06XXXXXXXX",
                    "text": "Mon premier test",
                    "speechRate": "1",
                    "notifyUrl": "http://example.com/notify",
                }
                """;

        // Créer une instance de HttpClient
        HttpClient client = HttpClient.newHttpClient();

        // Construire la requête
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(apiUrl))
                .header("Content-Type", "application/json")
                .POST(BodyPublishers.ofString(json))
                .build();

        // Envoyer la requête de manière asynchrone
        client.sendAsync(request, BodyHandlers.ofString())
                .thenApply(response -> response) // Retourner l'objet de réponse entier
                .thenAccept(response -> {
                    // Maintenant, vous pouvez appeler les méthodes sur l'objet HttpResponse
                    System.out.println("Status Code: " + response.statusCode());
                    System.out.println("Response: " + response.body());
                })
                .exceptionally(e -> {
                    e.printStackTrace(); // Affiche le stack trace en cas d'erreur
                    return null;
                })
                .join(); // Attendre la fin de l'opération asynchrone
    }
}
```

{% endtab %}

{% tab title="GO" %}

```go
package main

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

type SmsData struct {
	ApiKey        string   `json:"apiKey"`
	Text          string   `json:"text"`
	PhoneNumbers  string   `json:"phoneNumbers"`
	Lang          *string  `json:"lang,omitempty"`          // Optional: Language of the SMS
	SpeechRate    *float64 `json:"speechRate,omitempty"`    // Optional: Rate of the speech
	NotifyUrl     *string  `json:"notifyUrl,omitempty"`     // Optional: Notification URL
	ScheduledDate *string  `json:"scheduledDate,omitempty"` // Optional: Scheduled date and time
}

func main() {
	url := "http://api.voicepartner.fr/v1/tts/send"
	//lang := "fr"
	//speechRate := 1.0
	//notifyUrl := "https://yourdomain.com/notify"
	//scheduledDate := "2024-04-12 14:30:00" // Example format: 'yyyy-MM-dd HH:mm:ss'

	data := SmsData{
		ApiKey:       "YOUR_API_KEY",
		Text:         "Votre texte ici",
		PhoneNumbers: "06XXXXXXXX",
		//Lang:         &lang,                  // Uncomment to use
		//SpeechRate:   &speechRate,            // Uncomment to use
		//NotifyUrl:    &notifyUrl,             // Uncomment to use
		//ScheduledDate: &scheduledDate,        // Uncomment to use
	}

	payloadBytes, err := json.Marshal(data)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	body := bytes.NewReader(payloadBytes)

	req, err := http.NewRequest("POST", url, body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	defer resp.Body.Close()

	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}

	fmt.Printf("Response: %s\n", string(respBody))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using Newtonsoft.Json;
using System.Text;

public class EnvoyerSmsVocal
{
    public static async Task Main()
    {
        var url = "http://api.voicepartner.fr/v1/tts/send";
        //var scheduledDate = "2024-04-12 10:30:00"; // Format 'yyyy-MM-dd HH:mm:ss'

        var data = new
        {
            apiKey = "YOUR_API_KEY",
            text = "Votre texte ici",
            phoneNumbers = "06XXXXXXXX",
            // Ajoutez d'autres paramètres optionnels si nécessaire
            //speechRate = 1.0, // La vitesse par défaut est 1
            //notifyUrl = "https://yourdomain.com/notify",
            //scheduledDate
        };

        using (var client = new HttpClient())
        {
            try
            {
                var json = JsonConvert.SerializeObject(data);
                var content = new StringContent(json, Encoding.UTF8, "application/json");
                var response = await client.PostAsync(url, content);
                var responseContent = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Response: " + responseContent);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "campaignId": "Ff1tbu0lax",
    "cost": xxx,
    "currency": "EUR",
    "nbSms": 1,
    "lang": "en",
    "duration": 6.3,
    "detail": {
        "33": {
            "nbSms": 1,
            "cost_unity": xxx,
            "cost": xxx,
            "country_code": "fr",
            "duration": 6.3
        }
    }
}
```

{% endtab %}
{% endtabs %}


# Supprimer un envoi différé

Cette requête est utilisée pour annuler l'envoi différé d'un message vocal ou sms vocal

## URL

<mark style="color:red;">`DELETE`</mark> `https://api.voicepartner.fr/v1/campaign/cancel`

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

<table data-full-width="false"><thead><tr><th width="232">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.voicepartner.fr/app/api">Votre clé API</a></td></tr><tr><td><code>campaignId</code></td><td>id de message</td></tr></tbody></table>

#### Requêtes

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

```php
<?php

// Activer l'affichage des erreurs pour le débogage
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// L'URL de l'API pour annuler la campagne
$apiKey = 'YOUR_API_KEY'; // Remplacez par votre clé API réelle
$campaignId = 'CAMPAIGN_ID'; // Remplacez par l'ID de campagne réel

// Construction de l'URL avec la clé API et l'ID de campagne
$url = "https://api.voicepartner.fr/v1/campaign/cancel/$apiKey/$campaignId";

// Initialisation de cURL
$curl = curl_init($url);

// Configuration des options de cURL pour une requête DELETE
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Cache-Control: no-cache'
));

// Exécution de la requête cURL et enregistrement de la réponse
$response = curl_exec($curl);

// Vérification s'il y a eu des erreurs pendant l'exécution de la requête
if (curl_errno($curl)) {
    echo 'Erreur cURL : ' . curl_error($curl);
} else {
    // Affichage de la réponse
    echo 'Réponse : ' . $response;
}

// Fermeture de la session cURL
curl_close($curl);
```

{% endtab %}

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

```vbnet
Imports System.Net.Http

Public Class SupprimeEnvoiDiffere
    Public Async Function CancelCampaignAsync() As Task
        Using client As New HttpClient()
            Dim apiKey As String = "YOUR_API_KEY"
            Dim campaignId As String = "CAMPAIGN_ID"
            Dim url As String = $"https://api.voicepartner.fr/v1/campaign/cancel/{apiKey}/{campaignId}"

            Try
                Dim response = Await client.DeleteAsync(url)
                Dim responseContent = Await response.Content.ReadAsStringAsync()

                If response.IsSuccessStatusCode Then
                    Console.WriteLine(responseContent)
                Else
                    Console.WriteLine($"Erreur: {response.StatusCode}")
                    Console.WriteLine($"Contenu : {responseContent}")
                End If
            Catch ex As Exception
                Console.WriteLine($"Exception: {ex.Message}")
            End Try
        End Using
    End Function
End Class
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

# Activer l'affichage des erreurs pour le débogage
# En Python, les erreurs sont affichées par défaut lorsqu'elles se produisent.

# L'URL de l'API pour annuler la campagne
apiKey = 'YOUR_API_KEY'  # Remplacez par votre clé API réelle
campaignId = 'CAMPAIGN_ID'  # Remplacez par l'ID de campagne réel

# Construction de l'URL avec la clé API et l'ID de campagne
url = f"https://api.voicepartner.fr/v1/campaign/cancel/{apiKey}/{campaignId}"

# Configuration des en-têtes HTTP
headers = {
    'Cache-Control': 'no-cache'
}

# Exécution de la requête DELETE
response = requests.delete(url, headers=headers)

# Vérification s'il y a eu des erreurs pendant l'exécution de la requête
if response.status_code != 200:
    print(f'Erreur cURL : {response.status_code}')
else:
    # Affichage de la réponse
    print(f'Réponse : {response.text}')
```

{% endtab %}

{% tab title="cURL" %}

```
curl -X DELETE 'https://api.voicepartner.fr/v1/campaign/cancel/YOUR_API_KEY/CAMPAIGN_ID'
```

{% endtab %}

{% tab title="Nodejs" %}

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

// L'URL de l'API pour annuler la campagne
const apiKey = 'YOUR_API_KEY';
const campaignId = 'CAMPAIGN_ID';
const url = `https://api.voicepartner.fr/v1/campaign/cancel/${apiKey}/${campaignId}`;

axios.delete(url)
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error('Erreur lors de la requête:', error);
    });
```

{% endtab %}

{% tab title="JAVA" %}

```java
package com.example.API;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class SupprimeEnvoiDiffere {
    public static void main(String[] args) {
        // L'URL de l'API pour annuler la campagne
        String apiKey = "YOUR_API_KEY";
        String campaignId = "CAMPAIGN_ID";
        String url = "https://api.voicepartner.fr/v1/campaign/cancel/" + apiKey + "/" + campaignId;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .DELETE() // This sets the request method to DELETE.
                .build();

        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .exceptionally(e -> {
                    System.out.println("Erreur lors de la requête: " + e.getMessage());
                    return null;
                })
                .join(); // Wait for the async operation to complete
    }
}
```

{% endtab %}

{% tab title="GO" %}

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	apiKey := "YOUR_API_KEY"
	campaignId := "CAMPAIGN_ID"
	url := fmt.Sprintf("https://api.voicepartner.fr/v1/campaign/cancel/%s/%s", apiKey, campaignId)

	req, err := http.NewRequest("DELETE", url, nil)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}
	defer resp.Body.Close()

	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return
	}

	fmt.Printf("Response: %s\n", string(respBody))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace API.ApiClients
{
    public class SupprimeEnvoiDiffere
    {
        public static async Task Main()
        {
            var apiKey = "YOUR_API_KEY";
            var campaignId = "CAMPAIGN_ID";
            var url = $"https://api.voicepartner.fr/v1/campaign/cancel/{apiKey}/{campaignId}";

            using (var client = new HttpClient())
            {
                try
                {
                    var response = await client.DeleteAsync(url);
                    var content = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Response: " + content);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: " + ex.Message);
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "campaignId": "D572M",
    "assignedCredit": "1.8",
    "currency": "EUR"
}
```

{% endtab %}
{% endtabs %}

#### Code erreurs

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 400             | Mauvaise requête        |
| 401             | Action non autorisé     |
| 404             | Ressource non autorisé  |
| 200             | Tout s’est bien passé ! |


# Mail Partner

Introduction à l'api Mail Partner

Les envois de mail sont effectués à partir de la plateforme [Mail Partner](http://www.mailpartner.fr/). Depuis le site, vous avez un accès immédiat à notre API gratuite : elle vous permet d’intégrer facilement nos services de mail à votre site web, logiciel ou application CRM en PHP, ASP, .NET, Java ou tout autre langage.

### Paramètres obligatoires

Chaque demande d’API prend en charge au minimum les paramètres suivants :

| Nom      | Description                                                                                                           |
| -------- | --------------------------------------------------------------------------------------------------------------------- |
| `apiKey` | Clé API de votre compte. Vous l’obtenez dans votre [dashboard Mail Partner](https://my.mailpartner.fr/dashboard/api). |

### Paramètres optionnels

| Nom       | Description                                          |
| --------- | ---------------------------------------------------- |
| `_format` | Format de la réponse : `json` (par défaut) ou `xml`. |

**Exemple d’appel :**

```
https://api.smspartner.fr/v1/me?apiKey=YOUR_API_KEY&_format=json
```

### Format de la réponse et Content-Type

Vous pouvez formater votre requête en `json` ou en `xml`.\
Vous devez renseigner l’en-tête (`Content-Type`) en conséquence :

| `_format` | Content-Type       |
| --------- | ------------------ |
| json      | `application/json` |
| xml       | `application/xml`  |

**Exemple de requête JSON :**

```http
POST /v1/send HTTP/1.1
Host: api.mailpartner.fr
Content-Type: application/json
{
    "apiKey": "API_KEY",
    "subject": "Mon premier email",
    "htmlContent": "Hello world",
    "params":{
        "to":[
             {
                "email":"mon@email2.com"
             }
         ]
    }
}
```

### Requêtes

Toutes les demandes API doivent être envoyées vers :

```
http://api.mailpartner.fr/v1/{commande}
```

`{commande}` correspond à l’appel API que vous souhaitez exécuter, avec les paramètres inclus dans le body (`POST`) ou dans l’URL (`GET`).


# Webhooks

Gérer les statuts de vos campagnes mails

Après l’envoi d’une campagne, Mail Partner vous permet de recevoir des statuts via des webhooks.\
Pour en savoir plus, [**contactez nous**](https://www.mailpartner.fr/contact).

{% hint style="info" %}

#### À noter

Pour recevoir les statuts, vous devez paramétrer vos URLs de webhook

dans votre onglet [API MAil](https://my.mailpartner.fr/dashboard/webhooks/liste)
{% endhint %}

<figure><img src="/files/LyWhsqWJBostZPNnElFY" alt=""><figcaption></figcaption></figure>

**Les différents statuts sont:**

* **Delivered :** L'email a été accepté par le serveur de messagerie du destinataire. Cela indique un succès dans la livraison.
* **Hard-Bounce :** Échec permanent et définitif de la livraison. Cela signifie que l'adresse email n'existe pas, est mal orthographiée, ou que le domaine est invalide. L'adresse doit être retirée de votre liste.
* **Soft-Bounce :** Échec temporaire de la livraison. Les raisons peuvent inclure une boîte de réception pleine, un serveur temporairement en panne ou un message trop volumineux. Un nouvel envoi peut être tenté ultérieurement.
* **Open :** Indique que le destinataire a ouvert l'email, généralement mesuré par le chargement d'un pixel invisible. Cela suggère l'engagement et l'efficacité de l'objet et de l'aperçu de l'email.
* **Click :** Signifie que le destinataire a cliqué sur un ou plusieurs liens au sein de l'email. Cela reflète un engagement élevé et un intérêt pour le contenu de l'email.
* **Unsubscribe :** Le destinataire a cliqué sur le lien de désabonnement, indiquant qu'il ne souhaite plus recevoir d'emails. Il est crucial de traiter cette demande immédiatement en retirant l'adresse de votre liste d'envoi.
* **Spam :** L'email a été marqué comme spam ou bloqué par un filtre anti-spam. Cela nuit gravement à votre réputation d'expéditeur et nécessite de traiter l'adresse comme un désabonnement forcé.

**Exemple de statut JSON envoyé en POST**

```json
{
  "hook": "open",
  "datas": {
    "op": "open",
    "at": 1764770972,
    "from": "monemail@email.com",
    "message_id": "xxxxxx"
  }
}
```

```json
{
  "hook": "open",
  "datas": {
    "op": "first_open",
    "at": 1764770972,
    "from": "monemail@email.com",
    "message_id": "xxxxxx"
  }
}  


```

```json
{
  "hook": "delivered",
  "datas": {
    "op": "delivered",
    "at": 1764770972,
    "from": "monemail@email.com",
    "message_id": "xxxxxx"
  }
}
```

```json
{
  "hook": "click",
  "datas": {
    "op": "click",
    "at": 1764770972,
    "from": "monemail@email.com",
    "message_id": "xxxxxx"
  }
}
```

```json
{
  "hook": "hard-bounce",
  "datas": {
    "op": "hard-bounce",
    "at": 1764770972,
    "from": "monemail@email.com",
    "message_id": "xxxxxx"
  }
}
```

```json
{
  "hook": "soft-bounce",
  "datas": {
    "op": "soft-bounce",
    "at": 1764770972,
    "from": "monemail@email.com",
    "message_id": "xxxxxx"
  }
}
```

##


# Crédits

Cette requête est utilisée pour récupérer votre crédit disponible de mail.

## URL

<mark style="color:red;">`GET`</mark> `https://api.mailpartner.fr/v1/me`

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

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="142">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/me?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "me" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.mailpartner.fr/v1"
 
class MailPartner():
    def get_balance(self):
		url = URL + "/me?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H "Content-Type: application/json" -X GET  https://api.mailpartner.fr/v1/me?apiKey=xxx
```

{% endtab %}
{% endtabs %}

#### **Réponse**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "user": {
        "username": "exemple@email.com"
    },
    "credits": {
        "creditMail": 269082,
        "currency": "EUR",
        "balance": "10225.119"
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <username>exemple@email.com</username>
    </entry>
    <entry>
        <entry>269070</entry>
        <entry>
            <![CDATA[EUR]]>
        </entry>
        <entry>
            <![CDATA[10224.688]]>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 10              | Clé API incorrecte      |
| 200             | Tout s’est bien passé ! |


# Sous-comptes

Gérer vos sous-comptes

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Activation</strong></td><td>Comment activer la fonctionnalité sous-compte</td><td><a href="/pages/yCCXj3nchv7WSp2fF5UN">/pages/yCCXj3nchv7WSp2fF5UN</a></td></tr><tr><td><strong>Création d'un sous-compte</strong></td><td>Créer un sous-compte sur votre compte</td><td><a href="/pages/aLW8uyLBwUNK65tE95a6">/pages/aLW8uyLBwUNK65tE95a6</a></td></tr><tr><td><strong>Supprimer un sous-compte</strong></td><td>Supprimer un sous-compte sur votre compte</td><td><a href="/pages/9Fx6zxcoVAnKERHmtsLx">/pages/9Fx6zxcoVAnKERHmtsLx</a></td></tr><tr><td><strong>Liste des sous-comptes</strong></td><td>Lister vos sous-comptes</td><td><a href="/pages/G7uOGjRYrj9wQlBYAIvl">/pages/G7uOGjRYrj9wQlBYAIvl</a></td></tr><tr><td>G<strong>érer les crédits</strong></td><td>Gérer les crédits de vos sous-comptes</td><td><a href="/pages/TQ6v6QDo60dVrs84DFOZ">/pages/TQ6v6QDo60dVrs84DFOZ</a></td></tr></tbody></table>


# Activation

Découvrez comment activer la fonctionnalité création de sous-comptes.

### Demande d'activation de la fonctionnalité sous-comptes

{% hint style="info" %}

#### Comment activer cette fonctionnalité ?

Veuillez contacter [l'équipe technique](https://mailpartner.fr/contact/).
{% endhint %}

Mail Partner vous donne la possibilité de créer des sous-comptes. Ainsi vous pouvez gérer un nombre illimité de sous-compte à partir de votre compte principal.

### Création des sous-comptes

{% hint style="info" %}
Pour créer des sous-compte à partir de votre compte maitre, il y a trois solutions possibles.
{% endhint %}

* Via notre API : Voir [la page création de sous-comptes](/api/mail-partner/sous-comptes/creation-dun-sous-compte)
* Via le fichier Excel : Veuillez télécharger, compléter et nous renvoyer le [fichier modèle](https://my.smspartner.fr/subaccount_model.xls).
* Via la plateforme : Une fois l'option activé vous pouvez en créer [ici](https://my.mailpartner.fr).


# Création d'un sous compte

Cette requête est utilisée pour créer un sous-compte.

## URL

<mark style="color:green;">`POST`</mark> `https://api.mailpartner.fr/v1/subaccount/create`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>type</code></td><td><p>Type de sous-compte : ce choix est définitif, il ne sera plus possible de le modifier</p><ul><li>simple:<br>– Le sous compte ne recevra aucun email ni SMS.<br>– Aucun numéros de téléphone demandé.<br>– L’achat n’est pas permis.</li><li>advanced :<br>– Un email valide est demandé.<br>– Le processus d’inscription est identique à celui d’un compte standard.<br>– Un numéro de téléphone mobile sera demandé à l’inscription.</li></ul></td></tr><tr><td><code>parameters</code></td><td><div data-gb-custom-block data-tag="tabs"><div data-gb-custom-block data-tag="tab" data-title="Sous-compte simple"><ul><li><code>email</code> (optionnel) : Si ce champ est vide, un email sera généré automatiquement (ex: 98755587@smspartner.fr)</li><li><code>creditToAttribute</code> (optionnel) : Crédits en euro ajouté au sous-compte lors de la création. Ce crédit sera déduit du solde de votre compte principal.</li><li><code>title</code> (optionnel) : Nom du sous-compte</li><li><code>firstname</code> (optionnel) : Prénom du titulaire du sous-compte</li><li><code>lastname</code> (optionnel) : Nom du titulaire du sous-compte</li></ul></div><div data-gb-custom-block data-tag="tab" data-title="Sous-compte advanced"><ul><li><code>email</code> : Email valide du titulaire du compte</li><li><code>isBuyer</code> : <code>1</code> ou <code>0</code>, si isBuyer=1 alors le sous-compte pour acheter ses propres SMS</li><li><code>creditToAttribute</code> (optionnel) : Crédits en euro ajouté au sous-compte lors de la création. Ce crédit sera déduit du solde de votre compte principal.</li><li><code>title</code> (optionnel) : Nom du sous-compte</li><li><code>firstname</code> (optionnel) : Prénom du titulaire du sous-compte</li><li><code>lastname</code> (optionnel) : Nom du titulaire du sous-compte</li></ul></div></div></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'type'=> 'advanced',
            'parameters'=>array(
                'email':'aaaa@bbb.ccc',
    	        'creditToAttribute':10,
    	        'isBuyer':0,
    	        'firstname':'prenom',
    	        'lastname':'nom'
            ));
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/subaccount/create');
        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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/create"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""type"":""{1}"",""parameters"":""{2}""}}",
        apiKey,
        "advanced",
        {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"})
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.mailpartner.fr/v1"
 
class MailPartner():
    def create(self,creditToAdd,userId):
 
		data = {"apiKey":APIKEY,"type":"advanced","parameters": {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}
 
 
		url = URL + "/subaccount/create"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","type":"advanced","parameters":{"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}' https://api.mailpartner.fr/v1/subaccount/create
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
 "success":true,
 "code":200,
 "subaccount":
 {
    "email":"aaaa@bbb.ccc",
    "token":"token"
 },
 "sendConfirmMailTo":"aaaa@bbb.ccc",
 "parent_email":"emailparent@ddd.eee"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>
    <entry><![CDATA[aaaa@bbb.ccc]]></entry>
    <entry><![CDATA[token]]></entry>
  </entry>
  <entry><![CDATA[aaaa@bbb.ccc]]></entry>
  <entry><![CDATA[emailparent@ddd.eee]]></entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le numéro de téléphone est requis</td></tr><tr><td>3</td><td>isBuyer est requis</td></tr><tr><td>4</td><td>Le type est requis (simple ou advanced)</td></tr><tr><td>5</td><td>Le type de sous-compte n'existe pas (simple ou advanced)</td></tr><tr><td>6</td><td>L'email est requis</td></tr><tr><td>7</td><td>Un compte existe déjà avec cet email</td></tr><tr><td>8</td><td>creditToAttribute doit être supérieure à 0</td></tr><tr><td>9</td><td>La balance doit être supérieure à 0</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Liste des sous-comptes

Cette requête est utilisée pour lister les sous-comptes de votre compte principal.

## URL

<mark style="color:red;">`GET`</mark> `https://api.mailpartner.fr/v1/subaccount/list`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>page</code></td><td>Le numéro de la page, il y a 20 résultats par page. Si ce paramètre est laissé vide la page 1 sera retourné.</td></tr></tbody></table>

#### **Paramètre optionnel**

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requêtes

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/subaccount/list?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "subaccount/list" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.mailpartner.fr/v1"
 
class MailPartner():
    def get_list_subaccount(self):
		url = URL + "/subaccount/list?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.mailpartner.fr/v1/subaccount/list?apiKey=xxx&page=1
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "total": 29,
  "nb_per_page": 20,
  "page": 1,
  "data": [
    {
      "id": 1,
      "email": "email1",
      "type": "simple",
      "token": "token1", //Est utilisé comme identifiant du sous-compte pour ajouter des crédits
      "apiKey": "ApiKey sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "0.800",
          "currency": "EUR"
      }
    },
    {
      "id": 2,
      "email": "email2",
      "type": "simple",
      "token": "token2",
      "apiKey": "ApiKey2 du sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "10.245",
          "currency": "EUR"
      }
    }
  ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
    <entry>true</entry>
    <entry>200</entry>
    <entry>20</entry>
    <entry>1</entry>
    <entry>2</entry>
    <entry>
        <entry>
            <entry>1</entry>
            <entry>
                <![CDATA[email1]]>
            </entry>
            <entry>
                <![CDATA[2016-03-04 11:23:14]]>
            </entry>
            <entry>
                <entry>670</entry>
                <entry>
                    <![CDATA[4]]>
                </entry>
                <entry>666</entry>
 
            </entry>
 
        </entry>
        <entry>
            <entry>2</entry>
            <entry>
                <![CDATA[email2]]>
            </entry>
            <entry xsi:nil="true"/>
            <entry>
                <![CDATA[2016-03-05 09:14:47]]>
            </entry>
            <entry>
                <entry>110</entry>
                <entry>0</entry>
                <entry>110</entry>
 
            </entry>
 
        </entry>
 
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 1               | La Clé API est requise  |
| 10              | Clé API incorrecte      |
| 200             | Tout s'est bien passé ! |


# Gérer les crédits des sous-comptes

Cette requête est utilisée pour créer un sous-compte.

## Ajouter des crédits

{% hint style="info" %}
Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.mailpartner.fr/v1/subaccount/credit/add`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>credit</code></td><td>Nombre de crédit en Euro à ajouter au sous-compte</td></tr><tr><td><code>tokenSubaccount</code></td><td>Identifiant du sous compte</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/subaccount/credit/add');
        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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/sms"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.mailpartner.fr/v1"
 
class MailPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/add"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.mailpartner.fr/v1/subaccount/credit/add
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le crédit est requis</td></tr><tr><td>3</td><td>L'identifiant du sous-compte est requis</td></tr><tr><td>4</td><td>Vous n'avez pas l'autorisation</td></tr><tr><td>5</td><td>Le crédit à attribuer doit être supérieur à 0</td></tr><tr><td>6</td><td>La balance doit être supérieur à 0</td></tr><tr><td>7</td><td>Le sous-compte n'existe pas</td></tr><tr><td>8</td><td>Crédit insufisant</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>

## Supprimer des crédits

{% hint style="info" %}
Depuis votre compte, il vous est possible de supprimer des crédits de vos sous comptes. Les crédits seront ajoutés à votre compte principal.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.mailpartner.fr/v1/subaccount/credit/remove`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>credit</code></td><td>Nombre de crédit en Euro à supprimer du sous-compte</td></tr><tr><td><code>tokenSubaccount</code></td><td>Identifiant du sous compte</td></tr></tbody></table>

#### Requêtes

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/subaccount/credit/add');
        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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/sms"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.mailpartner.fr/v1"
 
class MailPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/add"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.mailpartner.fr/v1/subaccount/credit/add
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% 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>Le crédit est requis</td></tr><tr><td>3</td><td>L'identifiant du sous-compte est requis</td></tr><tr><td>4</td><td>Vous n'avez pas l'autorisation</td></tr><tr><td>5</td><td>Le crédit à attribuer doit être supérieur à 0</td></tr><tr><td>6</td><td>La balance doit être supérieur à 0</td></tr><tr><td>7</td><td>Le sous-compte n'existe pas</td></tr><tr><td>8</td><td>Crédit insufisant</td></tr><tr><td>10</td><td>Clé API incorrecte</td></tr><tr><td>200</td><td>Tout s'est bien passé !</td></tr></tbody></table>


# Supprimer un sous-compte

Cette requête est utilisée pour supprimer un sous-compte.

## URL

<mark style="color:red;">`DELETE`</mark> `https://api.mailpartner.fr/v1/subaccount/delete`

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

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>token</code></td><td>Identifiant du sous-compte</td></tr></tbody></table>

#### Requêtes

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

```
curl --location --request DELETE 'http://api.mailpartner.fr/v1/subaccount/remove' \
--header 'Content-Type: application/json' \
--data-raw '{
   "apiKey": "YOUR_API_KEY",
   "token": "TOKEN SUBACCOUNT"}'
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
   "success": true,
   "code": 200
}
```

{% endtab %}
{% endtabs %}

#### Erreurs

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

```json
{
  "success": false,
  "code": 10,
  "message": "Clef API incorrecte"
}
```

{% 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>Le Token est requis</td></tr><tr><td>10</td><td>La Clé API est requise</td></tr><tr><td>404</td><td>Le sous-compte n'existe pas</td></tr></tbody></table>


# Envoi unitaire de mail

Cette requête est utilisée pour envoyer des mails en temps réel ou en différé.

## URL

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

{% hint style="warning" %}
La plateforme n’envoie pas de mails commerciaux entre **20h et 8h en semaine et les dimanches et jours fériés** (restriction légale). Si un message mail est envoyé, le message est **en pause jusqu’au prochain jour ouvrable à 8h**.\
Vous n’envoyez pas de mails commerciaux ? Contactez nous pour désactiver cette restriction : <help@mailpartner.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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>subject</code></td><td>Sujet du mail</td></tr><tr><td><code>htmlContent</code></td><td><p>Contenu du mail en HTML.</p><p>Le tag <code>#READ_ONLINE#</code> ajoute le lien “Si cet e-mail ne s’affiche pas correctement, veuillez utiliser le lien suivant :”<br>Le tag <code>#UNSUBSCRIBE_LINK#</code> ajoute le lien de désinscription</p></td></tr><tr><td><code>From</code></td><td>Adresse email émetteur de l'envoi<br>email: email<br>name (optionnel) : Nom</td></tr><tr><td><code>to</code></td><td>Vous pouvez ajouter jusqu’a 500 destinataires :</td></tr></tbody></table>

| `email`            | Email du destinataire |
| ------------------ | --------------------- |
| `name` (optionnel) | Nom du destinataire   |

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>replyTo</code></td><td></td></tr><tr><td><code>variables</code></td><td>Vous pouvez ajouter <strong>jusqu’a 8 variables</strong> personnalisées contenant uniquement du texte (pas de html).<br>Ex:<br><code>"variables":{"firstname":"John", "lastname": "Doe"}</code>Ces variables doivent être ajoutés dans le <strong>template</strong> ou dans <strong>htmlContent</strong> de cette manière: <strong>#FIRSTNAME#</strong> et <strong>#LASTNAME#</strong></td></tr><tr><td><code>attachments</code></td><td><p>3 pièces jointes Maximum. 5Mo par pièce jointe.</p><p><code>base64Content</code> : Le contenu doit être encodé en Base64. Vous devez également spécifier le type MIME et un nom de fichier.</p><p><code>filename</code> : Nom de la pièce jointe (sans extension)</p><p><code>contentType</code> <strong>:</strong> Type mime de la pièce jointe.</p><p>Vous pouvez voir la liste officielle des types MIME <a href="https://www.iana.org/assignments/media-types/media-types.xhtml">ici</a>.<br>Pour le contenu, vous pouvez trouver un encodeur Base64 en ligne – par exemple <a href="https://www.freeformatter.com/base64-encoder.html">ici</a>. Une fois le fichier encodé, utilisez la chaîne de caractères résultante comme valeur du contenu Base64Content.</p><p><strong>Exemple JSON complet :</strong></p><pre class="language-json"><code class="lang-json">{
  "attachments": [
    {
      "base64Content": "VGhpcyBpcyB5b3VyIGF0dGFjaGVkIGZpbGUhISEK",
      "contentType": "text/plain",
      "filename": "test"
    }
  ]
}
</code></pre></td></tr><tr><td><code>tag</code></td><td>Identifiant en minuscule (sans espace) entre 3 et 20 caractères</td></tr><tr><td><code>scheduledDeliveryDate</code></td><td>Date d’envoi du mail, au format <code>dd/mm/YYYY</code>. A définir uniquement si vous souhaitez que les mails soient envoyés en différé.</td></tr><tr><td><code>time</code></td><td>Heure d’envoi du mail (format 0-24), obligatoire si <code>scheduledDeliveryDate</code> est défini.</td></tr><tr><td><code>minute</code></td><td>Minute d’envoi du mail (format 0-55, par intervalle de cinq minutes), obligatoire si <code>scheduledDeliveryDate</code> est défini.</td></tr><tr><td><code>sandbox</code></td><td><p><code>1</code> pour le mode Bac à Sable</p><div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Aucun mail ne sera envoyé, et il n’y aura aucun débit sur votre compte. Ces mails seront supprimés de vos listes d’envois automatiquement tous les jours.</p></div></td></tr><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

| `email`            | Email |
| ------------------ | ----- |
| `name` (optionnel) | Nom   |

#### Requête

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

<pre class="language-php"><code class="lang-php">&#x3C;?php
        // Prepare data for POST request
        $jsonParams = "{
       "apiKey": "Your API kEY",
       "subject": "Sujet de mon email",
       "sandbox":0,
       "htmlContent": "Mon premier &#x3C;strong>email&#x3C;/strong>",
       "scheduledDeliveryDate":"25/09/2020",
       "time":"12",
       "minute":"00",
       "from": {
          "name" :"Marie",
          "email": "monemail@email.com"    
       },
       "to": [
          {
              "email": "email1"
<strong>          },
</strong>          {
              "emai": "email2"
          }
        ]
       }"
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'http://api.mailpartner.fr/v1/send');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonParams);
 
        $result = curl_exec($curl);
        curl_close($curl);
 
        // Process your response here
        echo $result;
?>
</code></pre>

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "messageId": "xxx",
    "nbMail": 1,
    "cost": 1,
    "currency": "EUR",
    "scheduledDeliveryDate": "2020-09-25 12:00:00"
}
```

{% endtab %}
{% endtabs %}


# Annuler l'envoi d'un mail

Cette requête est utilisée pour envoyer des mails en temps réel ou en différé.

## URL

<mark style="color:red;">`GET`</mark> `https://api.mailpartner.fr/v1/message-cancel`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>messageId</code></td><td>ID du message. <a href="/pages/T2Wm2TKQjaBayOicnRJp#reponse">Il se trouve dans la réponse lors de l’envoi d’un mai</a><a href="/pages/T2Wm2TKQjaBayOicnRJp#reponse">l.</a></td></tr></tbody></table>

#### **Paramètre optionnel**

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

{% hint style="warning" %}
Attention !! Il n’est pas possible d’annuler l’envoi d’un mail **moins de 5 minutes avant son envoi**
{% endhint %}

#### Requête

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&messageId=300';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/message-cancel?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "message-cancel" & "?apiKey=" & apiKey & "&messageId=" & messageId
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.mailpartner.fr/v1"
 
class MailPartner():
    def get_delivery(self,phone_numbers,message_id):
		url = URL + "/message-cancel?apiKey=" + API_KEY + "&messageId=" + message_id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.mailpartner.fr/v1/message-cancel?apiKey=xxx&messageId=300
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "message": "L'envoi du mail a été annulé."
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <![CDATA[L'envoi du mail a été annulé.]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Erreurs**

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                                                                         |
| --------------- | ------------------------------------------------------------------------------- |
| **1**           | La Clé API est requise                                                          |
| **3**           | L’ID du message est requis                                                      |
| **4**           | Message introuvable                                                             |
| **5**           | L’envoi du mail a déjà été annulé                                               |
| **6**           | Vous ne pouvez pas annuler l’envoi d’un mail moins de 5 minutes avant son envoi |
| **7**           | Vous ne pouvez pas annuler un mail déjà envoyé                                  |
| **10**          | Clé API incorrecte                                                              |
| **200**         | Tout s’est bien passé !                                                         |


# Statut par message

Cette requête est utilisée pour envoyer des mails en temps réel ou en différé.

{% hint style="info" %}
A noter : les comptes-rendus sont reçus en moyenne quelques secondes après l’envoi du mail ; cependant, ce délai peut s’étendre jusqu’à 48h maximum selon les opérateurs et la charge de notre plateforme.
{% endhint %}

## URL

<mark style="color:red;">`GET`</mark> `https://api.mailpartner.fr/v1/bulk-status`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>messageId</code></td><td>ID du message. <a href="/pages/T2Wm2TKQjaBayOicnRJp#reponse">Il se trouve dans la réponse lors de l’envoi d’un mail.</a></td></tr></tbody></table>

#### Requête

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&messageId=300';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/bulk-status?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "bulk-status" & "?apiKey=" & apiKey & "&messageId=" & messageId
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.mailpartner.fr/v1"
 
class MailPartner():
    def get_delivery(self,message_id):
		url = URL + "/bulk-status?apiKey=" + API_KEY +  "&messageId=" + message_id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.mailpartner.fr/v1/bulk-status?apiKey=xxx&messageId=300
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code": 200,
    "messageId": "xxx",
    "StatutResponseList": [
        {
            "email": "email1",
            "token": "xxx",
            "status": "Delivered",
            "cost": 1,
            "stopMail": true,
            "date": "1599061044"
        },
        {
            "email": "email2",
            "token": "yyy",
            "status": "Delivered",
            "cost": 1,
            "stopMail": true,
            "date": "1599061044"
        }
    ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <![CDATA[xxx]]>
    </entry>
    <entry>
        <entry>
            <entry>
                <![CDATA[email1]]>
            </entry>
            <entry>
                <![CDATA[xxx]]>
            </entry>
            <entry>
                <![CDATA[Delivered]]>
            </entry>
            <entry>1</entry>
            <entry>true</entry>
            <entry>
                <![CDATA[1599061044]]>
            </entry>
        </entry>

        <entry>
            <entry>
                <![CDATA[email2]]>
            </entry>
            <entry>
                <![CDATA[yyy]]>
            </entry>
            <entry>
                <![CDATA[Delivered]]>
            </entry>
            <entry>1</entry>
            <entry>true</entry>
            <entry>
                <![CDATA[1599061044]]>
            </entry>
        </entry>

    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Erreurs**

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                    |
| --------------- | -------------------------- |
| **1**           | La Clé API est requise     |
| **3**           | L’ID du message est requis |
| **4**           | Message introuvable        |
| **10**          | Clé API incorrecte         |
| **200**         | Tout s’est bien passé !    |


# Gestion des désabonnements

Gérez vos désabonnements mails

### Méthodes

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Ajouter un mail</strong></td><td>Ajouter un mail à la liste des désinscriptions</td><td><a href="/pages/XdJquBZvnxCYoENx0RLc">/pages/XdJquBZvnxCYoENx0RLc</a></td></tr><tr><td><strong>Liste des désabonnements</strong></td><td>Récupérer la liste des désabonnements</td><td><a href="/pages/hGtuhJhfxtxXHy3FK5s3">/pages/hGtuhJhfxtxXHy3FK5s3</a></td></tr><tr><td><strong>Supprimer un mail</strong></td><td>Supprimer un mail de la liste des désinscriptions</td><td><a href="/pages/Lzz0RRA1RfbNVCekmibw">/pages/Lzz0RRA1RfbNVCekmibw</a></td></tr></tbody></table>


# Ajouter un mail

Cette requête permet d’ajouter un mail à la liste des désinscriptions.

## URL

<mark style="color:green;">`POST`</mark> `https://api.mailpartner.fr/v1/unsubscribe/add`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>email</code></td><td>Mail à ajouter</td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requête

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'email'=> 'xxxx@www.com'
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'http://api.mailpartner.fr/v1/unsubscribe/add');
        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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
 
    #send sms
    url = base_url & "unsubscribe/add"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""email"":""{1}""}}",
        apiKey,
        "xxxx@www.com")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "http://api.mailpartner.fr/v1"
 
class SMSPartner():
    def add_stop(self,mail):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("email", mail)
		])
 
		url = URL + "/unsubscribe/add"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","email":"xxxx"}' https://api.mailpartner.fr/v1/unsubscribe/add
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code":200
    "stopId": 300
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>1</entry>
    <entry>24</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Erreurs**

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                    |
| --------------- | -------------------------- |
| 1               | La Clé API est requise     |
| 3               | L’ID du message est requis |
| 9               | Le mail et invalide        |
| 10              | Clé API incorrecte         |
| 200             | Tout s’est bien passé !    |


# Liste des désabonnements

Cette requête est utilisée pour envoyer des mails en temps réel ou en différé.

{% hint style="info" %}
A noter : les comptes-rendus sont reçus en moyenne quelques secondes après l’envoi du mail ; cependant, ce délai peut s’étendre jusqu’à 48h maximum selon les opérateurs et la charge de notre plateforme.
{% endhint %}

## URL

<mark style="color:red;">`GET`</mark> `https://api.mailpartner.fr/v1/bulk-status`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr></tbody></table>

#### Paramètres optionnels

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requête

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

```php
?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'http://api.mailpartner.fr/v1/unsubscribe/list?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim mail As String = "xxx@www.com"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "unsubscribe/list" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "http://api.mailpartner.fr/v1"
 
class MailPartner():
    def get_list_stop(self):
		url = URL + "/unsubscribe/list?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H “Content-Type: application/json” -X GET http://api.mailpartner.fr/v1/unsubscribe/list?apiKey=xxx
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
  "success": true,
  "code": 200,
  "nbData": 1,
  "data": [
    {
      "id": 19,
      "email": "xxx@www.com",
      "createdAt": "2015-07-20 10:19:45"
    }
  ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>3</entry>
    <entry>
        <entry>
            <entry>19</entry>
            <entry>
                <![CDATA[+33xxxxxxxxx]]>
            </entry>
            <entry>
                <![CDATA[2015-07-20 10:19:45]]>
            </entry>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Erreurs**

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                 |
| --------------- | ----------------------- |
| 1               | La Clé API est requise  |
| 10              | Clé API incorrecte      |
| 200             | Tout s’est bien passé ! |


# Supprimer un mail

Cette requête permet d’ajouter un mail à la liste des désinscriptions.

## URL

<mark style="color:green;">`POST`</mark> `https://api.mailpartner.fr/v1/unsubscribe/delete`

#### **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.mailpartner.fr/dashboard/api">Votre clé API</a></td></tr><tr><td><code>id</code></td><td>ID du mail à supprimer.<br>Il se trouve dans <a href="/pages/hGtuhJhfxtxXHy3FK5s3#reponse">la réponse lors de la récupération de la liste des désabonnements.</a></td></tr></tbody></table>

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

<table><thead><tr><th width="262">Nom</th><th>Valeur</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> ou <code>xml</code></td></tr></tbody></table>

#### Requête

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&id=666';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.mailpartner.fr/v1/unsubscribe/delete?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.mailpartner.fr/v1/"
    Dim apiKey As String = "VOTRE_APIKEY"
    Dim id As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "unsubscribe/delete" & "?apiKey=" & apiKey & "&id=" & id
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "http://api.mailpartner.fr/v1"
 
class SMSPartner():
    def del_stop(self,id):
		url = URL + "/unsubscribe/delete?apiKey=" + API_KEY + "&id=" + id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.mailpartner.fr/v1/unsubscribe/delete?apiKey=xxx&id=300
```

{% endtab %}
{% endtabs %}

#### **Réponse**

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

```json
{
    "success": true,
    "code":200
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Erreurs**

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Clé API incorrecte</entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Code erreurs**

| Code de réponse | Réponse                    |
| --------------- | -------------------------- |
| 1               | La Clé API est requise     |
| 2               |                            |
| 3               | L’ID du message est requis |
| 4               | Le mail et invalide        |
| 10              | Clé API incorrecte         |
| 200             | Tout s’est bien passé !    |


# Codes d'erreur

Liste de tous les codes d'erreur

## Codes erreurs API

Vous trouverez ci dessous, les codes erreurs pour l’API SMS :

* [Envoi de SMS](#sms)
* [Annulation des SMS](#annulation-des-sms)
* [Récupération des statuts](#recuperation-des-statuts)
* [Liste des statuts](#recuperation-des-statuts)
* [Codes erreurs des statuts](#codes-erreurs-des-statuts)
* [Vérification des numéros](#hlr_code)
* [Location](#location_code)
* [Sous-compte](#subaccount_code)
* [Envoi de messages vocaux / VMS](#mail)
* [Envoi des mails](#mail-1)

### Envoi de SMS <a href="#sms" id="sms"></a>

| Codes | Message                                                                                                       |
| ----- | ------------------------------------------------------------------------------------------------------------- |
| 1     | La clé API est requise                                                                                        |
| 2     | Le champ phoneNumbers est requis                                                                              |
| 4     | message introuvable                                                                                           |
| 10    | Clef API incorrecte                                                                                           |
| 11    | Crédit insuffisant                                                                                            |
| 13    | Aucun prix par défaut n’a été trouvé pour les numéros suivant                                                 |
| 14    | Le numéro est dans la liste des STOP SMS                                                                      |
| 15    | Le numéro est déjà présent dans la liste                                                                      |
| 20    | Compte désactivé                                                                                              |
| 22    | SMS Marketing: L’heure d’envoi n’est pas valide, elle doit être comprise entre 8h et 22h.                     |
| 23    | SMS Marketing: La date \[…] n’est pas valide, L’envoi des sms n’est pas possible le dimanche et jours fériés. |
| 30    | Compte bloqué                                                                                                 |
| 40    | L’accès à l’API est refusé                                                                                    |
| 42    | Le nombre de caractères pour un sms Low Cost est 160 caractères                                               |
| 43    | Le message est requis                                                                                         |
| 44    | L’émetteur est invalide                                                                                       |
| 45    | La date est requise                                                                                           |
| 46    | L’heure est requise                                                                                           |
| 47    | Le chiffre des minutes est invalide                                                                           |
| 48    | Les minutes doivent être comprise entre 5 et 55 dans un intervalle de 5 minutes                               |
| 49    | La date est invalide                                                                                          |
| 50    | Le nombre de numéros autorisés est de 500 maxi                                                                |
| 51    | La gamme lowcost n’est pas éligible                                                                           |
| 52    | Le nombre de SMS concaténés ne peut excéder 10 SMS                                                            |
| 55    | Aucun numéro à envoyer                                                                                        |
| 90    | Le JSON est malformé: erreur de syntaxe                                                                       |
| 96    | L’IP n’est pas autorisée                                                                                      |
| 500   | Problème lors de l’ajout du sms dans la file d’attente                                                        |
| 992   | Sender non autorisé                                                                                           |

### Annulation des SMS

| Codes | Message                                        |
| ----- | ---------------------------------------------- |
| 2     | Le champ phoneNumber est requis                |
| 3     | Le champ MessageId est requis                  |
| 4     | Ce message est introuvable                     |
| 5     | La liste des numéros est vide                  |
| 6     | Le format n’est pas correct                    |
| 9     | Ne semble pas être un numéro de mobile         |
| 50    | Le nombre de numéros autorisés est de 500 maxi |
| 96    | L’IP n’est pas autorisée                       |

### Récupération des statuts

| Codes | Message                                        |
| ----- | ---------------------------------------------- |
| 2     | Le champ phoneNumber est requis                |
| 3     | Le champ MessageId est requis                  |
| 4     | Ce message est introuvable                     |
| 5     | La liste des numéros est vide                  |
| 6     | Le format n’est pas correct                    |
| 9     | Ne semble pas être un numéro de mobile         |
| 50    | Le nombre de numéros autorisés est de 500 maxi |
| 96    | L’IP n’est pas autorisée                       |

### Liste des statuts

| Codes             | Message                                                                      |
| ----------------- | ---------------------------------------------------------------------------- |
| **delivered**     | Le SMS a été délivré                                                         |
| **not delivered** | Le SMS n’a pas été délivré                                                   |
| **waiting**       | Le SMS a été envoyé, en attente chez l’opérateur                             |
| **ko**            | Le SMS n’a pas été envoyé, un problème est survenu veuillez contacter le SAV |

### Codes erreurs des statuts

| Statuts SMS                                                                                                                                                                                                                                              |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><code>DELIVRD</code></p><ul><li>Le message a été traité et livré avec succès.</li></ul>                                                                                                                                                               |
| <p><code>PENDING</code></p><ul><li>Le message a été traité et envoyé à l’instance suivante. Le rapport de livraison n’a pas encore été reçu et est attendu, le statut est toujours en attente.</li></ul>                                                 |
| <p><code>UNDELIV</code></p><ul><li>Le message a été envoyé à l’opérateur, mais n’a pas pu être livré, car un accusé de réception avec le statut « <code>UNDELIV</code> » été annulé par l’opérateur.</li></ul>                                           |
| <p><code>ACCEPTD</code></p><ul><li>Le SMS a été accepté et sera envoyé.</li></ul>                                                                                                                                                                        |
| <p><code>UNKNOWN</code></p><ul><li>Une erreur inconnue s’est produite.</li></ul>                                                                                                                                                                         |
| <p><code>ENROUTE</code></p><ul><li>Le message est en route.</li></ul>                                                                                                                                                                                    |
| <p><code>EXPIRED</code></p><ul><li>Le message a été envoyé et a expiré en raison d’un dépassement de sa période de validité (notre plate-forme par défaut est de 48 heures), ou l’opérateur a renvoyé <code>EXPIRED</code> comme statut final.</li></ul> |
| <p><code>REJECTD</code></p><ul><li>Le message a été envoyé, mais il a été rejeté par l’opérateur et a renvoyé <code>REJECTD</code> comme statut final.</li></ul>                                                                                         |

### Vérification des numéros <a href="#hlr_code" id="hlr_code"></a>

| Codes | Message                                                     |
| ----- | ----------------------------------------------------------- |
| 2     | Le champ phoneNumber est requis                             |
| 11    | Crédit insuffisant                                          |
| 13    | Aucun prix par défaut n’a été trouvé vers cette destination |
| 14    | Le numéro est dans la liste des STOP SMS                    |
| 19    | Les numéros doivent-être séparés par une virgule            |
| 50    | Le nombre de numéros autorisés est de 500 maxi              |
| 55    | Aucun numéro à envoyer                                      |
| 96    | L’IP n’est pas autorisée                                    |

### Location <a href="#location_code" id="location_code"></a>

| Codes | Message                                                               |
| ----- | --------------------------------------------------------------------- |
| 3     | Le paramètre parameters est requis                                    |
| 4     | Le paramètre op est requis                                            |
| 5     | Le paramètre urlNotification n’est pas une URL valide                 |
| 6     | Cette opération n’est pas autorisé                                    |
| 7     | Le paramètre sexe est requis                                          |
| 8     | Le paramètre sexe doit être uniquement m,h or f                       |
| 9     | Le paramètre minAge est requis                                        |
| 11    | Crédit insuffisant                                                    |
| 12    | Le paramètre minAge doit être supérieur à 17                          |
| 13    | Le paramètre maxAge est requis                                        |
| 14    | Le paramètre maxAge doit être inférieur à 99                          |
| 15    | Le paramètre interest doit être supérieur à 0                         |
| 16    | Le paramètre interest ne peut pas être vide                           |
| 17    | Le paramètre subInterest ne doit pas être vide                        |
| 18    | Le paramètre subInterest doit être supérieur à 0                      |
| 19    | Les paramètres interest ou subInterest sont requis                    |
| 22    | Le paramètre category ne doit pas être vide                           |
| 23    | Le paramètre category doit être supérieur à 0                         |
| 24    | Les paramètres Type est requis                                        |
| 25    | Le paramètre Localite est requis                                      |
| 26    | Le paramètre Volume est requis                                        |
| 27    | Le volume souhaité ne peut pas être supérieur au volume disponible    |
| 28    | Le paramètre DesiredVolume ne peux pas être supérieur au volume total |
| 31    | Le paramètre token est requis                                         |
| 32    | La demande de location est introuvable                                |
| 33    | Le fichier de location est introuvable                                |
| 34    | Le fichier de location a déjà été utilisé                             |
| 35    | Le fichier de location est en cours de téléchargement                 |
| 36    | La location du fichier a échoué                                       |
| 61    | La requête semble invalide et n’a retourné aucun résultat             |
| 96    | L’IP n’est pas autorisée                                              |

### Sous-compte <a href="#subaccount_code" id="subaccount_code"></a>

| Codes | Message                                           |
| ----- | ------------------------------------------------- |
| 2     | Vous n’êtes pas autorisé à créer des sous-comptes |
| 3     | Le champ Credit est requis                        |
| 4     | Le champ tokenSubaccount est requis               |
| 5     | Le champ credit doit être supérieur à 0           |
| 6     | Le sous-compte est introuvable                    |
| 7     | Crédit insuffisant pour le sous-compte            |
| 11    | Crédit insuffisant                                |
| 96    | L’IP n’est pas autorisée                          |

### HLR

Code des status: PENDING (statusGrpId: 1)

**Le message a été traité et envoyé à l’opérateur mobile.**

| statusId | Status                                                                                                                                                                                                     |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 3        | <p><code>PENDING\_WAITING\_DELIVERY</code></p><ul><li>Le message a été traité et envoyé. Le rapport de livraison n’a pas encore été reçu et est attendu, donc le statut est toujours en attente.</li></ul> |
| 7        | <p><code>PENDING\_ENROUTE</code></p><ul><li>Le message a été traité et envoyé à l’opérateur mobile.</li></ul>                                                                                              |
| 26       | <p><code>PENDING\_ACCEPTED</code></p><ul><li>Le message a été accepté et traité, et est prêt à être envoyé à l’opérateur.</li></ul>                                                                        |

#### UNDELIVERABLE (statusGrpId: 2)

**Le message n’a pas été délivré.**

| statusId | Status                                                                                                                                                                                                                    |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 4        | <p><code>UNDELIVERABLE\_REJECTED\_OPERATOR</code></p><ul><li>Un message a été envoyé à l’opérateur, un rapport de livraison avec le statut “REJECTED” a été retourné.</li></ul>                                           |
| 9        | <p><code>UNDELIVERABLE\_NOT\_DELIVERED</code></p><ul><li>Le message a été envoyé à l’opérateur, mais n’a pas pu être livré, un rapport de livraison avec le statut “UNDELIVERED” a été renvoyé par l’opérateur.</li></ul> |

#### DELIVERED (statusGrpId: 3)

**Le message a été traité et délivré avec succès.**

| statusId | Status                                                                                                                    |
| -------- | ------------------------------------------------------------------------------------------------------------------------- |
| 2        | <p><code>DELIVERED\_TO\_OPERATOR</code></p><ul><li>Le message a été envoyé et livré avec succès à l’opérateur.</li></ul>  |
| 5        | <p><code>DELIVERED\_TO\_HANDSET</code></p><ul><li>Le message a été traité et remis au destinataire avec succès.</li></ul> |

#### EXPIRED (statusGrpId: 4)

Le message a été envoyé et a expiré soit parce qu’il était en attente au-delà de sa période de validité (notre plate-forme est configurée par défaut sur 48 heures), soit parce que le rapport de livraison de l’opérateur a rétabli le statut “`EXPIRED`” comme statut final.

| statusId | Status                                                                                                                                                                                                                                              |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 15       | <p><code>EXPIRED\_EXPIRED</code></p><ul><li>Le message a été reçu et envoyé à l’opérateur. Toutefois, il est resté en attente jusqu’à l’expiration de la période de validité ou jusqu’à ce que l’opérateur ait renvoyé le statut EXPIRED.</li></ul> |
| 29       | <p><code>EXPIRED\_DLR\_UNKNOWN</code></p><ul><li>Le message a été reçu et transmis à l’opérateur pour livraison. Toutefois, le rapport de livraison de l’opérateur n’a pas été formaté correctement ou n’a pas été reconnu comme valable.</li></ul> |

#### REJECTED (statusGrpId: 5)

**Le message a été reçu mais a été rejeté l’opérateur.**

| statusId | Status                                                                                                                                                                                                                                                                                                                                            |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 6        | <p><code>REJECTED\_NETWORK</code></p><ul><li>Le message a été reçu, mais le réseau est hors de notre couverture.</li></ul>                                                                                                                                                                                                                        |
| 8        | <p><code>REJECTED\_PREFIX\_MISSING</code></p><ul><li>Le message a été reçu mais a été rejeté car le numéro n’est pas reconnu en raison d’un préfixe ou d’une longueur de numéro incorrecte. Ces informations sont différentes pour chaque réseau et sont régulièrement mises à jour.</li></ul>                                                    |
| 10       | <p><code>REJECTED\_DND</code></p><ul><li>Le message a été reçu et rejeté parce que l’utilisateur est abonné aux services DND (Ne pas déranger), ce qui désactive tout trafic de service vers son numéro.</li></ul>                                                                                                                                |
| 11       | <p><code>REJECTED\_SOURCE</code></p><ul><li>Votre compte est configuré pour n’accepter que les ID d’expéditeur enregistrés alors que l’ID d’expéditeur défini dans la demande n’a pas été enregistré sur votre compte.</li></ul>                                                                                                                  |
| 21       | <p><code>REJECTED\_SYSTEM\_ERROR</code></p><ul><li>La demande a été rejetée en raison d’une erreur de système, veuillez réessayer la soumission ou contacter notre équipe de support technique pour plus de détails.</li></ul>                                                                                                                    |
| 52       | <p><code>REJECTED\_DESTINATION</code></p><ul><li>La demande a été reçue, mais la destination n’est pas valide – le préfixe du numéro n’est pas correct car il ne correspond à un préfixe valide d’aucun opérateur de téléphonie mobile. La longueur du numéro est également prise en considération pour vérifier la validité du numéro.</li></ul> |

### Code des erreurs (HLR)

**OK (errorGrpId: 0)**

La demande a été traitée avec succès.

| errorId | Permanent | Error                                                                                                                                                                                                  |
| ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 0       | false     | <p><code>NO\_ERROR</code></p><ul><li>Aucune description d’erreur n’est fournie. Généralement renvoyé pour livraison réussie ou lorsque le code d’erreur n’a pas été renvoyé par l’opérateur.</li></ul> |

#### HANDSET\_ERRORS (errorGrpId: 1)

La demande n’a pas été complétée en raison de problèmes liés au téléphone portable.

| errorId | Permanent | Error                                                                                                                                                                                                                                                                                                                         |
| ------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1       | true      | <p><code>EC\_UNKNOWN\_SUBSCRIBER</code></p><ul><li>Le numéro n’existe pas ou n’a pas été attribué à un abonné actif dans la base de données des utilisateurs de l’opérateur.</li></ul>                                                                                                                                        |
| 5       | false     | <p><code>EC\_UNIDENTIFIED\_SUBSCRIBER</code></p><ul><li>Abonné non identifié</li></ul>                                                                                                                                                                                                                                        |
| 6       | false     | <p><code>EC\_ABSENT\_SUBSCRIBER\_SM</code></p><ul><li>L’abonné est détecté comme étant indisponible, car il n’y a pas eu de réponse à la radiomessagerie du combiné. Cela est souvent dû au fait que le combiné est éteint ou se trouve dans une zone de faible signal. S’applique à la version 3 du protocole MAP.</li></ul> |
| 7       | false     | <p><code>EC\_UNKNOWN\_EQUIPMENT</code></p><ul><li>L’appareil mobile n’a pas été reconnu par l’EIR (Equipment Identity Register), lors de la vérification de l’appareil au niveau du protocole MAP sur l’infrastructure de l’opérateur.</li></ul>                                                                              |
| 8       | false     | <p><code>EC\_ROAMING\_NOT\_ALLOWED</code></p><ul><li>L’abonné est actuellement en itinérance dans un autre pays ou dans l’infrastructure d’un autre opérateur – la fourniture de l’itinérance n’est pas garantie en raison de l’absence d’accords d’itinérance entre de nombreux opérateurs différents.</li></ul>             |
| 9       | true      | <p><code>EC\_ILLEGAL\_SUBSCRIBER</code></p><ul><li>Abonné illégal</li></ul>                                                                                                                                                                                                                                                   |
| 11      | true      | <p><code>EC\_TELESERVICE\_NOT\_PROVISIONED</code></p><ul><li>Le service mobile de l’abonné a été suspendu par l’opérateur.</li></ul>                                                                                                                                                                                          |
| 12      | true      | <p><code>EC\_ILLEGAL\_EQUIPMENT</code></p><ul><li>Équipement illégal</li></ul>                                                                                                                                                                                                                                                |
| 13      | false     | <p><code>EC\_CALL\_BARRED</code></p><ul><li>Le message est rejeté en raison de l’interdiction du service de messagerie, le blocage est fixé par l’opérateur ou l’abonné pour le numéro.</li></ul>                                                                                                                             |
| 27      | false     | <p><code>EC\_ABSENT\_SUBSCRIBER</code></p><ul><li>L’abonné est hors ligne dans le réseau, comme le confirme la réponse du combiné à la radiomessagerie. Cela est souvent dû au fait que le combiné est éteint.</li></ul>                                                                                                      |
| 31      | false     | <p><code>EC\_SUBSCRIBER\_BUSY\_FOR\_MT\_SMS</code></p><ul><li>L’abonné est occupé pour Mt SMS</li></ul>                                                                                                                                                                                                                       |
| 32      | false     | <p><code>EC\_SM\_DELIVERY\_FAILURE</code></p><ul><li>Échec de la livraison</li></ul>                                                                                                                                                                                                                                          |
| 33      | false     | <p><code>EC\_MESSAGE\_WAITING\_LIST\_FULL</code></p><ul><li>Liste d’attente des messages complète</li></ul>                                                                                                                                                                                                                   |
| 34      | false     | <p><code>EC\_SYSTEM\_FAILURE</code></p><ul><li>Défaillance du système</li></ul>                                                                                                                                                                                                                                               |
| 35      | false     | <p><code>EC\_DATA\_MISSING</code></p><ul><li>Données manquantes</li></ul>                                                                                                                                                                                                                                                     |
| 36      | false     | <p><code>EC\_UNEXPECTED\_DATA\_VALUE</code></p><ul><li>Valeur inattendue des données</li></ul>                                                                                                                                                                                                                                |
| 255     | false     | <p><code>EC\_UNKNOWN\_ERROR</code></p><ul><li>Erreur inconnue</li></ul>                                                                                                                                                                                                                                                       |
| 256     | false     | <p><code>EC\_SM\_DF\_MEMORYCAPACITYEXCEEDED</code></p><ul><li>Il y a eu une erreur d’équipement de l’abonné mobile, alors que la mémoire du combiné a été dépassée.</li></ul>                                                                                                                                                 |
| 257     | false     | <p><code>EC\_SM\_DF\_EQUIPMENTPROTOCOLERROR</code></p><ul><li>Il y a eu une erreur dans l’équipement de l’abonné mobile.</li></ul>                                                                                                                                                                                            |
| 258     | false     | <p><code>EC\_SM\_DF\_EQUIPMENTNOTSM\_EQUIPPED</code></p><ul><li>Il y a eu une erreur dans l’équipement de l’abonné mobile.</li></ul>                                                                                                                                                                                          |
| 259     | false     | <p><code>EC\_SM\_DF\_UNKNOWNSERVICECENTRE</code></p><ul><li>Il y a eu une erreur dans l’équipement de l’abonné mobile.</li></ul>                                                                                                                                                                                              |
| 260     | false     | <p><code>EC\_SM\_DF\_SC\_CONGESTION</code></p><ul><li>Il y a eu une erreur dans l’équipement de l’abonné mobile.</li></ul>                                                                                                                                                                                                    |
| 261     | false     | <p><code>EC\_SM\_DF\_INVALIDSME\_ADDRESS</code></p><ul><li>Il y a eu une erreur dans l’équipement de l’abonné mobile.</li></ul>                                                                                                                                                                                               |
| 262     | false     | <p><code>EC\_SM\_DF\_SUBSCRIBERNOTSC\_SUBSCRIBER</code></p><ul><li>Il y a eu une erreur dans l’équipement de l’abonné mobile.</li></ul>                                                                                                                                                                                       |
| 500     | false     | <p><code>EC\_PROVIDER\_GENERAL\_ERROR</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                         |
| 502     | false     | <p><code>EC\_NO\_RESPONSE</code></p><ul><li>Le message a été traité et transmis avec succès à l’opérateur, mais l’opérateur n’a pas répondu à la demande de soumission du message, ou l’erreur a été annulée par l’opérateur. L’erreur s’applique également à des erreurs similaires au niveau du réseau SS7.</li></ul>       |
| 503     | false     | <p><code>EC\_SERVICE\_COMPLETION\_FAILURE</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                     |
| 504     | false     | <p><code>EC\_UNEXPECTED\_RESPONSE\_FROM\_PEER</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                 |
| 507     | false     | <p><code>EC\_MISTYPED\_PARAMETER</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                              |
| 508     | false     | <p><code>EC\_NOT\_SUPPORTED\_SERVICE</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                          |
| 509     | false     | <p><code>EC\_DUPLICATED\_INVOKE\_ID</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                           |
| 1024    | false     | <p><code>EC\_OR\_APPCONTEXTNOTSUPPORTED</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                       |
| 1025    | false     | <p><code>EC\_OR\_INVALIDDESTINATIONREFERENCE</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                  |
| 1026    | false     | <p><code>EC\_OR\_INVALIDORIGINATINGREFERENCE</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                  |
| 1027    | false     | <p><code>EC\_OR\_ENCAPSULATEDAC\_NOTSUPPORTED</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                 |
| 1028    | false     | <p><code>EC\_OR\_TRANSPORTPROTECTIONNOTADEQUATE</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                               |
| 1029    | false     | <p><code>EC\_OR\_NOREASONGIVEN</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                                                |
| 1030    | false     | <p><code>EC\_OR\_POTENTIALVERSIONINCOMPATIBILITY</code></p><ul><li>Erreur générale de protocole de réseau, causée par des versions de protocole de réseau d’opérateur ou des paramètres incompatibles entre deux composants de réseau.</li></ul>                                                                              |
| 1031    | false     | <p><code>EC\_OR\_REMOTENODENOTREACHABLE</code></p><ul><li>L’abonné mobile n’était pas joignable en raison d’une erreur de protocole de l’opérateur de réseau.</li></ul>                                                                                                                                                       |
| 1152    | false     | <p><code>EC\_NNR\_NOTRANSLATIONFORANADDRESSOFSUCHNATURE</code></p><ul><li>L’abonné mobile n’était pas joignable en raison d’une erreur de protocole de l’opérateur de réseau.</li></ul>                                                                                                                                       |
| 1153    | false     | <p><code>EC\_NNR\_NOTRANSLATIONFORTHISSPECIFICADDRESS</code></p><ul><li>Pas de traduction pour cette adresse spécifique</li></ul>                                                                                                                                                                                             |
| 1154    | false     | <p><code>EC\_NNR\_SUBSYSTEMCONGESTION</code></p><ul><li>L’abonné mobile n’était pas joignable en raison d’une erreur de protocole de l’opérateur de réseau.</li></ul>                                                                                                                                                         |
| 1155    | false     | <p><code>EC\_NNR\_SUBSYSTEMFAILURE</code></p><ul><li>L’abonné mobile n’était pas joignable en raison d’une erreur de protocole de l’opérateur de réseau.</li></ul>                                                                                                                                                            |
| 1156    | false     | <p><code>EC\_NNR\_UNEQUIPPEDUSER</code></p><ul><li>L’abonné mobile n’était pas joignable en raison d’une erreur de protocole de l’opérateur de réseau.</li></ul>                                                                                                                                                              |
| 1157    | false     | <p><code>EC\_NNR\_MTPFAILURE</code></p><ul><li>L’abonné mobile n’était pas joignable en raison d’une erreur de protocole de l’opérateur de réseau.</li></ul>                                                                                                                                                                  |
| 1158    | false     | <p><code>EC\_NNR\_NETWORKCONGESTION</code></p><ul><li>L’abonné mobile n’était pas joignable en raison d’une erreur de protocole de l’opérateur de réseau.</li></ul>                                                                                                                                                           |

#### USER\_ERRORS (errorGrpId: 2)

Une erreur d’utilisateur s’est produite.

| errorId | Permanent | Error                                                                                                                                                                                                                                                                                                                                             |
| ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 2049    | true      | <p><code>EC\_IMSI\_BLACKLISTED</code></p><ul><li>IMSI sur liste noire.</li></ul>                                                                                                                                                                                                                                                                  |
| 2052    | true      | <p><code>EC\_BLACKLISTED\_DESTINATIONADDRESS</code></p><ul><li>Le numéro de destination a été mis sur liste noire soit à la demande de l’opérateur, soit sur votre compte via les portails web SMSPartner – veuillez supprimer la liste noire sur votre compte via portal.infobip.com ou contactez le support pour plus d’informations.</li></ul> |
| 2053    | true      | <p><code>EC\_BLACKLISTED\_SENDERADDRESS</code></p><ul><li>Le numéro de l’expéditeur a été mis sur liste noire soit à la demande de l’opérateur, soit sur votre compte via les portails web SMSPartner – veuillez supprimer la liste noire sur votre compte via portal.infobip.com ou contactez le support pour plus d’informations.</li></ul>     |
| 2053    | true      | <p><code>EC\_SOURCE\_ADDRESS\_BLACKLISTED</code></p><ul><li>L’adresse source est sur la liste noire du compte SMSPartner.</li></ul>                                                                                                                                                                                                               |
| 4096    | true      | <p><code>EC\_INVALID\_PDU\_FORMAT</code></p><ul><li>Format PDU non valide.</li></ul>                                                                                                                                                                                                                                                              |
| 4100    | true      | <p><code>EC\_MESSAGE\_CANCELED</code></p><ul><li>La demande a été reçue, mais n’a pas été envoyée à l’instance suivante pendant sa période de validité, et est expirée avec le code d’erreur approprié EC\_MESSAGE\_CANCELED, ou le même code d’erreur a été renvoyé par l’opérateur.</li></ul>                                                   |
| 4101    | true      | <p><code>EC\_VALIDITYEXPIRED</code></p><ul><li>Le message a été envoyé à l’instance suivante, et n’a pas été délivré dans la période de validité du message, il est donc expiré avec le code d’erreur approprié EC\_VALIDITYEXPIRED ou le code d’erreur a été renvoyé par l’opérateur.</li></ul>                                                  |
| 4102    | true      | <p><code>EC\_NOTSUBMITTEDTOSMPPCHANNEL</code></p><ul><li>Ne peut pas être transférée via le SMPP en raison de l’absence de conectivité du SMPP.</li></ul>                                                                                                                                                                                         |
| 4103    | true      | <p><code>EC\_DESTINATION\_FLOODING</code></p><ul><li>En ce qui concerne le statut REJECTED\_FLOODING\_FILTER, le message est rejeté en raison du nombre de messages envoyés à un seul numéro.</li></ul>                                                                                                                                           |
| 4104    | true      | <p><code>EC\_DESTINATION\_TXT\_FLOODING</code></p><ul><li>En ce qui concerne le statut REJECTED\_FLOODING\_FILTER, le message est rejeté en raison du nombre de messages identiques envoyés à un seul numéro.</li></ul>                                                                                                                           |

#### OPERATOR\_ERRORS (errorGrpId: 3)

La demande n’a pas été complétée en raison de problèmes liés à l’opérateur.

| errorId | Permanent | Error                                                                                                                                                                                                                                             |
| ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 10      | true      | <p><code>EC\_BEARER\_SERVICE\_NOT\_PROVISIONED</code></p><ul><li>Service au porteur non fourni</li></ul>                                                                                                                                          |
| 20      | false     | <p><code>EC\_SS\_INCOMPATIBILITY</code></p><ul><li>Incompatibilité SS</li></ul>                                                                                                                                                                   |
| 51      | true      | <p><code>EC\_RESOURCE\_LIMITATION</code></p><ul><li>Indique que l’opération MAP invoquée n’a pas pu être terminée en raison de la congestion du réseau – il s’agit d’une erreur de congestion du réseau SS7 au niveau du protocole MAP.</li></ul> |
| 71      | false     | <p><code>EC\_UNKNOWN\_ALPHABET</code></p><ul><li>Alphabet inconnu</li></ul>                                                                                                                                                                       |
| 501     | false     | <p><code>EC\_INVALID\_RESPONSE\_RECEIVED</code></p><ul><li>Réception d’une réponse non valable</li></ul>                                                                                                                                          |
| 2048    | false     | <p><code>EC\_TIME\_OUT</code></p><ul><li>Time Out</li></ul>                                                                                                                                                                                       |
| 2050    | true      | <p><code>EC\_DEST\_ADDRESS\_BLACKLISTED</code></p><ul><li>Le numéro a été trouvé sur la liste noire du DND (Do Not Disturb) fournie par l’opérateur, ou le même code d’erreur a été retourné par l’opérateur.</li></ul>                           |

### Envoi de messages vocaux / VMS <a href="#mail" id="mail"></a>

| Codes                      | Message                                   |
| -------------------------- | ----------------------------------------- |
| PHONE\_NUMBER\_REQUIRED    | Le numéro de téléphone est requis         |
| PHONE\_NUMBER\_SIZE\_ERROR | le nombre de numéros est supérieur à 500  |
| TOKEN\_AUDIO\_REQUIRED     | Le token de l’audio est requis            |
| NOTIFY\_URL\_INVALID       | L’url de notification est invalide        |
| SENDER\_NOT\_AUTHORIZED    | Le sender n’est pas autorisé              |
| SENDER\_INVALID            | Le sender est invalide                    |
| AUDIO\_FILE\_NOT\_FOUND    | Le fichier audio est introuvable          |
| DESTINATION\_INVALID       | Le numéro de téléphone n’est pas autorisé |
| NOT\_CREDIT                | Crédit insuffisant                        |
| PHONE\_NUMBER\_INVALID     | Numéro invalide                           |

### Envoi de Mail <a href="#mail" id="mail"></a>

| Codes | Message                                                                                  |
| ----- | ---------------------------------------------------------------------------------------- |
| 1     | La clé API est requise                                                                   |
| 2     | Le contenu du mail est requis                                                            |
| 3     | La clé API est requise                                                                   |
| 4     | Le sender email est requis                                                               |
| 5     | Le sender name ne peut-être vide                                                         |
| 8     | L’URL de la pièce jointe est requise                                                     |
| 9     | L’extension de la pièce jointe n’est pas autorisés                                       |
| 10    | Clef API incorrecte                                                                      |
| 11    | Crédit insuffisant                                                                       |
| 14    | Le mail est dans la liste des désinscriptions                                            |
| 15    | Le mail est déjà dans la liste d’envoi                                                   |
| 16    | Le nom de la pièce jointe ne peut-être vide                                              |
| 17    | Nombre de destinataires maximum dépassés                                                 |
| 18    | L’email du destinataires est requis                                                      |
| 19    | L’email du destinataire semble invalide                                                  |
| 20    | Compte désactivé                                                                         |
| 21    | Le nom du destinataire ne peut-être vide                                                 |
| 22    | La liste des destinataires est requise                                                   |
| 23    | L’email du destinataire en réponse est requis                                            |
| 24    | L’email du destinataire en réponse semble invalide                                       |
| 25    | Le nom du destinataire en réponse ne peut-être vide                                      |
| 30    | Compte bloqué                                                                            |
| 40    | L’accès à l’API est refusé                                                               |
| 45    | La date est requise                                                                      |
| 46    | L’heure est requise                                                                      |
| 47    | Le chiffre des minutes est invalide                                                      |
| 48    | Les minutes doivent-être comprise entre 5 et 55 dans un interval de 5 minutes            |
| 49    | La date est invalide                                                                     |
| 50    | Le nombre de mails autorisés est de 500 maxi                                             |
| 55    | Aucun prix par default n’a été trouvé                                                    |
| 90    | Le JSON est malformé: erreur de syntaxe                                                  |
| 96    | L’IP n’est pas autorisée                                                                 |
| 429   | trop de requêtes effectuées en une minute (limite : 2000 requêtes / minute / Adresse IP) |
| 500   | Problème lors de l’ajout du mail dans la file d’attente                                  |


# SDKS

Dans le cadre de vos envois sur SMS Partner, nous proposons des SDK officiels sur de nombreux langages de programmation afin que vous puissiez facilement envoyer vos messages à ajouter des messages.

<table data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><strong>PHP</strong></td><td><a href="/files/3uoHefgboeayNdsIjlYF">/files/3uoHefgboeayNdsIjlYF</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-PHP">https://github.com/smspartnerfr/SMS-API-PHP</a></td></tr><tr><td align="center"><strong>Ruby</strong></td><td><a href="/files/f5SzE0Mr5317L0A0wJgw">/files/f5SzE0Mr5317L0A0wJgw</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-RUBY">https://github.com/smspartnerfr/SMS-API-RUBY</a></td></tr><tr><td align="center"><strong>Go</strong></td><td><a href="/files/FcUoY9Tkjs4B3vgSZi28">/files/FcUoY9Tkjs4B3vgSZi28</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-GO">https://github.com/smspartnerfr/SMS-API-GO</a></td></tr><tr><td align="center"><strong>Swift</strong></td><td><a href="/files/bmVUZ1FDgbBtF1MjWePg">/files/bmVUZ1FDgbBtF1MjWePg</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-SWIFT">https://github.com/smspartnerfr/SMS-API-SWIFT</a></td></tr><tr><td align="center"><strong>VB.net</strong></td><td><a href="/files/0p86VoeQtyMswAGscFWO">/files/0p86VoeQtyMswAGscFWO</a></td><td><a href="https://github.com/smspartnerfr/">https://github.com/smspartnerfr/</a></td></tr><tr><td align="center"><strong>Python</strong></td><td><a href="/files/E9tyOKjrU5uJsS29A4nP">/files/E9tyOKjrU5uJsS29A4nP</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-PYTHON">https://github.com/smspartnerfr/SMS-API-PYTHON</a></td></tr><tr><td align="center"><strong>Java</strong></td><td><a href="/files/NLCRQLA4cpRUs4WVLMYh">/files/NLCRQLA4cpRUs4WVLMYh</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-JAVA">https://github.com/smspartnerfr/SMS-API-JAVA</a></td></tr><tr><td align="center"><strong>Nodejs</strong></td><td><a href="/files/AohAvb2J5ot7x62cwiLW">/files/AohAvb2J5ot7x62cwiLW</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-NodeJS">https://github.com/smspartnerfr/SMS-API-NodeJS</a></td></tr><tr><td align="center"><strong>C#</strong></td><td><a href="/files/ii8kklBNOGM7X1b6HGiK">/files/ii8kklBNOGM7X1b6HGiK</a></td><td><a href="https://github.com/smspartnerfr/SMS-API-Csharp">https://github.com/smspartnerfr/SMS-API-Csharp</a></td></tr><tr><td align="center"><strong>cURL</strong></td><td><a href="/files/dvX9XiI3Anx4lYoGzE1k">/files/dvX9XiI3Anx4lYoGzE1k</a></td><td><a href="https://github.com/smspartnerfr/">https://github.com/smspartnerfr/</a></td></tr></tbody></table>


# Welcome

Welcome to the documentation of our SMS Partner, Voice Partner and Mail Partner APIs.

### Discover

<table data-column-title-hidden data-view="cards" data-full-width="false"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>SMS Partner</strong></td><td>Discover the SMS API</td><td></td><td></td><td><a href="/pages/JOPXH3RvDKsINlPzXsda">/pages/JOPXH3RvDKsINlPzXsda</a></td></tr><tr><td><strong>Voice Partner</strong></td><td>Discover the Voice API</td><td></td><td></td><td><a href="/pages/O4vjsldgmm1irorPZszd">/pages/O4vjsldgmm1irorPZszd</a></td></tr><tr><td><strong>Mail Partner</strong></td><td>Discover the Mail API</td><td></td><td></td><td><a href="/pages/v3i4o5q3fiYWZNX2r84k">/pages/v3i4o5q3fiYWZNX2r84k</a></td></tr><tr><td><strong>Error Codes</strong></td><td>See the list of error codes</td><td></td><td></td><td><a href="/pages/t9UocnsyRwI1MRgv4VPO">/pages/t9UocnsyRwI1MRgv4VPO</a></td></tr><tr><td><strong>SDKS</strong></td><td>Discover our SDKS</td><td></td><td></td><td><a href="/pages/KgJDbLtX71VvvOH0K9ix">/pages/KgJDbLtX71VvvOH0K9ix</a></td></tr></tbody></table>


# SMS Partner

Introduction to the SMS Partner API

SMS messages are sent via the [SMS Partner](https://smspartner.fr) API. From the website, you have immediate access to our free API: it allows you to easily integrate our SMS services into your website, software, or CRM application in PHP, ASP, .NET, Java, or any other language.

### Required Parameters

Each API request must include at least the following parameters:

| Name     | Description                                                                                                      |
| -------- | ---------------------------------------------------------------------------------------------------------------- |
| `apiKey` | Your account's API key. You can obtain it from your [SMS Partner dashboard](https://my.smspartner.fr/dashboard). |

### Optional Parameters

| Name      | Description                                 |
| --------- | ------------------------------------------- |
| `_format` | Response format: `json` (default) or `xml`. |

**Example call:**

```
https://api.smspartner.fr/v1/me?apiKey=YOUR_API_KEY&_format=json
```

### Response Format and Content-Type

You can format your request in either `json` or `xml`.\
You must set the appropriate header (`Content-Type`) accordingly:

| `_format` | Content-Type       |
| --------- | ------------------ |
| json      | `application/json` |
| xml       | `application/xml`  |

**Example JSON request:**

```http
POST /v1/send HTTP/1.1
Host: api.smspartner.fr
Content-Type: application/json

{
    "apiKey": "API_KEY",
    "phoneNumbers": "+33600000000",
    "message": "Hello world"
}
```

### Requests

All API requests must be sent to:

```
http://api.smspartner.fr/v1/{command}
```

`{command}` corresponds to the API call you wish to make, with the parameters included in the body (`POST`) or in the URL (`GET`).

***

### Download a PHP Example

Directly download a usage example in PHP:

***

Feel free to check out our SDKs available on this site.

{% content-ref url="/pages/KgJDbLtX71VvvOH0K9ix" %}
[SDKS](/en/sdks)
{% endcontent-ref %}


# Webhooks

Manage the statuses and replies of your SMS campaigns

## Reply on a short number

After sending a campaign from our short number, SMS Partner lets you receive replies.\
For more information, [**contact us**](https://www.smspartner.fr/contact).

{% hint style="info" %}

#### Please note

To receive replies, you must set your reply reception URL

in your [SMS API](https://my.smspartner.fr/dashboard/api/paramaters) tab
{% endhint %}

**Example of JSON response sent via POST**

```json
{
"type":"response",
"phone_number":"+336....",
"text":"test",
"message_id":1111111
}

```

**For a STOP SMS the webhook response will be**

```json
{
"type":"stop",
"phone_number":"+336...",
"text":"Stop",
"message_id":111111
}
```

## Reply on a long number (virtual number)

SMS Partner offers the rental of a long number (example: 06 XX XX XX XX)\
To learn more about creating a dedicated long number, [contact us](https://www.smspartner.fr/contact/).

#### Example of a simple response (160 characters maximum)

```json
{
  "msisdn": "33xxxxxxxxx",
  "to": "33xxxxxxxxx",
  "messageId": "1235-1234-1233-4665",
  "text": "Test",
  "type": "text",
  "keyword": "Test",
  "message-timestamp": "2016-03-10 09:51:46"
}
```

#### Example of a response for a long SMS (+160 characters)

```json
{
  "msisdn": "33xxxxxxxxx",
  "to": "33xxxxxxxxx",
  "messageId": "a1b2c3d4-e5f6-40a1-80b2-c9d0e1f....", //in UUID format
  "concat": "true",
  "concat-ref": "171",
  "concat-total": "2",
  "concat-part": "1",
  "text": "   Long message....",
  "type": "text",
  "keyword": "MESSAGELONG",
  "message-timestamp": "2016-03-09 16:00:30"
}
 
{
  "msisdn": "33xxxxxxxxx",
  "to": "33xxxxxxxxx",
  "messageId": "a1b2c3d4-e5f6-40a1-80b2-c9d0e1...", //in UUID format
  "concat": "true",
  "concat-ref": "171",
  "concat-total": "2",
  "concat-part": "2",
  "text": "....very long",
  "type": "text",
  "keyword": "TRESLONG",
  "message-timestamp": "2016-03-09 16:00:31"
}
```

## DLR - retrieving SMS statuses

**The SMS delivery status can be sent via the webhook using POST**

<pre class="language-json" data-overflow="wrap"><code class="lang-json"><strong>{
</strong>"status":"delivered",
"msgId":"11111111",
"date":1764768485,
"phone":"+336.......",
"cost":"0.049",
"currency":"EUR",
"tag":"...."
}
</code></pre>

The possible statuses are

* delivered: The SMS was delivered
* not delivered: The SMS was not delivered
* waiting: The SMS is pending at the operator


# Credits

This request is used to retrieve your available SMS credits, as well as the number of pending outgoing SMS.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/me`

Rate limit: 30 requests / 60 seconds *(see* [Rate limiting)](/en/api/sms-partner/rate-limiting)*)*

#### **Required Parameters**

<table><thead><tr><th width="142">Name</th><th>Value</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.smspartner.fr/dashboard/api/paramaters">Your API key</a></td></tr></tbody></table>

#### Optional Parameters

<table><thead><tr><th width="142">Name</th><th>Value</th></tr></thead><tbody><tr><td><code>_format</code></td><td><code>json</code> or <code>xml</code></td></tr></tbody></table>

#### Requests

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

```php
<?php
    // Prepare data for GET request
    $data = 'apiKey=YOUR_API_KEY';

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/me?'.$data);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);

    $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "me" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_balance(self):
		url = URL + "/me?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/me?apiKey=xxx
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Prepare data for the GET request
let data = 'apiKey=YOUR API KEY';
let url = 'https://api.smspartner.fr/v1/me?' + data;

https.get(url, (res) => {
  let data = '';

  // A chunk of data has been received.
  res.on('data', (chunk) => {
    data += chunk;
  });

  // The whole response has been received. Print the result.
  res.on('end', () => {
    console.log(JSON.parse(data));
  });

}).on("error", (err) => {
  // An error message will be printed in case of an error.
  console.log("Error: " + err.message);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class CreditsSms {
    public static void main(String[] args) {
        try {
            String apiKey = "your_api_key";
            String url = "https://api.smspartner.fr/v1/me?apiKey=" + apiKey;

            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");

            int responseCode = con.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println(response.toString());
            } else {
                System.out.println("GET request failed. Response Code: " + responseCode);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct Credits: View {
    @State private var credit: String = "Loading..."

    var body: some View {
        VStack {
            Text("My credit")
                .font(.title)
                .padding()

            Text(credit)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: getCredit)
    }

    func getCredit() {
        let apiKey = "Your-api-key"
        let urlString = "https://api.smspartner.fr/v1/me?apiKey=\(apiKey)"

        guard let url = URL(string: urlString) else {
            print("Invalid URL")
            return
        }

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

        task.resume()
    }
}

struct CreditView_Previews: PreviewProvider {
    static var previews: some View {
        Credits()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	apiKey := "your_api_key"
	url := "https://api.smspartner.fr/v1/me?apiKey=" + apiKey

	response, err := http.Get(url)
	if err != nil {
		fmt.Println("GET request failed:", err)
		return
	}
	defer response.Body.Close()

	if response.StatusCode == http.StatusOK {
		bodyBytes, err := ioutil.ReadAll(response.Body)
		if err != nil {
			fmt.Println("Failed to read response body:", err)
			return
		}
		fmt.Println(string(bodyBytes))
	} else {
		fmt.Println("GET request failed. Response Code:", response.StatusCode)
	}
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var uri = new Uri($"https://api.smspartner.fr/v1/me?apiKey={apiKey}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Response**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "user": {
        "username": "exemple@email.com",
        "firstname": "John",
        "lastname": "Doe"
    },
    "credits": {
        "creditSms": 269082,
        "creditSmsECO": 444570,
        "creditHlr": 2045023,
        "toSend": 0,
        "solde": "10225.119",
        "currency": "EUR",
        "balance": "10225.119"
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>
        <username>exemple@email.com</username>
        <firstname>John</firstname>
        <lastname>Doe</lastname>
    </entry>
    <entry>
        <entry>269070</entry>
        <entry>444551</entry>
        <entry>2044937</entry>
        <entry>0</entry>
        <entry><![CDATA[10224.688]]></entry>
        <entry><![CDATA[EUR]]></entry>
        <entry><![CDATA[10224.688]]></entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### **Error Codes**

| Response Code | Message               |
| ------------- | --------------------- |
| 10            | Invalid API key       |
| 200           | Everything went fine! |


# Sub-accounts

Manage your sub-accounts.

### Methods

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Activation</strong></td><td>How to activate the sub-account feature</td><td><a href="/pages/BkoaF8tXHdxQomdYp50E">/pages/BkoaF8tXHdxQomdYp50E</a></td></tr><tr><td><strong>Create a Sub-account</strong></td><td>Create a sub-account under your account</td><td><a href="/pages/2GBgSPoCU5KHk5PMTgQV">/pages/2GBgSPoCU5KHk5PMTgQV</a></td></tr><tr><td><strong>Delete Sub-account</strong></td><td>Delete a sub-account from your account</td><td><a href="/pages/DyVqqDKKc4SFetnxB3jz">/pages/DyVqqDKKc4SFetnxB3jz</a></td></tr><tr><td><strong>Sub-accounts List</strong></td><td>List your sub-accounts</td><td><a href="/pages/twbmaYILN60tYnk46sEY">/pages/twbmaYILN60tYnk46sEY</a></td></tr><tr><td><strong>Manage Sub-account Credits</strong></td><td>Manage your sub-accounts’ credits</td><td><a href="/pages/bGlkY2xUptnGDF6gg36S">/pages/bGlkY2xUptnGDF6gg36S</a></td></tr></tbody></table>


# Activation

Learn how to activate the sub-account creation feature.

### Request to activate the sub-account feature

{% hint style="info" %}
**How to activate this feature?**

Please contact [our technical team](https://www.smspartner.fr/contact/).
{% endhint %}

SMS Partner allows you to create sub-accounts. This way, you can manage an unlimited number of sub-accounts from your main account.

### Creating sub-accounts

{% hint style="info" %}
There are three ways to create sub-accounts from your master account.
{% endhint %}

* Via our API: See the [sub-account creation page](/en/api/sms-partner/sub-accounts/create-sub-account)
* Via Excel file: Download, fill in and send back the [template file](https://my.smspartner.fr/subaccount_model.xls).
* Via the platform: Once the option is activated, you can create sub-accounts [here](https://my.smspartner.fr/dashboard/sous-compte/liste-sous-compte).


# Create Sub-account

This request is used to create a sub-account.

## URL

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

#### **Required Parameters**

| Name         | Value                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey`     | [Your API key](https://my.smspartner.fr/dashboard/api)                                                                                                                                                                                                                                                                                                                                                                                 |
| `type`       | <p>Type of sub-account: this choice is final and cannot be modified later.<br></p><ul><li><code>simple</code>:<br>– The sub-account will not receive any emails or SMS.<br>– No phone number is required.<br>– Purchases are not allowed.</li><li><code>advanced</code>:<br>– A valid email is required.<br>– Registration process is the same as a standard account.<br>– A mobile phone number will be required at signup.</li></ul> |
| `parameters` | See below, depending on the sub-account type:                                                                                                                                                                                                                                                                                                                                                                                          |

**Simple sub-account parameters:**

* `email` *(optional)*: If left empty, an email will be generated automatically (e.g., <98755587@smspartner.fr>)
* `creditToAttribute` *(optional)*: Credits in euros added to the sub-account upon creation. These credits will be deducted from your master account.
* `title`, `firstname`, `lastname` *(optional)*: Sub-account’s title and owner’s names.

**Advanced sub-account parameters:**

* `email`: Valid email address of the sub-account owner
* `isBuyer`: `1` or `0`; if `1`, the sub-account can buy SMS on its own.
* Same optional fields as above (`creditToAttribute`, `title`, `firstname`, `lastname`)

#### Requests

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'type'=> 'advanced',
            'parameters'=>array(
                'email':'aaaa@bbb.ccc',
    	        'creditToAttribute':10,
    	        'isBuyer':0,
    	        'firstname':'prenom',
    	        'lastname':'nom'
            ));
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/create');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #send sms
    url = base_url & "subaccount/create"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""type"":""{1}"",""parameters"":""{2}""}}",
        apiKey,
        "advanced",
        {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"})
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def create(self,creditToAdd,userId):
 
		data = {"apiKey":APIKEY,"type":"advanced","parameters": {"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}
 
 
		url = URL + "/subaccount/create"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","type":"advanced","parameters":{"email":"aaaa@bbb.ccc","creditToAttribute":10,"isBuyer":0,"firstname":"prenom","lastname":"nom"}}' https://api.smspartner.fr/v1/subaccount/create
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Replace with your API key
const apiKey = "YOUR_API_KEY";

// Prepare the data for the POST request
const data = JSON.stringify({
  apiKey: apiKey,
  type: "advanced",
  parameters: {
    email: "aaaa@bbb.ccc",
    creditToAttribute: 10,
    isBuyer: 0,
    firstname: "prenom",
    lastname: "nom",
  },
});

// Define the options for the HTTP POST request to the SMS Partner API
const options = {
  hostname: "api.smspartner.fr",
  port: 443,
  path: "/v1/subaccount/create",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": data.length,
    "cache-control": "no-cache",
  },
};

// Perform the HTTP POST request with the options and data defined above
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  // Print the API response data to standard output
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

// Print an error if the HTTP POST request fails
req.on("error", (error) => {
  console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;


public class SubAccountCreation {
    public static void main(String[] args) {
        try {
            // Replace with your API key
            String apiKey = "YOUR_API_KEY";

            // Prepare the data for the POST request
            JSONObject parameters = new JSONObject();
            parameters.put("email", "aaaa@bbb.ccc");
            parameters.put("creditToAttribute", 10);
            parameters.put("isBuyer", 0);
            parameters.put("firstname", "prenom");
            parameters.put("lastname", "nom");

            JSONObject json = new JSONObject();
            json.put("apiKey", apiKey);
            json.put("type", "advanced");
            json.put("parameters", parameters);

            URL url = new URL("https://api.smspartner.fr/v1/subaccount/create");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

            // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream();
            os.write(json.toString().getBytes());
            os.flush();

            // Read the API response
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());

            // Print the JSON response
            System.out.println(response);

            // Close the HTTP connection
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

// Structure for the view "CreationSubCompte"
struct CreationSubCompte: View {
    var body: some View {
        // A button that calls the function createSubaccount() lorsqu'il est pressé
        Button(action: {
            createSubaccount()
        }) {
            Text("Créer sous-compte")
                .font(.system(size: 20))
                .foregroundColor(.white)
                .frame(minWidth: 0, maxWidth: .infinity)
                .padding()
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                .cornerRadius(10)
                .padding(.horizontal)
        }
    }

    // Fonction pour créer un sous-compte
    func createSubaccount() {
        let url = URL(string: "https://api.smspartner.fr/v1/subaccount/create")! // URL pour créer un sous-compte

        // Paramètres pour la requête
        let parameters: [String: Any] = [
            "apiKey": "TU_CLAVE_API", // Your API key
            "type": "advanced",
            "parameters": [
                "email": "aaaa@bbb.ccc", // Adresse e-mail du sous-compte
                "creditToAttribute": 10, // Credit to assign
                "isBuyer": 0, // Indique si le sous-compte est un acheteur
                "firstname": "prenom", // Prénom de l'utilisateur du sous-compte
                "lastname": "nom" // Nom de l'utilisateur du sous-compte
            ] as [String : Any]
        ]

        // Création de la requête
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("no-cache", forHTTPHeaderField: "cache-control")

        // Ajout du corps de la requête
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
        } catch let error {
            print(error.localizedDescription)
        }

        // Tâche pour envoyer la requête et recevoir la réponse
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            // Si une erreur survient, on l'affiche
            if let error = error {
                print("Erreur : \(error)")
            }
            // Sinon, on traite les données reçues
            else if let data = data {
                do {
                    // On tente de convertir les données reçues en JSON
                    if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                        print(json) // On affiche le JSON obtenu
                    }
                } catch let error {
                    print("Erreur : \(error)")
                }
            }
        }

        task.resume() // On lance la tâche
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type Fields struct {
	APIKey     string      `json:"apiKey"`
	Type       string      `json:"type"`
	Parameters Parameters `json:"parameters"`
}

type Parameters struct {
	Email            string `json:"email"`
	CreditToAttribute int    `json:"creditToAttribute"`
	IsBuyer          int    `json:"isBuyer"`
	Firstname        string `json:"firstname"`
	Lastname         string `json:"lastname"`
}

func main() {
	// Prepare data for POST request
	data := Fields{
		APIKey: "YOUR_API_KEY",
		Type:   "advanced",
		Parameters: Parameters{
			Email:            "aaaa@bbb.ccc",
			CreditToAttribute: 10,
			IsBuyer:          0,
			Firstname:        "prenom",
			Lastname:         "nom",
		},
	}

	payloadBuf := new(bytes.Buffer)
	json.NewEncoder(payloadBuf).Encode(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/create", payloadBuf)
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Add("Content-Type", "application/json")

	// Create HTTP client and send the request
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Print the response status and body
	log.Printf("Response status: %s", resp.Status)
	log.Printf("Response body: %s", string(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 fields = new
        {
            apiKey = "YOUR_API_KEY",
            type = "advanced",
            parameters = new 
            {
                email = "aaaa@bbb.ccc",
                creditToAttribute = 10,
                isBuyer = 0,
                firstname = "prenom",
                lastname = "nom"
            }
        };

        var json = JsonConvert.SerializeObject(fields);

        var uri = new Uri("https://api.smspartner.fr/v1/subaccount/create");
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        HttpResponseMessage response = await client.PostAsync(uri, content);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("La requête POST a échoué avec le code d'état : " + response.StatusCode);
        }
    }
}
```

{% endtab %}
{% endtabs %}

#### **Response**

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

```json
{
 "success":true,
 "code":200,
 "subaccount":
 {
    "email":"aaaa@bbb.ccc",
    "token":"token"
 },
 "sendConfirmMailTo":"aaaa@bbb.ccc",
 "parent_email":"emailparent@ddd.eee"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>
    <entry><![CDATA[aaaa@bbb.ccc]]></entry>
    <entry><![CDATA[token]]></entry>
  </entry>
  <entry><![CDATA[aaaa@bbb.ccc]]></entry>
  <entry><![CDATA[emailparent@ddd.eee]]></entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
    "success": false,
    "code": 10,
    "message": "Invalid API key"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry><![CDATA[Invalid API key]]></entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Code | Message                                                      |
| ---- | ------------------------------------------------------------ |
| 1    | API key is required                                          |
| 2    | Phone number is required                                     |
| 3    | `isBuyer` is required                                        |
| 4    | `type` is required (simple or advanced)                      |
| 5    | Sub-account type does not exist (must be simple or advanced) |
| 6    | Email is required                                            |
| 7    | An account with this email already exists                    |
| 8    | `creditToAttribute` must be greater than 0                   |
| 9    | Master account balance must be greater than 0                |
| 200  | All good!                                                    |


# Delete Sub-account

This request is used to delete a sub-account.

## URL

<mark style="color:red;">`DELETE`</mark> `https://api.smspartner.fr/v1/subaccount/delete`

#### **Required Parameters**

| Name     | Value                                                  |
| -------- | ------------------------------------------------------ |
| `apiKey` | [Your API key](https://my.smspartner.fr/dashboard/api) |
| `token`  | Sub-account identifier (token)                         |

#### Request

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

```
curl --location --request DELETE 'http://api.smspartner.fr/v1/subaccount/remove' \
--header 'Content-Type: application/json' \
--data-raw '{
   "apiKey": "YOUR_API_KEY",
   "token": "TOKEN SUBACCOUNT"}'
```

{% endtab %}
{% endtabs %}

#### **Response**

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

```json
{
   "success": true,
   "code": 200
}
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
  "success": false,
  "code": 10,
  "message": "Invalid API key"
}
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Message                    |
| ------------- | -------------------------- |
| 1             | Token is required          |
| 10            | API key is required        |
| 404           | Sub-account does not exist |


# Sub-account List

This request is used to list the sub-accounts of your main account.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/subaccount/list`

#### **Required Parameters**

| Name     | Value                                                              |
| -------- | ------------------------------------------------------------------ |
| `apiKey` | [Your API key](https://my.smspartner.fr/dashboard/api)             |
| `page`   | Page number (20 results per page). If omitted, page 1 is returned. |

#### **Optional Parameter**

| Name      | Value           |
| --------- | --------------- |
| `_format` | `json` or `xml` |

#### Requests

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/list?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #check credits
    Dim url As String
    url = base_url & "subaccount/list" & "?apiKey=" & apiKey
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_list_subaccount(self):
		url = URL + "/subaccount/list?apiKey=" + API_KEY
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/subaccount/list?apiKey=xxx&page=1
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Retrieves the list of sub-accounts
let data = 'apiKey=YOUR_API_KEY';
let url = 'https://api.smspartner.fr/v1/subaccount/list?' + data;

https.get(url, (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);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class RécupérationDesSousComptes {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/subaccount/list?" +
                    "apiKey=" + apiKey;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct ListeDesSousComptes: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Liste Des Sous Comptes")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: loadSubAccounts)
    }

    func loadSubAccounts() {
        let apiKey = "YOUR_API_KEY"
        let urlString = "https://api.smspartner.fr/v1/subaccount/list?apiKey=\(apiKey)"

        guard let url = URL(string: urlString) else {
            print("Invalid URL")
            return
        }

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print("Error: \(error)")
            } else if let data = data {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct ListeDesSousComptes_Previews: PreviewProvider {
    static var previews: some View {
        ListeDesSousComptes()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	apiKey := "YOUR_API_KEY"
	url := "https://api.smspartner.fr/v1/subaccount/list?apiKey=" + apiKey

	// Create GET request
	resp, err := http.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Print the response body
	log.Printf("Response body: %s", string(body))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        string apiKey = "YOUR_API_KEY";
        var uri = new Uri($"https://api.smspartner.fr/v1/subaccount/list?apiKey={apiKey}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Response**

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

```json
{
  "success": true,
  "code": 200,
  "total": 29,
  "nb_per_page": 20,
  "page": 1,
  "data": [
    {
      "id": 1,
      "email": "email1",
      "type": "simple",
      "token": "token1", //Est utilisé comme identifiant du sous-compte pour ajouter des crédits
      "apiKey": "ApiKey sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "0.800",
          "currency": "EUR"
      }
    },
    {
      "id": 2,
      "email": "email2",
      "type": "simple",
      "token": "token2",
      "apiKey": "ApiKey2 du sous compte",
      "createdAt": "2016-03-04 11:23:14",
      "credits": {
          "balance": "10.245",
          "currency": "EUR"
      }
    }
  ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
    <entry>true</entry>
    <entry>200</entry>
    <entry>20</entry>
    <entry>1</entry>
    <entry>2</entry>
    <entry>
        <entry>
            <entry>1</entry>
            <entry>
                <![CDATA[email1]]>
            </entry>
            <entry>
                <![CDATA[2016-03-04 11:23:14]]>
            </entry>
            <entry>
                <entry>670</entry>
                <entry>
                    <![CDATA[4]]>
                </entry>
                <entry>666</entry>
 
            </entry>
 
        </entry>
        <entry>
            <entry>2</entry>
            <entry>
                <![CDATA[email2]]>
            </entry>
            <entry xsi:nil="true"/>
            <entry>
                <![CDATA[2016-03-05 09:14:47]]>
            </entry>
            <entry>
                <entry>110</entry>
                <entry>0</entry>
                <entry>110</entry>
 
            </entry>
 
        </entry>
 
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
  "success": false,
  "code": 10,
  "message": "Invalid API key"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Invalid API key]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Message             |
| ------------- | ------------------- |
| 1             | API key is required |
| 10            | Invalid API key     |
| 200           | Request successful  |


# Manage Sub-account Credits

This request is used to manage sub-account credits.

## Add Credits

{% hint style="info" %}
From your main account, you can add credits to your sub-accounts. The credits will be deducted from your main account.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/subaccount/credit/add`

#### **Required Parameters**

| Name              | Value                                                  |
| ----------------- | ------------------------------------------------------ |
| `apiKey`          | [Your API key](https://my.smspartner.fr/dashboard/api) |
| `credit`          | Amount of credit in Euros to add to the sub-account    |
| `tokenSubaccount` | Sub-account identifier                                 |

#### Requests

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/credit/add');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/add"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/add"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.smspartner.fr/v1/subaccount/credit/add
```

{% endtab %}

{% tab title="Nodejs" %}

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

// permet d'ajouter des crédits à un sous-compte
//Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  credit: '100',
  tokenSubaccount: 'identifiant du sous-compte'
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/subaccount/credit/add',
  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("Error: " + 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 AjouterRetirerDesCredits {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "YOUR API KEY";
            int credit = 100;
            String tokenSubaccount = "identifiant du sous-compte";

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"credit\": " + credit + ", \"tokenSubaccount\": \"" + tokenSubaccount + "\"}";

            // Create POST request
            URL url = new URL("https://api.smspartner.fr/v1/subaccount/credit/add");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AjoutCreditSousCompte: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Ajout Credit Sous Compte")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: ajoutCreditSousCompte)
    }

    func ajoutCreditSousCompte() {
        let apiKey = "YOUR_API_KEY"
        let credit = "100"
        let tokenSubaccount = "identifiant du sous-compte"

        let urlString = "https://api.smspartner.fr/v1/subaccount/credit/add"
        let url = URL(string: urlString)!

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "credit": credit,
            "tokenSubaccount": tokenSubaccount
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct AjoutCreditSousCompte_Previews: PreviewProvider {
    static var previews: some View {
        AjoutCreditSousCompte()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type SubaccountData struct {
	APIKey         string `json:"apiKey"`
	Credit         string `json:"credit"`
	TokenSubaccount string `json:"tokenSubaccount"`
}

func main() {
	apiKey := "YOUR_API_KEY"
	credit := "100"
	tokenSubaccount := "identifiant du sous-compte"

	// Create POST request data
	data := SubaccountData{
		APIKey:         apiKey,
		Credit:         credit,
		TokenSubaccount: tokenSubaccount,
	}
	jsonData, _ := json.Marshal(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/credit/add", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Set("Content-Type", "application/json")

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

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

	// Print the response body
	log.Printf("Response body: %s", string(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 data = new
        {
            apiKey = "YOUR API KEY",
            credit = "100",
            tokenSubaccount = "Subaccount ID"
        };

        string jsonString = JsonConvert.SerializeObject(data);

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/subaccount/credit/add", content);

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

{% endtab %}
{% endtabs %}

#### **Response**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
    "success": false,
    "code": 10,
    "message": "Clé API incorrecte"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Clé API incorrecte]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Message                                 |
| ------------- | --------------------------------------- |
| 1             | API key is required                     |
| 2             | Credit amount is required               |
| 3             | Sub-account identifier is required      |
| 4             | You are not authorized                  |
| 5             | Credit to assign must be greater than 0 |
| 6             | Your balance must be greater than 0     |
| 7             | Sub-account does not exist              |
| 8             | Insufficient credit                     |
| 10            | Invalid API key                         |
| 200           | Everything went well!                   |

## Remove Credits

{% hint style="info" %}
From your main account, you can remove credits from your sub-accounts. The credits will be added back to your main account.
{% endhint %}

### URL

<mark style="color:green;">`POST`</mark> `https://api.smspartner.fr/v1/subaccount/credit/remove`

#### **Required Parameters**

<table data-full-width="false"><thead><tr><th width="180">Name</th><th>Value</th></tr></thead><tbody><tr><td><code>apiKey</code></td><td><a href="https://my.smspartner.fr/dashboard/api">Your API key</a></td></tr><tr><td><code>credit</code></td><td>Amount of credit in Euros to remove from the sub-account</td></tr><tr><td><code>tokenSubaccount</code></td><td>Sub-account identifier</td></tr></tbody></table>

#### Requests

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'credit'=> '100',
            'tokenSubaccount'=>'identifiant du sous-compte'
            );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/subaccount/credit/remove');
        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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #send sms
    url = base_url & "subaccount/credit/remove"
    #note : utiliser une librairie JSON en production, par exemple :
    #https//www.nuget.org/packages/Newtonsoft.Json/
    Dim parameters As String = String.Format(
        "{{""apiKey"":""{0}"",""credit"":""{1}"",""tokenSubaccount"":""{2}""}}",
        apiKey,
        50,
        "identifiant du sous-compte")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def add_credit(self,creditToAdd,tokenSubaccount):
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("credit",creditToAdd),
			("tokenSubaccount",tokenSubaccount)
 
		])
 
		url = URL + "/subaccount/credit/remove"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","credit":"10","tokenSubaccount":"identifiant du sous-compte"}' https://api.smspartner.fr/v1/subaccount/credit/remove
```

{% endtab %}

{% tab title="Nodejs" %}

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

// permet d'ajouter des crédits à un sous-compte
//Depuis votre compte, il vous est possible d’ajouter des crédits sur vos sous comptes. Les crédits seront débités de votre compte principal.
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  credit: '100',
  tokenSubaccount: 'identifiant du sous-compte'
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/subaccount/credit/remove',
  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("Error: " + 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 AjouterRetirerDesCredits {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "YOUR API KEY";
            int credit = 100;
            String tokenSubaccount = "identifiant du sous-compte";

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"credit\": " + credit + ", \"tokenSubaccount\": \"" + tokenSubaccount + "\"}";

            // Create POST request
            URL url = new URL("https://api.smspartner.fr/v1/subaccount/credit/remove");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AjoutCreditSousCompte: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Ajout Credit Sous Compte")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: ajoutCreditSousCompte)
    }

    func ajoutCreditSousCompte() {
        let apiKey = "YOUR_API_KEY"
        let credit = "100"
        let tokenSubaccount = "identifiant du sous-compte"

        let urlString = "https://api.smspartner.fr/v1/subaccount/credit/remove"
        let url = URL(string: urlString)!

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "credit": credit,
            "tokenSubaccount": tokenSubaccount
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct AjoutCreditSousCompte_Previews: PreviewProvider {
    static var previews: some View {
        AjoutCreditSousCompte()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

type SubaccountData struct {
	APIKey         string `json:"apiKey"`
	Credit         string `json:"credit"`
	TokenSubaccount string `json:"tokenSubaccount"`
}

func main() {
	apiKey := "YOUR_API_KEY"
	credit := "100"
	tokenSubaccount := "identifiant du sous-compte"

	// Create POST request data
	data := SubaccountData{
		APIKey:         apiKey,
		Credit:         credit,
		TokenSubaccount: tokenSubaccount,
	}
	jsonData, _ := json.Marshal(data)

	// Create POST request
	req, err := http.NewRequest("POST", "https://api.smspartner.fr/v1/subaccount/credit/remove", bytes.NewBuffer(jsonData))
	if err != nil {
		log.Fatalf("Error creating request: %v", err)
	}
	req.Header.Set("Content-Type", "application/json")

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

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

	// Print the response body
	log.Printf("Response body: %s", string(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 data = new
        {
            apiKey = "YOUR API KEY",
            credit = "100",
            tokenSubaccount = "Subaccount ID"
        };

        string jsonString = JsonConvert.SerializeObject(data);

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/subaccount/credit/remove", content);

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

{% endtab %}
{% endtabs %}

#### **Response**

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

```json
{
    "success": true,
    "code": 200,
    "credit": 2869.2,
    "subaccountCredit": 61.8,
    "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>2859.2</entry>
    <entry>71.8</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
</result
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
    "success": false,
    "code": 10,
    "message": "Invalid API key"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>
        <![CDATA[Invalid API key]]>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Message                                 |
| ------------- | --------------------------------------- |
| 1             | API key is required                     |
| 2             | Credit amount is required               |
| 3             | Sub-account identifier is required      |
| 4             | You are not authorized                  |
| 5             | Credit to assign must be greater than 0 |
| 6             | Your balance must be greater than 0     |
| 7             | Sub-account does not exist              |
| 8             | Insufficient credit                     |
| 10            | Invalid API key                         |
| 200           | Everything went well!                   |


# Rate limiting

To guarantee the stability and availability of the API for all our users, every endpoint of the SMS Partner API applies a rate limit. This limit defines the maximum number of requests you can make to a given endpoint within a given time window.

## How it works

The limit is applied **per endpoint** and **per calling IP address**. Each endpoint has its own quota, independent of the others: using up your quota on one endpoint does not affect your quota on another.

The quota is automatically reset when the time window associated with the called endpoint expires. There is nothing you need to do on your end to reset it.

The exact limits (number of allowed requests and window duration) vary by endpoint, depending on their nature and their cost to our infrastructure. If you need a higher quota for a specific use case, contact our support team.

## Exceeding the limit

When an endpoint's quota is exceeded, the API responds with the HTTP status code **`429 Too Many Requests`** and a JSON response body of the form:

```json
{
  "success": false,
  "code": 429,
  "message": "Too many requests, please slow down.",
  "readableLimit": "30 request per 60 secondes"
}
```

In this case, no action is performed server-side: the request is simply rejected, with no side effects.

## Response headers

On a `429` response, the API also returns the following headers, which let you know the exact state of your quota:

| Header                  | Description                                                          |
| ----------------------- | -------------------------------------------------------------------- |
| `X-RateLimit-Limit`     | Maximum number of requests allowed within the endpoint's time window |
| `X-RateLimit-Remaining` | Number of requests remaining in the current window                   |
| `X-RateLimit-Timeleft`  | Number of seconds before the quota resets                            |

Full response example:

```http
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Timeleft: 42
Content-Type: application/json

{
  "success": false,
  "code": 429,
  "message": "Too many requests, please slow down.",
  "readableLimit": "30 request per 60 secondes"
}
```

{% hint style="info" %}
These headers are only guaranteed on `429` responses. Do not rely on their systematic presence on successful responses to anticipate your remaining quota.
{% endhint %}

## Best practices

* **Respect `X-RateLimit-Timeleft`** before retrying your request rather than retrying immediately in a loop.
* **Implement backoff** (increasing delay between attempts) in case of repeated `429` responses.
* **Avoid aggressive polling**: prefer webhooks over regularly polling a status endpoint whenever possible.
* **Batch your calls** whenever the endpoint allows it (e.g. bulk sending rather than several individual calls), in order to limit the number of requests needed.

## Need a higher quota?

If the default limits do not fit your usage volume, contact our [support team](mailto:contact@smspartner.fr) with the endpoint concerned and your requirement: we will look into adjusting your quota.


# Send SMS

Les différentes méthode d'envoi de SMS

### Methods

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Single Send</strong></td><td>Send an SMS instantly</td><td><a href="/pages/5U064j4bkxMl43sfjdxe">/pages/5U064j4bkxMl43sfjdxe</a></td></tr><tr><td><strong>Bulk Send</strong></td><td>Send multiple SMS at once</td><td><a href="/pages/VIqqusz8WBfJAedMocgU">/pages/VIqqusz8WBfJAedMocgU</a></td></tr><tr><td><strong>Send by Long Number</strong></td><td>Send an SMS using a long number as the sender</td><td><a href="/pages/l35VMqe6yv1bGmBGXp9E">/pages/l35VMqe6yv1bGmBGXp9E</a></td></tr><tr><td><strong>Survey Send</strong></td><td>Send a survey via SMS</td><td><a href="/pages/B7wVufOj68xba6mxZ8Kw">/pages/B7wVufOj68xba6mxZ8Kw</a></td></tr><tr><td><strong>Cancel Scheduled SMS</strong></td><td>Cancel the sending of a scheduled SMS</td><td><a href="/pages/lrW5vcfhWkGNdmfuu1v7">/pages/lrW5vcfhWkGNdmfuu1v7</a></td></tr><tr><td><strong>Special Characters</strong></td><td>List of special characters replaced when sending an SMS</td><td><a href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a></td></tr></tbody></table>


# Single Send

This request is used to send SMS in real-time or scheduled.

## URL

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

{% hint style="warning" %}
The platform does not send marketing SMS between **8 PM and 8 AM on weekdays, as well as on Sundays and public holidays** (legal restriction). If a message is sent during that time, it will be **on hold until the next working day at 8 AM**.\
Not sending marketing SMS? Contact us to disable this restriction: <help@smspartner.fr>
{% endhint %}

#### **Required Parameters**

| Name           | Value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `apiKey`       | [Your API key](https://my.smspartner.fr/dashboard/api)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `phoneNumbers` | <p>Recipient phone numbers.<br>To send to multiple recipients, separate numbers with commas. <strong>Maximum of 500 numbers per request.</strong><br>Supported formats:</p><ul><li>National (06xxxxxxxx) or international (+336xxxxxxxx) for French numbers.</li><li>International (+496xxxxxxxx) for numbers outside France.</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `message`      | <p>SMS content. <strong>160 characters</strong> max per SMS (additional SMS units will be charged per 153-character segment beyond that).</p><p>Line break → <span data-gb-custom-inline data-tag="emoji" data-code="1f1e7-1f1f7">🇧🇷</span> <strong>Note: Line break counts as two characters.</strong></p><p>€ symbol → <span data-gb-custom-inline data-tag="emoji" data-code="1f4b6">💶</span></p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>The character ” must be escaped (\”) for the SMS to be valid. Otherwise, a 400 error will be returned.</p><p>Some <a data-mention href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a> will be replaced upon sending. Please review them.</p></div> |

#### **Optional Parameters**

| Name                    | Value                                                                                                                                                                                                                                                                                                                                                                             |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sender`                | <p>Sender name. If left empty, SMS will be sent using a short operator code (e.g., 36xxx).</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Sender name must be between <strong>3 and 11 characters</strong>, <strong>no special characters</strong> allowed.<br>Note: Some mobile devices may not display spaces properly.</p></div> |
| `tag`                   | String up to 20 characters, no spaces, lowercase only                                                                                                                                                                                                                                                                                                                             |
| `scheduledDeliveryDate` | dd/mm/YYYY (scheduled delivery)                                                                                                                                                                                                                                                                                                                                                   |
| `time`                  | <p>Format: 0–24 (delivery hour)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>If <code>scheduledDeliveryDate</code> is set, this parameter is required</p></div>                                                                                                                                                                   |
| `minute`                | <p>Format: 0–55 (5-min intervals)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>If <code>scheduledDeliveryDate</code> is set, this parameter is required</p></div>                                                                                                                                                                 |
| `urlResponse`           | URL to receive SMS replies (e.g., <http://www.myresponseurl.com>)                                                                                                                                                                                                                                                                                                                 |
| `urlDlr`                | URL to receive delivery reports (e.g., <http://www.mydlrurl.com>)                                                                                                                                                                                                                                                                                                                 |
| `isStopSms`             | `1` to add STOP notice at the end of SMS (mandatory and automatic for marketing SMS)                                                                                                                                                                                                                                                                                              |
| `isUnicode`             | <p>If set to 1: Enables Unicode mode (max 70 characters per SMS).</p><p><em>Note: Unicode SMS must be enabled on your account by an administrator. Contact support to enable this feature.</em></p><p><a href="https://www.smspartner.fr/blog/liste-complete-des-emoticones-a-copier-coller/">> View full list of emojis</a></p>                                                  |
| `sandbox`               | <p><code>1</code> for Sandbox Mode</p><div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>No SMS will be sent, and no credit will be charged. These SMS will be automatically deleted from your logs every day.</p></div>                                                                                                                       |
| `_format`               | `json` or `xml`                                                                                                                                                                                                                                                                                                                                                                   |

#### **Requests**

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

```php
<?php
   // Prepare data for POST request
   $fields = array(
       'apiKey' => 'YOUR API KEY',
       'phoneNumbers' => '+336xxxxxxxx',
       'message' => 'This is your message',
       'sender' => 'mycompany',
       'scheduledDeliveryDate' => '21/10/2014',
       'time' => 9,
       'minute' => 0
   );

   $curl = curl_init(); 
   curl_setopt($curl, CURLOPT_URL, 'https://api.smspartner.fr/v1/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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #send sms
    url = base_url & "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}"",""phoneNumbers"":""{1}"",""message"":""{2}""}}",
        apiKey,
        "+33XXXXXXXXX",
        "message de test")
    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
import http.client
import json
conn = http.client.HTTPSConnection("api.smspartner.fr")

payload = json.dumps({
"apiKey": "your api key smspartner", #replace with your SMSPartner API key
"phoneNumbers": "+336xxxxxxxx", #replace with your phone number
"sender": "Your sender name",
"gamme": 1,
"message": "Cest un message test PYTHON", #remplacez par votre message
 "webhookUrl": "https://webhook.site/TOKEN" #remplacez TOKEN par votre token webhook.site
})

headers = {
'Content-Type': 'application/json',
'Content-Length': str(len(payload)),
'cache-control': 'no-cache'
}

conn.request("POST", "/v1/send", payload, headers) #Une requête POST est envoyée au serveur SMSPartner avec le chemin d'URL "/v1/send"

res = conn.getresponse() #La réponse est ensuite stockée dans la variable res.

data = res.read() 

print(data.decode("utf-8")) #Cette ligne lit les données de la réponse HTTP.
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumbers":"xxxx","message":"test","sender":"mycompany"}' https://api.smspartner.fr/v1/send
```

{% endtab %}

{% tab title="Nodejs" %}

```javascript
// Importer le module 'https' de Node.js
const https = require('https');

// Objet JSON qui contient les informations nécessaires pour envoyer le SMS
const data = JSON.stringify({
    apiKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', //replace with your API key
    phoneNumbers: '+336XXXXXXXX',  //replace with your phone number
    sender: 'NodeJS',
    gamme: 1,
    message: "Cest un message test NodeJS" //remplacez par votre message
});

// Define the options for the HTTP POST request to the SMS Partner API
const options = {
  hostname: 'api.smspartner.fr',
  port: 443,
  path: '/v1/send',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': data.length,
    'cache-control': 'no-cache',
    'webhookUrl': 'https://webhook.site/TOKEN' // Webhook URL *cette ligne est optionnel*
  }
};

// Demande HTTP POST avec les options et les données définies précédemment
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
  
  // Print the API response data to standard output
  res.on('data', (d) => {
    process.stdout.write(d);
  });
});

// Affichage en cas d'erreur lors de l'exécution de la requête HTTP POST
req.on('error', (error) => {
  console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;

public class SMSRequest {
    public static void main(String[] args) {
        try {
        // Create the URL object with the SMS API address
            URL url = new URL("https://api.smspartner.fr/v1/send");
        // Ouverture de la connexion HTTP avec l'API
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

        // Création de l'objet JSON contenant les paramètres du SMS à envoyer   
            JSONObject json = new JSONObject();
            json.put("apiKey", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); //your api key smspartner
            json.put("phoneNumbers", "+336XXXXXXXX"); //your phone number
            json.put("virtualNumber", "+336XXXXXXXX");
            json.put("sender", "demo JAVA");
            json.put("gamme", 1);
            json.put("message", "C'est un message test en JAVA !");
            json.put("webhookUrl", "https://webhook.site/TOKEN"); //your webhook url
        
        // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream(); 
            os.write(json.toString().getBytes());
            os.flush();

        // Read the API response
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());
            System.out.println(response);
            
        // Close the HTTP connection
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct SMSUnitaire: View {
    var body: some View {
        // A button that calls the function sendSMS() lorsqu'il est pressé
        Button(action: {
            sendSMS()
        }) {
            Text("Envoyer SMS unitaire")
                .font(.system(size: 20)) // Taille du texte
                .foregroundColor(.white) // Couleur du texte
                .frame(minWidth: 0, maxWidth: .infinity) // Taille du bouton, qui s'ajuste automatiquement
                .padding() // Padding autour du texte
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom)) // Fond du bouton, un dégradé de bleu
                .cornerRadius(10) // Coins arrondis du bouton
                .padding(.horizontal) // Espacement horizontal autour du bouton
        }
    }

    func sendSMS() {
        // Objet JSON contenant les informations nécessaires pour envoyer le SMS
        let data = [
            "apiKey": "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX", // replace with your API key
            "phoneNumbers": "+336XXXXXXXX", // replace with your phone number
            "sender": "Swift",
            "gamme": 1,
            "message": "C'est un message test Swift" // remplacez par votre message
        ] as [String : Any]
        
        // Conversion de l'objet JSON en données
        guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {
            fatalError("Erreur lors de la conversion des données en JSON.")
        }
        
        // Définition des options pour la requête HTTP POST à l'API SMS Partner
        let url = URL(string: "https://api.smspartner.fr/v1/send")!
        var request = URLRequest(url: url)
        request.httpMethod = "POST" // Méthode HTTP
        request.httpBody = jsonData // Corps de la requête
        request.addValue("application/json", forHTTPHeaderField: "Content-Type") // Type de contenu
        request.addValue("\(jsonData.count)", forHTTPHeaderField: "Content-Length") // Longueur du contenu
        request.addValue("no-cache", forHTTPHeaderField: "cache-control") // Contrôle du cache
        request.addValue("https://webhook.site/TOKEN", forHTTPHeaderField: "webhookUrl") // URL du webhook *cette ligne est facultative*
        
        // Exécution de la requête HTTP POST avec les options et données définies précédemment
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            guard let httpResponse = response as? HTTPURLResponse else {
                fatalError("Erreur : réponse HTTP non valide.")
            }
            print("statusCode: \(httpResponse.statusCode)") // Impression du statut HTTP
            
            if let error = error {
                print("Error: \(error.localizedDescription)") // Impression de l'erreur, si elle existe
            }
            
            if let data = data {
                if let responseString = String(data: data, encoding: .utf8) {
                    print("Response: \(responseString)") // Print the response, if it exists
                }
            }
        }
        task.resume() // Démarrage de la tâche
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"fmt"
	"net/http"
)

func main() {
	apiKey := "VOTRE CLE API"
	phoneNumbers := "+336xxxxxxxx"
	message := "Ceci est votre message"
	sender := "monentreprise"
	scheduledDeliveryDate := "21/10/2014"
	time := 9
	minute := 0

	// Construire le corps JSON pour la requête POST
	jsonData := fmt.Sprintf(`{
		"apiKey": "%s",
		"phoneNumbers": "%s",
		"message": "%s",
		"sender": "%s",
		"scheduledDeliveryDate": "%s",
		"time": %d,
		"minute": %d
	}`, apiKey, phoneNumbers, message, sender, scheduledDeliveryDate, time, minute)

	// Effectuer la requête POST
	url := "https://api.smspartner.fr/v1/send"
	req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(jsonData)))
	if err != nil {
		fmt.Println("Erreur lors de la création de la requête:", err)
		return
	}
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Erreur lors de l'envoi de la requête:", err)
		return
	}
	defer resp.Body.Close()

	// Traiter la réponse
	if resp.StatusCode == http.StatusOK {
		body := new(bytes.Buffer)
		_, err := body.ReadFrom(resp.Body)
		if err != nil {
			fmt.Println("Erreur lors de la lecture de la réponse:", err)
			return
		}
		fmt.Println(body.String())
	} else {
		fmt.Println("La requête POST a échoué. Code de réponse:", resp.StatusCode)
	}
}
```

{% 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",
            phoneNumbers = "+336xxxxxxxx",
            message = "This is your message",
            sender = "mycompany",
            scheduledDeliveryDate = "21/10/2014",
            time = 9,
            minute = 0
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/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 %}

#### **Response**

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

```json
{
   "success": true,
   "code": 200,
   "message_id": 307,
   "nb_sms": 1,
   "cost": 0.038,
   "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>306</entry>
  <entry>1</entry>
  <entry>0.038</entry>
  <entry>
        <![CDATA[EUR]]>
  </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
    "success": false,
    "code":9,
    "errors": [{
        "elementId": "children[message].data",
        "message": "Message is required"
    }, {
        "elementId": "children[phoneNumbers].data",
        "message": "This phone number is not valid (922264)"
    }, {
        "elementId": "children[sender].data",
        "message": "Sender cannot exceed 11 characters"
    }, {
        "elementId": "children[scheduledDeliveryDate].data",
        "message": "The date (21/11/2014 :) is earlier than the current date."
    }, {
        "elementId": "children[minute].data",
        "message": "Minute is required"
    }, {
        "elementId": "children[time].data",
        "message": "Hour is required"
    }]
}

```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
 <result>
          <entry>false</entry>
          <entry>9</entry>
          <entry>
                <entry>
                  <entry>children[message].data</entry>
                  <entry>Message is required</entry>
                </entry>
                <entry>
                   <entry>children[phoneNumbers].data</entry>
                   <entry>This phone number is not valid (922264)</entry>
                </entry>
                <entry>
                    <entry>children[sender].data</entry>
                    <entry>Sender cannot exceed 11 characters</entry>
                </entry>
                <entry>
                    <entry>children[scheduledDeliveryDate].data</entry>
                    <entry>The date (21/11/2014 :) is earlier than the current date. If you wish to send it now, please select [Immediate send]</entry>
                </entry>
                <entry>
                    <entry>children[minute].data</entry>
                    <entry>Minute is required</entry>
                </entry>
                <entry>
                    <entry>children[time].data</entry>
                    <entry>Hour is required</entry>
                </entry>
      </entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Description                                                                                                                                                                                                                                         |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1             | API Key is required                                                                                                                                                                                                                                 |
| 2             | Phone number is required                                                                                                                                                                                                                            |
| 9             | One or more constraints were not met during sending: - Sender cannot exceed 11 characters - Invalid phone number - If \<code>scheduledDeliveryDate\</code> is set: The date is earlier than the current date. Minute is required. Hour is required. |
| 10            | Invalid API Key                                                                                                                                                                                                                                     |
| 11            | Insufficient credits                                                                                                                                                                                                                                |


# Bulk Send

This request is used to send SMS messages in real-time or scheduled.

## URL

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

{% hint style="warning" %}
The platform does not send marketing SMS between **8 PM and 8 AM on weekdays, as well as on Sundays and public holidays** (legal restriction). If a message is sent during that time, it will be **on hold until the next working day at 8 AM**.\
Not sending marketing SMS? Contact us to disable this restriction: <help@smspartner.fr>
{% endhint %}

#### **Required Parameters**

| Name      | Value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey`  | [Your API key](https://my.smspartner.fr/dashboard/api)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `SMSList` | <p><code>phoneNumber</code> → Recipient's phone number. Limit per request is 500 numbers.<br>Must be:</p><ul><li>In national format (06xxxxxxxx) or international (+336xxxxxxxx) for French numbers</li><li>In international format (+496xxxxxxxx) for non-French numbers</li></ul><p><code>message</code> → SMS content. <strong>160 characters</strong> max per SMS (additional SMS units will be charged per 153-character segment beyond that).</p><p>Line break → <span data-gb-custom-inline data-tag="emoji" data-code="1f1e7-1f1f7">🇧🇷</span> <strong>Note: Line break counts as two characters.</strong></p><p>€ symbol → <span data-gb-custom-inline data-tag="emoji" data-code="1f4b6">💶</span></p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>The character ” must be escaped (\”) for the message to be valid. Otherwise, a 400 error will be returned.</p><p>Some <a data-mention href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a> may be replaced during sending. Please review them.</p></div> |

#### **Optional Parameters**

| Name                    | Value                                                                                                                                                                                                                                                                                                                                                                                   |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sender`                | <p>Sender name. If left empty, the SMS will be sent using a short operator code (e.g., 36xxx).</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>Sender name must be between <strong>3 and 11 characters</strong> and must <strong>not contain special characters</strong>.<br>Some mobile phones may not display spaces properly.</p></div> |
| `tag`                   | String (max 20 characters, no spaces, lowercase only)                                                                                                                                                                                                                                                                                                                                   |
| `scheduledDeliveryDate` | dd/mm/YYYY (for scheduled sending)                                                                                                                                                                                                                                                                                                                                                      |
| `time`                  | <p>Format: 0–24 (hour of delivery)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>If <code>scheduledDeliveryDate</code> is set, this parameter is required</p></div>                                                                                                                                                                      |
| `minute`                | <p>Format: 0–55 (5-minute intervals)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>If <code>scheduledDeliveryDate</code> is set, this parameter is required</p></div>                                                                                                                                                                    |
| `isStopSms`             | 1 to add the STOP mention at the end of the SMS (mandatory and automatic for marketing SMS)                                                                                                                                                                                                                                                                                             |
| `isUnicode`             | <p>If 1: Enables Unicode mode, max characters per SMS will be 70.</p><p><em>Note: Unicode SMS must be enabled on your account by an administrator. Please contact technical support to activate this feature.</em></p><p><a href="https://www.smspartner.fr/blog/liste-complete-des-emoticones-a-copier-coller/">> View full list of emojis</a></p>                                     |
| `sandbox`               | <p><code>1</code> for Sandbox Mode</p><div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>No SMS will be sent and no credit will be charged. These SMS will be automatically deleted from your logs every day.</p></div>                                                                                                                              |
| `_format`               | `json` or `xml`                                                                                                                                                                                                                                                                                                                                                                         |

#### Requests

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'sender' => 'mycompany',
            'scheduledDeliveryDate'=> '21/10/2014',
            'time'=> 9,
            'minute'=> 0,
            'SMSList'=> array(
                array(
                    'phoneNumber'=> '06xxxxxxx1',
                    'message'=> 'msg 0'
                ),
                array(
                    'phoneNumber'=> '06xxxxxxx2',
                    'message'=> 'msg 1'
                )
 
            )
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/bulk-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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #send sms
    url = base_url & "bulk-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}"",""sender"":""{1}"",""SMSList"":""{2}""}}",
        apiKey,
        "mycompany",
        {{ ""phoneNumber"":"06xxxxxxx1",""message"":"msg1"},{ ""phoneNumber"":"06xxxxxxx2",""message"":"msg2"}}
        )
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def send_sms(self,phone_numbers, msg, sender = "SMSPartner"):
		#sender = "DEMOSMS"
		print(phone_numbers)
 
 
		data = {"apiKey":APIKEY,"sender":sender,"SMSList":[{"phoneNumber":"06xxxxxxx1","message":"msg1"},{"phoneNumber":"06xxxxxxx2","message":"msg2"}]}
 
 
		url = URL + "/bulk-send"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print("SMS msg {} not delivered to {}".format(msg, phone_numbers))
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumber":"xxxx","message":"test","sender":"mycompany"}' https://api.smspartner.fr/v1/send
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Replace with your API key
const apiKey = 'YOUR_API_KEY';

// Objet JSON qui contient les informations nécessaires pour envoyer les SMS en lots
const data = JSON.stringify({
    apiKey: apiKey,
    sender: 'mycompany',
    scheduledDeliveryDate: '21/10/2014',
    time: 9,
    minute: 0,
    SMSList: [
        {
            phoneNumber: '06xxxxxxx1',
            message: 'msg 0',
        },
        {
            phoneNumber: '06xxxxxxx2',
            message: 'msg 1',
        },
    ],
});

// Define the options for the HTTP POST request to the SMS Partner API
const options = {
    hostname: 'api.smspartner.fr',
    port: 443,
    path: '/v1/bulk-send',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': data.length,
        'cache-control': 'no-cache',
    },
};

// Demande HTTP POST avec les options et les données définies précédemment
const req = https.request(options, (res) => {
    console.log(`statusCode: ${res.statusCode}`);

    // Print the API response data to standard output
    res.on('data', (d) => {
        process.stdout.write(d);
    });
});

// Affichage en cas d'erreur lors de l'exécution de la requête HTTP POST
req.on('error', (error) => {
    console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONArray;
import org.json.JSONObject;

public class SMSparLots {
    public static void main(String[] args) {
        try {
            // Create the URL object with the SMS API address
            URL url = new URL("https://api.smspartner.fr/v1/bulk-send");
            // Ouverture de la connexion HTTP avec l'API
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

            // Création de l'objet JSON contenant les paramètres des SMS à envoyer en lot
            JSONObject json = new JSONObject();
            json.put("apiKey", "VOTRE_API_KEY"); // Replace with your API key
            json.put("sender", "mycompany");
            json.put("scheduledDeliveryDate", "21/10/2014");
            json.put("time", 9);
            json.put("minute", 0);

            JSONArray SMSList = new JSONArray();
            JSONObject sms1 = new JSONObject();
            sms1.put("phoneNumber", "06xxxxxxx1");
            sms1.put("message", "msg 0");
            SMSList.put(sms1);

            JSONObject sms2 = new JSONObject();
            sms2.put("phoneNumber", "06xxxxxxx2");
            sms2.put("message", "msg 1");
            SMSList.put(sms2);

            json.put("SMSList", SMSList);

            // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream();
            os.write(json.toString().getBytes());
            os.flush();

            // Read the API response
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());
            System.out.println(response);

            // Close the HTTP connection
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

// Cette requête est utilisée pour envoyer des SMS par lot de 500 en temps réel ou en différé
struct SMSParLotsView: View {
    var body: some View {
        // A button that calls the function sendSMSParLots() lorsqu'il est pressé
        Button(action: {
            sendSMSParLots()
        }) {
            Text("Send Bulk SMS")
                .font(.system(size: 20))
                .foregroundColor(.white)
                .frame(minWidth: 0, maxWidth: .infinity)
                .padding()
                .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                .cornerRadius(10)
                .padding(.horizontal)
        }
    }
    

    func sendSMSParLots() {
        // Liste des SMS à envoyer
        let smsList: [[String: String]] = [
            [
                "phoneNumber": "06XXXXXXXX", // Recipient's phone number
                "message": "msg 0 en temps réel" // Message à envoyer
            ],
            [
                "phoneNumber": "06XXXXXXXX", // Another phone number
                "message": "msg 1 en temps réel" // Un autre message
            ]
        ]

        // Données à envoyer à l'API
        let data: [String: Any] = [
            "apiKey": "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX", // Your API key
            "sender": "mycompany", // L'expéditeur du SMS
            // Ces 3 lignes permettent de programmer un envoi différé.
            //"scheduledDeliveryDate": "12/05/2023", // Date de livraison prévue
            //"time": 9, // Heure de livraison
            //"minute": 0, // Minute de livraison
            "SMSList": smsList // La liste des SMS à envoyer
        ]

        // Conversion des données en JSON
        guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {
            fatalError("Error converting data to JSON.")
        }

        // Création de la requête HTTP
        let url = URL(string: "https://api.smspartner.fr/v1/bulk-send")! // URL de l'API
        var request = URLRequest(url: url)
        request.httpMethod = "POST" // Méthode HTTP
        request.httpBody = jsonData // Corps de la requête
        request.addValue("application/json", forHTTPHeaderField: "Content-Type") // Type de contenu
        request.addValue("\(jsonData.count)", forHTTPHeaderField: "Content-Length") // Longueur du contenu
        request.addValue("no-cache", forHTTPHeaderField: "cache-control") // Contrôle du cache

        // Envoi de la requête HTTP
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            // Vérification de la réponse HTTP
            guard let httpResponse = response as? HTTPURLResponse else {
                fatalError("Error: Invalid HTTP response.")
            }
            print("statusCode: \(httpResponse.statusCode)") // Impression du code d'état HTTP

            // Gestion des erreurs éventuelles
            if let error = error {
                print("Error: \(error.localizedDescription)")
            }

            // Impression de la réponse de l'API
            if let data = data {
                if let responseString = String(data: data, encoding: .utf8) {
                    print("Response: \(responseString)")
                }
            }
        }
        task.resume()
    }
}
// Un aperçu de la vue
struct BulkSMSView_Previews: PreviewProvider {
    static var previews: some View {
        SMSParLotsView()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	apiKey := "VOTRE CLE API"
	sender := "monentreprise"
	scheduledDeliveryDate := "21/10/2014"
	time := 9
	minute := 0

	// Construire les données JSON pour la requête POST
	data := map[string]interface{}{
		"apiKey":               apiKey,
		"sender":               sender,
		"scheduledDeliveryDate": scheduledDeliveryDate,
		"time":                 time,
		"minute":               minute,
		"SMSList": []map[string]string{
			{"phoneNumber": "06xxxxxxx1", "message": "msg 0"},
			{"phoneNumber": "06xxxxxxx2", "message": "msg 1"},
		},
	}

	// Convertir les données en JSON
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("Erreur lors de la conversion en JSON:", err)
		return
	}

	// Effectuer la requête POST
	url := "https://api.smspartner.fr/v1/bulk-send"
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println("Erreur lors de l'envoi de la requête:", err)
		return
	}
	defer resp.Body.Close()

	// Traiter la réponse
	if resp.StatusCode == http.StatusOK {
		body := new(bytes.Buffer)
		_, err := body.ReadFrom(resp.Body)
		if err != nil {
			fmt.Println("Erreur lors de la lecture de la réponse:", err)
			return
		}
		fmt.Println(body.String())
	} else {
		fmt.Println("La requête POST a échoué. Code de réponse:", resp.StatusCode)
	}
}
```

{% 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",
            sender = "mycompany",
            scheduledDeliveryDate = "21/10/2014",
            time = 9,
            minute = 0,
            SMSList = new[]
            {
                new
                {
                    phoneNumber = "06xxxxxxx1",
                    message = "msg 0"
                },
                new
                {
                    phoneNumber = "06xxxxxxx2",
                    message = "msg 1"
                }
            }
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/bulk-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 %}

#### **Response**

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

```json
{
    "success": true,
    "code": 200,
    "message_id": "xxxxxx",
    "currency": "EUR",
    "cost": 0.076,
    "nbSMS": 2,
    "SMSResponse_List": [
        {
            "success": true,
            "code": 200,
            "nbSms": 1,
            "cost": 0.038,
            "phoneNumber": "+336xxxxxxx1"
        },
        {
            "success": true,
            "code": 200,
            "nbSms": 1,
            "cost": 0.038,
            "phoneNumber": "+336xxxxxxx2"
        }
    ]
}

```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry>xxxxxx</entry>
    <entry>
        <![CDATA[EUR]]>
    </entry>
    <entry>0.076</entry>
    <entry>2</entry>
    <entry>
        <entry>
            <entry>true</entry>
            <entry>200</entry>
            <entry>1</entry>
            <entry>0.038</entry>
            <entry>
                <![CDATA[+336xxxxxxx1]]>
            </entry>
        </entry>
        <entry>
            <entry>true</entry>
            <entry>200</entry>
            <entry>1</entry>
            <entry>0.038</entry>
            <entry>
                <![CDATA[+336xxxxxxx2]]>
            </entry>
        </entry>
    </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
    "success": false,
    "code": 9,
    "error": [
        {
            "elementId": "children[message].data",
            "message": "Message is required"
        },
        {
            "elementId": "children[phoneNumber].data",
            "message": "Phone number is not valid (922264)"
        },
        {
            "elementId": "children[sender].data",
            "message": "Sender cannot exceed 11 characters"
        },
        {
            "elementId": "children[scheduledDeliveryDate].data",
            "message": "Date (21/11/2014 :) is earlier than the current date."
        },
        {
            "elementId": "children[minute].data",
            "message": "Minute is required"
        },
        {
            "elementId": "children[time].data",
            "message": "Hour is required"
        }
    ]
}

```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>9</entry>
    <entry>
        <entry>
            <entry>children[message].data</entry>
            <entry>Message is required</entry>
        </entry>
        <entry>
            <entry>children[phoneNumber].data</entry>
            <entry>This phone number is not valid (922264)</entry>
        </entry>
        <entry>
            <entry>children[sender].data</entry>
            <entry>Sender cannot exceed 11 characters</entry>
        </entry>
        <entry>
            <entry>children[scheduledDeliveryDate].data</entry>
            <entry>Date (21/11/2014 :) is earlier than the current date. To send it now, select [Immediate send]</entry>
        </entry>
        <entry>
            <entry>children[minute].data</entry>
            <entry>Minute is required</entry>
        </entry>
        <entry>
            <entry>children[time].data</entry>
            <entry>Hour is required</entry>
        </entry>
    </entry>
</result>

```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Description                                                                                                                                                                                                                                        |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1             | API Key is required                                                                                                                                                                                                                                |
| 2             | Phone number is required                                                                                                                                                                                                                           |
| 9             | At least one constraint was not met during sending: - Sender cannot exceed 11 characters - Invalid phone number - If `scheduledDeliveryDate` is set: The date (dd/mm/yyyy) is earlier than the current date. Minute is required. Hour is required. |
| 10            | Invalid API Key                                                                                                                                                                                                                                    |
| 11            | Insufficient credits                                                                                                                                                                                                                               |


# Send by Long Number

This request is used to send SMS using a long number. A long number looks like: +337XXXXXXXX

## URL

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

{% hint style="warning" %}
The platform does not send marketing SMS between **8 PM and 8 AM on weekdays, as well as on Sundays and public holidays** (legal restriction). If a message is sent during that time, it will be **on hold until the next working day at 8 AM**.\
Not sending marketing SMS? Contact us to disable this restriction: <help@smspartner.fr>
{% endhint %}

#### **Required Parameters**

| Name      | Value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `apiKey`  | [Your API key](https://my.smspartner.fr/dashboard/api)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `to`      | <p>Recipient's phone number.</p><ul><li>In national format (06xxxxxxxx) or international (+336xxxxxxxx) for French numbers</li><li>In international format (+496xxxxxxxx) for non-French numbers</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `from`    | Your virtual number in international format (e.g., 336xxxxxxxx)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `message` | <p>SMS content. <strong>160 characters</strong> max per SMS (beyond that, an additional SMS will be charged per 153-character segment).</p><p>Line break → <span data-gb-custom-inline data-tag="emoji" data-code="1f1e7-1f1f7">🇧🇷</span> <strong>Note: line break counts as two characters.</strong></p><p>€ symbol → <span data-gb-custom-inline data-tag="emoji" data-code="1f4b6">💶</span></p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>The character ” must be escaped (\”) for the SMS to be valid. Otherwise, a 400 error will be returned.</p><p>Some <a data-mention href="/pages/mYV3b7pJz8NOy0a5FBaU">/pages/mYV3b7pJz8NOy0a5FBaU</a> will be replaced during sending. Please review them.</p></div> |

#### **Optional Parameters**

| Name          | Value                                                                                                                                                                                                                                                                    |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `tag`         | String (max 20 characters, no spaces, lowercase only)                                                                                                                                                                                                                    |
| `urlResponse` | URL to receive SMS replies (e.g., <http://www.myresponseurl.com>)                                                                                                                                                                                                        |
| `urlDlr`      | URL to receive delivery reports (e.g., <http://www.mydlrurl.com>)                                                                                                                                                                                                        |
| `isStopSms`   | `1` to add the STOP mention at the end of the SMS (mandatory and automatic for marketing SMS)                                                                                                                                                                            |
| `sandbox`     | <p><code>1</code> to enable Sandbox Mode</p><div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>No SMS will be sent and no credit will be charged. These SMS will be automatically removed from your sending logs every day.</p></div> |
| `_format`     | `json` or `xml`                                                                                                                                                                                                                                                          |

#### Requests

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'to'=> '336xxxxxxxx',
            'from' => '336xxxxxxxx',
            'message'=> 'This is your message'
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/vn/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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #send sms
    url = base_url & "vn/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}"",""to"":""{1}"",""from"":""{2}"",""message"":""{3}""}}",
        apiKey,
        "336xxxxxxxx",
        "336xxxxxxxx",
        "message de test")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def send_sms(self, to, from, msg):
		print(to)
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("to", to),
			("from",from),
			("message", msg)
		])
 
		url = URL + "/vn/send"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print("SMS msg {} not delivered to {}".format(msg, to))
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","to":"xxxx","from":"xxx","message":"test"}' https://api.smspartner.fr/v1/vn/send
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Replace with your API key
const apiKey = "YOUR_API_KEY";

// Prepare the data for the POST request
const data = JSON.stringify({
  apiKey: apiKey,
  to: "336xxxxxxxx",
  from: "336xxxxxxxx",
  message: "Ceci est votre message",
});

// Define the options for the HTTP POST request to the SMS Partner API
const options = {
  hostname: "api.smspartner.fr",
  port: 443,
  path: "/v1/vn/send",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Content-Length": data.length,
    "cache-control": "no-cache",
  },
};

// Perform the HTTP POST request with the options and data defined above
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  // Print the API response data to standard output
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

// Print an error if the HTTP POST request fails
req.on("error", (error) => {
  console.error(error);
});

// Envoyer les données de l'objet 'data' à la demande
req.write(data);
// Terminer la demande HTTP POST
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;

public class EnvoyerSMSLong {
    public static void main(String[] args) {
        try {
            // Replace with your API key
            String apiKey = "YOUR_API_KEY";

            // Create the URL object with the SMS API address
            URL url = new URL("https://api.smspartner.fr/v1/vn/send");

            // Ouverture de la connexion HTTP avec l'API
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");
            conn.setDoOutput(true);

            // Création de l'objet JSON contenant les paramètres du SMS à envoyer
            JSONObject json = new JSONObject();
            json.put("apiKey", apiKey);
            json.put("to", "336xxxxxxxx");
            json.put("from", "336xxxxxxxx");
            json.put("message", "Ceci est votre message");

            // Écriture des données JSON dans le corps de la requête HTTP
            OutputStream os = conn.getOutputStream();
            os.write(json.toString().getBytes());
            os.flush();

            // Read the API response
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());
            System.out.println(response);

            // Close the HTTP connection
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI
import Foundation

// Struct pour la vue "EnvoieSMSParNumeroLong"
struct EnvoieSMSParNumeroLong: View {
    var body: some View {
        NavigationView {
            VStack {
                // A button that calls the function EnvoieSMSParNumeroLong() lorsqu'il est pressé
                Button(action: {
                    EnvoieSMSParNumeroLong()
                }) {
                    Text("Envoyer SMS")
                        .font(.system(size: 20))
                        .foregroundColor(.white)
                        .frame(minWidth: 0, maxWidth: .infinity)
                        .padding()
                        .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
                        .cornerRadius(10)
                        .padding(.horizontal)
                }
            }
        }
    }
    
    // Fonction pour envoyer un SMS par numéro long
    func EnvoieSMSParNumeroLong() {
        let apiKey = "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX" // Your API key
        let destinataire = "33XXXXXXXXX" // Le numéro du destinataire
        let expediteur = "33XXXXXXXXX" // Votre numéro
        let message = "status" // Le message à envoyer

        let url = URL(string: "https://api.smspartner.fr/v1/vn/send")! // URL pour envoyer le SMS
        var requete = URLRequest(url: url)
        requete.httpMethod = "POST"
        requete.addValue("application/json", forHTTPHeaderField: "Content-Type") // Ajout du type de contenu dans l'en-tête de la requête

        // Paramètres pour l'envoi du SMS
        let params: [String: Any] = [
            "apiKey": apiKey,
            "to": destinataire,
            "from": expediteur,
            "message": message
        ]
        
        // Ajout des paramètres dans le corps de la requête
        requete.httpBody = try? JSONSerialization.data(withJSONObject: params)
        
        let session = URLSession.shared
        // Tâche pour envoyer la requête
        let task = session.dataTask(with: requete) { (data, response, error) in
            // Si une erreur survient, on l'affiche
            if let erreur = error {
                print("Erreur : \(erreur.localizedDescription)")
                return
            }
            
            // Sinon, on affiche les données reçues
            if let donnees = data {
                if let resultat = String(data: donnees, encoding: .utf8) {
                    print(resultat) // Impression du résultat
                }
            }
        }
        
        task.resume() // On lance la tâche
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"bytes"
	"fmt"
	"net/http"
)

func main() {
	apiKey := "YOUR API KEY"
	to := "336xxxxxxxx"
	from := "336xxxxxxxx"
	message := "This is your message"

	// Construire les données JSON pour la requête POST
	data := map[string]interface{}{
		"apiKey":  apiKey,
		"to":      to,
		"from":    from,
		"message": message,
	}

	// Convertir les données en JSON
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("Erreur lors de la conversion en JSON:", err)
		return
	}

	// Effectuer la requête POST
	url := "https://api.smspartner.fr/v1/vn/send"
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println("Erreur lors de l'envoi de la requête:", err)
		return
	}
	defer resp.Body.Close()

	// Traiter la réponse
	if resp.StatusCode == http.StatusOK {
		body := new(bytes.Buffer)
		_, err := body.ReadFrom(resp.Body)
		if err != nil {
			fmt.Println("Erreur lors de la lecture de la réponse:", err)
			return
		}
		fmt.Println(body.String())
	} else {
		fmt.Println("La requête POST a échoué. Code de réponse:", resp.StatusCode)
	}
}
```

{% 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",
            to = "336xxxxxxxx",
            from = "336xxxxxxxx",
            message = "This is your message"
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/vn/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 %}

#### Response

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

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

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>xxx</entry>
  <entry>1</entry>
  <entry>xxx</entry>
  <entry>
        <![CDATA[EUR]]>
  </entry>
</result>
```

{% endtab %}
{% endtabs %}


# Survey Send

This request is used to send a survey in real-time or scheduled.

## URL

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

{% hint style="warning" %}
The platform does not send marketing SMS between **8 PM and 8 AM on weekdays, as well as on Sundays and public holidays** (legal restriction). If a message is sent during that time, it will be **on hold until the next working day at 8 AM**.\
Not sending marketing SMS? Contact us to disable this restriction: <help@smspartner.fr>
{% endhint %}

#### **Required Parameters**

| Name           | Value                                                                                                                                                                                                                                                                                                                                           |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey`       | [Your API key](https://my.smspartner.fr/dashboard/api)                                                                                                                                                                                                                                                                                          |
| `phoneNumbers` | <p>Recipient phone numbers.<br>To send to multiple recipients, separate numbers with commas. <strong>Maximum of 500 numbers per request.</strong><br>Supported formats:</p><ul><li>National format (06xxxxxxxx) or international (+336xxxxxxxx) for French numbers</li><li>International format (+496xxxxxxxx) for non-French numbers</li></ul> |
| `sondageIdent` | Survey identifier                                                                                                                                                                                                                                                                                                                               |

#### **Optional Parameters**

| Name                    | Value                                                                                                                                                                                                                    |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `tag`                   | String (max 20 characters, no spaces, lowercase only)                                                                                                                                                                    |
| `scheduledDeliveryDate` | dd/mm/YYYY (scheduled delivery)                                                                                                                                                                                          |
| `time`                  | <p>Format: 0–24 (hour of delivery)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>If <code>scheduledDeliveryDate</code> is set, this parameter is required.</p></div>      |
| `minute`                | <p>Format: 0–55 (in 5-minute intervals)</p><div data-gb-custom-block data-tag="hint" data-style="danger" class="hint hint-danger"><p>If <code>scheduledDeliveryDate</code> is set, this parameter is required.</p></div> |
| `_format`               | `json` or `xml`                                                                                                                                                                                                          |

#### Requests

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

```php
<?php
        // Prepare data for POST request
        $fields = array(
            'apiKey'=> 'YOUR API KEY',
            'phoneNumbers'=> '+336xxxxxxxx',
            'sondageIdent'=> 'SONDAGE_IDENT',
            'scheduledDeliveryDate'=> '21/10/2014',
            'time'=> 9,
            'minute'=> 0
        );
 
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/sondage/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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
 
    #send sms
    url = base_url & "sondage/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}"",""phoneNumbers"":""{1}"",""sondageIdent"":""{2}""}}",
        apiKey,
        "+33XXXXXXXXX",
        "SONDAGE_IDENT")
    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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def send_sms(self,phone_numbers, sondageIdent):
		#sender = "DEMOSMS"
		print(phone_numbers)
 
		data = OrderedDict([
			("apiKey", API_KEY),
			("phoneNumbers", phone_numbers),
			("sondageIdent", sondageIdent)
		])
 
		url = URL + "/send"
		r = requests.post(url, data=json.dumps(data), verify=False)
 
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print("SMS msg {} not delivered to {}".format(msg, phone_numbers))
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X POST -d '{"apiKey":"xxxxx","phoneNumbers":"xxxx","sondageIdent":"SONDAGE_IDENT"}' https://api.smspartner.fr/v1/sondage/to/send
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Prepare the data for the POST request
let data = JSON.stringify({
  apiKey: 'YOUR API KEY',
  phoneNumbers: '+336XXXXXXXX',
  // identifiant du sondage que vous avez créé dans votre compte SMS Partner
  sondageIdent: 'SONDAGE ID',
  scheduledDeliveryDate: '04/07/2023',
  time: 11,
  minute: 55 //tous les 5 minutes ex: 00, 05, 10, 15, 20, etc.
});

let options = {
  hostname: 'api.smspartner.fr',
  path: '/v1/sondage/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 SondageParSMS {
    public static void main(String[] args) {
        try {
            // Prepare data for POST request
            String apiKey = "your_api_key";
            String phoneNumbers = "+336XXXXXXXX";
            String sondageIdent = "your_sondage_ident";
            String scheduledDeliveryDate = "05/07/2023";
            int time = 10;
            int minute = 35;

            // Create JSON payload
            String jsonPayload = "{\"apiKey\": \"" + apiKey + "\", \"phoneNumbers\": \"" + phoneNumbers +
                    "\", \"sondageIdent\": \"" + sondageIdent + "\", \"scheduledDeliveryDate\": \"" +
                    scheduledDeliveryDate + "\", \"time\": " + time + ", \"minute\": " + minute + "}";

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

            // Send POST request
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonPayload.getBytes());
            outputStream.flush();
            outputStream.close();

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct SondageSMS: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Sondage SMS")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: sendSondage)
    }

    func sendSondage() {
        let apiKey = "YOUR_API_KEY"
        let phoneNumber = "+336xxxxxxxx"
        let sondageIdent = "SONDAGE_IDENT"
        let scheduledDeliveryDate = "05/07/2023"
        let time = 9
        let minute = 0

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

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

        let parameters: [String: Any] = [
            "apiKey": apiKey,
            "phoneNumbers": phoneNumber,
            "sondageIdent": sondageIdent,
            "scheduledDeliveryDate": scheduledDeliveryDate,
            "time": time,
            "minute": minute
        ]

        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 {
                let resultString = String(data: data, encoding: .utf8)
                DispatchQueue.main.async {
                    self.result = resultString ?? "Error"
                }
            }
        }

        task.resume()
    }
}

struct SondageSMS_Previews: PreviewProvider {
    static var previews: some View {
        SondageSMS()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

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

func main() {
	// Prepare data for POST request
	data := map[string]interface{}{
		"apiKey":                "YOUR API KEY",
		"phoneNumbers":          "+336xxxxxxxx",
		"sondageIdent":          "SONDAGE_IDENT",
		"scheduledDeliveryDate": "21/10/2024",
		"time":                  9,
		"minute":                0,
	}

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

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

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

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

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

	// Process your response here
	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",
            phoneNumbers = "+336xxxxxxxx",
            sondageIdent = "SONDAGE_IDENT",
            scheduledDeliveryDate = "21/10/2014",
            time = 9,
            minute = 0
        };

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

        HttpResponseMessage response = await client.PostAsync("https://api.smspartner.fr/v1/sondage/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 %}

#### **Response**

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

```json
{
   "success":true,
   "code":200,
   "message_id":307,
   "nb_sms": 1,
   "cost": 0.038,
   "currency": "EUR"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry>306</entry>
  <entry>1</entry>
  <entry>0.038</entry>
  <entry>
        <![CDATA[EUR]]>
  </entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
    "success": false,
    "code": 9,
    "error": [
        {
            "elementId": "children[message].data",
            "message": "Message is required"
        },
        {
            "elementId": "children[phoneNumbers].data",
            "message": "Invalid phone number (922264)"
        },
        {
            "elementId": "children[sender].data",
            "message": "Sender name cannot exceed 11 characters"
        },
        {
            "elementId": "children[scheduledDeliveryDate].data",
            "message": "The date (21/11/2014 :) is earlier than the current date."
        },
        {
            "elementId": "children[minute].data",
            "message": "Minute is required"
        },
        {
            "elementId": "children[time].data",
            "message": "Hour is required"
        }
    ]
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>false</entry>
  <entry>9</entry>
  <entry>
    <entry>
      <entry>children[message].data</entry>
      <entry>Message is required</entry>
    </entry>
    <entry>
      <entry>children[phoneNumbers].data</entry>
      <entry>Invalid phone number (922264)</entry>
    </entry>
    <entry>
      <entry>children[sender].data</entry>
      <entry>Sender name cannot exceed 11 characters</entry>
    </entry>
    <entry>
      <entry>children[scheduledDeliveryDate].data</entry>
      <entry>The date (21/11/2014 :) is earlier than the current date. To send it now, select [Immediate send]</entry>
    </entry>
    <entry>
      <entry>children[minute].data</entry>
      <entry>Minute is required</entry>
    </entry>
    <entry>
      <entry>children[time].data</entry>
      <entry>Hour is required</entry>
    </entry>
  </entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Description                                                                                                                                                                                                                                                                    |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 1             | API Key is required                                                                                                                                                                                                                                                            |
| 2             | Phone number is required                                                                                                                                                                                                                                                       |
| 9             | <p>At least one constraint was not respected during the sending:<br>- Sender name cannot exceed 11 characters<br>- Invalid phone number<br>- If <code>scheduledDeliveryDate</code> is set: the date is earlier than the current date, minute is required, hour is required</p> |
| 10            | Invalid API Key                                                                                                                                                                                                                                                                |
| 11            | Not enough credits                                                                                                                                                                                                                                                             |


# Cancel Scheduled SMS

This request is used to cancel a scheduled SMS.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/message-cancel`

{% hint style="danger" %}
Note: You cannot cancel a scheduled SMS if it is due to be sent within the next 5 minutes.
{% endhint %}

#### **Required Parameters**

| Name        | Value                                                                                                               |
| ----------- | ------------------------------------------------------------------------------------------------------------------- |
| `apiKey`    | [Your API key](https://my.smspartner.fr/dashboard/api)                                                              |
| `messageId` | ID of the message. It can be found in the [response of the send](/en/api/sms-partner/send-sms/single-send#reponse). |

#### **Optional Parameters**

| Name      | Value           |
| --------- | --------------- |
| `_format` | `json` or `xml` |

#### Requests

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&messageId=300';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/message-cancel?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "message-cancel" & "?apiKey=" & apiKey & "&messageId=" & messageId
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,phone_numbers,message_id):
		url = URL + "/message-cancel?apiKey=" + API_KEY + "&messageId=" + message_id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/message-cancel?apiKey=xxx&messageId=300
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Prepare the data for the GET request
let data = 'apiKey=YOUR_API_KEY&messageId=300';
let url = 'https://api.smspartner.fr/v1/message-cancel?' + data;

https.get(url, (res) => {
  let data = '';

  // Un morceau de données a été reçu.
  res.on('data', (chunk) => {
    data += chunk;
  });

  // La totalité de la réponse a été reçue. Imprimer le résultat.
  res.on('end', () => {
    console.log(JSON.parse(data));
  });

}).on("error", (err) => {
  // Un message d'erreur sera imprimé en cas d'erreur.
  console.log("Erreur: " + err.message);
});
```

{% endtab %}

{% tab title="JAVA" %}

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

public class AnnulerEnvoiSMS {
    public static void main(String[] args) {
        try {
            // Prepare data for GET request
            String apiKey = "YOUR_API_KEY";
            String messageId = "300";

            // Create GET request URL
            String urlString = "https://api.smspartner.fr/v1/message-cancel?" +
                    "apiKey=" + apiKey + "&messageId=" + messageId;

            // Create URL object
            URL url = new URL(urlString);

            // Create HTTP connection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            // Send GET request
            int responseCode = connection.getResponseCode();

            // Get response
            BufferedReader reader;
            if (responseCode >= 200 && responseCode <= 299) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

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

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

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

struct AnnulerEnvoi: View {
    @State private var result: String = "Loading..."

    var body: some View {
        VStack {
            Text("Annuler Envoi")
                .font(.title)
                .padding()

            Text(result)
                .font(.system(size: 20))
                .padding()
        }
        .onAppear(perform: cancelMessage)
    }

    func cancelMessage() {
        let apiKey = "YOUR_API_KEY"
        let messageId = "300"
        let urlString = "https://api.smspartner.fr/v1/message-cancel?apiKey=\(apiKey)&messageId=\(messageId)"

        guard let url = URL(string: urlString) else {
            print("URL inválida")
            return
        }

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

        task.resume()
    }
}

struct AnnulerEnvoi_Previews: PreviewProvider {
    static var previews: some View {
        AnnulerEnvoi()
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	messageId := "300"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/message-cancel?" +
		"apiKey=" + apiKey + "&messageId=" + messageId

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var messageId = "300";
        var uri = new Uri($"https://api.smspartner.fr/v1/message-cancel?apiKey={apiKey}&messageId={messageId}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Response**

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

```json
{
  "success": true,
  "code": 200,
  "message": "The SMS sending has been canceled."
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>true</entry>
  <entry>200</entry>
  <entry><![CDATA[The SMS sending has been canceled.]]></entry>
</result>
```

{% endtab %}
{% endtabs %}

#### Errors

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

```json
{
  "success": false,
  "code": 10,
  "message": "Invalid API key"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
  <entry>false</entry>
  <entry>10</entry>
  <entry>Invalid API key</entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Message                                                                               |
| ------------- | ------------------------------------------------------------------------------------- |
| 1             | API key is required                                                                   |
| 3             | Message ID is required                                                                |
| 4             | Message not found                                                                     |
| 5             | The SMS has already been canceled                                                     |
| 6             | It is not possible to cancel an SMS if it is due to be sent within the next 5 minutes |
| 10            | Invalid API key                                                                       |
| 11            | Not enough credits                                                                    |


# Special Characters

List of special characters replaced when sending an SMS.

### Character Replacement List

| Character | Replaced with |
| --------- | ------------- |
| ÿ         | y             |
| ç         | Ç             |
| û         | u             |
| ü         | u             |
| ï         | i             |
| ô         | o             |
| ö         | o             |
| ó         | o             |
| î         | i             |
| ë         | e             |
| ê         | e             |
| \[        | (             |
| ]         | )             |
| {         | (             |
| }         | )             |
| \`        | ‘             |
| µ         | u             |
| Ä         | A             |
| À         | A             |
| Á         | A             |
| Â         | A             |
| Ã         | A             |
| È         | E             |
| Ê         | E             |
| Ë         | E             |
| Ü         | U             |
| Ù         | U             |
| Ú         | U             |
| Û         | U             |
| Ý         | Y             |
| ä         | a             |
| á         | a             |
| â         | a             |
| ã         | a             |
| Ö         | O             |
| Ô         | O             |
| œ         | oe            |
| ^         | Removed       |
| \~        | Removed       |
| \|        | Removed       |
| \\        | Removed       |
| ¨         | Removed       |
| °         | .             |
| ‘         | ‘             |
| “         | ‘             |


# Status & Statistics

Different SMS sending methods

### Methods

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Single Status</strong></td><td>Retrieve the status of an SMS</td><td><a href="/pages/5OQgWUz9U0pmHvLqf9kx">/pages/5OQgWUz9U0pmHvLqf9kx</a></td></tr><tr><td><strong>Bulk Status</strong></td><td>Retrieve the status of multiple SMS</td><td><a href="/pages/Nn8jYABt8fAs4qnHOuDP">/pages/Nn8jYABt8fAs4qnHOuDP</a></td></tr><tr><td><strong>Status by Message</strong></td><td>Retrieve status via a message ID</td><td><a href="/pages/WpR4Ux5MvqHC37v8otdg">/pages/WpR4Ux5MvqHC37v8otdg</a></td></tr><tr><td><strong>Status by Tag</strong></td><td>Retrieve status via a tag</td><td><a href="/pages/uXTQckHkKcvxdQeUQOV1">/pages/uXTQckHkKcvxdQeUQOV1</a></td></tr><tr><td><strong>Sending Statistics</strong></td><td>Retrieve sending statistics</td><td><a href="/pages/PfPcBtLqIU1id6fTlEMP">/pages/PfPcBtLqIU1id6fTlEMP</a></td></tr></tbody></table>


# Single Status

This request allows you to retrieve the status of a single SMS.

## URL

<mark style="color:red;">`GET`</mark> `https://api.smspartner.fr/v1/message-status`

#### **Required Parameters**

| Name          | Value                                                                                                       |
| ------------- | ----------------------------------------------------------------------------------------------------------- |
| `apiKey`      | [Your API key](https://my.smspartner.fr/dashboard/api)                                                      |
| `messageId`   | Message ID. Found in the [response of the send request](/en/api/sms-partner/send-sms/single-send#response). |
| `phoneNumber` | Recipient's mobile phone number                                                                             |

#### **Optional Parameters**

| Name      | Value           |
| --------- | --------------- |
| `_format` | `json` or `xml` |

#### Requests

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

```php
<?php
 
        // Prepare data for GET request
        $data = 'apiKey=YOUR_API_KEY&messageId=300&phoneNumber=06xxxxxxxx';
 
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL,'https://api.smspartner.fr/v1/message-status?'.$data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 
 
        $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 = "http://api.smspartner.fr/v1/"
    Dim apiKey As String = "YOUR_APIKEY"
    Dim phoneNumber As String = "06XXXXXXXX"
    Dim messageId As Integer = XXX
 
    #check credits
    Dim url As String
    url = base_url & "message-status" & "?apiKey=" & apiKey & "&phoneNumber=" & phoneNumber & "&messageId=" & messageId
 
    Dim credits As String
    credits = apiRequest("GET", url, Nothing)
 
  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 logging
import json
from collections import OrderedDict
 
# 3p
import requests
 
API_KEY = "MY API KEY"
URL = "https://api.smspartner.fr/v1"
 
class SMSPartner():
    def get_delivery(self,phone_numbers,message_id):
		url = URL + "/message-status?apiKey=" + API_KEY + "&phoneNumber=" + phone_numbers + "&messageId=" + message_id
		r = requests.get(url)
		r_json = r.json()
		if r_json.get("success") == True:
			print(r_json)
			status = True
		else:
			print(r_json)
			status = False
		return status
```

{% endtab %}

{% tab title="cURL" %}

```
curl -H  "Content-Type: application/json" -X GET  https://api.smspartner.fr/v1/message-status?apiKey=xxx&messageId=300&phoneNumber=06xxxxxxxx
```

{% endtab %}

{% tab title="Nodejs" %}

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

// Replace with your API key and other data
const apiKey = "YOUR_API_KEY";
const messageId = "300";
const phoneNumber = "06xxxxxxxx";

// Prepare the data for the GET request
const data = `apiKey=${apiKey}&messageId=${messageId}&phoneNumber=${phoneNumber}`;

// Define the options for the HTTP GET request to the SMS Partner API
const options = {
  hostname: "api.smspartner.fr",
  port: 443,
  path: `/v1/message-status?${data}`,
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "cache-control": "no-cache",
  },
};

// Perform the HTTP GET request with the options and data defined above
const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  // Print the API response data to standard output
  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

// Print an error if the HTTP GET request fails
req.on("error", (error) => {
  console.error(error);
});

// End the HTTP GET request
req.end();
```

{% endtab %}

{% tab title="JAVA" %}

```java
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
import org.json.JSONObject;

public class SMSSTatus {
    public static void main(String[] args) {
        try {
            // Replace with your API key and other data
            String apiKey = "YOUR_API_KEY";
            String messageId = "300";
            String phoneNumber = "06xxxxxxxx";

            // Prepare the data for the GET request
            String data = String.format("apiKey=%s&messageId=%s&phoneNumber=%s", apiKey, messageId, phoneNumber);
            URL url = new URL("https://api.smspartner.fr/v1/message-status?" + data);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("cache-control", "no-cache");

            // Read the API response
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String response = br.lines().collect(Collectors.joining());

            // Print the JSON response
            System.out.println(response);

            // Close the HTTP connection
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import SwiftUI

// Structure for the view "StatutSMS"
struct StatutSMS: View {
   var body: some View {
       // A button that calls the function StatutSMS() lorsqu'il est pressé
       Button(action: {
           StatutSMS()
       }) {
           Text("Check SMS Status")
               .font(.system(size: 20))
               .foregroundColor(.white)
               .frame(minWidth: 0, maxWidth: .infinity)
               .padding()
               .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.blue.opacity(0.8)]), startPoint: .top, endPoint: .bottom))
               .cornerRadius(10)
               .padding(.horizontal)
       }
   }
   
   // Fonction pour vérifier le statut d'un SMS
   func StatutSMS() {
       let apiKey = "XXXXXXXXXXXX YOUR API KEY XXXXXXXXXXXXX" // Your API key
       let messageId = "your msg ID" // ID de votre message
       let phoneNumber = "06XXXXXXXX" // Phone number

       // URL pour vérifier le statut du SMS
       let urlString = "https://api.smspartner.fr/v1/message-status?apiKey=\(apiKey)&messageId=\(messageId)&phoneNumber=\(phoneNumber)"

       // On vérifie que l'URL est correctement formée
       guard let url = URL(string: urlString) else {
           print("Erreur : impossible de créer l'URL")
           return
       }

       // Tâche pour récupérer les données de l'URL
       let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
           // Si une erreur se produit, on l'affiche
           if let error = error {
               print("Erreur : \(error)")
           }
           // Sinon, on affiche les données reçues
           else if let data = data {
               let str = String(data: data, encoding: .utf8)
               print("Données reçues :\n\(str ?? "")")
           }
       }
       
       task.resume() // On lance la tâche
   }
}

// Aperçu de la vue
struct StatutSMS_Previews: PreviewProvider {
   static var previews: some View {
       StatutSMS()
   }
}
```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	// Prepare data for GET request
	apiKey := "YOUR_API_KEY"
	messageId := "300"
	phoneNumber := "06xxxxxxxx"

	// Create GET request URL
	url := "https://api.smspartner.fr/v1/message-status?" +
		"apiKey=" + apiKey + "&messageId=" + messageId + "&phoneNumber=" + phoneNumber

	// Create HTTP client
	client := &http.Client{Timeout: 10 * time.Second}

	// Send GET request
	resp, err := client.Get(url)
	if err != nil {
		log.Fatalf("Error sending request: %v", err)
	}
	defer resp.Body.Close()

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

	// Process your response here
	log.Printf("Response: %s", body)
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

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

    static async Task Main(string[] args)
    {
        var apiKey = "YOUR_API_KEY";
        var messageId = "300";
        var phoneNumber = "06xxxxxxxx";
        var uri = new Uri($"https://api.smspartner.fr/v1/message-status?apiKey={apiKey}&messageId={messageId}&phoneNumber={phoneNumber}");

        HttpResponseMessage response = await client.GetAsync(uri);

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

{% endtab %}
{% endtabs %}

#### **Response**

{% tabs %}
{% tab title="json" %}
{% code fullWidth="true" %}

```json
{
    "success": true,
    "code": 200,
    "number": "0600000000",
    "messageId": "1111",
    "stopSms": false,
    "date": "2015-02-07 22:39:46",
    "statut": "Delivered",
    "cost": 0.045,
    "countryCode": "FR",
    "currency": "EUR"
}
```

{% endcode %}
{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>true</entry>
    <entry>200</entry>
    <entry><![CDATA[0600000000]]></entry>
    <entry><![CDATA[1111]]></entry>
    <entry>false</entry>
    <entry><![CDATA[2015-02-07 22:39:46]]></entry>
    <entry><![CDATA[Delivered]]></entry>
    <entry>0.045</entry>
    <entry><![CDATA[FR]]></entry>
    <entry><![CDATA[EUR]]></entry>
</result>
```

{% endtab %}
{% endtabs %}

* **Delivered**: The message was successfully delivered to the recipient’s device or platform.
* **Not delivered**: The message could not be delivered. Possible reasons include an invalid phone number or operator issues.
* **Waiting**: The message is still in the process of being delivered and has not yet been confirmed as delivered or failed.

#### Errors

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

```json
{
    "success": false,
    "code": 10,
    "message": "Invalid API key"
}
```

{% endtab %}

{% tab title="xml" %}

```xml
<?xml version='1.0' encoding='UTF-8'?>
<result>
    <entry>false</entry>
    <entry>10</entry>
    <entry>Invalid API key</entry>
</result>
```

{% endtab %}
{% endtabs %}

**Error Codes**

| Response Code | Description              |
| ------------- | ------------------------ |
| 1             | API key is required      |
| 2             | Phone number is required |
| 3             | Message ID is required   |
| 4             | Message not found        |
| 10            | Invalid API key          |
| 200           | Everything is OK!        |




---

[Next Page](/llms-full.txt/1)

