API Data
REST · JSON v1.0 31 March 2026

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.

URL de base https://www.optico.fr/data-api

Transport & conventions

MéthodeTous les endpoints utilisent GET
ParamètresPassés en query string de l'URL
Format de réponseapplication/json
Noms des paramètressnake_case dans les requêtes, camelCase dans les réponses
Format des datesYYYY-MM-DD
PaginationIndex 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.

GET
https://www.optico.fr/data-api?api_key=d4t4_5f4dcc3b5aa765d61d8327deb882cf99&...
Si l'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 :

json
{
  "status": "ERROR",
  "errors": [
    "Invalid api key",
    "Missing parameter `type`"
  ]
}
Message d'erreurCause
Invalid api keyL'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 5000La valeur de limit est hors de la plage autorisée.
Invalid parameter typeLe paramètre type n'est ni calls ni sms.
Cannot handle requestUne erreur serveur inattendue est survenue.
Plusieurs erreurs de validation peuvent être renvoyées dans la même réponse ; inspectez le tableau errors en entier.

#4 Endpoints

EndpointMéthodeObjet
/data-apiGETRé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ètreTypeDescription
api_keyobligatoirestringVotre clé API Data.
typeobligatoirestringcalls pour récupérer les enregistrements d'appels, sms pour les enregistrements SMS.
start_dateobligatoirestringDébut de la plage de dates (inclus). Format : YYYY-MM-DD.
end_dateobligatoirestringFin de la plage de dates (inclus, jusqu'à 23:59:59). Format : YYYY-MM-DD.
pageobligatoireintegerNuméro de page, à partir de 1.
limitobligatoireintegerRésultats par page. Min 10, max 5000.

Paramètres optionnels

ParamètreTypePar défautDescription
phoneoptionnelstring-Filtrer les résultats par numéro de téléphone de destination.
tracking_phoneoptionnelstring-Filtrer les résultats par numéro de tracking (surtaxé).
caller_phoneoptionnelstring-Filtrer les résultats par numéro de l'appelant.
statusoptionnelstring-Filtrer par statut d'appel. Séparez par des virgules pour plusieurs valeurs. Voir l'Annexe A.
offline_phone_descriptionoptionnelstring-Filtrer par description de la source du numéro offline.
group_by_dayoptionnelbooleanfalseSi 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.

Les pages sont basées sur 1. Commencez toujours par 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

Vous envoyez GET /data-api avec type=calls, start_date, end_date, page, limit à l'API Optico
L'API Optico renvoie status, total_results, [next_page], results[]
Répétez avec page=next_page jusqu'à ce que next_page soit absent pour récupérer tous les enregistrements.

Réponse en cas de succès

ChampTypeDescription
statusstringOK
total_resultsintegerNombre total d'enregistrements correspondant à la requête, toutes pages confondues.
next_pageintegerNuméro de la page suivante. Absent quand on est sur la dernière page.
resultsarrayTableau d'objets appel (voir les champs ci-dessous).

Champs de l'objet appel

ChampTypeDescription
start_datestringDate/heure de début de l'appel. Format : DD/MM/YYYY HH:MM:SS.
callerstringNuméro de téléphone de l'appelant. Peut être masqué selon les paramètres de confidentialité du domaine.
tracking_numberstringLe numéro de tracking (surtaxé) qui a été appelé.
phonestringNuméro de téléphone de destination vers lequel l'appel a été redirigé.
trigger_typeintegerMode de déclenchement de l'appel. Voir l'Annexe B.
sourcestringAttribution de la source de trafic (ex. Google Ads, Organic).
urlstringURL de la page sur laquelle le numéro de tracking était affiché.
refererstringURL de référence.
keywordstringMot-clé de recherche ayant amené la visite, si disponible.
call_pathstringListe des URL de pages visitées avant l'appel, séparées par des sauts de ligne.
statusstringIssue de l'appel. Voir l'Annexe A.
durationintegerDurée réelle de l'appel en secondes.
billing_durationintegerDurée facturée de l'appel en secondes (peut différer de la durée réelle).
revenuefloatValeur de revenu ou de coût attribuée à cet appel.
postcodestringCode postal saisi par l'appelant via SVI, le cas échéant.
keypadstringTouches pressées par l'appelant pendant l'appel, le cas échéant.
is_redirectbooleantrue si l'appel a été redirigé.
expired_redirectbooleantrue si l'appel a été redirigé en raison d'un numéro de tracking expiré.
answer_timeintegerDélai en secondes avant que l'appel soit décroché.
visit_idstringID de la session de visite du site associée à cet appel, si disponible.
gclidstringGoogle Click ID (gclid) issu de la session de visite associée à cet appel, si disponible.
client_datastringDonnées client personnalisées transmises via le script de tracking au moment de la visite, si disponibles.

Exemple

bash
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"
json (réponse)
{
  "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.

Les paramètres de pagination (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

ChampTypeDescription
datestringDate de la période agrégée. Format : YYYY-MM-DD.
callsintegerNombre total d'appels ce jour-là.
durationfloatDurée totale des appels en secondes pour ce jour.
revenuefloatRevenu total pour ce jour.

Exemple

bash
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"
json (réponse)
{
  "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

ChampTypeDescription
sent_datestringDate et heure de réception du SMS. Format : YYYY-MM-DD HH:MM:SS.
caller_phonestringNuméro de téléphone de l'expéditeur.
tracking_phonestringNuméro de tracking ayant reçu le SMS.
idintegerIdentifiant unique de l'enregistrement SMS.
message_contentstring / arrayCorps du message. Renvoie une chaîne pour les SMS standard, ou un tableau JSON pour les SMS unicode/multi-parties.

Exemple

bash
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"
json (réponse)
{
  "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).

ValeurDescription
SUCCESSAppel terminé avec succès.
ANOMALYAppel terminé sur une anomalie.
BUSYLe numéro de destination était occupé.
NORESPONSELa destination n'a pas répondu.
EXPIREDLe numéro de tracking était déjà expiré au moment de l'appel.
INTERRUPTEDAppel interrompu avant connexion.
ERR_SVI_STOPAppel arrêté pendant la saisie du code postal au SVI.
NOTASSIGNEDLe numéro de téléphone d'origine n'était attribué à aucun numéro de tracking.
ERR_CALLER_MSGL'appelant a raccroché pendant l'écoute d'un message.
CALLER_PHONE_BLACKLISTEDLe 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é.

ValeurDescription
1Normal : appel entrant standard sur un numéro de tracking.
2Webcall : appel initié via le widget web (click-to-call).
3Règle : appel déclenché par une règle de routage.
4Triggered : appel déclenché de manière programmatique via l'API.