Clic & Surf V1 API - Documentation
Présentation
L’API Clic & Surf V1 permet de mettre à disposition des partenaires certaines données d’usage provenant des offres Wifi contenues dans Clic & Surf selon des droits et autorisations définis par les administrateurs. Cette mise à disposition s’effectue aux formats JSON. L’API offre un système complet, flexible et simple d’utilisation pour la récupération des données de votre offre WiFi.
Activation de l’API
Votre API doit être activée dans votre manager https://hotspot.2isr.fr/v4/ > Statistiques & Données > Gestion de l’API
Sécurité de l’API
Votre adresse IP doit être enregistrée dans votre manager https://hotspot.2isr.fr/v4/ > Statistiques & Données > Gestion de l’API
Format des requêtes
Toutes les données sont transmises en UTF8
Composition des requêtes
Les paramètres suivants sont nécessaires dans l’ensemble des requêtes :
Les paramètres compte_hotspot et compte_manager sont indépendants. Seul l’un d’eux est obligatoire. Si les deux paramètres sont renseignés le paramètre compte_manager est prioritaire.
| Nom | Valeur | Type | Description |
|---|---|---|---|
| cle | 379j4ya8gdepj8xntgsgesxnf | POST/GET | Valeur de votre clé API disponible sur hotspot.2isr.fr |
| compte_hotspot | XXX00-000 | POST/GET | Identifiant du compte hotspot de la clé |
| compte_manager | FLOTT-000 | POST/GET | Identifiant du compte manager de la clé |
| résultat | count | POST/GET | Vide par défaut, si envoyé sur “count” le résultat ne renvoi que le count sans tableau de résultat |
Exemple d’une requête GET pour un compte API hotspot : https://api-hotspot.2isr.fr/v1/<fonction>/?cle=valeur_cle&compte_hotspot=XXX00-000
Exemple d’une requête GET pour un compte API manager : https://api-hotspot.2isr.fr/v1/<fonction>/?cle=valeur_cle&compte_manager=FLOTT-000
Les paramètres peuvent également tous être utilisés avec la méthode POST
Contextes des données
Il est utilisé la notion de contexte des données. Chaque donnée peut-être exportée suivant les contextes suivants :
hotspot : les données sont extraites d’un hotspot.
manager : les données sont extraites de tous les hotspots du compte manager.
groupe : les données sont extraites de tous les hotspots du groupe territorial dont le hotspot est le parent.
Champs libres du visiteur
L’objet infos_complementaires porte les champs libres saisis par le visiteur sur le portail Wi-Fi.
Depuis le 09/2026, cet objet expose quatre champs de profil supplémentaires (centres_interet, type_residant, situation_familiale, tranche_age) ainsi que chambre, jusque-là omis de cette documentation. Les champs de profil sont renvoyés en libellés lisibles et non plus sous leur forme technique. Aucune clé de infos_complementaires n’est retirée ni renommée ; en revanche la propriété champ_libre de la ligne, qui portait la fiche brute non masquée en doublon, n’est plus renvoyée.
Les données personnelles de cet objet sont par ailleurs masquées selon les règles RGPD du compte, comme elles le sont déjà dans l’export CSV. La forme du JSON ne change pas : toutes les clés restent présentes, seules les valeurs de prenom, nom, telephone et email peuvent désormais être masquées.
Les données personnelles sont masquées. prenom, nom, telephone et email suivent exactement les mêmes règles de masquage RGPD que les champs de premier niveau de la ligne, et que l’export CSV : le masquage ne s’applique pas si le visiteur a accepté l’optin, si la connexion est antérieure au 25/05/2018, ou si la protection est désactivée dans la configuration RGPD du compte. Si vous alimentez un CRM à partir de cette méthode et que vous avez besoin de l’identité en clair, c’est la configuration RGPD du compte qui le détermine.
L’API renvoie l’ensemble des champs libres, y compris ceux que le hotspot ne collecte pas sur son portail : le profil du visiteur est mutualisé entre hotspots par son adresse e-mail, une valeur saisie sur un autre hotspot est donc rattachée à la connexion. Les interfaces de la console, elles, ne restituent que les champs configurés sur le hotspot.
| Nom | Type | Description |
|---|---|---|
| id | String | Identifiant technique de la fiche de champs libres |
| last_update | String | Date de dernière mise à jour de la fiche |
| prenom, nom | String | Masqués en {{ PROTECTED RGDP}} le cas échéant |
| annee, sexe | String | Année de naissance, sexe |
| telephone | String | Masqué en 06XXXXXXXX le cas échéant |
| String | Masqué en abcxxxxxxx@domaine.fr le cas échéant |
|
| code_postal, pays, chambre | String | Code postal, pays, numéro de chambre |
| centres_interet | String | Centres d’intérêt, en libellés séparés par des virgules |
| type_residant | String | Type de résident, en libellé |
| situation_familiale | String | Situation familiale, en libellé |
| tranche_age | String | Tranche d’âge, en libellé (ex. 25-34 ans, 65 ans et plus) |
Réponses HTTP
requête correctement exécutée
| Code | Response | Description |
|---|---|---|
| 200 | OK |
La requête à correctement été exécutée. |
| 201 | OK |
La requête à correctement été exécutée et la modification prise en compte. |
| 204 | OK |
La requête à correctement été exécutée mais ne retourne aucune donnée. |
requête en erreur
| Code | Response | Description |
|---|---|---|
| 400 | Bad request |
La requête n’est pas correctement formée. |
| 401 | Unauthorized |
La requête n’est pas autorisée, votre clé n’est pas valide. |
| 403 | Forbidden |
L’accès à l’API n’est pas autorisé avec votre adresse IP. |
| 404 | Not found |
La méthode n’est pas disponible. |
| 405 | Method not allowed |
La méthode n’est pas autorisée. |
| 406 | Forbidden |
L’accès à l’API n’est pas autorisé du fait que les dernières conditions d’utilisation n’ont pas été acceptées. |
Erreurs de l’application
| Code | Response | Description |
|---|---|---|
| 500 | Internal server error |
Erreur interne, la requête est valide, mais l’API n’est pas en mesure de la traiter. |
| 503 | Service unavailable |
Le service API est temporairement indisponible. |
Modifications récentes
-
07/2016 : Création de l’API
-
09/2016 : Ajout des méthodes Clic & Surf :
- liste_users_online
- liste_hotspot
- liste_ap
- liste_logs
-
12/2017 : Ajout de la méthode :
- liste_groupe
-
03/2018 : Modification de la méthode :
- liste_logs : ajout valeur “optin” portail RGDP
-
09/2026 : Modification des méthodes :
- liste_users_online et liste_logs :
infos_complementairesexpose 4 nouveaux champs de profil (“centres_interet”, “type_residant”, “situation_familiale”, “tranche_age”) ainsi que le champ “chambre”, jusque-là omis de la documentation. - liste_users_online et liste_logs :
infos_complementairesapplique désormais le masquage RGPD du compte sur “prenom”, “nom”, “telephone” et “email”, selon les mêmes règles que l’export CSV (voir « Champs libres du visiteur »). Les champs de profil sont par ailleurs renvoyés en libellés lisibles et non plus sous leur forme technique. L’ensemble des champs continue d’être renvoyé. - liste_logs : la propriété
champ_libren’est plus renvoyée. Elle portait la fiche brute de champs libres, sans masquage RGPD, en doublon deinfos_complementaires. Changement non rétrocompatible si votre intégration la lisait : basculez surinfos_complementaires.
- liste_users_online et liste_logs :
Groupe Méthodes Clic & Surf
Utiliser ces méthodes pour extraire les informations souhaitées de votre hotspot Clic & Surf :
Resource Group ¶
liste_hotspot ¶
liste_hotspotGET/liste_hotspot/
Liste l’ensemble des hotspots et leurs configurations suivant le contexte.
Example URI
- contexte
String(required) Example: hotspotLe contexte peut-être : hotspot/manager/groupe.
- hotspot
String(required) Example: XXX00-000hotspot parent dans le contexte groupe.
requireduniquement dans le contexte groupe
200Headers
Content-Type: application/json
X-Request-ID: f72fc914
X-Response-Time: 2msBody
{
"code": 200,
"message": "",
"header": {
"date_export": "2016-09-21 17:11:49",
"fournisseur": "2ISR",
"API": "1",
"remote_addr": "",
"type_donnees": "liste_hotspot",
"contexte": "hotspot",
"nb_donnees": "1",
"time": "2"
},
"rows": [{
"id": "18"
"hotspot": "SJL64-005"
"hotspot_actif": "1"
"type_auth": "cgu"
"cgu_email": "1"
"redirection": "www.xxxxxxx.com"
"network": "10.x.x.x"
"masque": "26"
"ip_wan_operateur": "92.103.92.172"
"ssid": "SSID"
"description": "XXXXXXXXXXXXXX"
"street_name": "xx bd de la mer"
"postal_code": "49300"
"city": "CHOLET"
"province": "49"
"latitude": "41.384507"
"longitude": "-0.660716"
}]
}liste_groupe ¶
liste_groupeGET/liste_groupe/
Liste l’ensemble des groupes territoriaux du compte utilisé dans la requête.
Example URI
200Headers
Content-Type: application/json
X-Request-ID: f72fc914
X-Response-Time: 2msBody
{
"code": 200,
"message": "",
"header": {
"date_export": "2017-12-19 17:51:34",
"fournisseur": "2ISR",
"API": "1",
"remote_addr": "::1",
"type_donnees": "liste_groupe",
"contexte": "manager",
"nb_donnees": 1,
"time": 19
},
"rows": [
{
"id": "1702",
"hotspot_parent": "XXX00-000",
"description_groupe": "Mon groupe territorial"
}
]
}liste_ap ¶
liste_apGET/liste_ap/
Liste l’ensemble des points d’accès d’un hotspot
Example URI
- hotspot
String(required) Example: XXX00-000hotspot dont les données seront extraites, implicite lors de la connexion avec un compte hotspot.
200Headers
Content-Type: application/json
X-Request-ID: f72fc914
X-Response-Time: 2msBody
{
"code": 200,
"message": "",
"header": {
"date_export": "2016-09-21 17:11:49",
"fournisseur": "2ISR",
"API": "1",
"remote_addr": "",
"type_donnees": "liste_ap",
"contexte": "hotspot",
"nb_donnees": "1",
"time": "2"
},
"rows": [
{
"id": "3968",
"sn": "XXXXXXXXXXXX",
"mac": "XX:XX:XX:XX:XX:XX",
"host": "XXX00-001-1",
"nom_objet": "PARUCKUSRXXX",
"ip": "XX.XX.XX.XX",
"latitude": "0.000000",
"longitude": "0.000000"
}
]
}liste_users_online ¶
liste_users_onlineGET/liste_users_online/
Liste l’ensemble des utilisateurs en ligne suivant le contexte.
Example URI
- contexte
String(required) Example: hotspotLe contexte peut-être : hotspot/manager/groupe.
- hotspot
String(required) Example: XXX00-000hotspot dont les données seront extraites, hotspot Parent dans le contexte groupe, ignoré dans le contexte manager .
200Headers
Content-Type: application/json
X-Request-ID: f72fc614
X-Response-Time: 120msBody
{
"code": 200,
"message": "",
"header": {
"date_export": "2016-09-21 17:11:49",
"fournisseur": "2ISR",
"API": "1",
"remote_addr": "",
"type_donnees": "liste_users_online",
"contexte": "hotspot",
"nb_donnees": "1",
"time": "120"
},
"rows": [
{
"token_id": "d4d968efef2e5fc67fc2a44e4a0f39e7",
"timestamp_in": "2016-05-21 23:52:58.052457",
"timestamp_out": "2016-05-22 01:56:01.962058",
"user_login": "XXXXXXXXXXXXX",
"email": "xxxx@xxxx.xx",
"user_ip": "XX.XX.XX.XX",
"user_mac": "XX:XX:XX:XX:XX:XX",
"user_agent": "Mozilla/5.0 (Linux; Android 4.2.2; GT-I9192 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36",
"incoming": 85694239,
"outgoing": 10977787,
"email_verifier": 1,
"hotspot": "XXX00-000",
"duree": "1542",
"fastpass": null,
"info_client": null,
"autoconnect": "oui",
"logout_reason": "4",
"lang_sys": "fr-FR",
"lang_portail": "fr",
"type_auth": "ConnectorFB",
"ap_mac": "XX:XX:XX:XX:XX:XX",
"optin": "oui",
"platform": "Defaut",
"browser": "Defaut",
"ismobiledevice": "Non",
"verifie_txt": "Oui",
"ConnectorFB": {
"FB_ID": "XXXXXXXXXXXXXX",
"FB_Email": "xxxx@xxxx.xx",
"FB_LastName": "XXXX",
"FB_FirstName": "XXXXXXX",
"FB_Birthday": "",
"FB_Link": "https://www.facebook.com/app_scoped_user_id/XXXXXXXXXXXXXX/",
"FB_Sexe": "female",
"FB_Locale": "fr_FR",
"FB_City": "",
"verif": 1
},
"ConnectorTwitter": {
"Twitter_ID": "XXXXXXXXXXXXXX",
"Twitter_Name": "XXXX",
"Twitter_ScreenName": "XXXX",
"Twitter_Location": "XXXX",
"Twitter_Url": "",
"Twitter_Followers_Count": "643",
"Twitter_Listed_Count": "3",
"Twitter_Favourites_Count": "985",
"Twitter_Time_Zone": "Paris",
"Twitter_Lang": "en",
"Twitter_Profil_Image": "http://pbs.twimg.com/profile_images/XXXXXXXXXXXXXX/XXXXXXXXXXXXXX.jpg",
"Twitter_Email": "xxxxxxx@xxx.xx"
},
"ConnectorGoogle": {
"Google_ID": "XXXXXXXXXXXXXX",
"Google_Email": "xxxxxx@xxxx.xx",
"Google_Verified_Email": "1",
"Google_Name": "xxxxxxxxx",
"Google_Given_Name": "xxxxxxxx",
"Google_Family_Name": "xxxxxxxxx",
"Google_Link": "https://plus.google.com/xxxxxxxxxxxxxxxxx",
"Google_Picture": "https://lh3.googleusercontent.com/xxxxxxxxxxxxxxxxx/photo.jpg",
"Google_Gender": "female",
"Google_Locale": "fr"
},
"ConnectorLinkedin": {
"Linkedin_id": "XXXXXXXXX",
"Linkedin_email_address": "xxxxxx@xxxx.xx",
"Linkedin_first_name": "xxxxxxxxx",
"Linkedin_last_name": "xxxxxxxx",
"Linkedin_location_country": "fr_FR",
"Linkedin_pictureurl": "https://media.licdn.com/dms/xxxxxxxxxxxxxxxxx"
},
"infos_complementaires": {
"id": "8389",
"last_update": "2017-05-04 16:14:55",
"prenom": "",
"nom": "",
"annee": "",
"sexe": "",
"telephone": "",
"email": "",
"code_postal": "",
"pays": "",
"chambre": "",
"centres_interet": "",
"type_residant": "",
"situation_familiale": "",
"tranche_age": ""
}
}
]
}liste_logs ¶
liste_logsGET/liste_logs/
Liste et détaille l’ensemble des connexions réalisées sur le hotspot
Example URI
- date_start
date(required) Example: d/m/YDate de début de la période d’export.
- date_end
date(required) Example: d/m/YDate de fin de la période d’export.
- periode
String(required) Example: 3h|24h|48hPeriode annulant les dates précédentes : 3h, 24h, 48h
- contexte
String(required) Example: hotspotLe contexte peut-être : hotspot/manager/groupe.
- hotspot
String(required) Example: XXX00-000hotspot dont les données seront extraites, hotspot Parent dans le contexte groupe, ignoré dans le contexte manager .
200Headers
Content-Type: application/json
X-Request-ID: f72fc614
X-Response-Time: 120msBody
{
"code": 200,
"message": "",
"header": {
"date_export": "2016-09-21 17:11:49",
"fournisseur": "2ISR",
"API": "1",
"remote_addr": "",
"type_donnees": "liste_logs",
"contexte": "hotspot",
"nb_donnees": "1",
"time": "120"
},
"rows": [
{
"token_id": "d4d968efef2e5fc67fc2a44e4a0f39e7",
"timestamp_in": "2016-05-21 23:52:58.052457",
"timestamp_out": "2016-05-22 01:56:01.962058",
"user_login": "XXXXXXXXXXXXX",
"email": "xxxx@xxxx.xx",
"user_ip": "XX.XX.XX.XX",
"user_mac": "XX:XX:XX:XX:XX:XX",
"user_agent": "Mozilla/5.0 (Linux; Android 4.2.2; GT-I9192 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36",
"incoming": 85694239,
"outgoing": 10977787,
"email_verifier": 1,
"hotspot": "XXX00-000",
"duree": "1542",
"fastpass": null,
"info_client": null,
"autoconnect": "oui",
"logout_reason": "4",
"lang_sys": "fr-FR",
"lang_portail": "fr",
"type_auth": "ConnectorFB",
"ap_mac": "XX:XX:XX:XX:XX:XX",
"optin": "oui",
"platform": "Defaut",
"browser": "Defaut",
"ismobiledevice": "Non",
"verifie_txt": "Oui",
"ConnectorFB": {
"FB_ID": "XXXXXXXXXXXXXX",
"FB_Email": "xxxx@xxxx.xx",
"FB_LastName": "XXXX",
"FB_FirstName": "XXXXXXX",
"FB_Birthday": "",
"FB_Link": "https://www.facebook.com/app_scoped_user_id/XXXXXXXXXXXXXX/",
"FB_Sexe": "female",
"FB_Locale": "fr_FR",
"FB_City": "",
"verif": 1
},
"ConnectorTwitter": {
"Twitter_ID": "XXXXXXXXXXXXXX",
"Twitter_Name": "XXXX",
"Twitter_ScreenName": "XXXX",
"Twitter_Location": "XXXX",
"Twitter_Url": "",
"Twitter_Followers_Count": "643",
"Twitter_Listed_Count": "3",
"Twitter_Favourites_Count": "985",
"Twitter_Time_Zone": "Paris",
"Twitter_Lang": "en",
"Twitter_Profil_Image": "http://pbs.twimg.com/profile_images/XXXXXXXXXXXXXX/XXXXXXXXXXXXXX.jpg",
"Twitter_Email": "xxxxxxx@xxx.xx"
},
"ConnectorGoogle": {
"Google_ID": "XXXXXXXXXXXXXX",
"Google_Email": "xxxxxxxx@xxxxx.x",
"Google_Verified_Email": "1",
"Google_Name": "xxxxxxxxx",
"Google_Given_Name": "xxxxxxxx",
"Google_Family_Name": "xxxxxxxxx",
"Google_Link": "https://plus.google.com/xxxxxxxxxxxxxxxxx",
"Google_Picture": "https://lh3.googleusercontent.com/xxxxxxxxxxxxxxxxx/photo.jpg",
"Google_Gender": "female",
"Google_Locale": "fr"
},
"ConnectorLinkedin": {
"Linkedin_id": "XXXXXXXXX",
"Linkedin_email_address": "xxxxxx@xxxx.xx",
"Linkedin_first_name": "xxxxxxxxx",
"Linkedin_last_name": "xxxxxxxx",
"Linkedin_location_country": "fr_FR",
"Linkedin_pictureurl": "https://media.licdn.com/dms/xxxxxxxxxxxxxxxxx"
},
"infos_complementaires": {
"id": "8389",
"last_update": "2017-05-04 16:14:55",
"prenom": "",
"nom": "",
"annee": "",
"sexe": "",
"telephone": "",
"email": "",
"code_postal": "",
"pays": "",
"chambre": "",
"centres_interet": "",
"type_residant": "",
"situation_familiale": "",
"tranche_age": ""
}
}
]
}deconnecter_utilisateur ¶
deconnecter_utilisateurGET/deconnecter_utilisateur/
Déconnecter un utilisateur via son adresse MAC
Example URI
- mac
String(required) Example: 7c:5c:f8:30:78:75Adresse MAC de l’utilisateur à déconnecter.
200Headers
Content-Type: application/json
X-Request-ID: f72fc914
X-Response-Time: 2msBody
{
"code": 200,
"message": "L'utilisateur '7c:5c:f8:30:78:75' a été déconnecté",
}