Chargement en cours...





























































































































API SMS HTTPS Rest JSON iSendPro Telecom

Prérequis

Munissez vous de votre keyid

Votre keyid (clé d'identification) est visible sur votre espace client dans Mon compte -> Mon api
Cette clé vous identifie et vous devrez l'utiliser pour effectuer toutes vos requêtes via l'API

Envois marketing

L’envoi de SMS commerciaux est formellement interdit entre 20h00 et 08h00 les jours calendaires.
Ces restrictions contractuelles avec les opérateurs sont édictées par l’AFMM et ne sont pas spécifiques à notre site.
En cas de changement d'émetteur, la mention STOP en fin de message est obligatoire.
Le client s'engage à respecter ces obligations sous peine de fortes amendes et de suspension immédiate du compte.

Envois transactionnels

Ces envois correspondent à des messages de type non marketing (confirmation de commande, rendez vous, message d‘alerte, etc).
Ils peuvent etre envoyés à toute heure, une fois la restriction horaires du compte levée.
En cas de changement d'émetteur, vous pouvez retirer la mention STOP SMS en fin de message en utilisant l'argument nostop avec la valeur 1 (cf tableau), une fois la restriction STOP du compte levée.
Pour lever les restrictions horaires et STOP, envoyez un email à contact@isendpro.com

Configurer le contrôle IP

Un contrôle IP, basé sur un système de type «liste blanche» est activé par défaut.
Vous pouvez soit renseigner cette liste blanche, soit désactiver le contrôle IP.
Ce paramètrage peut s'effectuer sur Mon compte -> Mon api

Liste noire

Une liste des numéros de téléphone vers lesquels les messages ne sont pas envoyés est gérée.
Les numéros de téléphone y sont ajoutés à la demande des opérateurs ou de nos partenaires.
Tous les messages envoyés vers des clients en liste noire ne sont pas routés.
Dans ce cas, le code erreur 11 est retourné par la requête.

Encodage

  • Les appels à l'API doivent etre encodés en UTF-8
  • Les SMS et les noms de répertoires doivent être encodés en utf-8. Par défaut, les SMS sont réencodés en GSM7 lors de la transmission à l'opérateur. De ce fait, seuls les caractères précisés en annexe sont acceptés (ou remplacés).
  • Les retours d'API sont effectués en iso-8859-15 (latin1 + euro sign).
  • En cas d'envoi en ucs-2, la totalité des caractères utf-8 est supportée.

Remarques et bonnes pratiques

Logs

Nous vous recommandons de logguer (avec horodatage) vos appels à l'API ainsi que les réponses de cette dernière.

Traitement des erreurs

L'API REST/JSON répondra un code HTTP 200 à vos appels.
Si le code d'erreur est différent de 200, une erreur s'est produite et nous vous recommandons d'investiguer le problème, avec l'aide de notre support technique si nécessaire.
Les wrappers lèvent des exceptions en cas d'erreur, exceptions que nous vous recommandons de rattraper.

Traitement des retours

Certains retours vous remontent des problèmes sans déclencher d'erreur HTTP (ni exception dans les wrappers).
Par un exemple si vous soumettez des SMS à une liste de numéros de téléphone dont certains sont mal formatés, vous aurez un code HTTP 200 mais avec des codes retour indiquant ce problème

Dans l'exemple ci-dessous, le 0600208432 est un numéro invalide et le 0771058335 est un numéro en liste noire. Nous vous recommandons donc de traiter ces retours.
{
    "etat":{
        "etat":[
            {
                "code":"21",
                "tel":"0600208432",
                "message":"Le numéro de téléphone n'est pas attribué!"
            },
            {
                "code":"11",
                "tel":"0771058335",
                "message":"Le numéro de téléphone est dans la liste noire!"
            },
            {
                "code":"0",
                "tel":"0695208432",
                "message":"Votre message a bien ete envoye"v
            }
        ]
    }
}

Package supplémentaires pour les scripts

Python
Java

Traitement des accusés de réception

Nous vous recommandons de mettre en place une URL de traitement des retours des accusés de réception.

Retour des sms envoyés par les clients

Nous vous recommandons de mettre en place une URL de traitement des retours des sms envoyés par les clients.

Contact

Vous pouvez contacter le support technique à l'adresse suivante: support@isendpro.com

Important: Merci de préciser dans votre email votre identifiant client
Si la question concerne la remise d'un SMS, merci de rajouter les infos suivantes :
  • Numéro de téléphone (MSISDN)
  • Message
  • Date et heure d'envoi

Le support technique est joignable tous les jours de la semaine de 09h à 13h et de 14h à 17h au 04 83 66 05 10

Utilisation API



Changement d'émetteur

L'émetteur du message est par défaut un numéro court sur 5 chiffres. Il est possible de le remplacer par une chaine alpha numérique avec les contraintes suivantes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Utilisation de nom de marques uniquement si le client en est propriétaire
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message qui utilise 12 caractères

Il faut renseigner la variable emetteur lors des appels à l'API comme indiqué dans les tableaux des paramètres sur cette documentation

Remarque:
  • En France, fonctionne pour tous les opérateurs sauf NRJ
  • A l'étranger, varie suivant les destinations, merci de nous consulter pour plus d'informations

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/sms' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "num":         "33601020304",
   "sms":         "Bonjour! Bienvenue sur iSendPro!",
   "emetteur":    "isendpro"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/sms';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  '33601020304',
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'  =>  'isendpro'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);
echo $response;
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->tel)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
// Erreur specifique au numero de telephone 
}else if (isset($repetat->tel) && ($repetat->code!=0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'Tel: '.$repetat->tel;
// Envoi OK    
}else if (isset($repetat->tel) && ($repetat->code==0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'Tel: '.$repetat->tel;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/sms'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      '33601020304',
    'sms':      'Bonjour! Bienvenue sur iSendPro!',
    'emetteur': 'isendpro'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('tel'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Erreur specifique au numero de telephone 
elif repetat.has_key('tel') and repetat['code']!=0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'Tel: '+repetat['tel']
# Envoi OK    
elif repetat.has_key('tel') and repetat['code']==0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'Tel: '+repetat['tel']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/sms";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304");
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur", "isendpro");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("tel")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Erreur specifique au numero de telephone 
            }else if(repetat.containsKey("tel") && repetat.get("code")!="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("Tel: "+repetat.get("tel")); 
            // Envoi OK    
            }else if(repetat.containsKey("tel") && repetat.get("code")=="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("Tel: "+repetat.get("tel"));     
            }

        } finally {
            con.disconnect();
        }
    }
}


Envoi d'émojis/émoticones

Il est possible d'envoyer des émojis/émoticones avec les contraintes suivantes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.

Il faut renseigner la variable ucs2 avec pour valeur 1 lors des appels à l'API comme indiqué dans les tableaux des paramètres sur cette documentation.
La liste des emjois possible est disponible ICI
Remarque:
  • A l'étranger, varie suivant les destinations, merci de nous consulter pour plus d'informations

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/sms' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "num":         "33601020304",
   "sms":         "Bonjour! Bienvenue sur iSendPro! 🙂",
   "ucs2":         "1"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/sms';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  '33601020304',
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro! 🙂',
    'ucs2'      =>  '1'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);
echo $response;
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->tel)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
// Erreur specifique au numero de telephone 
}else if (isset($repetat->tel) && ($repetat->code!=0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'Tel: '.$repetat->tel;
// Envoi OK    
}else if (isset($repetat->tel) && ($repetat->code==0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'Tel: '.$repetat->tel;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/sms'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      '33601020304',
    'sms':      'Bonjour! Bienvenue sur iSendPro! 🙂',
    'ucs2':     '1'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('tel'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Erreur specifique au numero de telephone 
elif repetat.has_key('tel') and repetat['code']!=0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'Tel: '+repetat['tel']
# Envoi OK    
elif repetat.has_key('tel') and repetat['code']==0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'Tel: '+repetat['tel']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/sms";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304");
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro! 🙂");
        paramsTablo.put("ucs2",     "1");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("tel")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Erreur specifique au numero de telephone 
            }else if(repetat.containsKey("tel") && repetat.get("code")!="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("Tel: "+repetat.get("tel")); 
            // Envoi OK    
            }else if(repetat.containsKey("tel") && repetat.get("code")=="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("Tel: "+repetat.get("tel"));     
            }

        } finally {
            con.disconnect();
        }
    }
}


Envoi à l'international

Les numéros de téléphones sont attendus au format international avec l'indicatif pays sans le "+" au début.
Ex: Pour la Belgique, l'indicatif international est +32
Si le numéro de téléphone est 0601020304 alors pour la mise au format international, il faut supprimer le "0" de début et ajouter l'indicatif pays sans le "+" au début
Le numéro devenant alors 32601020304

Certaines destinations peuvent avoir des contraintes particulières (émetteurs acceptés, smslong, etc), merci de nous consulter pour plus d'informations


Envoi de SMS unitaire

Envoi d'un message à 1 seul destinataire par requete

Appel

https://apirest.isendpro.com/cgi-bin/sms
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
sms String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
emetteur String Non Emetteur du message
Par défaut, un numéro court sur 5 chiffres
Ex: 36007
Contraintes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message et augmente de 12 caractères la longueur globale
tracker String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exact est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
Nombre de SMS concaténés Nombre de caractères SANS
modification émetteur
Nombre de caractères AVEC
modification émetteur
1 160 148
2 306 294
3 459 447
4 612 600
5 765 753
6 918 906
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
gmt_zone Fuseau horaire Non A renseigner, en cas d'envoi différé sur un autre fuseau horaire que celui par défaut (GMT+1 Europe/Brussels)
Ex: Pour un envoi vers des destinataires en Argentine à l'horaire local et non celui de la France, la valeur de l'argument gmt_zone serait America/Havana
ucs2 Number Non Permet l'utilisation de caractères en alphabet non latin (russe, chinois, arabe, etc) et/ou avec des émojis
Contraintes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.
Utiliser la valeur 1
numAzur Number Non Dans le cadre d'une utilisation combinée entre SMS Azur et l'API, il est possible de forcer le numéro d'expéditeur à être le même que celui utilisé sur SMS Azur
Utiliser la valeur 1

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
{
 "etat":{
     "etat":[
         {
             "code":    "0",
             "tel":     "0680010203",
             "message": "Votre message a bien été envoyé"
         }
     ]
 }
}
{
 "etat":{
     "etat":[
         {
             "code":    "6",
             "message": "Vous devez saisir un numéro de téléphone"
         }
     ]
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/sms' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "num":         "33601020304",
   "sms":         "Bonjour! Bienvenue sur iSendPro!",
   "emetteur":    "isendpro"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/sms';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  '33601020304',
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'  =>  'isendpro'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);
echo $response;
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->tel)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
// Erreur specifique au numero de telephone 
}else if (isset($repetat->tel) && ($repetat->code!=0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'Tel: '.$repetat->tel;
// Envoi OK    
}else if (isset($repetat->tel) && ($repetat->code==0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'Tel: '.$repetat->tel;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/sms'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      '33601020304',
    'sms':      'Bonjour! Bienvenue sur iSendPro!',
    'emetteur': 'isendpro'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('tel'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Erreur specifique au numero de telephone 
elif repetat.has_key('tel') and repetat['code']!=0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'Tel: '+repetat['tel']
# Envoi OK    
elif repetat.has_key('tel') and repetat['code']==0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'Tel: '+repetat['tel']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/sms";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304");
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur", "isendpro");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("tel")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Erreur specifique au numero de telephone 
            }else if(repetat.containsKey("tel") && repetat.get("code")!="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("Tel: "+repetat.get("tel")); 
            // Envoi OK    
            }else if(repetat.containsKey("tel") && repetat.get("code")=="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("Tel: "+repetat.get("tel"));     
            }

        } finally {
            con.disconnect();
        }
    }
}


Envoi de SMS multiples

Envoi d'un message à plusieurs destinataires par requête via une liste de numéros de téléphone avec un maximum de 500 numéros de téléphone par requête

Appel

https://apirest.isendpro.com/cgi-bin/smsmulti
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num Array Oui Liste des numéros de téléphone du destinataire
Au format international sans le +
Ex: [ "33601020304", "33601020305", "33601020306" ]
sms String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
emetteur String Non Emetteur du message
Par défaut, un numéro court sur 5 chiffres
Ex: 36007
Contraintes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message et augmente de 12 caractères la longueur globale
tracker String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exactes est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
Nombre de SMS concaténés Nombre de caractères SANS
modification émetteur
Nombre de caractères AVEC
modification émetteur
1 160 148
2 306 294
3 459 447
4 612 600
5 765 753
6 918 906
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
gmt_zone Fuseau horaire Non A renseigner, en cas d'envoi différé sur un autre fuseau horaire que celui par défaut (GMT+1 Europe/Brussels)
Ex: Pour un envoi vers des destinataires en Argentine à l'horaire local et non celui de la France, la valeur de l'argument gmt_zone serait America/Havana
ucs2 Number Non Permet l'utilisation de caractères en alphabet non latin (russe, chinois, arabe, etc) et/ou avec des émojis
Contraintes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.
Utiliser la valeur 1
numAzur Number Non Dans le cadre d'une utilisation combinée entre SMS Azur et l'API, il est possible de forcer le numéro d'expéditeur à être le même que celui utilisé sur SMS Azur
Utiliser la valeur 1

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
{
    "etat":{
        "etat":[
            {
                "code":     "0",
                "tel":      "33601020304",
                "message":  "Votre message a bien ete envoye"
            },
            {
                "code":     "0",
                "tel":      "33601020305",
                "message":  "Votre message a bien ete envoye"
            }
        ]
    }
}
{
    "etat":{
        "etat":[
            {
                "code":     "21",
                "tel":      "33601020304",
                "message":  "Le numéro de téléphone n'est pas attribué!"
            },
            {
                "code":     "11",
                "tel":      "33601020305",
                "message":  "Le numero de telephone est dans la liste noire!""
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/smsmulti' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "num":         ["33601020304","33601020305","33601020306"],
   "sms":         "Bonjour! Bienvenue sur iSendPro!",
   "emetteur":    "isendpro"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/smsmulti';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  ['33601020304','33601020305'],
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'  =>  'isendpro'
);
$params = json_encode($params);     
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params,    
    CURLOPT_HTTPHEADER => array(                                                                          
        'Content-Type' => 'application/json',                                                                                
        'Content-Length: ' =>  strlen($params)                                                                       
    )
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetatList=$reponsejson->etat->etat;
if(!is_array($repetatList)){
    $repetatList=array($repetatList);
}

$cpt=1;
foreach($repetatList as $repetat){
    echo '-----------';
    echo $sautligne;
    echo 'Data '.$cpt;
    echo $sautligne;
    // Erreur generale
    if (!isset($repetat->tel)){
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
    // Erreur specifique au numero de telephone    
    }else if (isset($repetat->tel) && ($repetat->code!=0)){
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
        echo 'Tel: '.$repetat->tel;
        echo $sautligne;
    // Envoi OK    
    }else if (isset($repetat->tel) && ($repetat->code==0)){
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
        echo 'Tel: '.$repetat->tel;
        echo $sautligne;
    }
    $cpt+=1;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import types

url = 'https://apirest.isendpro.com/cgi-bin/smsmulti'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      ['33601020304','33601020305','33601020306'],
    'sms':      'Bonjour! Bienvenue sur iSendPro!',
    'emetteur': 'isendpro'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetatList=reponsejson['etat']['etat']
if not type(repetatList) is types.ListType:
    repetatList=[repetatList]

cpt=1
for repetat in repetatList:
    print '-----------'    
    print 'Data '+str(cpt)    
    # Erreur generale
    if not repetat.has_key('tel'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        
    # Erreur specifique au numero de telephone    
    elif repetat.has_key('tel') and repetat['code']!=0:
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        print 'Tel: '+repetat['tel']
        
    # Envoi OK    
    elif repetat.has_key('tel') and repetat['code']==0:
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        print 'Tel: '+repetat['tel']   
    
    cpt+=1
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/smsmulti";
        
        ArrayList<String> listData = new ArrayList<String>();
        listData.add("33601020304");
        listData.add("33601020305");
        listData.add("33601020306");
        
        Map<String, Object> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      listData);
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur", "isendpro");     
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            ArrayList repetatList = (ArrayList)repetat.get("etat");
            if(! (repetatList instanceof ArrayList)){
                repetatList.add(repetatList);                
            }            
            
            for (int i = 0; i < repetatList.size(); i++) {
                repetat = (Map)repetatList.get(i);
                
                System.out.println("-----------");
                System.out.println("Data "+i);                
                // Erreur generale
                if (! repetat.containsKey("tel")){           
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));    
                // Erreur specifique au numero de telephone 
                }else if(repetat.containsKey("tel") && repetat.get("code")!="0"){
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));  
                    System.out.println("Tel: "+repetat.get("tel")); 
                // Envoi OK    
                }else if(repetat.containsKey("tel") && repetat.get("code")=="0"){
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));  
                    System.out.println("Tel: "+repetat.get("tel"));     
                }
            }
        } finally {
            con.disconnect();
        }
    }
}


Envoi de SMS multiples à un répertoire

Envoi d'un message à plusieurs destinataires par requête via un répertoire de numéros de téléphone

Appel

https://apirest.isendpro.com/cgi-bin/smsmulti
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
repertoireId String Oui Identifiant du répertoire cible
sms String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
emetteur String Non Emetteur du message
Par défaut, un numéro court sur 5 chiffres
Ex: 36007
Contraintes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message et augmente de 12 caractères la longueur globale
tracker String Non Argument généré par le client afin d'associer les accusés de réception ou les réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exactes est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
gmt_zone Fuseau horaire Non A renseigner, en cas d'envoi différé sur un autre fuseau horaire que celui par défaut (Europe/London)
ucs2 Number Non Permet l'utilisation de caractères en alphabet non latin (russe, chinois, arabe, etc) et/ou avec des émojis
Contraintes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.
Utiliser la valeur 1
numAzur Number Non Dans le cadre d'une utilisation combinée entre SMS Azur et l'API, il est possible de forcer le numéro d'expéditeur à être le même que celui utilisé sur SMS Azur
Utiliser la valeur 1

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
repertoireId String Identifiant du répertoire cible
message String Libellé correspondant au tableau des erreurs
{
    "etat":{
        "etat":[
            {
                "code":         "0",
                "repertoireId": "123456789",
                "message":      "Votre message a bien ete envoye"
            }
        ]
    }
}
{
    "etat":{
        "etat":[
            {
                "code":         "108",
                "repertoireId": "123456789",
                "message":      "Cet identifiant ne correspond a aucun repertoire!"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/smsmulti' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "repertoireId":"123456789",
   "sms":         "Bonjour! Bienvenue sur iSendPro!",
   "emetteur":    "isendpro"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/smsmulti';
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'repertoireId'  =>  '123456789',
    'sms'           =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'      =>  'isendpro'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->repertoireId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
// Erreur specifique au repertoire
}else if (isset($repetat->repertoireId) && ($repetat->code!=0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'RepertoireId: '.$repetat->repertoireId;
// Envoi OK    
}else if (isset($repetat->repertoireId) && ($repetat->code==0)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'RepertoireId: '.$repetat->repertoireId;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/smsmulti'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'repertoireId': '123456789',
    'sms':          'Bonjour! Bienvenue sur iSendPro!',
    'emetteur':     'isendpro'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('repertoireId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Erreur specifique au repertoire
elif repetat.has_key('repertoireId') and repetat['code']!=0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'RepertoireId: '+repetat['repertoireId']
# Envoi OK    
elif repetat.has_key('repertoireId') and repetat['code']==0:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'RepertoireId: '+repetat['repertoireId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/smsmulti";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",        "a296464ce012b8ab710a");
        paramsTablo.put("repertoireId", "123456789");
        paramsTablo.put("sms",          "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur",     "isendpro");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("repertoireId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Erreur specifique au repertoire
            }else if(repetat.containsKey("repertoireId") && repetat.get("code")!="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("repertoireId: "+repetat.get("repertoireId")); 
            // Envoi OK    
            }else if(repetat.containsKey("repertoireId") && repetat.get("code")=="0"){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("repertoireId: "+repetat.get("repertoireId"));     
            }

        } finally {
            con.disconnect();
        }
    }
}


Création de lien court

Création d'un lien court à partir d'une url longue
Remarque: Ces liens courts ont une durée de vie de 1 mois à compter de leur création

Appel

https://apirest.isendpro.com/cgi-bin/shortlink
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
shortlink String Oui Url à raccourcir

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs (cf Annexes)
shortlink String Url raccourcie
Format: www.sms.ht/[XXXX]
Ex: www.sms.ht/6gHw
{
    "etat": {
        "etat": [
            {
                "code":     "250",
                "message":  "Le lien court a ete genere",
                "shortlink":"www.sms.ht/6X8Y"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/shortlink' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "shortlink":   "https://www.isendpro.com/"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/shortlink';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'shortlink' =>  'https://www.isendpro.com/'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->shortlink)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
// Infos du lien court
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'shortlink: '.$repetat->shortlink;
    echo $sautligne;
    echo 'message: '.$repetat->message;

}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/shortlink'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'shortlink':    'https://www.isendpro.com/'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('shortlink'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos du lien court
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'Shortlink: '+repetat['shortlink']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/shortlink";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",        "a296464ce012b8ab710a");
        paramsTablo.put("shortlink",    "https://www.isendpro.com/");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("shortlink")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos du lien court
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("shortlink: "+repetat.get("shortlink"));     
            }

        } finally {
            con.disconnect();
        }
    }
}


Rapport de campagne CSV

Récupération de la liste des envois sur une période donnée dans un fichier .csv

Appel

https://apirest.isendpro.com/cgi-bin/campagne
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
rapportCampagne Number Oui Utiliser la valeur suivante:
  • 1: Détails par envoi
  • 2: Regroupement par jour et par émetteur
date_deb Date au format
YYYY-MM-DD hh:mm
Oui Date de début des envois de la sélection
date_fin Date au format
YYYY-MM-DD hh:mm
Oui Date de fin des envois de la sélection

Réponse

La réponse est un fichier CSV zippé avec les colonnes suivantes suivant la valeur de l'argument rapportCampagne

Exemples de scripts

Paramètre Type Détails
Date d'envoi date Date d'envoi du SMS
Emetteur String Emeteur du message
Destinataire String Numéro de téléphone destinataire du message
Message String Message envoyé
Information complémentaire String Indique l'opérateur et l'état du message
Infos details String Indique l'accusé de réception fourni par l'opérateur
Statut String Statut du message
SMS retour String Eventuelle réponse du destinataire
Canal String Haute Qualite
Prix Number Cout du message
STOP Number Indique si le destinataire a répondu STOP
Tracker String Argument éventuellement fourni lors de l'envoi pour une identification simplifiée
Operateur String Opérateur associé au destinataire
Date AR date Date de réception de l'accusé de réception opérateur
Code erreur Number Code associé à l'accusé de réception
Paramètre Type Détails
Date d'envoi date Date d'envoi du SMS
Campagne String Libellé de la campagne
Répertoire String Répertoire(s) associé(s) aux envois
Emetteur String Emeteur du message
Message String Message de la campagne si hors API
Pays String Pays des destinataires
Envois prévus Number Quantité d'envois prévus
Envois reels Number Quantité d'envois réels
Envois non aboutis Number Quantité d'envois non aboutis
SMS Long Number Nombre de SMS pour le message
STOP Number Quantités de STOP recus
clics Number Quantités de clics
Visiteur unique Number Quantités de visiteurs uniques
Taux visite Number Taux de visite
Cout HT Number Cout de la campagne en euros HT

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/campagne' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":           "a296464ce012b8ab710a",
   "rapportCampagne": 1,
   "date_deb":        "2020-01-01 10:00",
   "date_fin":        "2020-01-07 20:00"
}' \
-o rapportCampagne.zip
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();
$zipName = 'rapportCampagne.zip';
$zipDirectory = '/VOTRE_REPERTOIRE/';
$fp = fopen($zipDirectory.$zipName, 'w');

$url = 'https://apirest.isendpro.com/cgi-bin/campagne';
$params = array(
    'keyid'             =>  'a296464ce012b8ab710a',
    'rapportCampagne'   =>  1,
    'date_deb'          =>  '2020-01-01 10:00',
    'date_fin'          =>  '2020-01-07 20:00',
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_FILE, $fp);

$response = curl_exec($ch);
fwrite($fp, $response);

curl_close($ch);
fclose($fp);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html

// Unzip du fichier
$za = new ZipArchive(); 
$za->open($zipDirectory.$zipName); 
for( $i = 0; $i < $za->numFiles; $i++ ){ 
    $stat = $za->statIndex( $i ); 
    $fileName = basename($stat['name']);
    print_r($fileName.PHP_EOL);     
    $za->extractTo($zipDirectory);
    $za->close();    
    // Lecture du fichier csv dans le zip
    $fn = fopen($fileName, 'r');    
    // Liste des titres de colonnes
    $titres = fgetcsv($fn, 1000, ';');
    while (($data = fgetcsv($fn, 1000, ';')) !== FALSE){
        foreach($data as $i => $d){
            if($d){
                // Affichage des donnees de la ligne
                echo $titres[$i].' => '.$d.PHP_EOL;
            }            
        }
        // Saut de ligne
        echo PHP_EOL;
    }   
    // Suppression du fichier .csv
    unlink($zipDirectory.$fileName);
}
// Suppression du fichier .zip
unlink($zipDirectory.$zipName);
?>
####################################################################################
#- Envoi requete
####################################################################################
import shutil
import requests
import zipfile
import os

zipName = 'rapportCampagne.zip'
zipDirectory = '/VOTRE_REPERTOIRE/'

url = 'https://apirest.isendpro.com/cgi-bin/campagne'
params = {
    'keyid':            'a296464ce012b8ab710a',
    'rapportCampagne':  1,
    'date_deb':         '2020-01-01 10:00',
    'date_fin':         '2020-01-07 20:00',
}

response = requests.post(url, params, stream=True)
with open(zipDirectory+zipName, 'wb') as f:
    response.raw.decode_content = True
    shutil.copyfileobj(response.raw, f) 

####################################################################################
#- Traitement du retour
####################################################################################
myzipfile = zipfile.ZipFile(zipDirectory+zipName)
for fileName in myzipfile.namelist():
    # Unzip du fichier vers zipDirectory
    with zipfile.ZipFile(zipDirectory+zipName, 'r') as zip_ref:
        zip_ref.extractall(zipDirectory)    
    # Lecture du fichier csv dans le zip
    fichier = open(zipDirectory+fileName)   
    lines = fichier.readlines()    
    firstLine=1
    for line in lines:
        line=line.strip()   
        line=line.split(';')    
        if firstLine:
            # Liste des titres de colonnes
            firstLine=0
            titres=line
        else:
            i=0
            for data in line:
                if data:
                    # Affichage des donnees de la ligne
                    print titres[i]+' => '+data
                    i+=1 

    # Suppression du fichier .csv
    os.remove(zipDirectory+fileName)

