API Data
Récupérez les enregistrements détaillés d'appels et de SMS pour vos numéros trackés. Accédez aux données brutes des appels, aux agrégats journaliers et aux logs SMS de manière programmatique pour alimenter vos propres tableaux de bord, CRM et pipelines de reporting.
#1 Introduction
L'API Optico Data permet de récupérer les enregistrements d'appels et de SMS pour vos numéros de téléphone trackés. Interrogez les détails d'appels individuels ou des agrégats journaliers sur une plage de dates. Les résultats sont paginés et renvoyés en JSON.
https://www.optico.fr/data-api
Transport & conventions
| Méthode | Tous les endpoints utilisent GET |
| Paramètres | Passés en query string de l'URL |
| Format de réponse | application/json |
| Noms des paramètres | snake_case dans les requêtes, camelCase dans les réponses |
| Format des dates | YYYY-MM-DD |
| Pagination | Index de page basé sur 1 ; page=1 est la première page |
#2 Authentification
Chaque requête doit inclure votre api_key en paramètre de query string. La clé est rattachée à un domaine et est délivrée à la création de votre compte sur www.optico.fr.
https://www.optico.fr/data-api?api_key=d4t4_5f4dcc3b5aa765d61d8327deb882cf99&...
api_key est manquante, invalide, ou si le domaine est inactif, l'API renvoie une réponse ERROR avec le message Invalid api key.#3 Erreurs
Toutes les réponses d'erreur partagent la même enveloppe :
{
"status": "ERROR",
"errors": [
"Invalid api key",
"Missing parameter `type`"
]
}
| Message d'erreur | Cause |
|---|---|
Invalid api key | L'api_key est manquante, n'existe pas, ou le domaine est inactif. |
Missing parameter <name> | Un paramètre obligatoire n'a pas été inclus dans la requête. |
Invalid date <value> | La date n'est pas une date valide ou n'est pas au format YYYY-MM-DD. |
Limit must be between 10 and 5000 | La valeur de limit est hors de la plage autorisée. |
Invalid parameter type | Le paramètre type n'est ni calls ni sms. |
Cannot handle request | Une erreur serveur inattendue est survenue. |
errors en entier.#4 Endpoints
| Endpoint | Méthode | Objet |
|---|---|---|
/data-api | GET | Récupérer les enregistrements d'appels et de SMS pour vos numéros trackés, paginés. |
#5 GET /data-api
Paramètres obligatoires
| Paramètre | Type | Description |
|---|---|---|
api_keyobligatoire | string | Votre clé API Data. |
typeobligatoire | string | calls pour récupérer les enregistrements d'appels, sms pour les enregistrements SMS. |
start_dateobligatoire | string | Début de la plage de dates (inclus). Format : YYYY-MM-DD. |
end_dateobligatoire | string | Fin de la plage de dates (inclus, jusqu'à 23:59:59). Format : YYYY-MM-DD. |
pageobligatoire | integer | Numéro de page, à partir de 1. |
limitobligatoire | integer | Résultats par page. Min 10, max 5000. |
Paramètres optionnels
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
phoneoptionnel | string | - | Filtrer les résultats par numéro de téléphone de destination. |
tracking_phoneoptionnel | string | - | Filtrer les résultats par numéro de tracking (surtaxé). |
caller_phoneoptionnel | string | - | Filtrer les résultats par numéro de l'appelant. |
statusoptionnel | string | - | Filtrer par statut d'appel. Séparez par des virgules pour plusieurs valeurs. Voir l'Annexe A. |
offline_phone_descriptionoptionnel | string | - | Filtrer par description de la source du numéro offline. |
group_by_dayoptionnel | boolean | false | Si true, renvoie une ligne agrégée par jour au lieu des enregistrements individuels. |
Pagination
Les résultats sont paginés. La réponse inclut un champ total_results et, lorsqu'il y a d'autres pages, un champ next_page. Itérez en incrémentant page jusqu'à ce que next_page soit absent.
page=1. Le champ next_page n'est présent que lorsque des résultats supplémentaires existent au-delà de la page courante.#6 Types
#6.1 Appels (type=calls)
Renvoie les enregistrements d'appels individuels dans la plage de dates demandée. Vous pouvez optionnellement regrouper les résultats par jour en utilisant group_by_day=true.
6.1.1 Enregistrements d'appels individuels
Le mode par défaut (group_by_day=false). Chaque élément du results représente un appel.
Flux
page=next_page jusqu'à ce que next_page soit absent pour récupérer tous les enregistrements.Réponse en cas de succès
| Champ | Type | Description |
|---|---|---|
status | string | OK |
total_results | integer | Nombre total d'enregistrements correspondant à la requête, toutes pages confondues. |
next_page | integer | Numéro de la page suivante. Absent quand on est sur la dernière page. |
results | array | Tableau d'objets appel (voir les champs ci-dessous). |
Champs de l'objet appel
| Champ | Type | Description |
|---|---|---|
start_date | string | Date/heure de début de l'appel. Format : DD/MM/YYYY HH:MM:SS. |
caller | string | Numéro de téléphone de l'appelant. Peut être masqué selon les paramètres de confidentialité du domaine. |
tracking_number | string | Le numéro de tracking (surtaxé) qui a été appelé. |
phone | string | Numéro de téléphone de destination vers lequel l'appel a été redirigé. |
trigger_type | integer | Mode de déclenchement de l'appel. Voir l'Annexe B. |
source | string | Attribution de la source de trafic (ex. Google Ads, Organic). |
url | string | URL de la page sur laquelle le numéro de tracking était affiché. |
referer | string | URL de référence. |
keyword | string | Mot-clé de recherche ayant amené la visite, si disponible. |
call_path | string | Liste des URL de pages visitées avant l'appel, séparées par des sauts de ligne. |
status | string | Issue de l'appel. Voir l'Annexe A. |
duration | integer | Durée réelle de l'appel en secondes. |
billing_duration | integer | Durée facturée de l'appel en secondes (peut différer de la durée réelle). |
revenue | float | Valeur de revenu ou de coût attribuée à cet appel. |
postcode | string | Code postal saisi par l'appelant via SVI, le cas échéant. |
keypad | string | Touches pressées par l'appelant pendant l'appel, le cas échéant. |
is_redirect | boolean | true si l'appel a été redirigé. |
expired_redirect | boolean | true si l'appel a été redirigé en raison d'un numéro de tracking expiré. |
answer_time | integer | Délai en secondes avant que l'appel soit décroché. |
visit_id | string | ID de la session de visite du site associée à cet appel, si disponible. |
gclid | string | Google Click ID (gclid) issu de la session de visite associée à cet appel, si disponible. |
client_data | string | Données client personnalisées transmises via le script de tracking au moment de la visite, si disponibles. |
Exemple
curl "https://www.optico.fr/data-api?api_key=d4t4_5f4dcc3b&type=calls&start_date=2026-01-01&end_date=2026-01-31&page=1&limit=50"
{
"status": "OK",
"total_results": 123,
"next_page": 2,
"results": [
{
"start_date": "17/01/2026 14:30:45",
"caller": "+33612345678",
"tracking_number": "+33912345678",
"phone": "+33987654321",
"trigger_type": 1,
"source": "Google Ads",
"url": "https://www.mysite.com/contact",
"referer": "google.com",
"keyword": "plumber paris",
"call_path": "https://www.mysite.com/
https://www.mysite.com/contact",
"status": "SUCCESS",
"duration": 245,
"billing_duration": 300,
"revenue": 1.50,
"postcode": "75001",
"keypad": "1",
"is_redirect": false,
"expired_redirect": false,
"answer_time": 8
}
]
}
6.1.2 Appels agrégés par jour (group_by_day=true)
Lorsque group_by_day=true, les résultats sont condensés en une ligne par jour. Ce mode est utile pour construire des tableaux de bord et des graphiques de tendance sans récupérer chaque appel individuel.
page, limit) restent obligatoires, mais total_results et next_page ne sont pas présents dans la réponse. Tous les jours de la plage sont renvoyés.Champs des résultats agrégés
| Champ | Type | Description |
|---|---|---|
date | string | Date de la période agrégée. Format : YYYY-MM-DD. |
calls | integer | Nombre total d'appels ce jour-là. |
duration | float | Durée totale des appels en secondes pour ce jour. |
revenue | float | Revenu total pour ce jour. |
Exemple
curl "https://www.optico.fr/data-api?api_key=d4t4_5f4dcc3b&type=calls&start_date=2026-01-01&end_date=2026-01-07&page=1&limit=100&group_by_day=true"
{
"status": "OK",
"results": [
{ "date": "2026-01-01", "calls": 45, "duration": 12350.5, "revenue": 67.89 },
{ "date": "2026-01-02", "calls": 38, "duration": 9870.0, "revenue": 55.20 }
]
}
#6.2 SMS (type=sms)
Renvoie les SMS reçus sur vos numéros de tracking dans la plage de dates demandée. La pagination fonctionne de la même manière que pour les appels.
Champs de l'objet SMS
| Champ | Type | Description |
|---|---|---|
sent_date | string | Date et heure de réception du SMS. Format : YYYY-MM-DD HH:MM:SS. |
caller_phone | string | Numéro de téléphone de l'expéditeur. |
tracking_phone | string | Numéro de tracking ayant reçu le SMS. |
id | integer | Identifiant unique de l'enregistrement SMS. |
message_content | string / array | Corps du message. Renvoie une chaîne pour les SMS standard, ou un tableau JSON pour les SMS unicode/multi-parties. |
Exemple
curl "https://www.optico.fr/data-api?api_key=d4t4_5f4dcc3b&type=sms&start_date=2026-01-01&end_date=2026-01-31&page=1&limit=100"
{
"status": "OK",
"results": [
{
"sent_date": "2026-01-17 14:30:45",
"caller_phone": "+33612345678",
"tracking_phone": "+33912345678",
"id": 789,
"message_content": "Hello, I'd like more information"
}
]
}
#Annexe A : valeurs de statut d'appel
Le champ status d'un enregistrement d'appel décrit l'issue de l'appel. Utilisez ces valeurs avec le paramètre de filtre status (séparées par des virgules pour plusieurs valeurs).
| Valeur | Description |
|---|---|
SUCCESS | Appel terminé avec succès. |
ANOMALY | Appel terminé sur une anomalie. |
BUSY | Le numéro de destination était occupé. |
NORESPONSE | La destination n'a pas répondu. |
EXPIRED | Le numéro de tracking était déjà expiré au moment de l'appel. |
INTERRUPTED | Appel interrompu avant connexion. |
ERR_SVI_STOP | Appel arrêté pendant la saisie du code postal au SVI. |
NOTASSIGNED | Le numéro de téléphone d'origine n'était attribué à aucun numéro de tracking. |
ERR_CALLER_MSG | L'appelant a raccroché pendant l'écoute d'un message. |
CALLER_PHONE_BLACKLISTED | Le numéro de l'appelant figure sur la liste de blocage. |
#Annexe B : types de déclenchement
Le champ trigger_type indique comment un appel a été initié.
| Valeur | Description |
|---|---|
1 | Normal : appel entrant standard sur un numéro de tracking. |
2 | Webcall : appel initié via le widget web (click-to-call). |
3 | Règle : appel déclenché par une règle de routage. |
4 | Triggered : appel déclenché de manière programmatique via l'API. |