Documentation REST API
Accédez à vos données de visibilité AI par programmation via l'API REST. Utilisez-la avec tout outil supportant les requêtes HTTP.
TL;DR
Générez une clé API personnelle dans les paramètres de votre compte. Utilisez ensuite des requêtes HTTP GET standard avec votre clé API pour récupérer les scores de visibilité, le nombre de mentions et les données de sentiment de ChatGPT, Gemini, Perplexity et Claude. Fonctionne avec Excel, Google Sheets, Power BI, Tableau, Python et tout autre client HTTP.
URL de base
Tous les endpoints de l'API sont disponibles sous l'URL de base suivante :
https://your-domain.com/api/v1/looker/
Remplacez your-domain.com par le domaine réel de votre instance AI Visibility Tool.
Authentification
Toutes les requêtes API nécessitent une authentification via une clé API personnelle. Vous pouvez créer des clés API dans les paramètres de votre compte sous "Clés API".
Comment s'authentifier
Incluez votre clé API dans chaque requête sous forme de jeton Bearer dans l'en-tête Authorization :
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/data
avt_ suivi de 48 caractères. Gardez votre clé API secrète — elle donne un accès complet en lecture à vos données de visibilité.
Gestion des clés API
- Créer des clés : Menu du compte → Clés API → Créer une clé API
- Maximum 3 clés actives en même temps
- Les clés ne sont affichées qu'une seule fois à la création — conservez-les en lieu sûr
- Supprimez les clés inutilisées à tout moment depuis la page Clés API
Accès payant par demande (MPP)
En alternative aux clés API gratuites, les agents IA peuvent payer un petit prix fixe par demande via le Protocole de Paiements Machine (MPP). Cela permet aux agents capables de paiement d'accéder aux données de visibilité à la volée, sans avoir à enregistrer un compte ou à provisionner une clé API au préalable.
How the 402 payment flow works
- L'agent appelle un point de terminaison payant sans clé API et sans credential de paiement.
- Le serveur répond avec HTTP 402 Paiement requis. L'en-tête WWW-Authenticate : Payment contient un défi MPP avec le prix et les méthodes de paiement acceptées.
- L'agent obtient un credential de paiement pour le défi — soit un paiement par carte via un Token de Paiement Partagé Stripe, soit un paiement en stablecoin sur le réseau Tempo.
- L'agent réessaie la même demande avec un en-tête Authorization : Payment contenant le credential. Le paiement est vérifié et les données sont renvoyées avec HTTP 200.
# First request without credentials
curl -i https://your-domain.com/api/v1/looker/data
# HTTP/1.1 402 Payment Required
# WWW-Authenticate: Payment challenge="...", ...
# Réessayer avec le credential de paiement
curl -H "Authorization: Payment <credential>" \
https://your-domain.com/api/v1/looker/data
Tarifs
| Endpoint | Price per request |
|---|---|
/api/v1/looker/data |
$0.02 USD |
/api/v1/looker/data.csv |
$0.02 USD |
/api/v1/looker/selections |
$0.01 USD |
/api/v1/looker/schema |
Free (API key required) |
Découverte lisible par machine
Les agents peuvent découvrir automatiquement les points de terminaison payants, les prix et les méthodes de paiement via la spécification OpenAPI, qui inclut des extensions x-payment-info pour chaque point de terminaison payant :
https://your-domain.com/openapi.json
Limites de débit
| Limite | Valeur |
|---|---|
| Requêtes par minute | 100 par clé API |
| Enregistrements maximum par requête | 10,000 |
Lorsque la limite de débit est dépassée, l'API renvoie HTTP 429. Attendez 60 secondes avant de réessayer.
Endpoints
Renvoie le schéma de données avec les noms de champs, les types et les informations sémantiques. Utile pour comprendre la structure des données avant d'interroger.
Paramètres : Aucun
Exemple de requête :
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/schema
Exemple de réponse :
{
"schema": [
{
"name": "date",
"label": "Date",
"dataType": "STRING",
"semantics": {
"conceptType": "DIMENSION",
"semanticType": "YEAR_MONTH_DAY"
}
},
{
"name": "visibility_score",
"label": "Visibility Score",
"dataType": "NUMBER",
"semantics": {
"conceptType": "METRIC"
}
}
]
}
Renvoie vos résultats d'analyse de visibilité AI. Supporte le filtrage par date, domaine thématique et système AI. Inclut la pagination pour les grands ensembles de données.
Paramètres de requête :
| Paramètre | Tapez | Requis | Description |
|---|---|---|---|
date_from |
String | Non | Filtre de date de début (AAAA-MM-JJ) |
date_to |
String | Non | Filtre de date de fin (AAAA-MM-JJ) |
selection_id |
Entier | Non | Filtrer par ID de domaine thématique (obtenir les IDs depuis l'endpoint /selections) |
ai_system |
String | Non | Filtrer par système AI : chatgpt, gemini, perplexity ou claude |
limit |
Entier | Non | Nombre d'enregistrements à renvoyer (par défaut : 1000, max : 10000) |
offset |
Entier | Non | Nombre d'enregistrements à sauter pour la pagination (par défaut : 0) |
Exemple de requête :
curl -H "Authorization: Bearer avt_your_key_here" \
"https://your-domain.com/api/v1/looker/data?date_from=2025-01-01&date_to=2025-01-31&ai_system=chatgpt&limit=500"
Exemple de réponse :
{
"data": [
{
"date": "20250115",
"topic_area": "Brand Monitoring",
"prompt": "What is the best project management tool?",
"category": "Product Comparison",
"funnel_stage": "Consideration",
"ai_system": "chatgpt",
"brand": "Asana",
"visibility_score": 75,
"mention_count": 3,
"position_score": 85,
"sentiment_score": 0.8,
"web_search_used": false
}
],
"pagination": {
"total": 1250,
"limit": 500,
"offset": 0,
"has_more": true
}
}
Renvoie une liste de vos domaines thématiques (sélections) avec leurs IDs. Utilisez ces IDs pour filtrer les données dans l'endpoint /data.
Paramètres : Aucun
Exemple de requête :
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/selections
Exemple de réponse :
{
"selections": [
{
"id": 42,
"name": "Brand Monitoring",
"description": "Track brand mentions across AI platforms",
"prompt_count": 25,
"is_active": true,
"created_at": "2025-01-10T14:30:00"
}
]
}
Référence des champs de données
Chaque enregistrement dans la réponse /data contient les champs suivants :
Dimensions
| Champ | Tapez | Description |
|---|---|---|
date |
String | Date d'analyse au format AAAAMMJJ |
topic_area |
String | Nom du domaine thématique (sélection) surveillé |
prompt |
String | Le texte du prompt envoyé au système d'IA |
category |
String | Catégorie assignée au prompt |
funnel_stage |
String | Étape de l'entonnoir marketing (p. ex. Sensibilisation, Considération, Décision) |
ai_system |
String | La plateforme AI interrogée (chatgpt, gemini, perplexity, claude) |
brand |
String | La marque suivie pour les mentions |
Métriques
| Champ | Tapez | Plage | Description |
|---|---|---|---|
visibility_score |
Nombre | 0–100 | Score de visibilité global de la marque dans la réponse AI |
mention_count |
Nombre | 0+ | Nombre de fois que la marque a été mentionnée dans la réponse de l'IA |
position_score |
Nombre | 0–100 | Score de classement de position — des valeurs plus élevées indiquent des mentions plus précoces |
sentiment_score |
Nombre | -1 à +1 | Score de sentiment de -1 (négatif) à +1 (positif) |
web_search_used |
Booléen | true/false | Si le système d'IA a utilisé la recherche web pour générer la réponse |
Format de réponse
Toutes les réponses sont renvoyées en JSON avec encodage UTF-8. L'en-tête HTTP Content-Type est défini sur application/json.
Codes de statut HTTP
| Code de statut | Signification |
|---|---|
| 200 OK | Requête réussie |
| 401 Unauthorized | Clé API manquante, invalide ou désactivée |
| 429 Too Many Requests | Limite de débit dépassée — attendez 60 secondes |
Gestion des erreurs
Les réponses d'erreur incluent toujours un corps JSON avec un message d'erreur :
{
"error": "API key required. Use the Authorization: Bearer <key> header."
}
| Erreur | Cause | Solution |
|---|---|---|
API key required |
Pas de clé API dans la requête | Ajoutez l'en-tête Authorization: Bearer (le paramètre de requête ne fonctionne que pour le point de terminaison CSV) |
Invalid or inactive API key |
La clé est incorrecte, supprimée ou désactivée | Vérifiez la clé sur votre page Clés API ; créez-en une nouvelle si nécessaire |
Rate limit exceeded |
Plus de 100 requêtes en 60 secondes | Attendez 60 secondes, puis réessayez ; envisagez de mettre les résultats en cache |
Exemples de code
import requests
API_KEY = "avt_your_key_here"
BASE_URL = "https://your-domain.com/api/v1/looker"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Récupérer tous les domaines thématiques
selections = requests.get(f"{BASE_URL}/selections", headers=headers).json()
print(selections)
# Récupérer les données de visibilité pour janvier 2025
params = {
"date_from": "2025-01-01",
"date_to": "2025-01-31",
"limit": 1000
}
data = requests.get(f"{BASE_URL}/data", headers=headers, params=params).json()
print(f"Total records: {data['pagination']['total']}")
# Paginer à travers tous les résultats
all_records = []
offset = 0
while True:
params["offset"] = offset
response = requests.get(f"{BASE_URL}/data", headers=headers, params=params).json()
all_records.extend(response["data"])
if not response["pagination"]["has_more"]:
break
offset += params["limit"]
print(f"Fetched {len(all_records)} records total")
const API_KEY = "avt_your_key_here";
const BASE_URL = "https://your-domain.com/api/v1/looker";
const headers = { "Authorization": `Bearer ${API_KEY}` };
// Récupérer les données de visibilité
const response = await fetch(`${BASE_URL}/data?date_from=2025-01-01&limit=500`, { headers });
const result = await response.json();
console.log(`Total: ${result.pagination.total} records`);
# Récupérer le schéma
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/schema
# Récupérer les données avec filtres
curl -H "Authorization: Bearer avt_your_key_here" \
"https://your-domain.com/api/v1/looker/data?date_from=2025-01-01&ai_system=chatgpt&limit=100"
# Récupérer les domaines thématiques
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/selections
function getVisibilityData() {
const API_KEY = "avt_your_key_here";
const url = "https://your-domain.com/api/v1/looker/data?limit=500";
const options = {
headers: { "Authorization": "Bearer " + API_KEY },
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
// Écrire les données dans la feuille active
const sheet = SpreadsheetApp.getActiveSheet();
const headers = Object.keys(json.data[0]);
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
const rows = json.data.map(row => headers.map(h => row[h]));
sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
}