# Suppression du fichier .zip
os.remove(zipDirectory+zipName)
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.io.BufferedReader;
import java.io.FileReader;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;
    /**
     * Size of the buffer to read/write data
     */
    private static final int BUFFER_SIZE = 4096;    

    public static void main(String[] args) throws IOException {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/campagne";
        
        var zipName = "rapportCampagne.zip";
        var zipDirectory = "/VOTRE_REPERTOIRE/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",            "a296464ce012b8ab710a");
        paramsTablo.put("rapportCampagne",  "1");
        paramsTablo.put("date_deb",         "2020-01-01 10:00");
        paramsTablo.put("date_fin",         "2020-01-07 20:00");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            File myzipfile = new File(zipDirectory+zipName);
            OutputStream outStream = new FileOutputStream(myzipfile);
            InputStream inputStream = con.getInputStream();
            int read;
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                outStream.write(bytes, 0, read);
            }  
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////            
            File destDir = new File(zipDirectory);

            ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipDirectory+zipName));
            ZipEntry entry = zipIn.getNextEntry();
            // iterates over entries in the zip file
            while (entry != null) {
                File mycsvfile = new File(zipDirectory+entry.getName());
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipDirectory+entry.getName()));
                byte[] bytesIn = new byte[BUFFER_SIZE];
                int read2 = 0;
                while ((read2 = zipIn.read(bytesIn)) != -1) {
                    bos.write(bytesIn, 0, read2);
                }
                bos.close();              
                        
                BufferedReader reader;
                String lineD;
                String data;  		
                ArrayList<String> titres=new ArrayList<String>();
                reader = new BufferedReader(new FileReader(zipDirectory+entry.getName()));
                String line = reader.readLine();
                // Liste des titres de colonnes
                if (line != null) {	
                    lineD = line.trim();
                    titres=new ArrayList<String>(Arrays.asList(lineD.split(";")));    
                }
                while (line != null) {				
                    line = reader.readLine();
                    if (line != null) {	
                        lineD = line.trim();
                        ArrayList<String> lineList = new ArrayList<String>(Arrays.asList(lineD.split(";")));                  
                        for (int i = 0; i < lineList.size(); i++) {
                            data = (String)lineList.get(i);            
                            data = data.trim();
                            System.out.println(titres.get(i)+" => "+data);
                        }
                        System.out.println(" ");
                    }
                }
                reader.close(); 
                // Suppression du fichier .csv
                mycsvfile.delete();

                zipIn.closeEntry();
                entry = zipIn.getNextEntry();            
            }
            zipIn.close();
            // Suppression du fichier .zip
            myzipfile.delete();            
            
        } finally {
            con.disconnect();
        }
    }  
}


Rapport de campagne JSON

Récupération de la liste des envois sur une période donnée, sur un numéro de téléphone et un tracker en JSON
La requête ne peut concerner plus de 1000 données à la fois sinon un message d'erreur sera retourné
Si la requete est trop grande alors il faudra utiliser les champs select_deb et select_pas

Appel

https://apirest.isendpro.com/cgi-bin/campagne
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
rapportCampagneData Number Oui Utiliser la valeur 1
date_deb Date au format
YYYY-MM-DD hh:mm
Oui Date de début des envois de la sélection
date_fin Date au format
YYYY-MM-DD hh:mm
Oui Date de fin des envois de la sélection
select_deb Number Non Ce nombre indique la position de début des résultats de la sélection
Ex: select_deb=1000 pour obtenir les données après les 1000ers résultats
select_pas Number Non Ce nombre indique la quantité de résultats dans la sélection
La valeur maximum acceptée est 1000
Ex: select_pas=500 pour obtenir 500 données
select_msisdn Array Non Ajout de cette liste dans la requête de rapport de campagne Au format international sans le +
Ex: [ "33601020304", "33601020305", "33601020306" ]
select_tracker String Non Ajout de ce critère dans la requête de rapport de campagne
La recherche sera étendue à tous les trackers commençant par le tracker indiqué
Ex: Si select_tracker=camp001 alors seront recherchés les trackers camp001-001 et camp001-002

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
historyMsg String Message envoyé au destinataire
historyDate String Date d'envoi du message au destinataire au format AAAA-MM-JJ HH:MM:SS
historyTracker String tracker associé au message envoyé au destinataire
historyOperator String Opérateur associé au message envoyé au destinataire
historyResponse String Réponse éventuelle retournée par le destinataire
Si aucune réponse la valeur est "-"
historyDeliveryAR String Indique si le message a bien été livré
Les valeurs possibles sont:
  • OK
  • NOK
historyDeliveryARtime String Date de la notification de livraison du message au destinataire au format AAAA-MM-JJ HH:MM:SS
historyDelivery1 String Complément d'information sur la notification
historyDelivery2 String Complément d'information sur la notification
{
    "etat": {
        "etat": [
            {
                "code":                     "207",
                "tel":                      "33601020304",
                "message":                  "Historique des envois",
                "historyMsg":               "Votre test 1 a bien été recu",
                "historyDate":              "2020-04-14 14:58:02",
                "historyTracker":           "camp001-002",
                "historyOperator":          "SFR",
                "historyResponse":          "-",
                "historyDeliveryAR":        "OK",
                "historyDeliveryARtime":    "2020-04-14 14:58:03",
                "historyDelivery1":         "SFR: SMS remis",
                "historyDelivery2":         "Message for 0033601020304 has been delivered"
            },
            {
                "code":                     "207",
                "tel":                      "33601020305",
                "message":                  "Historique des envois",
                "historyMsg":               "Votre test 1 a bien été recu",
                "historyDate":              "2020-04-14 14:58:08",
                "historyTracker":           "camp001-001",
                "historyOperator":          "ORAN",
                "historyResponse":          "-",
                "historyDeliveryAR":        "OK",
                "historyDeliveryARtime":    "2020-04-14 14:58:10",
                "historyDelivery1":         "ORAN: SMS remis",
                "historyDelivery2":         "SMS remis le 14.04.20 a 14:58:10"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/campagne' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                 "a296464ce012b8ab710a",
   "rapportCampagneData":   "1",
   "select_tracker":        "camp001",
   "date_deb":              "2020-04-01 00:00",
   "date_fin":              "2020-04-30 00:00",
   "select_deb":            "0",
   "select_pas":            "500"   
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();
$url = 'https://apirest.isendpro.com/cgi-bin/campagne';
$params = array(
    'keyid'                 =>  'a296464ce012b8ab710a',
    'rapportCampagneData'   =>  '1',
    'date_deb'              =>  '2020-01-01 00:00',
    'date_fin'              =>  '2020-01-10 00:00',
    'select_deb'            =>  '0',
    'select_pas'            =>  '500',
    'select_tracker'        =>  'camp001',    
    'select_msisdn'         =>  ['33601020304','33601020305']
);
$params = json_encode($params);     
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params,    
    CURLOPT_HTTPHEADER => array(                                                                          
        'Content-Type' => 'application/json',                                                                                
        'Content-Length: ' =>  strlen($params)                                                                       
    )
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetatList=$reponsejson->etat->etat;
if(!is_array($repetatList)){
    $repetatList=array($repetatList);
}

$cpt=1;
foreach($repetatList as $repetat){
    echo '-----------';
    echo $sautligne;
    echo 'Data '.$cpt;
    echo $sautligne;
    // Erreur generale
    if (!isset($repetat->tel)){
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
    // infos sur le retour
    }else{
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
        echo 'Tel: '.$repetat->tel;
        echo $sautligne;
        echo 'historyMsg: '.$repetat->historyMsg;
        echo $sautligne;        
        echo 'historyDate: '.$repetat->historyDate;
        echo $sautligne;        
        echo 'historyTracker: '.$repetat->historyTracker;
        echo $sautligne;        
        echo 'historyOperator: '.$repetat->historyOperator;
        echo $sautligne;        
        echo 'historyResponse: '.$repetat->historyResponse;
        echo $sautligne;        
        echo 'historyDeliveryAR: '.$repetat->historyDeliveryAR;
        echo $sautligne;        
        echo 'historyDeliveryARtime: '.$repetat->historyDeliveryARtime;
        echo $sautligne;        
        echo 'historyDelivery1: '.$repetat->historyDelivery1;
        echo $sautligne;        
        echo 'historyDelivery2: '.$repetat->historyDelivery2;
        echo $sautligne;                
    }
    $cpt+=1;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import types

url = 'https://apirest.isendpro.com/cgi-bin/campagne'
params = {
    'keyid'                 :  'a296464ce012b8ab710a',
    'rapportCampagneData'   :  '1',
    'date_deb'              :  '2020-01-01 00:00',
    'date_fin'              :  '2020-01-10 00:00',
    'select_deb'            :  '0',
    'select_pas'            :  '500',
    'select_msisdn'         :  ['33601020304','33601020305'],    
    'select_tracker'        :  'camp001'    
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetatList=reponsejson['etat']['etat']
if not type(repetatList) is types.ListType:
    repetatList=[repetatList]

cpt=1
for repetat in repetatList:
    print '-----------'    
    print 'Data '+str(cpt)    
    # Erreur generale
    if not repetat.has_key('tel'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']

    # Infos sur le retour
    else:
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        print 'Tel: '+repetat['tel']   
        print 'historyMsg: '+repetat['historyMsg']       
        print 'historyDate: '+repetat['historyDate']
        print 'historyTracker: '+repetat['historyTracker']   
        print 'historyOperator: '+repetat['historyOperator']
        print 'historyResponse: '+repetat['historyResponse']
        print 'historyDeliveryAR: '+repetat['historyDeliveryAR']
        print 'historyDeliveryARtime: '+repetat['historyDeliveryARtime']
        print 'historyDelivery1: '+repetat['historyDelivery1']
        print 'historyDelivery2: '+repetat['historyDelivery2']
    
    cpt+=1
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/campagne";
        
        ArrayList<String> listData = new ArrayList<String>();
        listData.add("33601020304");
        listData.add("33601020305");
        
        Map<String, Object> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                "a296464ce012b8ab710a");
        paramsTablo.put("rapportCampagneData", "1");
        paramsTablo.put("date_deb",             "2020-01-01 00:00");     
        paramsTablo.put("date_fin",             "2020-01-10 00:00");     
        paramsTablo.put("select_deb",           "0");     
        paramsTablo.put("select_pas",           "500");     
        paramsTablo.put("select_tracker",       "camp001");             
        paramsTablo.put("select_msisdn",        listData);            
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            ArrayList repetatList = (ArrayList)repetat.get("etat");
            if(! (repetatList instanceof ArrayList)){
                repetatList.add(repetatList);                
            }            
            
            for (int i = 0; i < repetatList.size(); i++) {
                repetat = (Map)repetatList.get(i);
                
                System.out.println("-----------");
                System.out.println("Data "+i);                
                // Erreur generale
                if (! repetat.containsKey("tel")){           
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));    
                // Infos sur le retour
                }else{
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));  
                    System.out.println("Tel: "+repetat.get("tel"));     
                    System.out.println("historyMsg: "+repetat.get("historyMsg"));       
                    System.out.println("historyDate: "+repetat.get("historyDate"));
                    System.out.println("historyTracker: "+repetat.get("historyTracker"));   
                    System.out.println("historyOperator: "+repetat.get("historyOperator"));
                    System.out.println("historyResponse: "+repetat.get("historyResponse"));
                    System.out.println("historyDeliveryAR: "+repetat.get("historyDeliveryAR"));
                    System.out.println("historyDeliveryARtime: "+repetat.get("historyDeliveryARtime"));
                    System.out.println("historyDelivery1: "+repetat.get("historyDelivery1"));
                    System.out.println("historyDelivery2: "+repetat.get("historyDelivery2"));    
                }
            }
        } finally {
            con.disconnect();
        }
    }
}


Comptage du nombre de caractères et de SMS

Comptage de la longueur d'un message en nombre de caractères et nombre de SMS avant l'envoi réel

Appel

https://apirest.isendpro.com/cgi-bin/comptage
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
sms String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
emetteur String Non Emetteur du message
Par défaut, un numéro court sur 5 chiffres
Ex: 36007
Contraintes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message et augmente de 12 caractères la longueur globale
comptage Number Oui Utiliser la valeur 1

Réponse

Paramètre Type Détails
tel String Numéro de téléphone associé au code retour
nb_sms number Nombre de SMS pour contenir le message
nb_caractere number Nombre de caractères pour contenir le message
{
 "etat":{
     "etat":[
         {
             "tel":             "0680010203",
             "nb_sms":          "1",             
             "nb_caractere":    "65"
         }
     ]
 }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/comptage' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "num":         "33601020304",
   "sms":         "Bonjour! Bienvenue sur iSendPro!",
   "emetteur":    "isendpro",
   "comptage":    1
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/comptage';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  '33601020304',
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'  =>  'isendpro',
    'comptage'  =>  1
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->tel)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
// Infos de comptage
}else{
    echo 'tel: '.$repetat->tel;
    echo $sautligne;
    echo 'nb_sms: '.$repetat->nb_sms;
    echo $sautligne;
    echo 'nb_caractere: '.$repetat->nb_caractere;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/comptage'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      '33601020304',
    'sms':      'Bonjour! Bienvenue sur iSendPro!',
    'emetteur': 'isendpro',
    'comptage': 1
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('tel'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de comptage
else:
    print 'tel: '+repetat['tel']
    print 'nb_sms: '+repetat['nb_sms']
    print 'nb_caractere: '+repetat['nb_caractere']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/comptage";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304");
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur", "isendpro"); 
        paramsTablo.put("comptage", "1");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("tel")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de comptage
            }else{
                System.out.println("tel: "+repetat.get("tel"));
                System.out.println("nb_sms: "+repetat.get("nb_sms"));  
                System.out.println("nb_caractere: "+repetat.get("nb_caractere"));     
            }

        } finally {
            con.disconnect();
        }
    }
}


Consultation du crédit

Consultation du crédit restant en quantité de SMS ou en euros Ht

Appel

https://apirest.isendpro.com/cgi-bin/credit
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
credit Number Oui Number indiquant le type de crédit restant
  • 1: Pour le montant en euros HT
  • 2: Pour la quantité de SMS

Réponse

Paramètre Type Détails
credit String Nombre à virgule indiquant le crédit restant en euros HT
Ex: 561.20
quantite Number Nombre indiquant le nombre de crédits restants en quantité de SMS
Ex: 8974
{
    "etat": 
    {
        "credit":   "13.066",
        "quantite": "326"
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/credit' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":   "a296464ce012b8ab710a",
   "credit":  2
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/credit';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'credit'    =>  2
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat;

// Erreur generale
if (!isset($repetat->credit)){
    $repetat=$reponsejson->etat->etat[0];
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
// Infos de quantites
}else{
    echo 'credit: '.$repetat->credit;
    if (isset($repetat->quantite)){
        echo $sautligne;
        echo 'quantite: '.$repetat->quantite;
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/credit'
params = {
    'keyid'     : 'a296464ce012b8ab710a',
    'credit'    : 2
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']

# Erreur generale
if not repetat.has_key('credit'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de quantites
else:
    print 'credit: '+repetat['credit']
    if repetat.has_key('quantite'):
        print 'quantite: '+repetat['quantite']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/credit";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid", "a296464ce012b8ab710a");
        paramsTablo.put("credit", "2");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");

            // Erreur generale
            if (! repetat.containsKey("credit")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }            
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("credit: "+repetat.get("credit"));
                if (repetat.containsKey("quantite")){
                    System.out.println("quantite: "+repetat.get("quantite"));  
                }
            }

        } finally {
            con.disconnect();
        }
    }
}


Récupération du prix unitaire par pays

Récupération du prix unitaire par pays en euros HT

Appel

https://apirest.isendpro.com/cgi-bin/credit
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
countryCode String Oui Indicatif international du pays sans le +
getPrice String Oui Utiliser la valeur '1'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
countryCode Number Indicatif international du pays sans le +
accountPrice String Prix unitaire en euros HT avec le point (.) comme séparateur des centimes
Ex: 0.067
{
    "etat":{
        "etat":[
            {
                "code":         "251",
                "message":      "Le prix unitaire",
                "countryCode":  "44",
                "accountPrice":  "0.067"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/credit' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":       "a296464ce012b8ab710a",
   "countryCode": "33",
   "getPrice":    "1"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/credit';
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'countryCode'   =>  '33',
    'getPrice'      =>  '1'    
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->countryCode)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'countryCode: '.$repetat->countryCode;
    echo $sautligne;
    echo 'accountPrice: '.$repetat->accountPrice;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/credit'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'countryCode':  '33',
    'getPrice':     '1'    
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('countryCode'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'countryCode: '+repetat['countryCode']
    print 'accountPrice: '+repetat['accountPrice']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/credit";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",            "a296464ce012b8ab710a");
        paramsTablo.put("countryCode",      "33");
        paramsTablo.put("getPrice",         "1");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("countryCode")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message")); 
                System.out.println("countryCode: "+repetat.get("countryCode"));  
                System.out.println("accountPrice: "+repetat.get("accountPrice"));     
            }

        } finally {
            con.disconnect();
        }
    }
}


Appel au LookUp HLR

Service Payant Merci de vous rapprocher de votre conseiller commercial concernant la tarification de ce service
Appel au LookUp HLR pour tester les numéros de téléphone et obtenir l'opérateur associé en retour
Les numéros de téléphone sont placés dans les variables numXX est un entier allant de 1 à 500 au maximum

Appel

https://apirest.isendpro.com/cgi-bin/hlr
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num Array Oui Liste des numéros de téléphone du destinataire
Au format international sans le +
Ex: [ "33601020304", "33601020305", "33601020306" ]
getHLR Number Oui Utiliser la valeur 1

Réponse

Paramètre Type Détails
tel String Numéro de téléphone associé au code retour
operateur String Chaine de caracteres indiquant la valeur de l'opérateur
Liste des opérateur:
  • ORAN: Orange
  • SFR: SFR
  • BOUY: Bouygues Telecom
  • FREE: FREE
  • NRJ: NRJ Mobile
  • LYCA: LYCA Mobile
  • CORI: Coriolis
  • MUND: Mundio
  • TRAT: Transatel
  • COMP: Completel
  • LEGO: Legos
  • MOQU: SFR
  • INTE: Numéro international
Si le numéro est en liste noire alors il sera ajouté "-LISTE NOIRE" au nom de l'opérateur
{
    "etat": {
        "etat": [
            {
                "tel":      "33601020304", 
                "operateur":"INVALIDE"
            }, 
            {
                "tel":      "33601020305",
                "operateur":"SFR"
            },
            {
                "tel":      "33601020306",
                "operateur":"BOUY-LISTE NOIRE"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/hlr' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":   "a296464ce012b8ab710a",
   "num":     ["33601020304","33601020305","33601020306"],
   "getHLR":  1
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/hlr';
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  ['33601020304','33601020305'],
    'getHLR'    =>  1
);
$params = json_encode($params);     
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params,    
    CURLOPT_HTTPHEADER => array(                                                                          
        'Content-Type' => 'application/json',                                                                                
        'Content-Length: ' =>  strlen($params)                                                                       
    )
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetatList=$reponsejson->etat->etat;
if(!is_array($repetatList)){
    $repetatList=array($repetatList);
}

$cpt=1;
foreach($repetatList as $repetat){
    echo '-----------';
    echo $sautligne;
    echo 'Data '.$cpt;
    echo $sautligne;
    // Erreur generale
    if (!isset($repetat->tel)){
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
    // Infos sur le numero
    }else{
        echo 'Tel: '.$repetat->tel;
        echo $sautligne;
        echo 'Operateur: '.$repetat->operateur;
        echo $sautligne;
    }
    $cpt+=1;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import types

url = 'https://apirest.isendpro.com/cgi-bin/hlr'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      ['33601020304','33601020305','33601020306'],
    'getHLR':   1
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetatList=reponsejson['etat']['etat']
if not type(repetatList) is types.ListType:
    repetatList=[repetatList]

cpt=1
for repetat in repetatList:
    print '-----------'    
    print 'Data '+str(cpt)    
    # Erreur generale
    if not repetat.has_key('tel'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        
    # Infos sur le numero
    elif repetat.has_key('tel'):
        print 'Tel: '+repetat['tel']
        print 'Operateur: '+repetat['operateur']
    
    cpt+=1
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/hlr";
        
        ArrayList<String> listData = new ArrayList<String>();
        listData.add("33601020304");
        listData.add("33601020305");
        listData.add("33601020306");
        
        Map<String, Object> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      listData);
        paramsTablo.put("getHLR",   "1");     
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            ArrayList repetatList = (ArrayList)repetat.get("etat");
            if(! (repetatList instanceof ArrayList)){
                repetatList.add(repetatList);                
            }            
            
            for (int i = 0; i < repetatList.size(); i++) {
                repetat = (Map)repetatList.get(i);
                
                System.out.println("-----------");
                System.out.println("Data "+i);                
                // Erreur generale
                if (! repetat.containsKey("tel")){           
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));    
                // Erreur specifique au numero de telephone 
                }else{
                    System.out.println("tel: "+repetat.get("tel"));
                    System.out.println("operateur: "+repetat.get("operateur"));     
                }
            }
        } finally {
            con.disconnect();
        }
    }
}


Ajout en liste noire

Ajout de numéros de téléphone dans votre liste noire

Appel

https://apirest.isendpro.com/cgi-bin/setlistenoire
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
setlisteNoire Number Oui Utiliser la valeur 1

Réponse

Paramètre Type Détails
tel String Numéro de téléphone associé au code retour
listeNoire String Confirmation de l'ajout: OK
{
    "etat": {
        "etat": [
            {
                "tel":          "33601020304", 
                "listeNoire":   "OK"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/setlistenoire' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":           "a296464ce012b8ab710a",
   "num":             "33601020304",
   "setlisteNoire":   1
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/setlistenoire';
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'num'           =>  '33601020304',
    'setlisteNoire' =>  1
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->tel)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'tel: '.$repetat->tel;
    echo $sautligne;
    echo 'listeNoire: '.$repetat->listeNoire;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/setlistenoire'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'num':          '33601020304',
    'setlisteNoire':1
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('tel'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'tel: '+repetat['tel']
    print 'listeNoire: '+repetat['listeNoire']

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/setlistenoire";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304");
        paramsTablo.put("setlisteNoire", "1");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("tel")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("tel: "+repetat.get("tel"));
                System.out.println("listeNoire: "+repetat.get("listeNoire"));    
            }

        } finally {
            con.disconnect();
        }
    }
}


Suppression de la liste noire

Suppression de numéros de téléphone dans votre liste noire

Appel

https://apirest.isendpro.com/cgi-bin/dellistenoire
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
delListeNoire Number Oui Utiliser la valeur 1

Réponse

Paramètre Type Détails
tel String Numéro de téléphone associé au code retour
listeNoire String Retour sur la tentative de suppression
  • SUPPRESSION OK
  • SUPPRESSION NOK
{
    "etat": {
        "etat": [
            {
                "tel":          "33601020304", 
                "listeNoire":   "SUPPRESSION OK"
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "tel":          "33601020304", 
                "listeNoire":   "SUPPRESSION NOK"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/dellistenoire' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":           "a296464ce012b8ab710a",
   "num":             "33601020304",
   "delListeNoire":   1
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/dellistenoire';
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'num'           =>  '33601020304',
    'delListeNoire' =>  1
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->tel)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'tel: '.$repetat->tel;
    echo $sautligne;
    echo 'listeNoire: '.$repetat->listeNoire;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/dellistenoire'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'num':          '33601020304',
    'delListeNoire':1
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('tel'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'tel: '+repetat['tel']
    print 'listeNoire: '+repetat['listeNoire']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/dellistenoire";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304");
        paramsTablo.put("delListeNoire", "1");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("tel")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("tel: "+repetat.get("tel"));
                System.out.println("listeNoire: "+repetat.get("listeNoire"));    
            }

        } finally {
            con.disconnect();
        }
    }
}


Récupération de la liste noire

Récupération de la liste des numéros de téléphone en liste noire dans un fichier .csv

Appel

https://apirest.isendpro.com/cgi-bin/getlistenoire
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
getListeNoire Number Oui Utiliser la valeur 1

Réponse

La réponse est un fichier CSV zippé avec une seule colonne contenant le numéro de téléphone

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/getlistenoire' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":           "a296464ce012b8ab710a",
   "getListeNoire":   1
}' \
-o listenoire.zip
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();
$zipName = 'listenoire.zip';
$zipDirectory = '/VOTRE_REPERTOIRE/';
$fp = fopen($zipDirectory.$zipName, 'w');

$url = 'https://apirest.isendpro.com/cgi-bin/getlistenoire';
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'getListeNoire' =>  1
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_FILE, $fp);

$response = curl_exec($ch);
fwrite($fp, $response);

curl_close($ch);
fclose($fp);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html

// Unzip du fichier
$za = new ZipArchive(); 
$za->open($zipDirectory.$zipName); 
for( $i = 0; $i < $za->numFiles; $i++ ){ 
    $stat = $za->statIndex( $i ); 
    $fileName = basename($stat['name']);
    print_r($fileName.PHP_EOL);     
    $za->extractTo($zipDirectory);
    $za->close();    
    // Lecture du fichier csv dans le zip
    $fn = fopen($fileName, 'r');    
    // Liste des titres de colonnes
    $titres = fgetcsv($fn, 1000, ';');
    while (($data = fgetcsv($fn, 1000, ';')) !== FALSE){
        foreach($data as $i => $d){
            if($d){
                // Affichage des donnees de la ligne
                echo $titres[$i].' => '.$d.PHP_EOL;
            }            
        }
        // Saut de ligne
        echo PHP_EOL;
    }   
    // Suppression du fichier .csv
    unlink($zipDirectory.$fileName);
}
// Suppression du fichier .zip
unlink($zipDirectory.$zipName);
?>
####################################################################################
#- Envoi requete
####################################################################################
import shutil
import requests
import zipfile
import os

zipName = 'listenoire.zip'
zipDirectory = '/VOTRE_REPERTOIRE/'

url = 'https://apirest.isendpro.com/cgi-bin/getlistenoire'
params = {
    'keyid':            'a296464ce012b8ab710a',
    'getListeNoire':    1
}

response = requests.post(url, params, stream=True)
with open(zipDirectory+zipName, 'wb') as f:
    response.raw.decode_content = True
    shutil.copyfileobj(response.raw, f) 

####################################################################################
#- Traitement du retour
####################################################################################
myzipfile = zipfile.ZipFile(zipDirectory+zipName)
for fileName in myzipfile.namelist():
    # Unzip du fichier vers zipDirectory
    with zipfile.ZipFile(zipDirectory+zipName, 'r') as zip_ref:
        zip_ref.extractall(zipDirectory)    
    # Lecture du fichier csv dans le zip
    fichier = open(zipDirectory+fileName)   
    lines = fichier.readlines()    
    firstLine=1
    for line in lines:
        line=line.strip()   
        line=line.split(';')    
        if firstLine:
            # Liste des titres de colonnes
            firstLine=0
            titres=line
        else:
            i=0
            for data in line:
                if data:
                    # Affichage des donnees de la ligne
                    print titres[i]+' => '+data
                    i+=1 

    # Suppression du fichier .csv
    os.remove(zipDirectory+fileName)

# Suppression du fichier .zip
os.remove(zipDirectory+zipName)        
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.io.BufferedReader;
import java.io.FileReader;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;
    /**
     * Size of the buffer to read/write data
     */
    private static final int BUFFER_SIZE = 4096;    

    public static void main(String[] args) throws IOException {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/getlistenoire";
        
        var zipName = "listenoire.zip";
        var zipDirectory = "/VOTRE_REPERTOIRE/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",            "a296464ce012b8ab710a");
        paramsTablo.put("getListeNoire",    "1");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            File myzipfile = new File(zipDirectory+zipName);
            OutputStream outStream = new FileOutputStream(myzipfile);
            InputStream inputStream = con.getInputStream();
            int read;
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                outStream.write(bytes, 0, read);
            }  
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////            
            File destDir = new File(zipDirectory);

            ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipDirectory+zipName));
            ZipEntry entry = zipIn.getNextEntry();
            // iterates over entries in the zip file
            while (entry != null) {
                File mycsvfile = new File(zipDirectory+entry.getName());
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipDirectory+entry.getName()));
                byte[] bytesIn = new byte[BUFFER_SIZE];
                int read2 = 0;
                while ((read2 = zipIn.read(bytesIn)) != -1) {
                    bos.write(bytesIn, 0, read2);
                }
                bos.close();              
                        
                BufferedReader reader;
                String lineD;
                String data;  		
                ArrayList<String> titres=new ArrayList<String>();
                reader = new BufferedReader(new FileReader(zipDirectory+entry.getName()));
                String line = reader.readLine();
                // Liste des titres de colonnes
                if (line != null) {	
                    lineD = line.trim();
                    titres=new ArrayList<String>(Arrays.asList(lineD.split(";")));    
                }
                while (line != null) {				
                    line = reader.readLine();
                    if (line != null) {	
                        lineD = line.trim();
                        ArrayList<String> lineList = new ArrayList<String>(Arrays.asList(lineD.split(";")));                  
                        for (int i = 0; i < lineList.size(); i++) {
                            data = (String)lineList.get(i);            
                            data = data.trim();
                            System.out.println(titres.get(i)+" => "+data);
                        }
                        System.out.println(" ");
                    }
                }
                reader.close(); 
                // Suppression du fichier .csv
                mycsvfile.delete();

                zipIn.closeEntry();
                entry = zipIn.getNextEntry();            
            }
            zipIn.close();
            // Suppression du fichier .zip
            myzipfile.delete();            
            
        } finally {
            con.disconnect();
        }
    }  
}


Création d'un nouveau répertoire

Création d'un nouveau répertoire de numéros de téléphone

Appel

https://apirest.isendpro.com/cgi-bin/repertoire
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
repertoireNom String Oui Nom du nouveau répertoire
repertoireEdit String Oui Utiliser la valeur 'create'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
repertoireId String Identifiant du répertoire créé
message String Libellé correspondant au tableau des erreurs
{
    "etat":{
        "etat":[
            {
                "code":         "100",
                "repertoireId": "39258",
                "message":      "Votre repertoire a ete cree!"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/repertoire' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":           "a296464ce012b8ab710a",
   "repertoireNom":   "MonNouveauRepertoire",
   "repertoireEdit":  "create"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/repertoire';
$params = array(
    'keyid'             =>  'a296464ce012b8ab710a',
    'repertoireNom'     =>  'MonNouveauRepertoire',
    'repertoireEdit'    =>  'create'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->repertoireId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
    echo 'RepertoireId: '.$repetat->repertoireId;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/repertoire'
params = {
    'keyid':            'a296464ce012b8ab710a',
    'repertoireNom':    'repertoireNom',
    'repertoireEdit':   'create'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('repertoireId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'RepertoireId: '+repetat['repertoireId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/repertoire";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",            "a296464ce012b8ab710a");
        paramsTablo.put("repertoireNom",    "repertoireNom");
        paramsTablo.put("repertoireEdit",   "create");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("repertoireId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message")); 
                System.out.println("repertoireId: "+repetat.get("repertoireId"));    
            }

        } finally {
            con.disconnect();
        }
    }
}


Ajout dans un répertoire

Ajout de numéros de téléphone dans un répertoire

Appel

https://apirest.isendpro.com/cgi-bin/repertoire
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num Array Oui Liste des numéros de téléphone à ajouter
Au format international sans le +
Ex: [ "33601020304", "33601020305", "33601020306" ]
repertoireId String Oui Identifiant du répertoire à modifier
repertoireEdit String Oui Utiliser la valeur 'add'
champ[X] Array Non Liste des données à associer au champ pour chaque numéro
[X] est à remplacer par un entier entre 1 et 27 inclus
Par défaut:
  • champ1 <=> Nom
  • champ2 <=> Champ A
  • champ27 <=> Champ Z
La position dans la liste des champs doit correspondre à celle du numéro de téléphone dans la liste des téléphones

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
repertoireId Number Identifiant du répertoire créé
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
{
    "etat":{
        "etat":[
            {
                "code":         "103",
                "repertoireId": "39258",
                "tel":          "33601020304",
                "message":      "Votre donnee a ete ajoutee dans le repertoire!"
            },
            {
                "code":         "103",
                "repertoireId": "39258",
                "tel":          "33601020305",
                "message":      "Votre donnee a ete ajoutee dans le repertoire!"
            }            
        ]
    }
}
{
    "etat":{
        "etat":[
            {
                "code":         "105",
                "repertoireId": "39258",
                "tel":          "33601020304",
                "message":      "La donnee est deja presente dans le repertoire!"
            },
            {
                "code":         "105",
                "repertoireId": "39258",
                "tel":          "33601020305",
                "message":      "La donnee est deja presente dans le repertoire!"
            }            
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/repertoire' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":           "a296464ce012b8ab710a",
   "repertoireEdit":  "add",
   "repertoireId":    "39258",
   "num":             ["33601020304","33601020305","33601020306"],
   "champ1":          ["Pierre","Paul","Jacques"],
   "champ2":          ["Paris","Lyon","Marseille"]
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/repertoire';
$params = array(
    'keyid'             =>  'a296464ce012b8ab710a',
    'repertoireEdit'    =>  'add',
    'repertoireId'      =>  '39258',
    'num'               =>  ['33601020304','33601020305','33601020306'],
    'champ1'            =>  ['Pierre','Paul','Jacques'],
    'champ2'            =>  ['Paris','Lyon','Marseille']
);
$params = json_encode($params);     
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params,    
    CURLOPT_HTTPHEADER => array(                                                                          
        'Content-Type' => 'application/json',                                                                                
        'Content-Length: ' =>  strlen($params)                                                                       
    )
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetatList=$reponsejson->etat->etat;
if(!is_array($repetatList)){
    $repetatList=array($repetatList);
}

$cpt=1;
foreach($repetatList as $repetat){
    echo '-----------';
    echo $sautligne;
    echo 'Data '.$cpt;
    echo $sautligne;
    // Erreur generale
    if (!isset($repetat->tel)){
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
    // Infos sur le numero
    }else{
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;    
        echo 'Tel: '.$repetat->tel;
        echo $sautligne;
        echo 'RepertoireId: '.$repetat->repertoireId;
        echo $sautligne;
    }
    $cpt+=1;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import types

url = 'https://apirest.isendpro.com/cgi-bin/repertoire'
params = {
    'keyid':            'a296464ce012b8ab710a',
    'repertoireEdit':   'add',
    'repertoireId':     '39258',
    'num':              ['33601020304','33601020305','33601020306'],
    'champ1':           ['Pierre','Paul','Jacques'],
    'champ2':           ['Paris','Lyon','Marseille']
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetatList=reponsejson['etat']['etat']
if not type(repetatList) is types.ListType:
    repetatList=[repetatList]

cpt=1
for repetat in repetatList:
    print '-----------'    
    print 'Data '+str(cpt)    
    # Erreur generale
    if not repetat.has_key('tel'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        
    # Infos sur le numero
    else:
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        print 'Tel: '+repetat['tel']
        print 'RepertoireId: '+repetat['repertoireId']
        
    cpt+=1
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/repertoire";

        ArrayList<String> listData = new ArrayList<String>();
        listData.add("33601020304");
        listData.add("33601020305");
        listData.add("33601020306");        

        ArrayList<String> listChamp1 = new ArrayList<String>();
        listChamp1.add("Pierre");
        listChamp1.add("Paul");
        listChamp1.add("Jacques");  

        ArrayList<String> listChamp2 = new ArrayList<String>();
        listChamp2.add("Paris");
        listChamp2.add("Lyon");
        listChamp2.add("Marseille");  
        
        Map<String, Object> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",            "a296464ce012b8ab710a");
        paramsTablo.put("repertoireEdit",   "add");
        paramsTablo.put("repertoireId",     "39258");
        paramsTablo.put("num",              listData);
        paramsTablo.put("champ1",           listChamp1);
        paramsTablo.put("champ2",           listChamp2);    
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            ArrayList repetatList = (ArrayList)repetat.get("etat");
            if(! (repetatList instanceof ArrayList)){
                repetatList.add(repetatList);                
            }            
            
            for (int i = 0; i < repetatList.size(); i++) {
                repetat = (Map)repetatList.get(i);
                
                System.out.println("-----------");
                System.out.println("Data "+i);                
                // Erreur generale
                if (! repetat.containsKey("tel")){           
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));    
                // Erreur specifique au numero de telephone 
                }else{
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));                  
                    System.out.println("tel: "+repetat.get("tel"));
                    System.out.println("RepertoireId: "+repetat.get("RepertoireId"));     
                }
            }
        } finally {
            con.disconnect();
        }
    }
}


Suppression dans un répertoire

Suppression de numéros de téléphone d'un répertoire

Appel

https://apirest.isendpro.com/cgi-bin/repertoire
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num Array Oui Liste des numéros de téléphone à ajouter
Au format international sans le +
Ex: [ "33601020304", "33601020305", "33601020306" ]
repertoireId String Oui Identifiant du répertoire à modifier
repertoireEdit String Oui Utiliser la valeur 'del'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
repertoireId Number Identifiant du répertoire créé
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
{
    "etat":{
        "etat":[
            {
                "code":         "106",
                "repertoireId": "39258",
                "tel":          "33601020304",
                "message":      "Votre donnee a ete supprimee du repertoire"
            },
            {
                "code":         "106",
                "repertoireId": "39258",
                "tel":          "33601020305",
                "message":      "Votre donnee a ete supprimee du repertoire"
            }            
        ]
    }
}
{
    "etat":{
        "etat":[
            {
                "code":         "107",
                "repertoireId": "39258",
                "tel":          "33601020304",
                "message":      "La donnee n'est pas presente dans le repertoire!"
            },
            {
                "code":         "107",
                "repertoireId": "39258",
                "tel":          "33601020305",
                "message":      "La donnee n'est pas presente dans le repertoire!"
            }            
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/repertoire' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":           "a296464ce012b8ab710a",
   "repertoireEdit":  "del",
   "repertoireId":    "39258",
   "num":             ["33601020304","33601020305","33601020306"]
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/repertoire';
$params = array(
    'keyid'             =>  'a296464ce012b8ab710a',
    'repertoireEdit'    =>  'del',
    'repertoireId'      =>  '39258',
    'num'               =>  ['33601020304','33601020305','33601020306']
);
$params = json_encode($params);     
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params,    
    CURLOPT_HTTPHEADER => array(                                                                          
        'Content-Type' => 'application/json',                                                                                
        'Content-Length: ' =>  strlen($params)                                                                       
    )
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetatList=$reponsejson->etat->etat;
if(!is_array($repetatList)){
    $repetatList=array($repetatList);
}

$cpt=1;
foreach($repetatList as $repetat){
    echo '-----------';
    echo $sautligne;
    echo 'Data '.$cpt;
    echo $sautligne;
    // Erreur generale
    if (!isset($repetat->tel)){
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;
    // Infos sur le numero
    }else{
        echo 'Code: '.$repetat->code;
        echo $sautligne;
        echo 'Message: '.$repetat->message;
        echo $sautligne;    
        echo 'Tel: '.$repetat->tel;
        echo $sautligne;
        echo 'RepertoireId: '.$repetat->repertoireId;
        echo $sautligne;
    }
    $cpt+=1;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import types

url = 'https://apirest.isendpro.com/cgi-bin/repertoire'
params = {
    'keyid':            'a296464ce012b8ab710a',
    'repertoireEdit':   'del',
    'repertoireId':     '39258',
    'num':              ['33601020304','33601020305','33601020306']
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetatList=reponsejson['etat']['etat']
if not type(repetatList) is types.ListType:
    repetatList=[repetatList]

cpt=1
for repetat in repetatList:
    print '-----------'    
    print 'Data '+str(cpt)    
    # Erreur generale
    if not repetat.has_key('tel'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        
    # Infos sur le numero
    else:
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
        print 'Tel: '+repetat['tel']
        print 'RepertoireId: '+repetat['repertoireId']
        
    cpt+=1
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/repertoire";

        ArrayList<String> listData = new ArrayList<String>();
        listData.add("33601020304");
        listData.add("33601020305");
        listData.add("33601020306");        
        
        Map<String, Object> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",            "a296464ce012b8ab710a");
        paramsTablo.put("repertoireEdit",   "del");
        paramsTablo.put("repertoireId",     "39258");
        paramsTablo.put("num",              listData);
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            ArrayList repetatList = (ArrayList)repetat.get("etat");
            if(! (repetatList instanceof ArrayList)){
                repetatList.add(repetatList);                
            }            
            
            for (int i = 0; i < repetatList.size(); i++) {
                repetat = (Map)repetatList.get(i);
                
                System.out.println("-----------");
                System.out.println("Data "+i);                
                // Erreur generale
                if (! repetat.containsKey("tel")){           
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));    
                // Erreur specifique au numero de telephone 
                }else{
                    System.out.println("Code: "+repetat.get("code"));
                    System.out.println("Message: "+repetat.get("message"));                  
                    System.out.println("tel: "+repetat.get("tel"));
                    System.out.println("RepertoireId: "+repetat.get("RepertoireId"));     
                }
            }
        } finally {
            con.disconnect();
        }
    }
}


Webhook des accusés de réception

Présentation de la structure de renvoi des accusés de réception sur une url donnée

Appel

Le client devra développer une page Web qui traitera les données reçues.
Contraintes
  • Page accessible sans système d'authentification
  • Définir le lien sur votre espace client Mon compte -> Mon API -> AR des SMS
  • Afficher la chaine de caractères 'validation' en réponse à l'appel
Remarque: Si la réponse 'validation' n'est pas obtenue, 2 autres tentatives d'envois de la notification seront effectuées à un jour d'intervalle à 02h00 du matin.
www.votre_adresse.com/votre_page_web?tel=[TEL]&libelle=[LIBELLE]&statut=[STATUT]&code_erreur=[CODE_ERREUR]&date=[DATE]&heure=[HEURE]&id=[ID]&operateur=[OPERATEUR]&tracker=[TRACKER]
Paramètre Type Obligatoire Détails
tel String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
libelle String Oui Libellé sur le statut de l'accusé de réception
statut Number Oui Statut du message
  • 0 -> ok
  • 2 -> erreur
Code erreur String Oui Code associé à l'accusé de réception (cf Annexes)
date Date au format
AAAA-MM-JJ
Oui La date de réception de l'accusé
heure Date au format
HH:MM:SS
Oui L'heure de réception de l'accusé
id Number Oui Identifiant unique de l'accusé
operateur String Oui Chaine de caracteres indiquant la valeur de l'opérateur (cf Annexes)
tracker String Oui Argument éventuellement fourni lors de l'envoi pour une identification simplifiée

Réponse

Vous devez répondre la chaine de caractères 'validation'
Remarque: Si la réponse 'validation' n'est pas obtenue, 2 autres tentatives d'envois de la notification seront effectuées à un jour d'intervalle à 02h00 du matin.
validation


Webhook des réponses

Présentation de la structure de renvoi des réponses sur une url donnée

Appel

Le client devra développer une page Web qui traitera les données reçues.
Contraintes
  • Page accessible sans système d'authentification
  • Définir le lien sur votre espace client Mon compte -> Mon API -> Réponses SMS
  • Afficher la chaine de caractères 'validation' en réponse à l'appel
www.votre_adresse.com/votre_page_web?tel=[TEL]&id_retour=[ID_RETOUR]&msg_sms=[MSG_SMS]&tracker=[TRACKER]
Paramètre Type Obligatoire Détails
tel String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
id_retour Number Oui Identifiant unique de l'accusé
msg_sms String Oui Réponse envoyée par le destinataire
tracker String Oui Argument éventuellement fourni lors de l'envoi pour une identification simplifiée

Réponse

Vous devez répondre la chaine de caractères 'validation'
validation


Création d'un sous compte

Création d'un nouveau sous compte pour un compte maitre

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountLogin String Oui Identifiant de connexion pour le nouveau sous compte
subAccountPassword String Oui Mot de passe de connexion pour le nouveau sous compte
subAccountEdit String Oui Utiliser la valeur 'addAccount'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountLogin String Identifiant de connexion pour le nouveau sous compte
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":             "230",
                "message":          "Le sous compte a ete ajoute",
                "subAccountLogin":  "isendpro2018",
                "subAccountId":     "20474",
                "subAccountKeyId":  "ber296464ce018ab710a"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":               "a296464ce012b8ab710a",
   "subAccountLogin":     "MonIdentifiant",
   "subAccountPassword":  "MonMotdpasse",
   "subAccountEdit":      "addAccount"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'             =>  'a296464ce012b8ab710a',
    'subAccountLogin'   =>  'MonIdentifiant',
    'subAccountPassword'=>  'MonMotdpasse',
    'subAccountEdit'    =>  'addAccount'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountLogin)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountLogin: '.$repetat->subAccountLogin;
    if (isset($repetat->subAccountId)){
        echo $sautligne;
        echo 'subAccountId: '.$repetat->subAccountId;
    }
    if (isset($repetat->subAccountKeyId)){
        echo $sautligne;
        echo 'subAccountKeyId: '.$repetat->subAccountKeyId;
    }
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid':                'a296464ce012b8ab710a',
    'subAccountLogin':      'MonIdentifiant',
    'subAccountPassword':   'MonMotdpasse',
    'subAccountEdit':       'addAccount'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountLogin'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountLogin: '+repetat['subAccountLogin']
    if repetat.has_key('subAccountId'):
        print 'subAccountId: '+repetat['subAccountId']    
    if repetat.has_key('subAccountKeyId'):
        print 'subAccountKeyId: '+repetat['subAccountKeyId']   
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                "a296464ce012b8ab710a");
        paramsTablo.put("subAccountLogin",      "MonIdentifiantJava");
        paramsTablo.put("subAccountPassword",   "MonMotdpasse");
        paramsTablo.put("subAccountEdit",       "addAccount");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountLogin")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message")); 
                System.out.println("subAccountLogin: "+repetat.get("subAccountLogin"));    
                if (repetat.containsKey("subAccountId")){
                    System.out.println("subAccountId: "+repetat.get("subAccountId"));   
                }
                if (repetat.containsKey("subAccountKeyId")){
                    System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));   
                }                
            }

        } finally {
            con.disconnect();
        }
    }
}


Définition du prix du SMS d'un sous compte

Définition du prix du SMS d'un sous compte en euros HT

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountPrice String Oui Valeur du prix unitaire en euro HT pour 1 SMS
Le séparateur de centimes est le point (.)
Ex: 0.044
subAccountCountryCode String Oui Indicatif international du pays associé au prix sans le +
Ex: 39 pour Italie ou 32 pour Belgique
subAccountEdit String Oui Utiliser la valeur 'setPrice'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":                 "241",
                "message":              "Le prix a ete mis a jour",
                "subAccountId":         "20474",
                "subAccountKeyId":      "ber296464ce018ab710a",
                "subAccountCountryCode":"39"
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "234",
                "message":              "Aucun sous compte avec ces identifiants",
                "subAccountKeyId":      "ber296464ce018ab710a",                      
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                   "a296464ce012b8ab710a",
   "subAccountKeyId":         "ber296464ce018ab710a",
   "subAccountPrice":         "0.068",
   "subAccountCountryCode":   "39",
   "subAccountEdit":          "setPrice"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                 =>  'a296464ce012b8ab710a',
    'subAccountKeyId'       =>  'ber296464ce018ab710a',
    'subAccountPrice'       =>  '0.068',
    'subAccountCountryCode' =>  '39',
    'subAccountEdit'        =>  'setPrice'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountKeyId: '.$repetat->subAccountKeyId;
    if (isset($repetat->subAccountId)){
        echo $sautligne;
        echo 'subAccountId: '.$repetat->subAccountId;
    }
    if (isset($repetat->subAccountCountryCode)){
        echo $sautligne;
        echo 'subAccountCountryCode: '.$repetat->subAccountCountryCode;
    }    
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid'                 :  'a296464ce012b8ab710a',
    'subAccountKeyId'       :  'ber296464ce018ab710a',
    'subAccountPrice'       :  '0.068',
    'subAccountCountryCode' :  '39',
    'subAccountEdit'        :  'setPrice'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountKeyId: '+repetat['subAccountKeyId'] 
    if repetat.has_key('subAccountId'):
        print 'subAccountId: '+repetat['subAccountId']    
    if repetat.has_key('subAccountCountryCode'):
        print 'subAccountCountryCode: '+repetat['subAccountCountryCode']  
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                    "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",          "ber296464ce018ab710a");
        paramsTablo.put("subAccountPrice",          "0.068");
        paramsTablo.put("subAccountCountryCode",    "39");
        paramsTablo.put("subAccountEdit",           "setPrice");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                if (repetat.containsKey("subAccountId")){
                    System.out.println("subAccountId: "+repetat.get("subAccountId"));   
                }
                if (repetat.containsKey("subAccountKeyId")){
                    System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));   
                }                
            }

        } finally {
            con.disconnect();
        }
    }
}


Récupération du prix du SMS d'un sous compte

Récupération du prix du SMS d'un sous compte en euros HT

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountCountryCode String Oui Indicatif international du pays associé au prix sans le +
Ex: 39 pour Italie ou 32 pour Belgique
subAccountEdit String Oui Utiliser la valeur 'getPrice'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le sous compte
subAccountCountryCode String Indicatif international du pays associé au prix sans le +
subAccountPrice String Prix unitaire en euros HT avec le point (.) comme séparateur des centimes
{
    "etat": {
        "etat": [
            {
                "code":                 "251",
                "message":              "Le prix unitaire",
                "subAccountId":         "20474",
                "subAccountKeyId":      "ber296464ce018ab710a",
                "subAccountCountryCode":"344",
                "subAccountPrice":      "0.049"    
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                   "a296464ce012b8ab710a",
   "subAccountKeyId":         "ber296464ce018ab710a",
   "subAccountCountryCode":   "39",
   "subAccountEdit":          "getPrice"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                 =>  'a296464ce012b8ab710a',
    'subAccountKeyId'       =>  'ber296464ce018ab710a',
    'subAccountCountryCode' =>  '39',
    'subAccountEdit'        =>  'getPrice'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountKeyId: '.$repetat->subAccountKeyId;
    if (isset($repetat->subAccountId)){
        echo $sautligne;
        echo 'subAccountId: '.$repetat->subAccountId;
    }
    if (isset($repetat->subAccountCountryCode)){
        echo $sautligne;
        echo 'subAccountCountryCode: '.$repetat->subAccountCountryCode;
    }    
    if (isset($repetat->subAccountPrice)){
        echo $sautligne;
        echo 'subAccountPrice: '.$repetat->subAccountPrice;
    }        
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid'                 :  'a296464ce012b8ab710a',
    'subAccountKeyId'       :  'ber296464ce018ab710a',
    'subAccountCountryCode' :  '39',
    'subAccountEdit'        :  'getPrice'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountKeyId: '+repetat['subAccountKeyId'] 
    if repetat.has_key('subAccountId'):
        print 'subAccountId: '+repetat['subAccountId']    
    if repetat.has_key('subAccountCountryCode'):
        print 'subAccountCountryCode: '+repetat['subAccountCountryCode']    
    if repetat.has_key('subAccountPrice'):
        print 'subAccountPrice: '+repetat['subAccountPrice']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                    "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",          "ber296464ce018ab710a");
        paramsTablo.put("subAccountCountryCode",    "39");
        paramsTablo.put("subAccountEdit",           "getPrice");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                if (repetat.containsKey("subAccountId")){
                    System.out.println("subAccountId: "+repetat.get("subAccountId"));   
                }
                if (repetat.containsKey("subAccountCountryCode")){
                    System.out.println("subAccountCountryCode: "+repetat.get("subAccountCountryCode"));   
                }        
                if (repetat.containsKey("subAccountPrice")){
                    System.out.println("subAccountPrice: "+repetat.get("subAccountPrice"));   
                }                  
            }

        } finally {
            con.disconnect();
        }
    }
}


Augmenter le crédit SMS d'un sous compte

Augmenter le crédit SMS d'un sous compte

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountAddCredit Number Oui Montant en euros HT à ajouter
Le séparateur de centimes est le point (.)
Ex: 150.0
subAccountEdit String Oui Utiliser la valeur 'addCredit'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":             "239",
                "message":          "Le credit a ete ajoute au sous compte",
                "subAccountId":     "20474",
                "subAccountKeyId":  "ber296464ce018ab710a"                
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "234",
                "message":              "Aucun sous compte avec ces identifiants",
                "subAccountKeyId":      "ber296464ce018ab710a",                    
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                   "a296464ce012b8ab710a",
   "subAccountKeyId":         "ber296464ce018ab710a",
   "subAccountAddCredit":     "150",
   "subAccountEdit":          "addCredit"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                 =>  'a296464ce012b8ab710a',
    'subAccountKeyId'       =>  'ber296464ce018ab710a',
    'subAccountAddCredit'   =>  '150',
    'subAccountEdit'        =>  'addCredit'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountId: '.$repetat->subAccountKeyId;
    echo $sautligne;
    echo 'subAccountKeyId: '.$repetat->subAccountId;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid':                'a296464ce012b8ab710a',
    'subAccountKeyId':      'ber296464ce018ab710a',
    'subAccountAddCredit':  '150',
    'subAccountEdit':       'addCredit'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountId: '+repetat['subAccountId']    
    print 'subAccountKeyId: '+repetat['subAccountKeyId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",      "ber296464ce018ab710a");
        paramsTablo.put("subAccountAddCredit",  "150");
        paramsTablo.put("subAccountEdit",       "addCredit");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("subAccountId: "+repetat.get("subAccountId"));   
                System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));   
            }

        } finally {
            con.disconnect();
        }
    }
}


Modifier l'encours SMS d'un sous compte

Modifier l'encours SMS d'un sous compte

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountOutstanding Number Oui Nouveau montant en euros HT de l'encours
subAccountEdit String Oui Utiliser la valeur 'setOutstanding'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":             "252",
                "message":          "L encours a ete defini pour le sous compte",
                "subAccountId":     "20474",
                "subAccountKeyId":  "ber296464ce018ab710a"                
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "234",
                "message":              "Aucun sous compte avec ces identifiants",
                "subAccountKeyId":      "ber296464ce018ab710a"                     
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                   "a296464ce012b8ab710a",
   "subAccountKeyId":         "ber296464ce018ab710a",
   "subAccountOutstanding":   "150",
   "subAccountEdit":          "setOutstanding"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                 =>  'a296464ce012b8ab710a',
    'subAccountKeyId'       =>  'ber296464ce018ab710a',
    'subAccountOutstanding' =>  '150',
    'subAccountEdit'        =>  'setOutstanding'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountId: '.$repetat->subAccountKeyId;    
    echo $sautligne;
    echo 'subAccountKeyId: '.$repetat->subAccountId;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid'                 :  'a296464ce012b8ab710a',
    'subAccountKeyId'       :  'ber296464ce018ab710a',
    'subAccountOutstanding' :  '150',
    'subAccountEdit'        :  'setOutstanding'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountId: '+repetat['subAccountId']    
    print 'subAccountKeyId: '+repetat['subAccountKeyId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                    "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",          "ber296464ce018ab710a");
        paramsTablo.put("subAccountOutstanding",    "150");
        paramsTablo.put("subAccountEdit",           "setOutstanding");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("subAccountId: "+repetat.get("subAccountId"));   
                System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));   
            }

        } finally {
            con.disconnect();
        }
    }
}


Consulter l'encours SMS d'un sous compte

Consulter l'encours SMS d'un sous compte

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountEdit String Oui Utiliser la valeur 'getOutstanding'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
subAccountOutstanding String Montant de l'encours en euros HT
{
    "etat": {
        "etat": [
            {
                "code":                     "254",
                "message":                  "L encours",
                "subAccountId":             "20474",
                "subAccountKeyId":          "ber296464ce018ab710a",
                "subAccountOutstanding":    "150"                                
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "234",
                "message":              "Aucun sous compte avec ces identifiants",
                "subAccountKeyId":      "ber296464ce018ab710a"    
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                   "a296464ce012b8ab710a",
   "subAccountKeyId":         "ber296464ce018ab710a",
   "subAccountEdit":          "getOutstanding"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                 =>  'a296464ce012b8ab710a',
    'subAccountKeyId'       =>  'ber296464ce018ab710a',
    'subAccountEdit'        =>  'getOutstanding'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountKeyId: '.$repetat->subAccountKeyId;
    echo $sautligne;
    }      
    if (isset($repetat->subAccountOutstanding)){
        echo $sautligne;
        echo 'subAccountOutstanding: '.$repetat->subAccountOutstanding;
    }      
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid'                 :  'a296464ce012b8ab710a',
    'subAccountKeyId'       :  'ber296464ce018ab710a',
    'subAccountEdit'        :  'getOutstanding'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountKeyId: '+repetat['subAccountKeyId']
    if repetat.has_key('subAccountOutstanding'):
        print 'subAccountOutstanding: '+repetat['subAccountOutstanding']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",            "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",  "ber296464ce018ab710a");
        paramsTablo.put("subAccountEdit",   "getOutstanding");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));
                if (repetat.containsKey("subAccountOutstanding")){
                    System.out.println("subAccountOutstanding: "+repetat.get("subAccountOutstanding"));
                }                
            }

        } finally {
            con.disconnect();
        }
    }
}


Gestion de la restriction STOP SMS d'un sous compte

Gestion de la restriction STOP SMS d'un sous compte

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountRestrictionStop Number Oui Activation ou désactivation de la restriction STOP SMS
  • 0: Désactivée
  • 1: Activée
subAccountEdit String Oui Utiliser la valeur 'setRestriction'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":             "244",
                "message":          "La restriction STOP a ete desactivee",
                "subAccountId":     "20474",
                "subAccountKeyId":  "ber296464ce018ab710a"                
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "234",
                "message":              "Aucun sous compte avec ces identifiants",
                "subAccountKeyId":      "ber296464ce018ab710a"     
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                       "a296464ce012b8ab710a",
   "subAccountKeyId":             "ber296464ce018ab710a",
   "subAccountRestrictionStop":   "0",
   "subAccountEdit":              "setRestriction"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                     =>  'a296464ce012b8ab710a',
    'subAccountKeyId'           =>  'ber296464ce018ab710a',
    'subAccountRestrictionStop' =>  '0',
    'subAccountEdit'            =>  'setRestriction'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountId: '.$repetat->subAccountKeyId;    
    echo $sautligne;
    echo 'subAccountKeyId: '.$repetat->subAccountId;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid'                     :  'a296464ce012b8ab710a',
    'subAccountKeyId'           :  'ber296464ce018ab710a',
    'subAccountRestrictionStop' :  '0',
    'subAccountEdit'            :  'setRestriction'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountId: '+repetat['subAccountId']
    print 'subAccountKeyId: '+repetat['subAccountKeyId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                    "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",          "ber296464ce018ab710a");
        paramsTablo.put("subAccountRestrictionStop","0");
        paramsTablo.put("subAccountEdit",           "setRestriction");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("subAccountId: "+repetat.get("subAccountId"));
                System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));
            }

        } finally {
            con.disconnect();
        }
    }
}


Gestion de la restriction horaire d'un sous compte

Gestion de la restriction horaire d'un sous compte

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountRestrictionTime Number Oui Activation ou désactivation de la restriction horaire
  • 0: Désactivée
  • 1: Activée
subAccountEdit String Oui Utiliser la valeur 'setRestriction'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":             "246",
                "message":          "La restriction horaire a ete desactivee",
                "subAccountId":     "20474",
                "subAccountKeyId":  "ber296464ce018ab710a"                
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "234",
                "message":              "Aucun sous compte avec ces identifiants",
                "subAccountKeyId":      "ber296464ce018ab710a"    
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                       "a296464ce012b8ab710a",
   "subAccountKeyId":             "ber296464ce018ab710a",
   "subAccountRestrictionTime":   "0",
   "subAccountEdit":              "setRestriction"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                     =>  'a296464ce012b8ab710a',
    'subAccountKeyId'           =>  'ber296464ce018ab710a',
    'subAccountRestrictionTime' =>  '0',
    'subAccountEdit'            =>  'setRestriction'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountId: '.$repetat->subAccountKeyId;    
    echo $sautligne;
    echo 'subAccountKeyId: '.$repetat->subAccountId;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid'                     :  'a296464a296464ce012b8ab710ae012b8ab710a',
    'subAccountKeyId'           :  'ber296464ce018ab710a',
    'subAccountRestrictionTime' :  '0',
    'subAccountEdit'            :  'setRestriction'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountId: '+repetat['subAccountId']
    print 'subAccountKeyId: '+repetat['subAccountKeyId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                    "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",          "ber296464ce018ab710a");
        paramsTablo.put("subAccountRestrictionTime","0");
        paramsTablo.put("subAccountEdit",           "setRestriction");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("subAccountId: "+repetat.get("subAccountId"));
                System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));
            }

        } finally {
            con.disconnect();
        }
    }
}


Modification du webhook de retour des AR pour un sous-compte

Modifier l'url de webhook de retour des AR pour un sous-compte vers laquelle les accusés de réception opérateurs seront envoyés

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountAdresseRetour String Oui Adresse de retour vers lequel sera envoyé les accusés de réception
Ex: https://monurlderetour.php
subAccountEdit String Oui Utiliser la valeur 'setAdresseRetour'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":             "258",
                "message":          "L url de retour a ete defini pour le sous compte",
                "subAccountId":     "20474",
                "subAccountKeyId":  "ber296464ce018ab710a"                
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "257",
                "message":              "Vous devez renseigner une url de retour valide",
                "subAccountKeyId":      "ber296464ce018ab710a"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                       "a296464ce012b8ab710a",
   "subAccountKeyId":             "ber296464ce018ab710a",
   "subAccountAdresseRetour":     "https://monurlderetour.php",
   "subAccountEdit":              "setAdresseRetour"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                     =>  'a296464ce012b8ab710a',
    'subAccountKeyId'           =>  'ber296464ce018ab710a',
    'subAccountAdresseRetour'   =>  'https://monurlderetour.php',
    'subAccountEdit'            =>  'setAdresseRetour'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;
////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountId: '.$repetat->subAccountKeyId;    
    echo $sautligne;
    echo 'subAccountKeyId: '.$repetat->subAccountId;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid'                     :  'a296464ce012b8ab710a',
    'subAccountKeyId'           :  'ber296464ce018ab710a',
    'subAccountAdresseRetour'   :  'https://monurlderetour.php',
    'subAccountEdit'            :  'setAdresseRetour'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountId: '+repetat['subAccountId']
    print 'subAccountKeyId: '+repetat['subAccountKeyId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                    "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",          "ber296464ce018ab710a");
        paramsTablo.put("subAccountAdresseRetour",  "https://monurlderetour.php");
        paramsTablo.put("subAccountEdit",           "setAdresseRetour");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("subAccountId: "+repetat.get("subAccountId"));
                System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));
            }

        } finally {
            con.disconnect();
        }
    }
}


Modification du webhook des réponses pour un sous-compte

Modifier l'url de webhook des réponses pour un sous-compte vers laquelle les réponses SMS seront envoyées

Appel

https://apirest.isendpro.com/cgi-bin/subaccount
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
subAccountKeyId String Oui Chaine de caractère unique identifiant le sous compte
subAccountAdresseSMSretour String Oui Adresse de retour vers lequel sera envoyé les réponses
Ex: https://monurlderetour.php
subAccountEdit String Oui Utiliser la valeur 'setAdresseSMSretour'

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs
subAccountId String Id pour le nouveau sous compte
subAccountKeyId String Clé d'identification (KeyId) pour le nouveau sous compte
{
    "etat": {
        "etat": [
            {
                "code":             "256",
                "message":          "L url de retour SMS a ete defini pour le sous compte",
                "subAccountId":     "20474",
                "subAccountKeyId":  "ber296464ce018ab710a"                
            }
        ]
    }
}
{
    "etat": {
        "etat": [
            {
                "code":                 "255",
                "message":              "Vous devez renseigner une url de retour SMS valide",
                "subAccountKeyId":      "ber296464ce018ab710a"
            }
        ]
    }
}

Exemples de scripts

curl -X POST \
 'https://apirest.isendpro.com/cgi-bin/subaccount' \
 -H 'cache-control: no-cache' \
 -d '{
   "keyid":                       "a296464ce012b8ab710a",
   "subAccountKeyId":             "ber296464ce018ab710a",
   "subAccountAdresseSMSretour":  "https://monurlderetour.php",
   "subAccountEdit":              "setAdresseSMSretour"
}'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$ch = curl_init();

$url = 'https://apirest.isendpro.com/cgi-bin/subaccount';
$params = array(
    'keyid'                     =>  'a296464ce012b8ab710a',
    'subAccountKeyId'           =>  'ber296464ce018ab710a',
    'subAccountAdresseSMSretour'=>  'https://monurlderetour.php',
    'subAccountEdit'            =>  'setAdresseSMSretour'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

curl_close($ch);

echo $response;
////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
$reponsejson=json_decode($response);
$repetat=$reponsejson->etat->etat;
if (!isset($repetat->code)){
    $repetat=$reponsejson->etat->etat[0];
}

// Erreur generale
if (!isset($repetat->subAccountKeyId)){
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;
// Infos de retour
}else{
    echo 'Code: '.$repetat->code;
    echo $sautligne;
    echo 'Message: '.$repetat->message;
    echo $sautligne;    
    echo 'subAccountId: '.$repetat->subAccountKeyId;
    echo $sautligne;
    echo 'subAccountKeyId: '.$repetat->subAccountId;
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests

url = 'https://apirest.isendpro.com/cgi-bin/subaccount'
params = {
    'keyid':                        'a296464ce012b8ab710a',
    'subAccountKeyId':              'ber296464ce018ab710a',
    'subAccountAdresseSMSretour':   'https://monurlderetour.php',
    'subAccountEdit':               'setAdresseSMSretour'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
reponsejson=response.json()
repetat=reponsejson['etat']
if not repetat.has_key('code'):
    try:
        repetat=reponsejson['etat']['etat'][0]
    except:
        repetat=reponsejson['etat']['etat']

# Erreur generale
if not repetat.has_key('subAccountKeyId'):
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
# Infos de retour
else:
    print 'Code: '+repetat['code']
    print 'Message: '+repetat['message']
    print 'subAccountId: '+repetat['subAccountId']
    print 'subAccountKeyId: '+repetat['subAccountKeyId']
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;

public class TestDocs {

    private static HttpURLConnection con;

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://apirest.isendpro.com/cgi-bin/subaccount";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",                        "a296464ce012b8ab710a");
        paramsTablo.put("subAccountKeyId",              "ber296464ce018ab710a");
        paramsTablo.put("subAccountAdresseSMSretour",   "https://monurlderetour.php");
        paramsTablo.put("subAccountEdit",               "setAdresseSMSretour");
        
        Gson gson = new Gson();       
        String urlParameters = gson.toJson(paramsTablo);        
        byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            Map reponsejson = new Gson().fromJson(content.toString(), Map.class);           
            Map repetat = (Map)reponsejson.get("etat");
            
            if (! repetat.containsKey("code")){
                try{
                    repetat=(Map)reponsejson.get("etat");
                    var repetatArray=((ArrayList)(repetat.get("etat"))).get(0);  
                    repetat=(Map)(repetatArray);                     
                }catch(Exception e) {
                    repetat=(Map)reponsejson.get("etat");
                    repetat=(Map)repetat.get("etat");             
                }
            }

            // Erreur generale
            if (! repetat.containsKey("subAccountKeyId")){
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));    
            // Infos de retour
            }else{
                System.out.println("Code: "+repetat.get("code"));
                System.out.println("Message: "+repetat.get("message"));  
                System.out.println("subAccountId: "+repetat.get("subAccountId"));
                System.out.println("subAccountKeyId: "+repetat.get("subAccountKeyId"));
            }

        } finally {
            con.disconnect();
        }
    }
}


Codes erreurs API

Tableau des codes erreurs retournés par l'API
Code erreur Message
0 Votre message a bien ete envoye
1 The login is empty
2 The password is empty
3 Your credentials are incorrect
4 Vous devez saisir un message!
5 Le message ne doit pas depasser XXX caracteres!
6 Vous devez saisir un numero de telephone valide!
7 Un numero de telephone est sur 10 chiffres!
9 La route que vous avez saisie n'existe pas!
10 Vous n'avez pas les droits necessaires pour utiliser cette route!
11 Le numero de telephone est dans la liste noire!
12 Votre credit de MT est epuise!
13 La route Lowcost est down!
14 L'adresse IP n'est pas autorisee!
15 Vous devez indiquer un canal d'envoi!
16 L'emetteur ne peut pas etre vide!
17 L'emetteur doit etre sur plus de 3 caracteres et sur 11 caracteres maximum!
18 L'emetteur ne peut pas comporter que des chiffres!
19 Si un emetteur est indique, le message ne doit pas depasser 149 caracteres afin de pouvoir ajouter le texte 'STOP XXXXX'
20 L'emetteur ne peut pas etre modifie sur le canal LowCost!
21 Le numero de telephone n'est pas attribue!
22 Le numero de telephone est attribue a un Full MVNO
23 Le nombre maximum de telephones par requete est de 500
24 Pas d'envoi commercial entre 20h et 08h, ni les jours feries
25 Il est obligatoire d'indiquer le cout vers les numeros en 0899. Ex: Pour plus de renseignements appelez le 0899 XX XX XX (1E35/apl+0.34E/min)
26 Il est obligatoire d'indiquer le cout vers les numeros en 0892. Ex: Pour plus de renseignements appelez le 0892 XX XX XX (0.34E/min)
27 L'indicatif pays du telephone n'est pas autorise!
28 Votre credit de qualification est epuise!
29 Nous ne pouvons donner suite a votre demande (overflow)
30 Erreur sur le domaine de connexion
31 Le message ne doit pas depasser XXX caracteres!
32 Le message est sur XXX SMS (XXX caracteres) alors que la demande est sur XXX SMS
33 Cet emetteur n'est pas autorise!
34 La valeur de smslong doit etre un entier!
35 Votre credit de HLR est epuise!
36 Vous n'etes pas autorise a retirer le STOP SMS!
37 Les numeros de telephone ne sont pas tous a destination du meme pays!
38 Le message ne doit pas depasser XXX caracteres!
39 Le message ne doit pas depasser XXX caracteres!
40 Le format de message ucs2 n'est pas autorise pour les numeros en France metropolitaine!
41 Vous n'etes pas autorise aux requetes HLR!
42 L'emetteur ne peut pas comporter de caracteres speciaux!
43 La date d'envoi n'est pas au bon format (AAAA-MM-JJ HH:MM)!
44 La zone GMT n'existe pas!
100 Votre repertoire a ete cree!
101 Vous devez saisir un nom de repertoire!
102 Votre identifiant de repertoire ne correspond a aucune donnee!
103 Votre donnee a ete ajoutee dans le repertoire!
104 Ce repertoire ne peut pas etre modifie car une campagne est programme dessus!
105 La donnee est deja presente dans le repertoire!
106 Votre donnee a ete supprimee du repertoire
107 La donnee n'est pas presente dans le repertoire!
108 Cet identifiant ne correspond a aucun repertoire!
201 Vous devez saisir une date de debut de selection!
202 Vous devez saisir une date de fin de selection!
203 La date de debut de selection n'est pas au bon format (AAAA-MM-JJ HH:MM)!
204 La date de fin de selection n'est pas au bon format (AAAA-MM-JJ HH:MM)!
205 La selection depasse 200 000 donnees! Merci de la reduire!
206 La selection ne correspond a aucune donnee!
207 Historique des envois
210 Le mot cle a ete ajoute
211 Le mot cle a ete supprime
212 Liste des mot cles pour ce compte
213 Le mot cle n'est pas disponible
214 Le mot cle n'existe pas pour ce compte
215 Aucun mot cle pour ce compte
216 Le mot cle ne doit contenir ni espace, ni caractere speciaux
217 Le mot cle doit etre entre 3 et 20 caracteres
220 L emetteur a ete ajoute
221 L emetteur a ete supprime
222 Liste des emetteurs pour ce compte
223 L emetteur n'est pas disponible
224 L emetteur n'existe pas pour ce compte
225 Aucun emetteur pour ce compte
230 Le sous compte a ete ajoute
231 Vous devez saisir un identifiant/login pour la creation du sous compte
232 Vous devez saisir un mot de passe pour la creation du sous compte
233 Un sous compte existe deja avec cet identifiant
234 Aucun sous compte avec ces identifiants
235 Vous devez renseigner l indicatif du pays associe au prix
236 Vous devez renseigner un prix
237 Le prix a ete cree
238 Vous devez renseigner le montant du credit a ajouter
239 Le credit a ete ajoute au sous compte
240 La commande saisie ne correspond a aucune fonctionnalite
241 Le prix a ete mis a jour
242 Vous devez saisir la cle d identifcation du sous compte
243 Un sous compte ne peut pas avoir de sous compte
244 La restriction STOP a ete desactivee
245 La restriction STOP a ete activee
246 La restriction horaire a ete desactivee
247 La restriction horaire a ete activee
248 Les donnees de restriction ne sont pas correctes
250 Le lien court a ete genere
251 Le prix unitaire
252 L encours a ete defini pour le sous compte
253 Vous devez renseigner un encours positif
254 L encours
255 Vous devez renseigner une url de retour SMS valide
256 L url de retour SMS a ete defini pour le sous compte
257 Vous devez renseigner une url de retour valide
258 L url de retour a ete defini pour le sous compte
777 Le service est en maintenance.
900 keyId is valid
901 keyId is not valid
998 L encodage du message est incorrect
999 Une erreur est survenue. Merci de contacter le service technique


Table GSM des caractères autorisés

Attention: les crochets ouvrants [ et fermant ] et le symbole Euro comptent pour 2 caractères
Caractère Signification Caractère Signification
LF Line Feed (saut de ligne) CR Carriage Return (retour chariot)
SP Espace (Space en anglais) ! Point d'exclamation
" Guillemet droit # Croisillon et parfois Dièse ou (aussi dénommé signe numéro 8)
% Pourcent & Esperluette
Apostrophe (guillemet fermant simple ou accent aigu) ( Parenthèse ouvrante
) Parenthèse fermante * Astérisque
+ Plus , Virgule
- Moins (aussi dénommé tiret8 ou trait d'union13) . Point
/ Barre oblique (Slash en anglais) 0 Le chiffre zéro
1 Le chiffre un 2 Le chiffre deux
3 Le chiffre trois 4 Le chiffre quatre
5 Le chiffre cinq 6 Le chiffre six
7 Le chiffre sept 8 Le chiffre huit
9 Le chiffre neuf : Deux-points
; Point-virgule < Inférieur
= Égal > Supérieur
? Point d'interrogation @ Arobace (aussi dénommé Arobase ou A commercial8)
A B
C D
E F
G H
I J
K L
M N
O P
Q R
S T
U V
W X
Y Z
[ Crochet ouvrant ] Crochet fermant
_ trait bas 8 aussi dénommé Tiret bas, ou souligné (underscore en anglais) a
b c
d e
f g
h i
j k
l m
n o
p q
r s
t u
v w
x y
z à
è é
ù Euro


Table GSM des caractères remplacés

Caractère Remplacé par Caractère Remplacé par
À A Á A
 A à A
Ä A Å A
È E É E
Ë E Ì I
Í I Î I
Ï I Ò O
Ó O Ô O
Õ O Ö O
Ù U Ú U
Û U Ü U
á a â a
ã a ä a
å a ç c
ê e ë e
ì i í i
î i ï i
ð o ñ n
ò o ó o
ô o õ o
ö o ù u
ú u û u
ü u ý y
ÿ y


Table d'encodage des caractères spéciaux

Caractère Encodage Caractère Encodage
Espace %20 $ %24
& %26 + %2B
, %2C / %2F
: %3A ; %3B
? %3D @ %40
Ê ou %ca Saut de ligne Õ ou %d5


Tableau des zones GMT

Zone GMT Correspondance Zone GMT Correspondance
Pacific/Midway (GMT-11:00) Midway Island, Samoa America/Adak (GMT-10:00) Hawaii-Aleutian
Etc/GMT+10 (GMT-10:00) Hawaii Pacific/Marquesas (GMT-09:30) Marquesas Islands
Pacific/Gambier (GMT-09:00) Gambier Islands America/Anchorage (GMT-09:00) Alaska
America/Ensenada (GMT-08:00) Tijuana, Baja California Etc/GMT+8 (GMT-08:00) Pitcairn Islands
America/Los_Angeles (GMT-08:00) Pacific Time (US & Canada) America/Denver (GMT-07:00) Mountain Time (US & Canada)
America/Chihuahua (GMT-07:00) Chihuahua, La Paz, Mazatlan America/Dawson_Creek (GMT-07:00) Arizona
America/Belize (GMT-06:00) Saskatchewan, Central America America/Cancun (GMT-06:00) Guadalajara, Mexico City, Monterrey
Chile/EasterIsland (GMT-06:00) Easter Island America/Chicago (GMT-06:00) Central Time (US & Canada)
America/New_York (GMT-05:00) Eastern Time (US & Canada) America/Havana (GMT-05:00) Cuba
America/Bogota (GMT-05:00) Bogota, Lima, Quito, Rio Branco America/Caracas (GMT-04:30) Caracas
America/Santiago (GMT-04:00) Santiago America/La_Paz (GMT-04:00) La Paz
Atlantic/Stanley (GMT-04:00) Faukland Islands America/Campo_Grande (GMT-04:00) Brazil
America/Goose_Bay (GMT-04:00) Atlantic Time (Goose Bay) America/Glace_Bay (GMT-04:00) Atlantic Time (Canada)
America/St_Johns (GMT-03:30) Newfoundland America/Araguaina (GMT-03:00) UTC-3
America/Montevideo (GMT-03:00) Montevideo America/Miquelon (GMT-03:00) Miquelon, St. Pierre
America/Godthab (GMT-03:00) Greenland America/Argentina/Buenos_Aires (GMT-03:00) Buenos Aires
America/Sao_Paulo (GMT-03:00) Brasilia America/Noronha (GMT-02:00) Mid-Atlantic
Atlantic/Cape_Verde (GMT-01:00) Cape Verde Is. Atlantic/Azores (GMT-01:00) Azores
Europe/Belfast (GMT) Greenwich Mean Time : Belfast Europe/Dublin (GMT) Greenwich Mean Time : Dublin
Europe/Lisbon (GMT) Greenwich Mean Time : Lisbon Europe/London (GMT) Greenwich Mean Time : London
Africa/Abidjan (GMT) Monrovia, Reykjavik Europe/Amsterdam (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
Europe/Belgrade (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague Europe/Brussels (GMT+01:00) Brussels, Copenhagen, Madrid, Paris
Africa/Algiers (GMT+01:00) West Central Africa Africa/Windhoek (GMT+01:00) Windhoek
Asia/Beirut (GMT+02:00) Beirut Africa/Cairo (GMT+02:00) Cairo
Asia/Gaza (GMT+02:00) Gaza Africa/Blantyre (GMT+02:00) Harare, Pretoria
Asia/Jerusalem (GMT+02:00) Jerusalem Europe/Minsk (GMT+02:00) Minsk
Asia/Damascus (GMT+02:00) Syria Europe/Moscow (GMT+03:00) Moscow, St. Petersburg, Volgograd
Africa/Addis_Ababa (GMT+03:00) Nairobi Asia/Tehran (GMT+03:30) Tehran
Asia/Dubai (GMT+04:00) Abu Dhabi, Muscat Asia/Yerevan (GMT+04:00) Yerevan
Asia/Kabul (GMT+04:30) Kabul Asia/Yekaterinburg (GMT+05:00) Ekaterinburg
Asia/Tashkent (GMT+05:00) Tashkent Asia/Kolkata (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
Asia/Katmandu (GMT+05:45) Kathmandu Asia/Dhaka (GMT+06:00) Astana, Dhaka
Asia/Novosibirsk (GMT+06:00) Novosibirsk Asia/Rangoon (GMT+06:30) Yangon (Rangoon)
Asia/Bangkok (GMT+07:00) Bangkok, Hanoi, Jakarta Asia/Krasnoyarsk (GMT+07:00) Krasnoyarsk
Asia/Hong_Kong (GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi Asia/Irkutsk (GMT+08:00) Irkutsk, Ulaan Bataar
Australia/Perth (GMT+08:00) Perth Australia/Eucla (GMT+08:45) Eucla
Asia/Tokyo (GMT+09:00) Osaka, Sapporo, Tokyo Asia/Seoul (GMT+09:00) Seoul
Asia/Yakutsk (GMT+09:00) Yakutsk Australia/Adelaide (GMT+09:30) Adelaide
Australia/Darwin (GMT+09:30) Darwin Australia/Brisbane (GMT+10:00) Brisbane
Australia/Hobart (GMT+10:00) Hobart Asia/Vladivostok (GMT+10:00) Vladivostok
Australia/Lord_Howe (GMT+10:30) Lord Howe Island Etc/GMT-11 (GMT+11:00) Solomon Is., New Caledonia
Asia/Magadan (GMT+11:00) Magadan Pacific/Norfolk (GMT+11:30) Norfolk Island
Asia/Anadyr (GMT+12:00) Anadyr, Kamchatka Pacific/Auckland (GMT+12:00) Auckland, Wellington
Etc/GMT-12 (GMT+12:00) Fiji, Kamchatka, Marshall Is. Pacific/Chatham (GMT+12:45) Chatham Islands
Pacific/Tongatapu (GMT+13:00) Nuku'alofa Pacific/Kiritimati (GMT+14:00) Kiritimati


Codes des AR Orange et SFR

Tableau des codes des accusés de réception retournés par les opérateurs Orange et SFR
Code Message Code Message
000 Service temporairement indisponible 002 Service temporairement indisponible
003 Service temporairement indisponible 004 Service temporairement indisponible
005 Service temporairement indisponible 006 Service temporairement indisponible
007 Service temporairement indisponible 008 Service temporairement indisponible
009 Code d'erreur illégal 010 Expiration de la temporisation du réseau
100 Fonctionnalité non supportée 101 Abonné inconnu
102 Fonctionnalité non offerte 103 Appel bloqué
104 Opération bloquée 105 Surcharge du SMS-C
106 Fonctionnalité non supportée 107 Abonné absent
108 Echec de remise 109 Surcharge su SMS-C
110 Erreur de protocole 111 Mobile non équipé
112 SMS-C inconnu 113 Surcharge du SMS-C
114 Mobile illégal 115 Mobile pas abonné
116 Erreur dans le mobile 117 Couche basse SMS non provisionnée
118 Echec du système 119 Erreur système du PLMN
120 Erreur système du HLR 121 Erreur du système du VLR
122 Erreur du système du VLR précédent 123 Erreur du système du MSC de contrôle
124 Erreur du système du VMC 125 Erreur du système du EIR
126 Erreur système 127 Valeur inattendue
200 Erreur dans l'adresse du SMS-C 201 Période de validité absolue non valide
202 Message court trop long 203 Impossible de lire le message GSM
204 Impossible de convertir en alphabet IA5 206 Format de période de validité invalide
207 Message dupliqué 208 Indicateur de type de message (MT) invalide


Codes des AR FREE

Tableau des codes des accusés de réception retournés par l'opérateur FREE Telecom
Code Message Description
1 ENROUTE The message is in enroute state
2 DELIVERED Message is delivered to destination
3 EXPIRED Message validity period has expired
4 DELETED Message has been deleted
5 UNDELIVERABLE Message is undeliverable
6 ACCEPTED Message is in accepted state (i.e. has been manually read on behalf of the subscriber by customer service)
7 UNKNOWN Message is in an invalid state
8 REJECTED Message is in a rejected state


Codes des AR NRJ

Tableau des codes des accusés de réception retournés par les opérateurs
Code Message Description
1 ACK Message is delivered to destination
0 ERROR Message is undeliverable


Codes des AR Bouygues et autres opérateurs(Lycamobile, Coriolis, etc)

Tableau des codes des accusés de réception retournés par les opérateurs
Code Message Description
2 ACK Message is delivered to destination
5 ERROR Message is undeliverable


Codes des AR Internationaux

Tableau des codes des accusés de réception retournés par les opérateurs Internationaux
Code Message Description
2 DELIVERED Message is delivered to destination
5 UNDELIVERABLE Message is undeliverable

API MAIL2SMS iSendPro Telecom

Prérequis

Munissez vous de votre keyid

Votre keyid (clé d'identification) est visible sur votre espace client dans Mon compte -> Mon api
Cette clé vous identifie et vous devrez l'utiliser pour effectuer toutes vos requêtes via l'API

Restrictions horaires

L’envoi de SMS commerciaux est formellement interdit entre 20h00 et 8h00 les jours calendaires. Ces restrictions contractuelles avec les opérateurs sont édictées par l’AFMM et ne sont pas spécifiques à notre site.
Vous pouvez soit programmer votre envoi pour plus tard, soit nous demander de lever cette restriction si vos envois ne sont pas à destination commerciale (système d’alerte, de notification de prise de rendez-vous par exemple) en envoyant un email à contact@isendpro.com

Configurer le contrôle des domaines

Un contrôle des domaines emails, basé sur un système de type «liste blanche» est activé par défaut.
Vous pouvez soit renseigner cette liste blanche, soit désactiver le contrôle.
Ce paramètrage peut s'effectuer sur Mon compte -> Mon api

Liste noire

Une liste des numéros de téléphone vers lesquels les messages ne sont pas envoyés est gérée.
Les numéros de téléphone y sont ajoutés à la demande des opérateurs ou de nos partenaires.
Tous les messages envoyés vers des clients en liste noire ne sont pas routés.
Dans ce cas, le code erreur 11 est retourné par la requête.

Remarques et bonnes pratiques

Logs

Nous vous recommandons de logguer (avec horodatage) vos appels à l'API ainsi que les réponses de cette dernière.

Traitement des retours

Certains retours vous remontent des problèmes sans déclencher d'erreur HTTP (ni exception dans les wrappers)..
Par un exemple si vous soumettez des envois à une liste de numéros de téléphone dont certains sont mal formatés, vous aurez un code HTTP 200 mais avec des code retour indiquant ce problème

Traitement des accusés de réception

Nous vous recommandons de mettre en place une URL de traitement des retours des accusés de réception.

Contact

Vous pouvez contacter le support technique à l'adresse suivante: support@isendpro.com

Important: Merci de préciser dans votre mail votre identifiant client
Si la question concerne la remise d'un appel, merci de rajouter les infos suivantes :
  • Numéro de téléphone (MSISDN)
  • Message
  • Date et heure d'envoi

Le support technique est joignable tous les jours de la semaine de 09h à 13h et de 14h à 17h au 04 83 66 05 10

Utilisation API

  • L’email doit être envoyé à sendsms@isendpro-api.com
  • L’e-mail attendu doit contenir des données formatées type XML dans le corps du message de la forme.
  • Les emails doivent être envoyés au format text brut sans aucune mise en forme, sinon l’email ne sera pas traité
  • <envoi>
        <keyid>[CLE_IDENTIFICATION]</keyid>
        <num>[NUMERO_MOBILE]</num>
        <sms>[MESSAGE]</sms>
        <emailId>[ID_UNIQUE]</emailId>
    </envoi>
  • L’argument emailId permet d’identifier de manière unique une demande d’envoi par email
  • Si 2 emails sont reçus avec le même emailId, alors le 2nd ne sera pas traité et un message d’erreur sera remonté sur l’adresse email indiquée dans emailAck

Destinataires:
  • A la place de fournir les numéros de téléphone et le message associé dans le corps de l’email, il est possible de fournir ces données dans des fichiers en pièces jointes au format .csv
  • Le fichier contenant les numéros de mobiles doit être nommé mobiles.csv
  • Chaque ligne va contenir un numéro de téléphone et éventuellement des données dynamiques supplémentaires séparées par ';;'
  • La structure étant de la forme :
[num];;[1];;[2];;[3]
Exemple sans données dynamiques:
0601020304
Les arguments [sms] et [num] ne doivent plus être renseignés dans le corps du message.

Remarques:
  • Le saut de ligne doit être remplacé par le caractère Õ
  • Si l’adresse email de l’expéditeur n’a pas été autorisée, les envois ne seront pas effectués
  • La clé d’identification est disponible sur votre votre espace client dans Mon compte -> Mon api


Envoi de message unitaire

Envoi d'un SMS à 1 seul destinataire par requete
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
emailId Number Oui identifiant unique de l’email
num String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
Ne pas renseigner si fourni dans le fichier mobiles.csv
sms String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
Ne pas renseigner si fourni dans le fichier mobiles.csv
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exact est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
Nombre de SMS concaténés Nombre de caractères SANS
modification émetteur
Nombre de caractères AVEC
modification émetteur
1 160 148
2 306 294
3 459 447
4 612 600
5 765 753
6 918 906
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
emailNot String Non Adresse email où envoyer les retours détaillés des envois
Ex: not@masociete.com
emailAck String Non Adresse email où envoyer si l’email a bien été traité ou non
Ex: ack@masociete.com
tracker String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
Voici un exemple de contenu d’un e-mail :
<envoi>
    <keyid>a296464ce012b8ab710a</keyid>
    <num>0601020304</num>
    <sms>L’été est finiÕSuper promo -10% à partir de 50€ d’ achat !!!</sms>
    <emetteur>MaSociete</emetteur>
    <emailNot>not@masociete.com</emailNot>
    <emailAck>ack@masociete.com</emailAck>
    <emailId>1548</emailId>
</envoi>


Envoi de messages multiples

Envoi d'un SMS à plusieurs destinataire par requete
Cette solution permet d’envoyer un message jusqu’à 500 destinataires différents par requête, permettant ainsi une augmentation de la vitesse des envois.
Les numéros de téléphone sont placés dans des variables numX où X est un entier allant de 1 à 500 au maximum.
Si le message est identique pour tous les destinataires, il suffit de le renseigner une seule fois dans la variable sms
Si le message est différent pour chaque destinataire alors les messages sont placés dans des variables smsXX est un entier allant de 1 à 500 au maximum.
Dans ce cas le message smsX sera envoyé au destinataire numX.
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
emailId Number Oui identifiant unique de l’email
num[X] String Oui Numéro de téléphone du destinataire
Au format national
Uniquement vers les fixes
Ex: 0401020304
Ne pas renseigner si fourni dans le fichier mobiles.csv
sms[X] String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
Ne pas renseigner si fourni dans le fichier mobiles.csv
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exact est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
Nombre de SMS concaténés Nombre de caractères SANS
modification émetteur
Nombre de caractères AVEC
modification émetteur
1 160 148
2 306 294
3 459 447
4 612 600
5 765 753
6 918 906
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
emailNot String Non Adresse email où envoyer les retours détaillés des envois
Ex: not@masociete.com
emailAck String Non Adresse email où envoyer si l’email a bien été traité ou non
Ex: ack@masociete.com
tracker[X] String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
Voici un exemple de contenu d’un email pour 2 destinataires avec le même message:
<envoi>
    <keyid>a296464ce012b8ab710a</keyid>
    <num1>0601020304</num1>
    <num2>0601020305</num2>
    <sms>L’été est finiÕSuper promo -10% à partir de 50€ d’ achat !!!</sms>
    <emetteur>MaSociete</emetteur>
    <emailNot>not@masociete.com</emailNot>
    <emailAck>ack@masociete.com</emailAck>
    <emailId>1548</emailId>
</envoi>
Voici un exemple de contenu d’un email pour 2 destinataires avec chacun leur message:
<envoi>
    <keyid>a296464ce012b8ab710a</keyid>
    <num1>0601020304</num1>
    <num2>0601020305</num2>
    <sms1>L’été est finiÕSuper promo -10% à partir de 50€ d’ achat !!!</sms1>
    <sms2>L’été est finiÕSuper promo -20% à partir de 100€ d’achat !!!</sms2>
    <emetteur>MaSociete</emetteur>
    <emailNot>not@masociete.com</emailNot>
    <emailAck>ack@masociete.com</emailAck>
    <emailId>1548</emailId>
</envoi>


Réponses par email

Ack

Paramètre Type Détails
emailId Number Identifiant fourni lors de l'envoi afin d'associer la réponse
code Number Code correspondant au tableau des Ack
message String Libellé correspondant au tableau des ack
<?xml version="1.0" encoding="ISO-8859-1"?>
<etatAck>
    <emailId>[emailId]</emailId>
    <code>[codeAck]</code>
    <message>[messageAck]</message>
</etatAck>

Not

Paramètre Type Détails
emailId Number Identifiant fourni lors de l'envoi afin d'associer la réponse
code Number Code correspondant au tableau des Ack
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des ack
<?xml version="1.0" encoding="ISO-8859-1"?>
<etatNot>
    <emailId>[emailId]</emailId>
</etatNot>
<etat>
    <code>[code]</code>
    <tel>[tel]</tel>
    <message>[message]</message>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etatNot>
    <emailId>[emailId]</emailId>
</etatNot>
<etat1>
    <code1>[code]</code1>
    <tel1>[tel]</tel1>
    <message1>[message]</message1>
</etat1>
...
<etatN>
    <codeN>[code]</codeN>
    <telN>[tel]</telN>
    <messageN>[message]</messageN>
</etatN>


Codes Ack

Tableau des codes ack retournées par l'API
Code erreur Message
0 Votre email a bien ete traite
1 emailId deja traite
2 emailId non renseigne


Codes erreurs

Tableau des codes erreurs retournés par l'API
Code erreur Message
0 Votre message a bien ete envoye
1 The login is empty
2 The password is empty
3 Your credentials are incorrect
4 Vous devez saisir un message!
5 Le message ne doit pas depasser XXX caracteres!
6 Vous devez saisir un numero de telephone valide!
7 Un numero de telephone est sur 10 chiffres!
9 La route que vous avez saisie n'existe pas!
10 Vous n'avez pas les droits necessaires pour utiliser cette route!
11 Le numero de telephone est dans la liste noire!
12 Votre credit de MT est epuise!
13 La route Lowcost est down!
14 L'adresse IP n'est pas autorisee!
15 Vous devez indiquer un canal d'envoi!
16 L'emetteur ne peut pas etre vide!
17 L'emetteur doit etre sur plus de 3 caracteres et sur 11 caracteres maximum!
18 L'emetteur ne peut pas comporter que des chiffres!
19 Si un emetteur est indique, le message ne doit pas depasser 149 caracteres afin de pouvoir ajouter le texte 'STOP XXXXX'
20 L'emetteur ne peut pas etre modifie sur le canal LowCost!
21 Le numero de telephone n'est pas attribue!
22 Le numero de telephone est attribue a un Full MVNO
23 Le nombre maximum de telephones par requete est de 500
24 Pas d'envoi commercial entre 20h et 08h, ni les jours feries
25 Il est obligatoire d'indiquer le cout vers les numeros en 0899. Ex: Pour plus de renseignements appelez le 0899 XX XX XX (1E35/apl+0.34E/min)
26 Il est obligatoire d'indiquer le cout vers les numeros en 0892. Ex: Pour plus de renseignements appelez le 0892 XX XX XX (0.34E/min)
27 L'indicatif pays du telephone n'est pas autorise!
28 Votre credit de qualification est epuise!
29 Nous ne pouvons donner suite a votre demande (overflow)
30 Erreur sur le domaine de connexion
31 Le message ne doit pas depasser XXX caracteres!
32 Le message est sur XXX SMS (XXX caracteres) alors que la demande est sur XXX SMS
33 Cet emetteur n'est pas autorise!
34 La valeur de smslong doit etre un entier!
35 Votre credit de HLR est epuise!
36 Vous n'etes pas autorise a retirer le STOP SMS!
37 Les numeros de telephone ne sont pas tous a destination du meme pays!
38 Le message ne doit pas depasser XXX caracteres!
39 Le message ne doit pas depasser XXX caracteres!
40 Le format de message ucs2 n'est pas autorise pour les numeros en France metropolitaine!
41 Vous n'etes pas autorise aux requetes HLR!
42 L'emetteur ne peut pas comporter de caracteres speciaux!
43 La date d'envoi n'est pas au bon format (AAAA-MM-JJ HH:MM)!
44 La zone GMT n'existe pas!
100 Votre repertoire a ete cree!
101 Vous devez saisir un nom de repertoire!
102 Votre identifiant de repertoire ne correspond a aucune donnee!
103 Votre donnee a ete ajoutee dans le repertoire!
104 Ce repertoire ne peut pas etre modifie car une campagne est programme dessus!
105 La donnee est deja presente dans le repertoire!
106 Votre donnee a ete supprimee du repertoire
107 La donnee n'est pas presente dans le repertoire!
108 Cet identifiant ne correspond a aucun repertoire!
201 Vous devez saisir une date de debut de selection!
202 Vous devez saisir une date de fin de selection!
203 La date de debut de selection n'est pas au bon format (AAAA-MM-JJ HH:MM)!
204 La date de fin de selection n'est pas au bon format (AAAA-MM-JJ HH:MM)!
205 La selection depasse 200 000 donnees! Merci de la reduire!
206 La selection ne correspond a aucune donnee!
207 Historique des envois
210 Le mot cle a ete ajoute
211 Le mot cle a ete supprime
212 Liste des mot cles pour ce compte
213 Le mot cle n'est pas disponible
214 Le mot cle n'existe pas pour ce compte
215 Aucun mot cle pour ce compte
216 Le mot cle ne doit contenir ni espace, ni caractere speciaux
217 Le mot cle doit etre entre 3 et 20 caracteres
220 L emetteur a ete ajoute
221 L emetteur a ete supprime
222 Liste des emetteurs pour ce compte
223 L emetteur n'est pas disponible
224 L emetteur n'existe pas pour ce compte
225 Aucun emetteur pour ce compte
230 Le sous compte a ete ajoute
231 Vous devez saisir un identifiant/login pour la creation du sous compte
232 Vous devez saisir un mot de passe pour la creation du sous compte
233 Un sous compte existe deja avec cet identifiant
234 Aucun sous compte avec ces identifiants
235 Vous devez renseigner l indicatif du pays associe au prix
236 Vous devez renseigner un prix
237 Le prix a ete cree
238 Vous devez renseigner le montant du credit a ajouter
239 Le credit a ete ajoute au sous compte
240 La commande saisie ne correspond a aucune fonctionnalite
241 Le prix a ete mis a jour
242 Vous devez saisir la cle d identifcation du sous compte
243 Un sous compte ne peut pas avoir de sous compte
244 La restriction STOP a ete desactivee
245 La restriction STOP a ete activee
246 La restriction horaire a ete desactivee
247 La restriction horaire a ete activee
248 Les donnees de restriction ne sont pas correctes
250 Le lien court a ete genere
251 Le prix unitaire
252 L encours a ete defini pour le sous compte
253 Vous devez renseigner un encours positif
254 L encours
255 Vous devez renseigner une url de retour SMS valide
256 L url de retour SMS a ete defini pour le sous compte
257 Vous devez renseigner une url de retour valide
258 L url de retour a ete defini pour le sous compte
777 Le service est en maintenance.
900 keyId is valid
901 keyId is not valid
998 L encodage du message est incorrect
999 Une erreur est survenue. Merci de contacter le service technique

API MAIL2FAX iSendPro Telecom

Prérequis

Munissez vous de votre keyid

Votre keyid (clé d'identification) est visible sur votre espace client dans Mon compte -> Mon api
Cette clé vous identifie et vous devrez l'utiliser pour effectuer toutes vos requêtes via l'API

Restrictions horaires

L’envoi de FAX commerciaux est formellement interdit entre 20h00 et 8h00 les jours calendaires. Ces restrictions contractuelles avec les opérateurs sont édictées par l’AFMM et ne sont pas spécifiques à notre site.
Vous pouvez soit programmer votre envoi pour plus tard, soit nous demander de lever cette restriction si vos envois ne sont pas à destination commerciale (système d’alerte, de notification de prise de rendez-vous par exemple) en envoyant un email à contact@isendpro.com

Configurer le contrôle IP

Un contrôle des domaines emails, basé sur un système de type «liste blanche» est activé par défaut.
Vous pouvez soit renseigner cette liste blanche, soit désactiver le contrôle.
Ce paramètrage peut s'effectuer sur Mon compte -> Mon api

Liste noire

Une liste des numéros de téléphone vers lesquels les messages ne sont pas envoyés est gérée.
Les numéros de téléphone y sont ajoutés à la demande des opérateurs ou de nos partenaires.
Tous les messages envoyés vers des clients en liste noire ne sont pas routés.
Dans ce cas, le code erreur 11 est retourné par la requête.

Remarques et bonnes pratiques

Destinataires

Les envois de Fax fonctionnent uniquement vers les numéros de téléphone fixes en France métropolitaine.

Logs

Nous vous recommandons de logguer (avec horodatage) vos appels à l'API ainsi que les réponses de cette dernière.

Traitement des retours

Certains retours vous remontent des problèmes sans déclencher d'erreur HTTP (ni exception dans les wrappers)..
Par un exemple si vous soumettez des envois à une liste de numéros de téléphone dont certains sont mal formatés, vous aurez un code HTTP 200 mais avec des code retour indiquant ce problème

Traitement des accusés de réception

Nous vous recommandons de mettre en place une URL de traitement des retours des accusés de réception.

Contact

Vous pouvez contacter le support technique à l'adresse suivante: support@isendpro.com

Important: Merci de préciser dans votre mail votre identifiant client
Si la question concerne la remise d'un appel, merci de rajouter les infos suivantes :
  • Numéro de téléphone (MSISDN)
  • Message
  • Date et heure d'envoi

Le support technique est joignable tous les jours de la semaine de 09h à 13h et de 14h à 17h au 04 83 66 05 10

Utilisation API

  • L’email doit être envoyé à sendfax@isendpro-api.com
  • L’e-mail attendu doit contenir des données formatées type XML dans le corps du message de la forme.
  • L’email doit également contenir en pièce jointe un fichier au format PDF qui sera le document envoyé par FAX
  • Ce fichier devra être au format .pdf, contenir entre 1 et 4 pages maximum et ne pas dépasser 500 Ko par page
  • L’argument emailId permet d’identifier de manière unique une demande d’envoi par email
  • Les emails doivent être envoyés au format text brut sans aucune mise en forme, sinon l’email ne sera pas traité
  • <envoi>
        <keyid>[CLE_IDENTIFICATION]</keyid>
        <num>[NUMERO_FIXE]</num>
        <emailId>[ID_UNIQUE]</emailId>
    </envoi>
  • Si 2 emails sont reçus avec le même emailId, alors le 2nd ne sera pas traité et un message d’erreur sera remonté sur l’adresse email indiquée dans emailAck

Destinataires:
  • A la place de fournir les numéros de téléphone dans le corps de l’email, il est possible de fournir ces données dans des fichiers en pièces jointes au format .csv
  • Le fichier contenant les numéros de mobiles doit être nommé mobiles.csv
  • Chaque ligne va contenir un numéro de téléphone
  • La structure étant de la forme :
[num]
Exemple :
0401020304
Les arguments [num] ne doivent plus être renseignés dans le corps du message.

Remarques:
  • 1 crédit sera décompté pour chaque page envoyée
  • Si l’adresse email de l’expéditeur n’a pas été autorisée, les envois ne seront pas effectués
  • La clé d’identification est disponible sur votre votre espace client dans Mon compte -> Mon api


Envoi de message unitaire

Envoi d'un FAX à 1 seul destinataire par requete
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
emailId Number Oui identifiant unique de l’email
num String Oui Numéro de téléphone du destinataire
Au format national
Uniquement vers les fixes
Ex: 0401020304
Ne pas renseigner si fourni dans le fichier mobiles.csv
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
headerinfo String Non texte affiché tout en haut du FAX, accompagné de la date et l’heure de réception.
Maximum de 50 caractères
emailNot String Non Adresse email où envoyer les retours détaillés des envois
Ex: not@masociete.com
emailAck String Non Adresse email où envoyer si l’email a bien été traité ou non
Ex: ack@masociete.com
tracker String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
Voici un exemple de contenu d’un e-mail :
<envoi>
    <keyid>a296464ce012b8ab710a</keyid>
    <num>0401020304</num>
    <emetteur>0201020304</emetteur>
    <headerinfo>Mon entete de FAX</headerinfo>
    <emailNot>not@masociete.com</emailNot>
    <emailAck>ack@masociete.com</emailAck>
    <emailId>1548</emailId>
</envoi>


Envoi de messages multiples

Envoi d'un Fax à plusieurs destinataire par requete
Cette solution permet d’envoyer un message jusqu’à 50 destinataires différents par requête, permettant ainsi une augmentation de la vitesse des envois.
Les numéros de téléphone sont placés dans des variables numX où X est un entier allant de 1 à 50 au maximum.
Si le Fax (ou fichier) est identique pour tous les destinataires, il suffit de le renseigner une seule fois dans la variable fichierid.
Si le Fax (ou fichier) est différent pour chaque destinataire alors ils sont placés dans des variables fichieridX où X est un entier allant de 1 à 50 au maximum.
Dans ce cas le Fax fichieridX sera envoyé au destinataire numX.
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
emailId Number Oui identifiant unique de l’email
num[X] String Oui Numéro de téléphone du destinataire
Au format national
Uniquement vers les fixes
Ex: 0401020304
Ne pas renseigner si fourni dans le fichier mobiles.csv
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
headerinfo String Non texte affiché tout en haut du FAX, accompagné de la date et l’heure de réception.
Maximum de 50 caractères
emailNot String Non Adresse email où envoyer les retours détaillés des envois
Ex: not@masociete.com
emailAck String Non Adresse email où envoyer si l’email a bien été traité ou non
Ex: ack@masociete.com
tracker[X] String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
Voici un exemple de contenu d’un e-mail :
<envoi>
    <keyid>a296464ce012b8ab710a</keyid>
    <num1>0401020304</num1>
    <num2>0201020305</num2>
    <emetteur>0201020304</emetteur>
    <headerinfo>Mon entete de FAX</headerinfo>
    <emailNot>not@masociete.com</emailNot>
    <emailAck>ack@masociete.com</emailAck>
    <emailId>1548</emailId>
</envoi>


Réponses par email

Ack

Paramètre Type Détails
emailId Number Identifiant fourni lors de l'envoi afin d'associer la réponse
code Number Code correspondant au tableau des Ack
message String Libellé correspondant au tableau des ack
<?xml version="1.0" encoding="ISO-8859-1"?>
<etatAck>
    <emailId>[emailId]</emailId>
    <code>[codeAck]</code>
    <message>[messageAck]</message>
</etatAck>

Not

Paramètre Type Détails
emailId Number Identifiant fourni lors de l'envoi afin d'associer la réponse
code Number Code correspondant au tableau des Ack
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des ack
<?xml version="1.0" encoding="ISO-8859-1"?>
<etatNot>
    <emailId>[emailId]</emailId>
</etatNot>
<etat>
    <code>[code]</code>
    <tel>[tel]</tel>
    <message>[message]</message>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etatNot>
    <emailId>[emailId]</emailId>
</etatNot>
<etat1>
    <code1>[code]</code1>
    <tel1>[tel]</tel1>
    <message1>[message]</message1>
</etat1>
...
<etatN>
    <codeN>[code]</codeN>
    <telN>[tel]</telN>
    <messageN>[message]</messageN>
</etatN>


Codes Ack

Tableau des codes ack retournées par l'API
Code erreur Message
0 Votre email a bien ete traite
1 emailId deja traite
2 emailId non renseigne


Codes erreurs

Tableau des codes erreurs retournés par l'API
Code erreur Message
0 Votre message a bien ete envoye
1 Le Champ Login est vide
2 Le Champ PWD est vide
3 Vos identifiants sont incorrectes
4 Vous devez saisir un message!
5 Le message ne doit pas dépasser XXX caractères!
6 Vous devez saisir un numéro de téléphone valide!
7 Un numéro de téléphone est sur 10 chiffres!
9 La route que vous avez saisie n'existe pas!
10 Vous n'avez pas les droits nécessaires pour utiliser cette route!
11 Le numéro de téléphone est dans la liste noire!
12 Votre crédit de MT est épuisé!
13 La route Lowcost est down!
14 L'adresse IP n'est pas autorisée!
15 Vous devez indiquer un canal d'envoi!
16 L'émetteur ne peut pas etre vide!
21 Le numéro de téléphone n'est pas attribué!
22 Le numéro de téléphone est attribue à un Full MVNO
23 Le nombre maximum de téléphones par requete est de 50
24 Pas d'envoi commercial entre 20h et 08h, ni les jours fériés
25 Il est obligatoire d'indiquer le cout vers les numeros en 0899. Ex: Pour plus de renseignements appelez le 0899 XX XX XX (1E35/apl+0.34E/min)
26 Il est obligatoire d'indiquer le cout vers les numeros en 0892. Ex: Pour plus de renseignements appelez le 0892 XX XX XX (0.34E/min)
27 L'indicatif pays du téléphone n'est pas autorisé!
28 Votre crédit de qualification est épuisé!
29 Nous ne pouvons donner suite à votre demande (overflow)
30 Erreur sur le domaine de connexion
31 Le message ne doit pas dépasser XXX caractères!
32 Le message est sur DATA1 SMS (DATA2 caractères) alors que la demande est sur DATA3 SMS
33 Cet émetteur n'est pas autorisé!
34 La valeur de smslong doit etre un entier!
37 Les numeros de telephone ne sont pas tous a destination du meme pays!
43 La date d'envoi n'est pas au bon format (AAAA-MM-JJ HH:MM)!
100 Vous devez saisir un type d'appel valide
101 Les appels répondeurs ne fonctionnent pas avec les numéros de fixe!
102 Vous devez saisir un fichier valide!
103 L'émetteur doit etre sur 10 chiffres!
104 L'émetteur ne doit comporter que des chiffres!
105 L'émetteur ne peut pas etre un numéro en 08!
106 Seuls les fichiers .wma, .wav sont acceptés!
107 Votre fichier dépasse XXX secondes!
108 Votre fichier doit dépasser XXX secondes!
200 Le numéro de téléphone doit etre un fixe
206 Seuls les fichiers .pdf sont acceptés!
207 Votre fichier dépasse XXX pages!
208 Votre fichier doit dépasser 1 page!
209 Votre fichier dépasse XXX Ko par page!
210 Votre fichier converti est trop lourd! Merci de contacter le support!
211 Vous devez saisir un identifiant de fichier
1000 Le fichier a bien été importé
999 Une erreur est survenue. Merci de contacter le service technique

API FAX HTTPS iSendPro Telecom

Prérequis

Munissez vous de votre keyid

Votre keyid (clé d'identification) est visible sur votre espace client dans Mon compte -> Mon api
Cette clé vous identifie et vous devrez l'utiliser pour effectuer toutes vos requêtes via l'API

Restrictions horaires

L’envoi de FAX commerciaux est formellement interdit entre 20h00 et 8h00 les jours calendaires. Ces restrictions contractuelles avec les opérateurs sont édictées par l’AFMM et ne sont pas spécifiques à notre site.
Vous pouvez soit programmer votre envoi pour plus tard, soit nous demander de lever cette restriction si vos envois ne sont pas à destination commerciale (système d’alerte, de notification de prise de rendez-vous par exemple) en envoyant un email à contact@isendpro.com

Configurer le contrôle IP

Un contrôle IP, basé sur un système de type «liste blanche» est activé par défaut.
Vous pouvez soit renseigner cette liste blanche, soit désactiver le contrôle IP.
Ce paramètrage peut s'effectuer sur Mon compte -> Mon api

Liste noire

Une liste des numéros de téléphone vers lesquels les messages ne sont pas envoyés est gérée.
Les numéros de téléphone y sont ajoutés à la demande des opérateurs ou de nos partenaires.
Tous les messages envoyés vers des clients en liste noire ne sont pas routés.
Dans ce cas, le code erreur 11 est retourné par la requête.

Encodage

  • L’encodage des urls doit être en ISO-8859-15

Remarques et bonnes pratiques

Destinataires

Les envois de Fax fonctionnent uniquement vers les numéros de téléphone fixes en France métropolitaine.

Logs

Nous vous recommandons de logguer (avec horodatage) vos appels à l'API ainsi que les réponses de cette dernière.

Traitement des erreurs

L'API répondra un code HTTP 200 à vos appels.
Si le code d'erreur est différent de 200, une erreur s'est produite et nous vous recommandons d'investiguer le problème, avec l'aide de notre support technique si nécessaire..
Les wrappers lèvent des exceptions en cas d'erreur, exceptions que nous vous recommandons de rattraper.

Traitement des retours

Certains retours vous remontent des problèmes sans déclencher d'erreur HTTP (ni exception dans les wrappers)..
Par un exemple si vous soumettez des envois à une liste de numéros de téléphone dont certains sont mal formatés, vous aurez un code HTTP 200 mais avec des code retour indiquant ce problème

Traitement des accusés de réception

Nous vous recommandons de mettre en place une URL de traitement des retours des accusés de réception.

Packages et fonctions pour les scripts

PHP
<?php
/////////////////////////////////////////////////////////
//	Fonction qui transforme un fichier xml en tableau
/////////////////////////////////////////////////////////
function XML2Array($xml, $recursive=true){
    if(!$recursive){
        $array=simplexml_load_string($xml);
    }else{
        $array=$xml;
    }
    $newArray=array();
    $array=(array)$array;
    foreach($array as $key => $value){
        $value=(array)$value;
        if(isset($value[0])){
            $newArray[$key]=trim($value[0]);
        }else{
            $newArray[$key]=XML2Array($value,true);
        }
    }
    return $newArray ;
}

/////////////////////////////////////////////////////////
//	Fonction qui transforme une chaine en donnee xml
/////////////////////////////////////////////////////////
function string2XML($out){
    $xml='';
    $out=explode("\n", $out);
    foreach($out as $line){
        if( strstr($line, '<etat') || strstr($line, '<credit>')) {
            $xml .= trim($line)."\n";
        }
    }
// Ne pas mettre d'indentation sinon cela ne fonctionne plus
$out = <<<XML
$xml
XML;    

    $xml = simplexml_load_string($out);
    return $xml;   
} 
?>
                    
Python
Java
/*
Fonction pour appel url avec multipart
*/

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
 
/**
 * This utility class provides an abstraction layer for sending multipart HTTP
 * POST requests to a web server.
 * @author www.codejava.net
 *
 */
public class MultipartUtility {
    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;
 
    /**
     * This constructor initializes a new HTTP POST request with content type
     * is set to multipart/form-data
     * @param requestURL
     * @param charset
     * @throws IOException
     */
    public MultipartUtility(String requestURL, String charset)
            throws IOException {
        this.charset = charset;
         
        // creates a unique boundary based on time stamp
        boundary = "===" + System.currentTimeMillis() + "===";
         
        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true); // indicates POST method
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);
        httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
        httpConn.setRequestProperty("Test", "Bonjour");
        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                true);
    }
 
    /**
     * Adds a form field to the request
     * @param name field name
     * @param value field value
     */
    public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                .append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(
                LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }
 
    /**
     * Adds a upload file section to the request
     * @param fieldName name attribute in <input type="file" name="..." />
     * @param uploadFile a File to be uploaded
     * @throws IOException
     */
    public void addFilePart(String fieldName, File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append(
                "Content-Disposition: form-data; name=\"" + fieldName
                        + "\"; filename=\"" + fileName + "\"")
                .append(LINE_FEED);
        writer.append(
                "Content-Type: "
                        + URLConnection.guessContentTypeFromName(fileName))
                .append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();
 
        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();
         
        writer.append(LINE_FEED);
        writer.flush();    
    }
 
    /**
     * Adds a header field to the request.
     * @param name - name of the header field
     * @param value - value of the header field
     */
    public void addHeaderField(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }
     
    /**
     * Completes the request and receives response from the server.
     * @return a list of Strings as response in case the server returned
     * status OK, otherwise an exception is thrown.
     * @throws IOException
     */
    public List<String> finish() throws IOException {
        List<String> response = new ArrayList<String>();
 
        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();
 
        // checks servers status code first
        int status = httpConn.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }
 
        return response;
    }
}                    

Contact

Vous pouvez contacter le support technique à l'adresse suivante: support@isendpro.com

Important: Merci de préciser dans votre mail votre identifiant client
Si la question concerne la remise d'un appel, merci de rajouter les infos suivantes :
  • Numéro de téléphone (MSISDN)
  • Message
  • Date et heure d'envoi

Le support technique est joignable tous les jours de la semaine de 09h à 13h et de 14h à 17h au 04 83 66 05 10

Utilisation API

Envoi d’un fichier Fax

Avant d’envoyer une campagne aux destinataires, il faut au préalable nous envoyer le fichier PDF via une requête http
Les fichiers doivent être au format .pdf, contenir entre 1 et 4 pages maximum et ne pas dépasser 500 Ko par page.
Remarque : 1 crédit sera décompté pour chaque page envoyée.
En cas de réussite, un identifiant unique est retourné dans fichierId, il devra être utilisé lors des envois associés à ce fichier, dans le champ fichierId.

Appel

https://www.isendpro.com/cgi-bin/fax.pyl
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
setFichier Number Oui Utiliser la valeur 1
uploadedfile String Oui Chemin vers le fichier en local

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs (cf Annexes)
fichierId Number Identifiant numérique correspondant au fichier vocal importé
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <fichierId>1574</fichierId>
    <message> Le fichier a bien été importé</message>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>106</code>
    <message> Seuls les fichiers .wma, .wav sont acceptés!</message>
</etat>

Exemples de scripts

curl -v -include \
'https://www.isendpro.com/cgi-bin/fax.pyl' \
-F 'keyid=a296464ce012b8ab710a' \
-F 'setFichier=1' \
-F uploadedfile=@test.pdf
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/fax.pyl';
$ficFax='/[PATH]/test.pdf';
if(function_exists('curl_file_create')) { // php 5.5+
    $cFile = curl_file_create($ficFax);
}else{
    $cFile = '@' . realpath($ficFax);
}

$ch = curl_init();
$params = array(
    'keyid'         => 'a296464ce012b8ab710a',
    'setFichier'    => '1',
    'uploadedfile'  => $cFile    
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html

$xml = string2XML($out);
$repetat = XML2Array($xml);
// Erreur generale
if (!isset($repetat['fichierId'])){
    echo 'Code: '.$repetat['code'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}else{
    // Envoi OK
    echo 'fichierId: '.$repetat['fichierId'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict

url = 'https://www.isendpro.com/cgi-bin/fax.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'setFichier':   '1'
}
files = {
    'uploadedfile': open('/[PATH]/test.pdf', 'rb')
}
response = requests.post(url, params, files=files)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    repetat=repetat['etat']
    # Erreur generale
    if not repetat.has_key('fichierId'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
    # Envoi OK
    else:
        print 'fichierId: '+repetat['fichierId']
        print 'Message: '+repetat['message']
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.pdf");
        String requestURL = "https://www.isendpro.com/cgi-bin/fax.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);
             
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");

            multipart.addFormField("keyid", "a296464ce012b8ab710a");
            multipart.addFormField("setFichier", "1");
             
            multipart.addFilePart("uploadedfile", uploadFile1);
 
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            Element eElement = (Element) nNode;                            
                            NodeList nl = eElement.getElementsByTagName("fichierId");
                                                        
                            // Erreur generale
                            if (nl.getLength() == 0) {
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());
                            // Infos de retour
                            }else{
                                System.out.println("fichierId: "+eElement.getElementsByTagName("fichierId").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());                              
                            }                            
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi de message unitaire

Envoi d'un FAX à 1 seul destinataire par requete

Appel

https://www.isendpro.com/cgi-bin/fax.pyl?keyid=[KEYID]&fichierid=[FICHIERID]&num=[NUM]&emetteur=[EMETTEUR]&tracker=[TRACKER]
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num String Oui Numéro de téléphone du destinataire
Au format national
Uniquement vers les fixes
Ex: 0401020304
fichierid Number Oui Identifiant numérique associé au Fax à envoyer
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
tracker String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>0</code>
    <tel>0401020304</tel>
    <message>Votre message a bien ete envoye</message>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>21</code>
    <tel>0814222448</tel>
    <message>Le numéro de téléphone n'est pas attribué!</message>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/fax.pyl' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&fichierid=5572&num=0401020304&tracker=test001'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/fax.pyl';

$ch = curl_init();
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'fichierid'     =>  5572,
    'num'           =>  0401020304,
    'tracker'       =>  'test001'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetat = XML2Array($xml);
// Erreur generale
if (!isset($repetat['tel'])){
    echo 'Code: '.$repetat['code'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}else{
    // Envoi OK
    echo 'tel: '.$repetat['tel'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict

url = 'https://www.isendpro.com/cgi-bin/fax.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'fichierid':    5572,
    'num':          0401020304,
    'tracker':      'test001'
}

response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    repetat=repetat['etat']
    # Erreur generale
    if not repetat.has_key('tel'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
    # Envoi OK
    else:
        print 'tel: '+repetat['tel']
        print 'Message: '+repetat['message']
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.pdf");
        String requestURL = "https://www.isendpro.com/cgi-bin/fax.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);             
            
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");
            
            multipart.addFormField("keyid",     "a296464ce012b8ab710a");
            multipart.addFormField("fichierid", "5572");
            multipart.addFormField("num",       "3401020304");
            multipart.addFormField("tracker",   "test001");
            
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            Element eElement = (Element) nNode;                            
                            NodeList nl = eElement.getElementsByTagName("tel");
                                                        
                            // Erreur generale
                            if (nl.getLength() == 0) {
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());
                            // Infos de retour
                            }else{
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());                              
                                System.out.println("tel: "+eElement.getElementsByTagName("tel").item(0).getTextContent());                                
                            }                            
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi de messages multiples

Envoi d'un Fax à plusieurs destinataire par requete
Cette solution permet d’envoyer un message jusqu’à 50 destinataires différents par requête, permettant ainsi une augmentation de la vitesse des envois.
Les numéros de téléphone sont placés dans des variables numX où X est un entier allant de 1 à 50 au maximum.
Si le Fax (ou fichier) est identique pour tous les destinataires, il suffit de le renseigner une seule fois dans la variable fichierid.
Si le Fax (ou fichier) est différent pour chaque destinataire alors ils sont placés dans des variables fichieridX où X est un entier allant de 1 à 50 au maximum.
Dans ce cas le Fax fichieridX sera envoyé au destinataire numX.

Appel

http(s)://www.isendpro.com/cgi-bin/fax.pyl?keyid=[KEYID]&fichierid1=[FICHIERID1]&num1=[NUM1]&fichierid2=[FICHIERID2]&num2=[NUM2]...&fichierid50=[FICHIERID50]&num50=[NUM50]&emetteur=[EMETTEUR]&tracker=[TRACKER]
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num[X] String Oui Numéro de téléphone du destinataire
Au format national
Uniquement vers les fixes
Ex: 0401020304
fichierid[X] Number Oui Identifiant numérique associé au Fax à envoyer
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
tracker[X] String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné

Réponse

Paramètre Type Détails
code[X] Number Code correspondant au tableau des erreurs
tel[X] String Numéro de téléphone associé au code retour
message[X] String Libellé correspondant au tableau des erreurs
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <etat1>
        <code1>0</code1>
        <tel1>0401020304</tel1>
        <message1>Votre message a bien ete envoye</message1>
    </etat1>
    <etat2>
        <code2>0</code2>
        <tel2>0401020305</tel2>
        <message2>Votre message a bien ete envoye</message2>
    </etat2>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <etat1>
        <code1>21</code1>
        <tel1>0801020304</tel1>
        <message1>Le numéro de téléphone n'est pas attribué!</message1>
    </etat1>
    <etat2>
        <code2>21</code2>
        <tel2>0801020305</tel2>
        <message2>Le numéro de téléphone n'est pas attribué!</message2>
    </etat2>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/fax.pyl' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&fichierid=5572&num1=0401020304&tracker1=test001X01&num2=0401020305&tracker2=test001X02'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/fax.pyl';

$ch = curl_init();
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'fichierid'     =>  557200,
    'num1'          =>  0401020304,
    'tracker1'      =>  'test001X01',
    'num2'          =>  0401020305,
    'tracker2'      =>  'test001X02'    
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetat = XML2Array($xml);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}
	
$cpt=1;
foreach($repetat as $key => $value){
    if(is_array($value)){
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // On récupère les réponses à la requete pour chacun des numéros d identifiant    
        if (array_key_exists('code'.$cpt,$value) && array_key_exists('message'.$cpt,$value) && array_key_exists('tel'.$cpt,$value) ){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;
        }else{
            if (array_key_exists('code',$value) && array_key_exists('message',$value) ){
                echo 'Code: '.$value['code'.$cpt];
                echo $sautligne;
                echo 'message: '.$value['message'.$cpt];
                echo $sautligne;                
            }
        }
        $cpt+=1;
    }else{
        if (array_key_exists('code',$repetat) && array_key_exists('message',$repetat) ){
            echo 'Code: '.$repetat['code'];
            echo $sautligne;
            echo 'message: '.$repetat['message'];
            echo $sautligne;            
            break;
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/fax.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'fichierid':    5572,
    'num1':         0401020304,
    'tracker1':     'test001X01',
    'num2':         0401020305,
    'tracker2':     'test001X02'    
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    repetatList=repetat['etat']    
    if type(repetatList) is types.ListType:
        keysList=repetatList.keys()
        keysList.sort()
        for key in keysList:
            print '-----------'    
            print 'Data '+key 
            cpt=key.replace('etat','')
            repetat=repetatList[key]
            # Erreur generale
            if not repetat.has_key('tel'+cpt):
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]   
    else:
        repetat=repetatList 
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.pdf");
        String requestURL = "https://www.isendpro.com/cgi-bin/fax.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);             
            
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");
            
            multipart.addFormField("keyid",         "a296464ce012b8ab710a");
            multipart.addFormField("fichierid",     "5572");
            multipart.addFormField("num1",          "0401020304");
            multipart.addFormField("tracker1",      "test001X01");
            multipart.addFormField("num2",          "0401020305");
            multipart.addFormField("tracker2",      "test001X02");    
            
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            NodeList nList2 = nNode.getChildNodes();                                                                                                             
                                                        
                            // Erreur generale
                            if(nList2.item(0).getNodeName()=="code"){                              
                                System.out.println("Code: "+nList2.item(0).getTextContent());
                                System.out.println("Message: "+nList2.item(1).getTextContent());                            
                            }else{      
                                // Infos de retour
                                for(int i=0; i<nList2.getLength(); i++) {
                                    Node n = nList2.item(i);                                                                                    
                                    Element airportElem = (Element)n;
                                    System.out.println("--------------------");
                                    System.out.println("Node :" + n.getNodeName());    
                                                                                    
                                    NodeList nList3 = n.getChildNodes();  
                                    //System.out.println("n3 Length:" + nList3.getLength());  
                                    for(int j=0; j<nList3.getLength(); j++) {
                                        System.out.println(nList3.item(j).getNodeName()+": "+nList3.item(j).getTextContent());
                                    }
                                }                            
                            }
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Consultation du crédit

Consultation du crédit restant en quantité ou en euros HT

Appel

https://www.isendpro.com/cgi-bin/fax.pyl?keyid=[KEYID]&credit=[CREDIT]&type_envoi=[TYPE_ENVOI]
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
credit Number Oui Number indiquant le type de crédit restant
  • 1: Pour le montant en euros HT
  • 2: Pour la quantité de SMS

Réponse

Paramètre Type Détails
credit String Nombre à virgule indiquant le crédit restant en euros HT
Ex: 561.20
quantite Number Nombre indiquant le nombre de crédits restants en quantité de Fax
Ex: 8974
 <?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <credit>110</credit>
    <quantite>4074</quantite>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/fax.pyl' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&credit=2'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/fax.pyl';

$ch = curl_init();
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'credit'        =>  2
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetat = XML2Array($xml);
// Erreur generale
if (!isset($repetat['credit'])){
    echo 'Code: '.$repetat['code'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}else{
    // Credit OK
    echo 'credit: '.$repetat['credit'];
    echo $sautligne;
    if (isset($repetat['quantite'])){
        echo 'quantite: '.$repetat['quantite'];
        echo $sautligne;
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict

url = 'https://www.isendpro.com/cgi-bin/fax.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'credit':       2
}

response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    repetat=repetat['etat']
    # Erreur generale
    if not repetat.has_key('credit'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
    # Envoi OK
    else:
        print 'credit: '+repetat['credit']
        if repetat.has_key('quantite'):
            print 'quantite: '+repetat['quantite']
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.pdf");
        String requestURL = "https://www.isendpro.com/cgi-bin/fax.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);             
            
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");
            
            multipart.addFormField("keyid",     "a296464ce012b8ab710a");
            multipart.addFormField("credit",    "2");                   
            
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            Element eElement = (Element) nNode;                            
                            NodeList nl = eElement.getElementsByTagName("credit");
                                                        
                            // Erreur generale
                            if (nl.getLength() == 0) {
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());
                            // Infos de retour
                            }else{
                                System.out.println("credit: "+eElement.getElementsByTagName("credit").item(0).getTextContent());
                                System.out.println("quantite: "+eElement.getElementsByTagName("quantite").item(0).getTextContent());                              
                            }                            
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Webhook des accusés de réception

Présentation de la structure de renvoi des accusés de réception sur une url donnée

Appel

Le client devra développer une page Web qui traitera les données reçues.
Contraintes
  • Page accessible sans système d'authentification
  • Définir le lien sur votre espace client Mon compte -> Mon API -> AR des FAX
  • Afficher la chaine de caractères 'validation' en réponse à l'appel
www.votre_adresse.com/votre_page_web??tel=[TEL]&date=[DATE]&heure=[HEURE]&id=[ID]&tracker=[TRACKER]&erreur=[ERREUR]&decroche=[DECROCHE]&duree=[DUREE]
Paramètre Type Obligatoire Détails
tel String Oui Numéro de téléphone du destinataire
Au format national
Uniquement vers les fixes
Ex: 0401020304
date Date au format
AAAA-MM-JJ
Oui La date de réception de l'accusé
heure Date au format
HH:MM:SS
Oui L'heure de réception de l'accusé
id Number Oui Identifiant unique de l'accusé
tracker String Oui Argument éventuellement fourni lors de l'envoi pour une identification simplifiée
erreur Number Oui Indique s'il y a une erreur lors de l'envoi
  • 0: Envoi OK
  • 1: Envoi Non OK
decroche Number Oui Indique si le destinataire a décroché
  • 0: Pas décroché/li>
  • 1: Décroché
duree Number Oui Durée de l'appel en secondes
Ex: 150


Codes erreurs API

Tableau des codes erreurs retournés par l'API
Code erreur Message
0 Votre message a bien ete envoye
1 Le Champ Login est vide
2 Le Champ PWD est vide
3 Vos identifiants sont incorrectes
4 Vous devez saisir un message!
5 Le message ne doit pas dépasser XXX caractères!
6 Vous devez saisir un numéro de téléphone valide!
7 Un numéro de téléphone est sur 10 chiffres!
9 La route que vous avez saisie n'existe pas!
10 Vous n'avez pas les droits nécessaires pour utiliser cette route!
11 Le numéro de téléphone est dans la liste noire!
12 Votre crédit de MT est épuisé!
13 La route Lowcost est down!
14 L'adresse IP n'est pas autorisée!
15 Vous devez indiquer un canal d'envoi!
16 L'émetteur ne peut pas etre vide!
21 Le numéro de téléphone n'est pas attribué!
22 Le numéro de téléphone est attribue à un Full MVNO
23 Le nombre maximum de téléphones par requete est de 50
24 Pas d'envoi commercial entre 20h et 08h, ni les jours fériés
25 Il est obligatoire d'indiquer le cout vers les numeros en 0899. Ex: Pour plus de renseignements appelez le 0899 XX XX XX (1E35/apl+0.34E/min)
26 Il est obligatoire d'indiquer le cout vers les numeros en 0892. Ex: Pour plus de renseignements appelez le 0892 XX XX XX (0.34E/min)
27 L'indicatif pays du téléphone n'est pas autorisé!
28 Votre crédit de qualification est épuisé!
29 Nous ne pouvons donner suite à votre demande (overflow)
30 Erreur sur le domaine de connexion
31 Le message ne doit pas dépasser XXX caractères!
32 Le message est sur DATA1 SMS (DATA2 caractères) alors que la demande est sur DATA3 SMS
33 Cet émetteur n'est pas autorisé!
34 La valeur de smslong doit etre un entier!
37 Les numeros de telephone ne sont pas tous a destination du meme pays!
43 La date d'envoi n'est pas au bon format (AAAA-MM-JJ HH:MM)!
100 Vous devez saisir un type d'appel valide
101 Les appels répondeurs ne fonctionnent pas avec les numéros de fixe!
102 Vous devez saisir un fichier valide!
103 L'émetteur doit etre sur 10 chiffres!
104 L'émetteur ne doit comporter que des chiffres!
105 L'émetteur ne peut pas etre un numéro en 08!
106 Seuls les fichiers .wma, .wav sont acceptés!
107 Votre fichier dépasse XXX secondes!
108 Votre fichier doit dépasser XXX secondes!
200 Le numéro de téléphone doit etre un fixe
206 Seuls les fichiers .pdf sont acceptés!
207 Votre fichier dépasse XXX pages!
208 Votre fichier doit dépasser 1 page!
209 Votre fichier dépasse XXX Ko par page!
210 Votre fichier converti est trop lourd! Merci de contacter le support!
211 Vous devez saisir un identifiant de fichier
1000 Le fichier a bien été importé
999 Une erreur est survenue. Merci de contacter le service technique

API Vocal HTTPS iSendPro Telecom

Prérequis

Munissez vous de votre keyid

Votre keyid (clé d'identification) est visible sur votre espace client dans Mon compte -> Mon api
Cette clé vous identifie et vous devrez l'utiliser pour effectuer toutes vos requêtes via l'API

Restrictions horaires

L’envoi de messages vocaux commerciaux est formellement interdit entre 20h00 et 8h00 les jours calendaires. Ces restrictions contractuelles avec les opérateurs sont édictées par l’AFMM et ne sont pas spécifiques à notre site.
Vous pouvez soit programmer votre envoi pour plus tard, soit nous demander de lever cette restriction si vos envois ne sont pas à destination commerciale (système d’alerte, de notification de prise de rendez-vous par exemple) en envoyant un email à contact@isendpro.com

Configurer le contrôle IP

Un contrôle IP, basé sur un système de type «liste blanche» est activé par défaut.
Vous pouvez soit renseigner cette liste blanche, soit désactiver le contrôle IP.
Ce paramètrage peut s'effectuer sur Mon compte -> Mon api

Liste noire

Une liste des numéros de téléphone vers lesquels les messages ne sont pas envoyés est gérée.
Les numéros de téléphone y sont ajoutés à la demande des opérateurs ou de nos partenaires.
Tous les messages envoyés vers des clients en liste noire ne sont pas routés.
Dans ce cas, le code erreur 11 est retourné par la requête.

Encodage

  • L’encodage des urls doit être en ISO-8859-15

Remarques et bonnes pratiques

Logs

Nous vous recommandons de logguer (avec horodatage) vos appels à l'API ainsi que les réponses de cette dernière.

Traitement des erreurs

L'API répondra un code HTTP 200 à vos appels..
Si le code d'erreur est différent de 200, une erreur s'est produite et nous vous recommandons d'investiguer le problème, avec l'aide de notre support technique si nécessaire..
Les wrappers lèvent des exceptions en cas d'erreur, exceptions que nous vous recommandons de rattraper.

Traitement des retours

Certains retours vous remontent des problèmes sans déclencher d'erreur HTTP (ni exception dans les wrappers)..
Par un exemple si vous soumettez des envois à une liste de numéros de téléphone dont certains sont mal formatés, vous aurez un code HTTP 200 mais avec des code retour indiquant ce problème

Traitement des accusés de réception

Nous vous recommandons de mettre en place une URL de traitement des retours des accusés de réception

Packages et fonctions pour les scripts

PHP
<?php
/////////////////////////////////////////////////////////
//	Fonction qui transforme un fichier xml en tableau
/////////////////////////////////////////////////////////
function XML2Array($xml, $recursive=true){
    if(!$recursive){
        $array=simplexml_load_string($xml);
    }else{
        $array=$xml;
    }
    $newArray=array();
    $array=(array)$array;
    foreach($array as $key => $value){
        $value=(array)$value;
        if(isset($value[0])){
            $newArray[$key]=trim($value[0]);
        }else{
            $newArray[$key]=XML2Array($value,true);
        }
    }
    return $newArray ;
}

/////////////////////////////////////////////////////////
//	Fonction qui transforme une chaine en donnee xml
/////////////////////////////////////////////////////////
function string2XML($out){
    $xml='';
    $out=explode("\n", $out);
    foreach($out as $line){
        if( strstr($line, '<etat') || strstr($line, '<credit>')) {
            $xml .= trim($line)."\n";
        }
    }
// Ne pas mettre d'indentation sinon cela ne fonctionne plus
$out = <<<XML
$xml
XML;    

    $xml = simplexml_load_string($out);
    return $xml;   
} 
?>
                    
Python
Java
/*
Fonction pour appel url avec multipart
*/

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
 
/**
 * This utility class provides an abstraction layer for sending multipart HTTP
 * POST requests to a web server.
 * @author www.codejava.net
 *
 */
public class MultipartUtility {
    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;
 
    /**
     * This constructor initializes a new HTTP POST request with content type
     * is set to multipart/form-data
     * @param requestURL
     * @param charset
     * @throws IOException
     */
    public MultipartUtility(String requestURL, String charset)
            throws IOException {
        this.charset = charset;
         
        // creates a unique boundary based on time stamp
        boundary = "===" + System.currentTimeMillis() + "===";
         
        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true); // indicates POST method
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);
        httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
        httpConn.setRequestProperty("Test", "Bonjour");
        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                true);
    }
 
    /**
     * Adds a form field to the request
     * @param name field name
     * @param value field value
     */
    public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                .append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(
                LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }
 
    /**
     * Adds a upload file section to the request
     * @param fieldName name attribute in <input type="file" name="..." />
     * @param uploadFile a File to be uploaded
     * @throws IOException
     */
    public void addFilePart(String fieldName, File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append(
                "Content-Disposition: form-data; name=\"" + fieldName
                        + "\"; filename=\"" + fileName + "\"")
                .append(LINE_FEED);
        writer.append(
                "Content-Type: "
                        + URLConnection.guessContentTypeFromName(fileName))
                .append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();
 
        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();
         
        writer.append(LINE_FEED);
        writer.flush();    
    }
 
    /**
     * Adds a header field to the request.
     * @param name - name of the header field
     * @param value - value of the header field
     */
    public void addHeaderField(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }
     
    /**
     * Completes the request and receives response from the server.
     * @return a list of Strings as response in case the server returned
     * status OK, otherwise an exception is thrown.
     * @throws IOException
     */
    public List<String> finish() throws IOException {
        List<String> response = new ArrayList<String>();
 
        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();
 
        // checks servers status code first
        int status = httpConn.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }
 
        return response;
    }
}                    

Contact

Vous pouvez contacter le support technique à l'adresse suivante: support@isendpro.com

Important: Merci de préciser dans votre mail votre identifiant client
Si la question concerne la remise d'un appel, merci de rajouter les infos suivantes :
  • Numéro de téléphone (MSISDN)
  • Message
  • Date et heure d'envoi

Le support technique est joignable tous les jours de la semaine de 09h à 13h et de 14h à 17h au 04 83 66 05 10

Utilisation API

Envoi d’un fichier vocal

Avant d’envoyer une campagne aux destinataires, il faut au préalable nous envoyer le fichier vocal via une requête http
Les fichiers vocaux doivent être au format .wav ou .wma et avoir une durée comprise entre 20 et 50 secondes.
En cas de réussite, un identifiant unique est retourné dans fichierId, il devra être utilisé lors des envois associés à ce fichier, dans le champ fichierId.

Appel

https://www.isendpro.com/cgi-bin/smv.pyl
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
setFichier Number Oui Utiliser la valeur 1
uploadedfile String Oui Chemin vers le fichier en local

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs (cf Annexes)
fichierId Number Identifiant numérique correspondant au fichier vocal importé
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <fichierId>1574</fichierId>
    <message> Le fichier a bien été importé</message>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>106</code>
    <message> Seuls les fichiers .wma, .wav sont acceptés!</message>
</etat>

Exemples de scripts

curl -v -include \
'https://www.isendpro.com/cgi-bin/smv.pyl' \
-F 'keyid=a296464ce012b8ab710a' \
-F 'setFichier=1' \
-F uploadedfile=@test.wav
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/smv.pyl';
$ficVocal='/[PATH]/test.wav';
if(function_exists('curl_file_create')) { // php 5.5+
    $cFile = curl_file_create($ficVocal);
}else{
    $cFile = '@' . realpath($ficVocal);
}

$ch = curl_init();
$params = array(
    'keyid'         => 'a296464ce012b8ab710a',
    'setFichier'    => '1',
    'uploadedfile'  => $cFile    
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html

$xml = string2XML($out);
$repetat = XML2Array($xml);
// Erreur generale
if (!isset($repetat['fichierId'])){
    echo 'Code: '.$repetat['code'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}else{
    // Envoi OK
    echo 'fichierId: '.$repetat['fichierId'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict

url = 'https://www.isendpro.com/cgi-bin/smv.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'setFichier':   '1'
}
files = {
    'uploadedfile': open('/[PATH]/test.wav', 'rb')
}
response = requests.post(url, params, files=files)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    repetat=repetat['etat']
    # Erreur generale
    if not repetat.has_key('fichierId'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
    # Envoi OK
    else:
        print 'fichierId: '+repetat['fichierId']
        print 'Message: '+repetat['message']
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.wav");
        String requestURL = "https://www.isendpro.com/cgi-bin/smv.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);
             
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");

            multipart.addFormField("keyid", "a296464ce012b8ab710a");
            multipart.addFormField("setFichier", "1");
             
            multipart.addFilePart("uploadedfile", uploadFile1);
 
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            Element eElement = (Element) nNode;                            
                            NodeList nl = eElement.getElementsByTagName("fichierId");
                                                        
                            // Erreur generale
                            if (nl.getLength() == 0) {
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());
                            // Infos de retour
                            }else{
                                System.out.println("fichierId: "+eElement.getElementsByTagName("fichierId").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());                              
                            }                            
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi de message unitaire

Envoi d'un message vocal à 1 seul destinataire par requete

Appel

https://www.isendpro.com/cgi-bin/smv.pyl?keyid=[KEYID]&type_appel=[TYPE_APPEL]&fichierid=[FICHIERID]&num=[NUM]&emetteur=[EMETTEUR]&tracker=[TRACKER]
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
fichierid Number Oui Identifiant numérique associé au message vocal à envoyer
type_appel Number Non Type d'appel à effectuer
  • 0: décroché fixe ou mobile
  • 1: répondeur mobile
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
tracker String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>0</code>
    <tel>33601020304</tel>
    <message>Votre message a bien ete envoye</message>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>21</code>
    <tel>33814222448</tel>
    <message>Le numéro de téléphone n'est pas attribué!</message>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/smv.pyl' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&fichierid=5572&type_appel=0&num=33601020304&tracker=test001'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/smv.pyl';

$ch = curl_init();
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'fichierid'     =>  5572,
    'type_appel'    =>  0,
    'num'           =>  33601020304,
    'tracker'       =>  'test001'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html

$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['tel'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Erreur specifique au numero de telephone  
        if ($value['code'.$cpt]!=0){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;
        // Envoi OK
        }else{
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;  
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;                
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict

url = 'https://www.isendpro.com/cgi-bin/smv.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'fichierid':    5572,
    'type_appel':   0,
    'num':          33601020304,
    'tracker':      'test001'
}

response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('tel'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Erreur specifique au numero de telephone  
            if repetat['code'+cpt]!=0:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]        
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt] 
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.wav");
        String requestURL = "https://www.isendpro.com/cgi-bin/smv.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);             
            
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");
            
            multipart.addFormField("keyid",     "a296464ce012b8ab710a");
            multipart.addFormField("fichierid", "5572");
            multipart.addFormField("type_appel","0");
            multipart.addFormField("num",       "33601020304");
            multipart.addFormField("tracker",   "test001");
            
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            Element eElement = (Element) nNode;                            
                            NodeList nl = eElement.getElementsByTagName("tel");
                                                        
                            // Erreur generale
                            if (nl.getLength() == 0) {
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());
                            // Infos de retour
                            }else{
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());                              
                                System.out.println("tel: "+eElement.getElementsByTagName("tel").item(0).getTextContent());                                
                            }                            
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi de messages multiples

Envoi d'un message vocal à plusieurs destinataire par requete
Cette solution permet d’envoyer un message jusqu’à 50 destinataires différents par requête, permettant ainsi une augmentation de la vitesse des envois.
Les numéros de téléphone sont placés dans des variables numX où X est un entier allant de 1 à 50 au maximum.
Si le message vocal (ou fichier) est identique pour tous les destinataires, il suffit de le renseigner une seule fois dans la variable fichierid.
Si le message vocal (ou fichier) est différent pour chaque destinataire alors ils sont placés dans des variables fichieridX où X est un entier allant de 1 à 50 au maximum.
Dans ce cas le message vocal fichieridX sera envoyé au destinataire numX.

Appel

http(s)://www.isendpro.com/cgi-bin/smv.pyl?keyid=[KEYID]&type_appel=[TYPE_APPEL]&fichierid1=[FICHIERID1]&num1=[NUM1]&fichierid2=[FICHIERID2]&num2=[NUM2]...&fichierid50=[FICHIERID50]&num50=[NUM50]&emetteur=[EMETTEUR]&tracker=[TRACKER]
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num[X] String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
fichierid[X] Number Oui Identifiant numérique associé au message vocal à envoyer
type_appel Number Non Type d'appel à effectuer
  • 0: décroché fixe ou mobile
  • 1: répondeur mobile
emetteur String Non Emetteur du message
Par défaut, un numéro de fixe sur 10 chiffres
Ex: 0422850268
Contraintes:
  • La modification pour un émetteur ne commencant pas par 01,02,03,04 ou 05, entraine une surtaxe par appel de 0.042 euros HT vers les mobiles et de 0.002 euros HT vers les fixes
  • Suite à une nouvelle réglementation imposée par l'ARCEP depuis le 01/08/2019, chaque modification d'un émetteur doit etre approuvée. Pour toute demande à ce sujet, vous pouvez nous contacter par email sur contact@isendpro.com
  • Un numéro composé de 10 chiffres, ne commençant pas par 08
tracker[X] String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné

Réponse

Paramètre Type Détails
code[X] Number Code correspondant au tableau des erreurs
tel[X] String Numéro de téléphone associé au code retour
message[X] String Libellé correspondant au tableau des erreurs
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <etat1>
        <code1>0</code1>
        <tel1>33601020304</tel1>
        <message1>Votre message a bien ete envoye</message1>
    </etat1>
    <etat2>
        <code2>0</code2>
        <tel2>0601020305</tel2>
        <message2>Votre message a bien ete envoye</message2>
    </etat2>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <etat1>
        <code1>21</code1>
        <tel1>33801020304</tel1>
        <message1>Le numéro de téléphone n'est pas attribué!</message1>
    </etat1>
    <etat2>
        <code2>21</code2>
        <tel2>0801020305</tel2>
        <message2>Le numéro de téléphone n'est pas attribué!</message2>
    </etat2>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/smv.pyl' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&fichierid=5572&type_appel=0&num1=33601020304&tracker1=test001X01&num2=0601020305&tracker2=test001X02'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/smv.pyl';

$ch = curl_init();
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'fichierid'     =>  557200,
    'type_appel'    =>  0,
    'num1'          =>  33601020304,
    'tracker1'      =>  'test001X01',
    'num2'          =>  33601020305,
    'tracker2'      =>  'test001X02'    
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html

$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['tel'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Erreur specifique au numero de telephone  
        if ($value['code'.$cpt]!=0){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;
        // Envoi OK
        }else{
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;  
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;                
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/smv.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'fichierid':    5572,
    'type_appel':   0,
    'num1':         33601020304,
    'tracker1':     'test001X01',
    'num2':         33601020305,
    'tracker2':     'test001X02'    
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('tel'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Erreur specifique au numero de telephone  
            if repetat['code'+cpt]!=0:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]        
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt] 
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.wav");
        String requestURL = "https://www.isendpro.com/cgi-bin/smv.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);             
            
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");
            
            multipart.addFormField("keyid",         "a296464ce012b8ab710a");
            multipart.addFormField("fichierid",     "5572");
            multipart.addFormField("type_appel",    "0");
            multipart.addFormField("num1",          "33601020304");
            multipart.addFormField("tracker1",      "test001X01");
            multipart.addFormField("num2",          "33601020305");
            multipart.addFormField("tracker2",      "test001X02");    
            
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            NodeList nList2 = nNode.getChildNodes();                                                                                                             
                                                        
                            // Erreur generale
                            if(nList2.item(0).getNodeName()=="code"){                              
                                System.out.println("Code: "+nList2.item(0).getTextContent());
                                System.out.println("Message: "+nList2.item(1).getTextContent());                            
                            }else{      
                                // Infos de retour
                                for(int i=0; i<nList2.getLength(); i++) {
                                    Node n = nList2.item(i);                                                                                    
                                    Element airportElem = (Element)n;
                                    System.out.println("--------------------");
                                    System.out.println("Node :" + n.getNodeName());    
                                                                                    
                                    NodeList nList3 = n.getChildNodes();  
                                    //System.out.println("n3 Length:" + nList3.getLength());  
                                    for(int j=0; j<nList3.getLength(); j++) {
                                        System.out.println(nList3.item(j).getNodeName()+": "+nList3.item(j).getTextContent());
                                    }
                                }                            
                            }
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Consultation du crédit

Consultation du crédit restant en quantité ou en euros HT

Appel

https://www.isendpro.com/cgi-bin/smv.pyl?keyid=[KEYID]&credit=[CREDIT]&type_envoi=[TYPE_ENVOI]
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
credit Number Oui Number indiquant le type de crédit restant
  • 1: Pour le montant en euros HT
  • 2: Pour la quantité de SMS
type_envoi Number Oui Number indiquant le type de crédit concernée
  • 0: décroché fixe
  • 1: décroché mobile
  • 2: répondeur mobile

Réponse

Paramètre Type Détails
credit String Nombre à virgule indiquant le crédit restant en euros HT
Ex: 561.20
quantite Number Nombre indiquant le nombre de crédits restants en quantité d'envois
Ex: 8974
 <?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <credit>110</credit>
    <quantite>4074</quantite>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/smv.pyl' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&credit=2&type_envoi=0'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/smv.pyl';

$ch = curl_init();
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'credit'        =>  2,
    'type_envoi'    =>  0
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetat = XML2Array($xml);
// Erreur generale
if (!isset($repetat['credit'])){
    echo 'Code: '.$repetat['code'];
    echo $sautligne;
    echo 'Message: '.$repetat['message'];
    echo $sautligne;
}else{
    // Credit OK
    echo 'credit: '.$repetat['credit'];
    echo $sautligne;
    if (isset($repetat['quantite'])){
        echo 'quantite: '.$repetat['quantite'];
        echo $sautligne;
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict

url = 'https://www.isendpro.com/cgi-bin/smv.pyl'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'credit':       2,
    'type_envoi':   0
}

response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    repetat=repetat['etat']
    # Erreur generale
    if not repetat.has_key('credit'):
        print 'Code: '+repetat['code']
        print 'Message: '+repetat['message']
    # Envoi OK
    else:
        print 'credit: '+repetat['credit']
        if repetat.has_key('quantite'):
            print 'quantite: '+repetat['quantite']
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter;  

public class TestDocs {
 
    public static void main(String[] args) {

        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////    
        String charset = "UTF-8";
        File uploadFile1 = new File("test.wav");
        String requestURL = "https://www.isendpro.com/cgi-bin/smv.pyl";
 
        try {
            MultipartUtility multipart = new MultipartUtility(requestURL, charset);             
            
            multipart.addHeaderField("User-Agent", "CodeJava");
            multipart.addHeaderField("Test-Header", "Header-Value");
            
            multipart.addFormField("keyid",     "a296464ce012b8ab710a");
            multipart.addFormField("credit",    "2");
            multipart.addFormField("type_envoi","0");                        
            
            List<String> response = multipart.finish();             

            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////             
            for (String line : response) {
                System.out.println(line);
                
                try {                    
                    InputSource is = new InputSource(new StringReader(line));
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = dBuilder.parse(is);

                    //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());                    
                    if(doc.getDocumentElement().getNodeName()!="etat"){
                        // Erreur inconnue
                        System.out.println("Erreur inconnue: "+line);
                    }else{
                        NodeList nList = doc.getElementsByTagName("etat");
                        for (int temp = 0; temp < nList.getLength(); temp++) {
                            Node nNode = nList.item(temp);
                            Element eElement = (Element) nNode;                            
                            NodeList nl = eElement.getElementsByTagName("credit");
                                                        
                            // Erreur generale
                            if (nl.getLength() == 0) {
                                System.out.println("Code: "+eElement.getElementsByTagName("code").item(0).getTextContent());
                                System.out.println("Message: "+eElement.getElementsByTagName("message").item(0).getTextContent());
                            // Infos de retour
                            }else{
                                System.out.println("credit: "+eElement.getElementsByTagName("credit").item(0).getTextContent());
                                System.out.println("quantite: "+eElement.getElementsByTagName("quantite").item(0).getTextContent());                              
                            }                            
                        }
                    }            
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Webhook des accusés de réception

Présentation de la structure de renvoi des accusés de réception sur une url donnée

Appel

Le client devra développer une page Web qui traitera les données reçues.
Contraintes
  • Page accessible sans système d'authentification
  • Définir le lien sur votre espace client Mon compte -> Mon API -> AR des VOCAUX
  • Afficher la chaine de caractères 'validation' en réponse à l'appel
www.votre_adresse.com/votre_page_web??tel=[TEL]&date=[DATE]&heure=[HEURE]&id=[ID]&tracker=[TRACKER]&erreur=[ERREUR]&decroche=[DECROCHE]&duree=[DUREE]
Paramètre Type Obligatoire Détails
tel String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
date Date au format
AAAA-MM-JJ
Oui La date de réception de l'accusé
heure Date au format
HH:MM:SS
Oui L'heure de réception de l'accusé
id Number Oui Identifiant unique de l'accusé
tracker String Oui Argument éventuellement fourni lors de l'envoi pour une identification simplifiée
erreur Number Oui Indique s'il y a une erreur lors de l'envoi
  • 0: Envoi OK
  • 1: Envoi Non OK
decroche Number Oui Indique si le destinataire a décroché
  • 0: Pas décroché/li>
  • 1: Décroché
duree Number Oui Durée de l'appel en secondes
Ex: 150


Codes erreurs API

Tableau des codes erreurs retournés par l'API
Code erreur Message
0 Votre message a bien ete envoye
1 Le Champ Login est vide
2 Le Champ PWD est vide
3 Vos identifiants sont incorrectes
4 Vous devez saisir un message!
5 Le message ne doit pas dépasser XXX caractères!
6 Vous devez saisir un numéro de téléphone valide!
7 Un numéro de téléphone est sur 10 chiffres!
9 La route que vous avez saisie n'existe pas!
10 Vous n'avez pas les droits nécessaires pour utiliser cette route!
11 Le numéro de téléphone est dans la liste noire!
12 Votre crédit de MT est épuisé!
13 La route Lowcost est down!
14 L'adresse IP n'est pas autorisée!
15 Vous devez indiquer un canal d'envoi!
16 L'émetteur ne peut pas etre vide!
21 Le numéro de téléphone n'est pas attribué!
22 Le numéro de téléphone est attribue à un Full MVNO
23 Le nombre maximum de téléphones par requete est de 50
24 Pas d'envoi commercial entre 20h et 08h, ni les jours fériés
25 Il est obligatoire d'indiquer le cout vers les numeros en 0899. Ex: Pour plus de renseignements appelez le 0899 XX XX XX (1E35/apl+0.34E/min)
26 Il est obligatoire d'indiquer le cout vers les numeros en 0892. Ex: Pour plus de renseignements appelez le 0892 XX XX XX (0.34E/min)
27 L'indicatif pays du téléphone n'est pas autorisé!
28 Votre crédit de qualification est épuisé!
29 Nous ne pouvons donner suite à votre demande (overflow)
30 Erreur sur le domaine de connexion
31 Le message ne doit pas dépasser XXX caractères!
32 Le message est sur DATA1 SMS (DATA2 caractères) alors que la demande est sur DATA3 SMS
33 Cet émetteur n'est pas autorisé!
34 La valeur de smslong doit etre un entier!
37 Les numeros de telephone ne sont pas tous a destination du meme pays!
43 La date d'envoi n'est pas au bon format (AAAA-MM-JJ HH:MM)!
100 Vous devez saisir un type d'appel valide
101 Les appels répondeurs ne fonctionnent pas avec les numéros de fixe!
102 Vous devez saisir un fichier valide!
103 L'émetteur doit etre sur 10 chiffres!
104 L'émetteur ne doit comporter que des chiffres!
105 L'émetteur ne peut pas etre un numéro en 08!
106 Seuls les fichiers .wma, .wav sont acceptés!
107 Votre fichier dépasse XXX secondes!
108 Votre fichier doit dépasser XXX secondes!
200 Le numéro de téléphone doit etre un fixe
206 Seuls les fichiers .pdf sont acceptés!
207 Votre fichier dépasse XXX pages!
208 Votre fichier doit dépasser 1 page!
209 Votre fichier dépasse XXX Ko par page!
210 Votre fichier converti est trop lourd! Merci de contacter le support!
211 Vous devez saisir un identifiant de fichier
1000 Le fichier a bien été importé
999 Une erreur est survenue. Merci de contacter le service technique

API SMS HTTPS iSendPro Telecom

Prérequis

Munissez vous de votre keyid

Votre keyid (clé d'identification) est visible sur votre espace client dans Mon compte -> Mon api
Cette clé vous identifie et vous devrez l'utiliser pour effectuer toutes vos requêtes via l'API

Envois marketing

L’envoi de SMS commerciaux est formellement interdit entre 20h00 et 08h00 les jours calendaires.
Ces restrictions contractuelles avec les opérateurs sont édictées par l’AFMM et ne sont pas spécifiques à notre site.
En cas de changement d'émetteur, la mention STOP en fin de message est obligatoire.
Le client s'engage à respecter ces obligations sous peine de fortes amendes et de suspension immédiate du compte.

Envois transactionnels

Ces envois correspondent à des messages de type non marketing (confirmation de commande, rendez vous, message d‘alerte, etc).
Ils peuvent etre envoyés à toute heure, une fois la restriction horaires du compte levée.
En cas de changement d'émetteur, vous pouvez retirer la mention STOP SMS en fin de message en utilisant l'argument nostop avec la valeur 1 (cf tableau), une fois la restriction STOP du compte levée.
Pour lever les restrictions horaires et STOP, envoyez un email à contact@isendpro.com

Configurer le contrôle IP

Un contrôle IP, basé sur un système de type «liste blanche» est activé par défaut.
Vous pouvez soit renseigner cette liste blanche, soit désactiver le contrôle IP.
Ce paramètrage peut s'effectuer sur Mon compte -> Mon api

Liste noire

Une liste des numéros de téléphone vers lesquels les messages ne sont pas envoyés est gérée.
Les numéros de téléphone y sont ajoutés à la demande des opérateurs ou de nos partenaires.
Tous les messages envoyés vers des clients en liste noire ne sont pas routés.
Dans ce cas, le code erreur 11 est retourné par la requête.

Encodage

  • Les appels à l'API doivent etre encodés en UTF-8
  • Les SMS et les noms de répertoires doivent être encodés en UTF-8. Par défaut, les SMS sont réencodés en GSM7 lors de la transmission à l'opérateur. De ce fait, seuls les caractères précisés en annexe sont acceptés (ou remplacés).
  • Les retours d'API sont effectués en ISO-8859-15 (latin1 + euro sign).
  • En cas d'envoi en ucs-2, la totalité des caractères utf-8 est supportée.

Remarques et bonnes pratiques

Logs

Nous vous recommandons de logguer (avec horodatage) vos appels à l'API ainsi que les réponses de cette dernière.

Traitement des erreurs

L'API répondra un code HTTP 200 à vos appels.

Traitement des retours

Dans l'exemple ci-dessous, le 33601020304 est un numéro invalide et le 33601020305 est un numéro en liste noire. Nous vous recommandons donc de traiter ces retours.
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <etat1>
        <code1>21</code1>
        <tel1>33601020304</tel1>
        <message1>Le numéro de téléphone n'est pas attribué!</message1>
    </etat1>
    <etat2>
        <code2>11</code2>
        <tel2>33601020305</tel2>
        <message2>Le numéro de téléphone est dans la liste noire!</message2>
    </etat2>
    <etat2>
        <code2>0</code2>
        <tel2>33601020306</tel2>
        <message2>Votre message a bien ete envoye</message2>
    </etat2>    
</etat>

Packages et fonctions pour les scripts

PHP
<?php
/////////////////////////////////////////////////////////
//	Fonction qui transforme un fichier xml en tableau
/////////////////////////////////////////////////////////
function XML2Array($xml, $recursive=true){
    if(!$recursive){
        $array=simplexml_load_string($xml);
    }else{
        $array=$xml;
    }
    $newArray=array();
    $array=(array)$array;
    foreach($array as $key => $value){
        $value=(array)$value;
        if(isset($value[0])){
            $newArray[$key]=trim($value[0]);
        }else{
            $newArray[$key]=XML2Array($value,true);
        }
    }
    return $newArray ;
}

/////////////////////////////////////////////////////////
//	Fonction qui transforme une chaine en donnee xml
/////////////////////////////////////////////////////////
function string2XML($out){
    $xml='';
    $out=explode("\n", $out);
    foreach($out as $line){
        if( strstr($line, '<etat') || strstr($line, '<credit>')) {
            $xml .= trim($line)."\n";
        }
    }
// Ne pas mettre d'indentation sinon cela ne fonctionne plus
$out = <<<XML
$xml
XML;    

    $xml = simplexml_load_string($out);
    return $xml;   
} 
?>
Python

Traitement des accusés de réception

Nous vous recommandons de mettre en place une URL de traitement des retours des accusés de réception.

Retour des sms envoyés par les clients

Nous vous recommandons de mettre en place une URL de traitement des retours des sms envoyés par les clients.

Contact

Vous pouvez contacter le support technique à l'adresse suivante: support@isendpro.com

Important: Merci de préciser dans votre email votre identifiant client
Si la question concerne la remise d'un SMS, merci de rajouter les infos suivantes :
  • Numéro de téléphone (MSISDN)
  • Message
  • Date et heure d'envoi

Le support technique est joignable tous les jours de la semaine de 09h à 13h et de 14h à 17h au 04 83 66 05 10

Utilisation API



Changement d'émetteur

L'émetteur du message est par défaut un numéro court sur 5 chiffres. Il est possible de le remplacer par une chaine alpha numérique avec les contraintes suivantes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Utilisation de nom de marques uniquement si le client en est propriétaire
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message qui utilise 12 caractères

Il faut renseigner la variable emetteur lors des appels à l'API comme indiqué dans les tableaux des paramètres sur cette documentation

Remarque:
  • En France, fonctionne pour tous les opérateurs sauf NRJ
  • A l'étranger, varie suivant les destinations, merci de nous consulter pour plus d'informations

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&num=33601020304&sms=Bonjour! Bienvenue sur iSendPro!&emetteur=isendpro&tracker=test001'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/';

$ch = curl_init();
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  '33601020304',
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'  =>  'isendpro'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['tel'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Erreur specifique au numero de telephone  
        if ($value['code'.$cpt]!=0){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;
        // Envoi OK
        }else{
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;  
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;                
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      '33601020304',
    'sms':      'Bonjour! Bienvenue sur iSendPro!',
    'emetteur': 'isendpro'
}
response = requests.post(url, params)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('tel'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Erreur specifique au numero de telephone  
            if repetat['code'+cpt]!=0:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]        
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]                
import java.io.*;
import java.net.*;
import java.util.*;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter; 

public class TestDocs {

    private static HttpURLConnection con;
    

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://www.isendpro.com/cgi-bin/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304"); 
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur", "isendpro");

        StringBuilder urlParameters = new StringBuilder();
        for (Map.Entry<String,String> param : paramsTablo.entrySet()) {
            if (urlParameters.length() != 0) urlParameters.append("&");
            urlParameters.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            urlParameters.append("=");
            urlParameters.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        
        System.out.println(urlParameters);
        byte[] postData = urlParameters.toString().getBytes("UTF-8");

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////                        
            String line = content.toString();            
            try {                    
                InputSource is = new InputSource(new StringReader(line));
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(is);
                   
                if(doc.getDocumentElement().getNodeName()!="etat"){
                    // Erreur inconnue
                    System.out.println("Erreur inconnue: "+line);
                }else{
                    NodeList nList = doc.getElementsByTagName("etat");
                    for (int temp = 0; temp < nList.getLength(); temp++) {
                        Node nNode = nList.item(temp);
                                                
                        Node nodeN1 = nNode.getFirstChild();
                        if(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            if(!n1Name.contains("etat")){
                                nodeN1 = nNode;
                            }
                        }                        
                        
                        while(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            System.out.println("-----------");
                            System.out.println(n1Name);                            
                            var erreur=1;
                            
                            Node nodeN2 = nodeN1.getFirstChild();                            
                            while(nodeN2!=null){
                                String n2Name = nodeN2.getNodeName();     
                                String n2Value = nodeN2.getFirstChild().getNodeValue();     
                                System.out.println(n2Name+": "+n2Value);
                                nodeN2=nodeN2.getNextSibling();
                                
                                if(n2Name.contains("code")){
                                    if(n2Value.equals("0")){
                                        erreur=0;
                                    }
                                }                                
                            }    
                            System.out.println("erreur: "+erreur);                                             
                            if(erreur==1){
                                // Erreur dans le retour
                            }else{
                                // OK
                            }                                                     
                            nodeN1=nodeN1.getNextSibling();
                        }                             
                    }
                }            
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi d'émojis/émoticones

Il est possible d'envoyer des émojis/émoticones avec les contraintes suivantes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.

Il faut renseigner la variable ucs2 avec pour valeur 1 lors des appels à l'API comme indiqué dans les tableaux des paramètres sur cette documentation.
La liste des emjois possible est disponible ICI
Remarque:
  • A l'étranger, varie suivant les destinations, merci de nous consulter pour plus d'informations

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&num=33601020304&sms=Bonjour! Bienvenue sur iSendPro! 🙂&ucs2=1'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/';

$ch = curl_init();
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  '33601020304',
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro! 🙂',
    'ucs2'      =>  '1'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['tel'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Erreur specifique au numero de telephone  
        if ($value['code'.$cpt]!=0){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;
        // Envoi OK
        }else{
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;  
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;                
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      '33601020304',
    'sms':      'Bonjour! Bienvenue sur iSendPro! 🙂',
    'ucs2':     '1'
}
response = requests.post(url, params)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('tel'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Erreur specifique au numero de telephone  
            if repetat['code'+cpt]!=0:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]        
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]                
import java.io.*;
import java.net.*;
import java.util.*;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter; 

public class TestDocs {

    private static HttpURLConnection con;
    

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://www.isendpro.com/cgi-bin/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304"); 
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro! 🙂");
        paramsTablo.put("ucs2",     "1");

        StringBuilder urlParameters = new StringBuilder();
        for (Map.Entry<String,String> param : paramsTablo.entrySet()) {
            if (urlParameters.length() != 0) urlParameters.append("&");
            urlParameters.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            urlParameters.append("=");
            urlParameters.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        
        System.out.println(urlParameters);
        byte[] postData = urlParameters.toString().getBytes("UTF-8");

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////                        
            String line = content.toString();            
            try {                    
                InputSource is = new InputSource(new StringReader(line));
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(is);
                   
                if(doc.getDocumentElement().getNodeName()!="etat"){
                    // Erreur inconnue
                    System.out.println("Erreur inconnue: "+line);
                }else{
                    NodeList nList = doc.getElementsByTagName("etat");
                    for (int temp = 0; temp < nList.getLength(); temp++) {
                        Node nNode = nList.item(temp);
                                                
                        Node nodeN1 = nNode.getFirstChild();
                        if(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            if(!n1Name.contains("etat")){
                                nodeN1 = nNode;
                            }
                        }                        
                        
                        while(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            System.out.println("-----------");
                            System.out.println(n1Name);                            
                            var erreur=1;
                            
                            Node nodeN2 = nodeN1.getFirstChild();                            
                            while(nodeN2!=null){
                                String n2Name = nodeN2.getNodeName();     
                                String n2Value = nodeN2.getFirstChild().getNodeValue();     
                                System.out.println(n2Name+": "+n2Value);
                                nodeN2=nodeN2.getNextSibling();
                                
                                if(n2Name.contains("code")){
                                    if(n2Value.equals("0")){
                                        erreur=0;
                                    }
                                }                                
                            }    
                            System.out.println("erreur: "+erreur);                                             
                            if(erreur==1){
                                // Erreur dans le retour
                            }else{
                                // OK
                            }                                                     
                            nodeN1=nodeN1.getNextSibling();
                        }                             
                    }
                }            
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi à l'international

Les numéros de téléphones sont attendus au format international avec l'indicatif pays sans le "+" au début.
Ex: Pour la Belgique, l'indicatif international est +32
Si le numéro de téléphone est 0601020304 alors pour la mise au format international, il faut supprimer le "0" de début et ajouter l'indicatif pays sans le "+" au début
Le numéro devenant alors 32601020304

Certaines destinations peuvent avoir des contraintes particulières (émetteurs acceptés, smslong, etc), merci de nous consulter pour plus d'informations


Envoi de SMS unitaire

Envoi d'un message à 1 seul destinataire par requete

Appel

https://www.isendpro.com/cgi-bin/
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
sms String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
emetteur String Non Emetteur du message
Par défaut, un numéro court sur 5 chiffres
Ex: 36007
Contraintes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message et augmente de 12 caractères la longueur globale
tracker String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exact est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
Nombre de SMS concaténés Nombre de caractères SANS
modification émetteur
Nombre de caractères AVEC
modification émetteur
1 160 148
2 306 294
3 459 447
4 612 600
5 765 753
6 918 906
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
gmt_zone Fuseau horaire Non A renseigner, en cas d'envoi différé sur un autre fuseau horaire que celui par défaut (GMT+1 Europe/Brussels)
Ex: Pour un envoi vers des destinataires en Argentine à l'horaire local et non celui de la France, la valeur de l'argument gmt_zone serait America/Havana
ucs2 Number Non Permet l'utilisation de caractères en alphabet non latin (russe, chinois, arabe, etc) et/ou avec des émojis
Contraintes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.
Utiliser la valeur 1
numAzur Number Non Dans le cadre d'une utilisation combinée entre SMS Azur et l'API, il est possible de forcer le numéro d'expéditeur à être le même que celui utilisé sur SMS Azur
Utiliser la valeur 1

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>0</code>
    <tel>33601020304</tel>
    <message>Votre message a bien ete envoye</message>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>6</code>
    <message>Vous devez saisir un numéro de téléphone</message>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&num=33601020304&sms=Bonjour! Bienvenue sur iSendPro!&emetteur=isendpro&tracker=test001'
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/';

$ch = curl_init();
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num'       =>  '33601020304',
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'  =>  'isendpro'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['tel'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Erreur specifique au numero de telephone  
        if ($value['code'.$cpt]!=0){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;
        // Envoi OK
        }else{
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;  
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;                
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num':      '33601020304',
    'sms':      'Bonjour! Bienvenue sur iSendPro!',
    'emetteur': 'isendpro'
}
response = requests.post(url, params)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('tel'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Erreur specifique au numero de telephone  
            if repetat['code'+cpt]!=0:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]        
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]                
import java.io.*;
import java.net.*;
import java.util.*;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter; 

public class TestDocs {

    private static HttpURLConnection con;
    

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://www.isendpro.com/cgi-bin/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num",      "33601020304"); 
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur", "isendpro");

        StringBuilder urlParameters = new StringBuilder();
        for (Map.Entry<String,String> param : paramsTablo.entrySet()) {
            if (urlParameters.length() != 0) urlParameters.append("&");
            urlParameters.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            urlParameters.append("=");
            urlParameters.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        
        System.out.println(urlParameters);
        byte[] postData = urlParameters.toString().getBytes("UTF-8");

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////                        
            String line = content.toString();            
            try {                    
                InputSource is = new InputSource(new StringReader(line));
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(is);
                   
                if(doc.getDocumentElement().getNodeName()!="etat"){
                    // Erreur inconnue
                    System.out.println("Erreur inconnue: "+line);
                }else{
                    NodeList nList = doc.getElementsByTagName("etat");
                    for (int temp = 0; temp < nList.getLength(); temp++) {
                        Node nNode = nList.item(temp);
                                                
                        Node nodeN1 = nNode.getFirstChild();
                        if(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            if(!n1Name.contains("etat")){
                                nodeN1 = nNode;
                            }
                        }                        
                        
                        while(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            System.out.println("-----------");
                            System.out.println(n1Name);                            
                            var erreur=1;
                            
                            Node nodeN2 = nodeN1.getFirstChild();                            
                            while(nodeN2!=null){
                                String n2Name = nodeN2.getNodeName();     
                                String n2Value = nodeN2.getFirstChild().getNodeValue();     
                                System.out.println(n2Name+": "+n2Value);
                                nodeN2=nodeN2.getNextSibling();
                                
                                if(n2Name.contains("code")){
                                    if(n2Value.equals("0")){
                                        erreur=0;
                                    }
                                }                                
                            }    
                            System.out.println("erreur: "+erreur);                                             
                            if(erreur==1){
                                // Erreur dans le retour
                            }else{
                                // OK
                            }                                                     
                            nodeN1=nodeN1.getNextSibling();
                        }                             
                    }
                }            
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi de SMS multiples

Envoi d'un message à plusieurs destinataires par requête via une liste de numéros de téléphone avec un maximum de 500 numéros de téléphone par requêtebr> Cette solution permet d’envoyer un message jusqu’à 500 destinataires différents par requête, permettant ainsi une augmentation de la vitesse des envois.
Les numéros de téléphone sont placés dans des variables numX où X est un entier allant de 1 à 500 au maximum.
Si le message est identique pour tous les destinataires, il suffit de le renseigner une seule fois dans la variable sms.
Si le message est différent pour chaque destinataire alors ils sont placés dans des variables smsX est un entier allant de 1 à 500 au maximum.
Dans ce cas le message smsX sera envoyé au destinataire numX.

Appel

https://www.isendpro.com/cgi-bin/
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
num[X] String Oui Numéro de téléphone du destinataire
Au format international sans le +
Ex: 33601020304
sms[X] String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
emetteur String Non Emetteur du message
Par défaut, un numéro court sur 5 chiffres
Ex: 36007
Contraintes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message et augmente de 12 caractères la longueur globale
tracker[X] String Non Généré par le client
Renvoyé en paramètre des urls pour les retours des accusés de réception et les retours des sms réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exactes est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
Nombre de SMS concaténés Nombre de caractères SANS
modification émetteur
Nombre de caractères AVEC
modification émetteur
1 160 148
2 306 294
3 459 447
4 612 600
5 765 753
6 918 906
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
gmt_zone Fuseau horaire Non A renseigner, en cas d'envoi différé sur un autre fuseau horaire que celui par défaut (GMT+1 Europe/Brussels)
Ex: Pour un envoi vers des destinataires en Argentine à l'horaire local et non celui de la France, la valeur de l'argument gmt_zone serait America/Havana
ucs2 Number Non Permet l'utilisation de caractères en alphabet non latin (russe, chinois, arabe, etc) et/ou avec des émojis
Contraintes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.
Utiliser la valeur 1
numAzur Number Non Dans le cadre d'une utilisation combinée entre SMS Azur et l'API, il est possible de forcer le numéro d'expéditeur à être le même que celui utilisé sur SMS Azur
Utiliser la valeur 1

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
tel String Numéro de téléphone associé au code retour
message String Libellé correspondant au tableau des erreurs
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <etat1>
        <code1>0</code1>
        <tel1>33601020304</tel1>
        <message1>Votre message a bien ete envoye</message1>
    </etat1>
    <etat2>
        <code2>0</code2>
        <tel2>33601020304</tel2>
        <message2>Votre message a bien ete envoye</message2>
    </etat2>        
</etat>     
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <etat1>
        <code1>21</code1>
        <tel1>33601020304</tel1>
        <message1>Le numéro de téléphone n'est pas attribué!</message1>
    </etat1>
    <etat2>
        <code2>11</code2>
        <tel2>33601020304</tel2>
        <message2>Le numero de telephone est dans la liste noire!</message2>
    </etat2>        
</etat> 

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&num1=33601020304&num2=33601020305&num3=33601020306&sms=Bonjour! Bienvenue sur iSendPro!&emetteur=isendpro'   
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/';

$ch = curl_init();
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'num1'       => '33601020304',  
    'num2'       => '33601020305',      
    'sms'       =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'  =>  'isendpro'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['tel'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Erreur specifique au numero de telephone  
        if ($value['code'.$cpt]!=0){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;
        // Envoi OK
        }else{
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;  
            echo 'tel: '.$value['tel'.$cpt];                
            echo $sautligne;                
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/'
params = {
    'keyid':    'a296464ce012b8ab710a',
    'num1':     '33601020304',  
    'num2':     '33601020305', 
    'sms':      'Bonjour! Bienvenue sur iSendPro!',
    'emetteur': 'isendpro'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('tel'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Erreur specifique au numero de telephone  
            if repetat['code'+cpt]!=0:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]        
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'Tel: '+repetat['tel'+cpt]   
import java.io.*;
import java.net.*;
import java.util.*;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter; 

public class TestDocs {

    private static HttpURLConnection con;
    

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://www.isendpro.com/cgi-bin/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",    "a296464ce012b8ab710a");
        paramsTablo.put("num1",     "33601020304");
        paramsTablo.put("num2",     "33601020305");
        paramsTablo.put("num3",     "33601020306"); 
        paramsTablo.put("sms",      "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur", "isendpro");

        StringBuilder urlParameters = new StringBuilder();
        for (Map.Entry<String,String> param : paramsTablo.entrySet()) {
            if (urlParameters.length() != 0) urlParameters.append("&");
            urlParameters.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            urlParameters.append("=");
            urlParameters.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        
        System.out.println(urlParameters);
        byte[] postData = urlParameters.toString().getBytes("UTF-8");

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////                        
            String line = content.toString();            
            try {                    
                InputSource is = new InputSource(new StringReader(line));
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(is);
                   
                if(doc.getDocumentElement().getNodeName()!="etat"){
                    // Erreur inconnue
                    System.out.println("Erreur inconnue: "+line);
                }else{
                    NodeList nList = doc.getElementsByTagName("etat");
                    for (int temp = 0; temp < nList.getLength(); temp++) {
                        Node nNode = nList.item(temp);
                                                
                        Node nodeN1 = nNode.getFirstChild();
                        if(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            if(!n1Name.contains("etat")){
                                nodeN1 = nNode;
                            }
                        }                        
                        
                        while(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            System.out.println("-----------");
                            System.out.println(n1Name);                            
                            var erreur=1;
                            
                            Node nodeN2 = nodeN1.getFirstChild();                            
                            while(nodeN2!=null){
                                String n2Name = nodeN2.getNodeName();     
                                String n2Value = nodeN2.getFirstChild().getNodeValue();     
                                System.out.println(n2Name+": "+n2Value);
                                nodeN2=nodeN2.getNextSibling();
                                
                                if(n2Name.contains("code")){
                                    if(n2Value.equals("0")){
                                        erreur=0;
                                    }
                                }                                
                            }    
                            System.out.println("erreur: "+erreur);                                             
                            if(erreur==1){
                                // Erreur dans le retour
                            }else{
                                // OK
                            }                                                     
                            nodeN1=nodeN1.getNextSibling();
                        }                             
                    }
                }            
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Envoi de SMS multiples à un répertoire

Envoi d'un message à plusieurs destinataires par requête via un répertoire de numéros de téléphone

Appel

https://www.isendpro.com/cgi-bin/
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
repertoireId String Oui Identifiant du répertoire cible
sms String Oui Message envoyé au destinataire
1 SMS peut contenir jusqu'à 160 caractères
Possibilité d'envoyer des messages plus long (jusqu'à 6 SMS concaténés) pour un total de 918 caractères (6 x 153)
(7 caractères étant réserves pour des entêtes techniques)
Le cout unitaire sera alors multiplié par le nombre de SMS correspondants
Cf Argument smslong
emetteur String Non Emetteur du message
Par défaut, un numéro court sur 5 chiffres
Ex: 36007
Contraintes:
  • Entre 4 et 11 caractères
  • Chiffre entre 0 et 9
  • Uniquement lettre alphabet français sans accent
  • Pas de caractères spéciaux
  • Pas uniquement des chiffres
  • Sauf si nostop=1, ajout automatique de la mention STOP XXXXX en fin de message et augmente de 12 caractères la longueur globale
tracker String Non Argument généré par le client afin d'associer les accusés de réception ou les réponses
Longueur max de 50 caractères
Ex: order-ab78pq9
smslong Number Non Argument indiquant le nombre de SMS concaténés
Si le nombre de SMS exactes est connu alors indiquer ce nombre
Si le nombre calculé par l'API diffère alors un message d'erreur sera retourné (code 32)
Pour éviter ce controle et autoriser les messages sur plus de 1 SMS, utiliser la valeur 999
nostop Number Non Argument pour ne pas afficher automatiquement la mention STOP SMS en fin de message
Utiliser la valeur 1
date_envoi Date au format
YYYY-MM-DD hh:mm
Non Date à laquelle le message sera envoyé
Envoi immédiat si non renseigné
gmt_zone Fuseau horaire Non A renseigner, en cas d'envoi différé sur un autre fuseau horaire que celui par défaut (Europe/London)
ucs2 Number Non Permet l'utilisation de caractères en alphabet non latin (russe, chinois, arabe, etc) et/ou avec des émojis
Contraintes:
  • Requête encodée au format UTF-8
  • 1 emoji comptera pour 2 caractères
  • La longueur max passe de 160 à 70 caractères par SMS (67 caractères si SMS Long)
  • Certains opérateurs ne supportent pas l'UCS2 (par exemple BOUYGUES en France), les caractères non supportés peuvent alors être supprimés du message.
Utiliser la valeur 1
numAzur Number Non Dans le cadre d'une utilisation combinée entre SMS Azur et l'API, il est possible de forcer le numéro d'expéditeur à être le même que celui utilisé sur SMS Azur
Utiliser la valeur 1

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
repertoireId String Identifiant du répertoire cible
message String Libellé correspondant au tableau des erreurs
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>0</code>
    <message>Votre message a bien ete envoye</message>
    <repertoireId>123456789</repertoireId>
</etat>
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>108</code>
    <message>Cet identifiant ne correspond a aucun repertoire!</message>
    <repertoireId>123456789</repertoireId>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&repertoireId=123456789&sms=Bonjour! Bienvenue sur iSendPro!&emetteur=isendpro'      
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/';

$ch = curl_init();
$params = array(
    'keyid'         =>  'a296464ce012b8ab710a',
    'repertoireId'  =>  '123456789',
    'sms'           =>  'Bonjour! Bienvenue sur iSendPro!',
    'emetteur'      =>  'isendpro'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['repertoireId'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Erreur specifique au repertoire
        if ($value['code'.$cpt]!=0){
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;
            echo 'repertoireId: '.$value['repertoireId'.$cpt];                
            echo $sautligne;
        // Envoi OK
        }else{
            echo 'Code: '.$value['code'.$cpt];
            echo $sautligne;
            echo 'message: '.$value['message'.$cpt];
            echo $sautligne;  
            echo 'repertoireId: '.$value['repertoireId'.$cpt];                
            echo $sautligne;                
        }
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'repertoireId': '123456789',
    'sms':          'Bonjour! Bienvenue sur iSendPro!',
    'emetteur':     'isendpro'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('repertoireId'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Erreur specifique au repertoire
            if repetat['code'+cpt]!=0:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'repertoireId: '+repetat['repertoireId'+cpt]        
            # Envoi OK
            else:
                print 'Code: '+repetat['code'+cpt]
                print 'Message: '+repetat['message'+cpt]
                print 'repertoireId: '+repetat['repertoireId'+cpt]   
                
import java.io.*;
import java.net.*;
import java.util.*;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter; 

public class TestDocs {

    private static HttpURLConnection con;
    

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://www.isendpro.com/cgi-bin/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",        "a296464ce012b8ab710a");
        paramsTablo.put("repertoireId", "123456789"); 
        paramsTablo.put("sms",          "Bonjour! Bienvenue sur iSendPro!");
        paramsTablo.put("emetteur",     "isendpro");

        StringBuilder urlParameters = new StringBuilder();
        for (Map.Entry<String,String> param : paramsTablo.entrySet()) {
            if (urlParameters.length() != 0) urlParameters.append("&");
            urlParameters.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            urlParameters.append("=");
            urlParameters.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        
        System.out.println(urlParameters);
        byte[] postData = urlParameters.toString().getBytes("UTF-8");

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////                        
            String line = content.toString();            
            try {                    
                InputSource is = new InputSource(new StringReader(line));
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(is);
                   
                if(doc.getDocumentElement().getNodeName()!="etat"){
                    // Erreur inconnue
                    System.out.println("Erreur inconnue: "+line);
                }else{
                    NodeList nList = doc.getElementsByTagName("etat");
                    for (int temp = 0; temp < nList.getLength(); temp++) {
                        Node nNode = nList.item(temp);
                                                
                        Node nodeN1 = nNode.getFirstChild();
                        if(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            if(!n1Name.contains("etat")){
                                nodeN1 = nNode;
                            }
                        }                        
                        
                        while(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            System.out.println("-----------");
                            System.out.println(n1Name);                            
                            var erreur=1;
                            
                            Node nodeN2 = nodeN1.getFirstChild();                            
                            while(nodeN2!=null){
                                String n2Name = nodeN2.getNodeName();     
                                String n2Value = nodeN2.getFirstChild().getNodeValue();     
                                System.out.println(n2Name+": "+n2Value);
                                nodeN2=nodeN2.getNextSibling();
                                
                                if(n2Name.contains("code")){
                                    if(n2Value.equals("0")){
                                        erreur=0;
                                    }
                                }                                
                            }    
                            System.out.println("erreur: "+erreur);                                             
                            if(erreur==1){
                                // Erreur dans le retour
                            }else{
                                // OK
                            }                                                     
                            nodeN1=nodeN1.getNextSibling();
                        }                             
                    }
                }            
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Création de lien court

Création d'un lien court à partir d'une url longue
Remarque: Ces liens courts ont une durée de vie de 1 mois à compter de leur création

Appel

https://www.isendpro.com/cgi-bin/
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
shortlink String Oui Url à raccourcir

Réponse

Paramètre Type Détails
code Number Code correspondant au tableau des erreurs
message String Libellé correspondant au tableau des erreurs (cf Annexes)
shortlink String Url raccourcie
Format: www.sms.ht/[XXXX]
Ex: www.sms.ht/6gHw
<?xml version="1.0" encoding="ISO-8859-1"?>
<etat>
    <code>250</code>
    <message>Le lien court a ete genere</message>
    <shortlink>www.sms.ht/6X8Y</shortlink>
</etat>

Exemples de scripts

curl -X POST \
 'https://www.isendpro.com/cgi-bin/' \
 -H 'cache-control: no-cache' \
 -d 'keyid=a296464ce012b8ab710a&shortlink=https://www.isendpro.com/'         
<?php
////////////////////////////////////////////////////////////////////////////////////
// Envoi requete
////////////////////////////////////////////////////////////////////////////////////
$url = 'https://www.isendpro.com/cgi-bin/';

$ch = curl_init();
$params = array(
    'keyid'     =>  'a296464ce012b8ab710a',
    'shortlink' =>  'https://www.isendpro.com/'
);
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => array('Content-type: multipart/form-data'),
    CURLOPT_RETURNTRANSFER => TRUE,   
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $params    
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
curl_close($ch);

////////////////////////////////////////////////////////////////////////////////////
// Traitement du retour
////////////////////////////////////////////////////////////////////////////////////
$sautligne="\n"; // Si utilisation script
//$sautligne="<br>"; // Si utilisation html
   
$xml = string2XML($out);
$repetatList=XML2Array($xml);
if(!array_key_exists('etat1', $repetatList)){
    $repetatList=array($repetatList);
}

foreach($repetatList as $key => $value){    
    $cpt='';
    if($key!='0'){
        $cpt=str_replace('etat', '', $key);
    }
    
    // Erreur generale
    if (!isset($value['shortlink'.$cpt])){
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'message: '.$value['message'];
        echo $sautligne;       
        break;
    }else{
        echo '-----------';
        echo $sautligne;
        echo 'Data '.$cpt;
        echo $sautligne;    
        // Infos de retour
        echo 'Code: '.$value['code'];
        echo $sautligne;
        echo 'Message: '.$value['message'];
        echo $sautligne;
        echo 'shortlink: '.$value['shortlink'];
    }
}
?>
####################################################################################
#- Envoi requete
####################################################################################
import requests
import xmltodict
import types

url = 'https://www.isendpro.com/cgi-bin/'
params = {
    'keyid':        'a296464ce012b8ab710a',
    'shortlink':    'https://www.isendpro.com/'
}
response = requests.post(url, params)
print(response.text)

####################################################################################
#- Traitement du retour
####################################################################################
repetat=xmltodict.parse(response.text)
if not repetat.has_key('etat'):
    # Erreur inconnue
    print 'Erreur inconnue: '+repetat
else:
    #repetat=repetat['etat']
    repetatList=repetat['etat']    
    if not repetatList.has_key('etat1'):
        repetatList={'0':repetat['etat']}

    keysList=repetatList.keys()
    keysList.sort()
    for key in keysList:
        repetat=repetatList[key]
        cpt=''
        if key!='0':
            cpt=key.replace('etat','')          
        # Erreur generale
        if not repetat.has_key('shortlink'+cpt):
            print 'Code: '+repetat['code']
            print 'Message: '+repetat['message']
        else:
            print '-----------'    
            print 'Data '+str(key)          
            # Infos du retour
            print 'Code: '+repetat['code'+cpt]
            print 'Message: '+repetat['message'+cpt]
            print 'shortlink: '+repetat['shortlink'+cpt]   
import java.io.*;
import java.net.*;
import java.util.*;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.PrintWriter; 

public class TestDocs {

    private static HttpURLConnection con;
    

    public static void main(String[] args) throws IOException {
        
        ////////////////////////////////////////////////////////////////////////////////////
        // Envoi requete
        ////////////////////////////////////////////////////////////////////////////////////
        var url = "https://www.isendpro.com/cgi-bin/";
        
        Map<String, String> paramsTablo = new HashMap<>();
        paramsTablo.put("keyid",        "a296464ce012b8ab710a");
        paramsTablo.put("shortlink",    "https://www.isendpro.com/");

        StringBuilder urlParameters = new StringBuilder();
        for (Map.Entry<String,String> param : paramsTablo.entrySet()) {
            if (urlParameters.length() != 0) urlParameters.append("&");
            urlParameters.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            urlParameters.append("=");
            urlParameters.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        
        System.out.println(urlParameters);
        byte[] postData = urlParameters.toString().getBytes("UTF-8");

        try {
            var myurl = new URL(url);
            con = (HttpURLConnection) myurl.openConnection();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            try (var wr = new DataOutputStream(con.getOutputStream())) {
                wr.write(postData);
            }
            
            StringBuilder content;            
            InputStream ret;
            if (con.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
                ret = con.getInputStream();
            } else {
                ret = con.getErrorStream();
            }            
            try (var br = new BufferedReader(new InputStreamReader(ret))) {
                String line;
                content = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }
            }
            System.out.println(content.toString());
            
            ////////////////////////////////////////////////////////////////////////////////////
            // Traitement du retour
            ////////////////////////////////////////////////////////////////////////////////////                        
            String line = content.toString();            
            try {                    
                InputSource is = new InputSource(new StringReader(line));
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(is);
                   
                if(doc.getDocumentElement().getNodeName()!="etat"){
                    // Erreur inconnue
                    System.out.println("Erreur inconnue: "+line);
                }else{
                    NodeList nList = doc.getElementsByTagName("etat");
                    for (int temp = 0; temp < nList.getLength(); temp++) {
                        Node nNode = nList.item(temp);
                                                
                        Node nodeN1 = nNode.getFirstChild();
                        if(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            if(!n1Name.contains("etat")){
                                nodeN1 = nNode;
                            }
                        }                        
                        
                        while(nodeN1!=null){
                            String n1Name = nodeN1.getNodeName();
                            System.out.println("-----------");
                            System.out.println(n1Name);                            
                            var erreur=1;
                            
                            Node nodeN2 = nodeN1.getFirstChild();                            
                            while(nodeN2!=null){
                                String n2Name = nodeN2.getNodeName();     
                                String n2Value = nodeN2.getFirstChild().getNodeValue();     
                                System.out.println(n2Name+": "+n2Value);
                                nodeN2=nodeN2.getNextSibling();
                                
                                if(n2Name.contains("code")){
                                    if(n2Value.equals("0")){
                                        erreur=0;
                                    }
                                }                                
                            }    
                            System.out.println("erreur: "+erreur);                                             
                            if(erreur==1){
                                // Erreur dans le retour
                            }else{
                                // OK
                            }                                                     
                            nodeN1=nodeN1.getNextSibling();
                        }                             
                    }
                }            
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }         
}


Rapport de campagne CSV

Récupération de la liste des envois sur une période donnée dans un fichier .csv

Appel

https://www.isendpro.com/cgi-bin/
Paramètre Type Obligatoire Détails
keyid String Oui Chaine de caractère unique identifiant votre compte
Ex: a296464ce012b8ab710a
rapportCampagne Number Oui Utiliser la valeur suivante:
  • 1: Détails par envoi
  • 2: Regroupement par jour et par émetteur
date_deb Date au format
YYYY-MM-DD hh:mm
Oui Date de début des envois de la sélection
date_fin Date au format
YYYY-MM-DD hh:mm
Oui Date de fin des envois de la sélection

Réponse

La réponse est un fichier CSV zippé avec les colonnes suivantes suivant la valeur de l'argument rapportCampagne

Exemples de scripts

Paramètre Type Détails
Date d'envoi date Date d'envoi du SMS
Emetteur String Emeteur du message
Destinataire String Numéro de téléphone destinataire du message
Message String Message envoyé
Information complémentaire