REST API Dokumentation
Greifen Sie programmatisch über die REST-API auf Ihre AI-Sichtbarkeitsdaten zu. Verwenden Sie sie mit jedem Tool, das HTTP-Anfragen unterstützt.
TL;DR
Generieren Sie einen persönlichen API-Schlüssel in Ihren Kontoeinstellungen. Verwenden Sie dann Standard-HTTP-GET-Anfragen mit Ihrem API-Schlüssel, um Sichtbarkeitswerte, Erwähnungen und Sentimentdaten von ChatGPT, Gemini, Perplexity und Claude abzurufen. Funktioniert mit Excel, Google Sheets, Power BI, Tableau, Python und jedem anderen HTTP-Client.
Basis-URL
Alle API-Endpunkte sind unter folgender Basis-URL verfügbar:
https://your-domain.com/api/v1/looker/
Ersetzen Sie your-domain.com durch die tatsächliche Domain Ihrer AI Visibility Tool-Instanz.
Authentifizierung
Alle API-Anfragen erfordern eine Authentifizierung über einen persönlichen API-Schlüssel. Sie können API-Schlüssel in Ihren Kontoeinstellungen unter "API-Schlüssel" erstellen.
So authentifizieren Sie sich
Übermitteln Sie Ihren API-Schlüssel bei jeder Anfrage als Bearer-Token im Authorization-Header:
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/data
avt_ gefolgt von 48 Zeichen. Halten Sie Ihren API-Schlüssel geheim — er bietet vollen Lesezugriff auf Ihre Sichtbarkeitsdaten.
API-Schlüssel-Verwaltung
- Schlüssel erstellen: Kontomenü → API-Schlüssel → API-Schlüssel erstellen
- Maximal 3 aktive Schlüssel gleichzeitig
- Schlüssel werden nur einmal bei der Erstellung angezeigt — bewahren Sie sie sicher auf
- Löschen Sie unbenutzte Schlüssel jederzeit auf der API-Schlüssel-Seite
Pay-per-Request-Zugang (MPP)
Als Alternative zu kostenlosen API-Schlüsseln können KI-Agenten einen kleinen Festpreis pro Anfrage über das Machine Payments Protocol (MPP) zahlen. Dies ermöglicht zahlungsfähigen Agenten den Zugriff auf Sichtbarkeitsdaten in Echtzeit, ohne zuerst ein Konto zu registrieren oder einen API-Schlüssel bereitzustellen.
How the 402 payment flow works
- Der Agent ruft einen kostenpflichtigen Endpunkt ohne API-Schlüssel und ohne Zahlungsnachweis auf.
- Der Server antwortet mit HTTP 402 Zahlung erforderlich. Der WWW-Authenticate: Payment-Header enthält eine MPP-Herausforderung mit dem Preis und den akzeptierten Zahlungsmethoden.
- Der Agent erhält einen Zahlungsnachweis für die Herausforderung – entweder eine Kartenzahlung über ein Stripe Shared Payment Token oder eine Stablecoin-Zahlung im Tempo-Netzwerk.
- Der Agent wiederholt dieselbe Anfrage mit einem Authorization: Payment-Header, der den Nachweis enthält. Die Zahlung wird verifiziert und die Daten werden mit HTTP 200 zurückgegeben.
# First request without credentials
curl -i https://your-domain.com/api/v1/looker/data
# HTTP/1.1 402 Payment Required
# WWW-Authenticate: Payment challenge="...", ...
# Wiederholen mit dem Zahlungsnachweis
curl -H "Authorization: Payment <credential>" \
https://your-domain.com/api/v1/looker/data
Preise
| 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) |
Maschinenlesbare Entdeckung
Agenten können die kostenpflichtigen Endpunkte, Preise und Zahlungsmethoden automatisch über die OpenAPI-Spezifikation entdecken, die x-payment-info-Erweiterungen für jeden zahlbaren Endpunkt enthält:
https://your-domain.com/openapi.json
Rate Limits
| Limit | Wert |
|---|---|
| Anfragen pro Minute | 100 pro API-Schlüssel |
| Maximale Datensätze pro Anfrage | 10,000 |
Wenn das Rate Limit überschritten wird, gibt die API HTTP 429 zurück. Warten Sie 60 Sekunden, bevor Sie es erneut versuchen.
Endpunkte
Gibt das Datenschema mit Feldnamen, Typen und semantischen Informationen zurück. Nützlich, um die Datenstruktur vor der Abfrage zu verstehen.
Parameter: Keine
Beispielanfrage:
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/schema
Beispielantwort:
{
"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"
}
}
]
}
Gibt Ihre AI-Sichtbarkeits-Analyseergebnisse zurück. Unterstützt Filterung nach Datum, Themenfeld und AI-System. Enthält Paginierung für große Datensätze.
Query-Parameter:
| Parameter | Geben Sie | Erforderlich | Beschreibung |
|---|---|---|---|
date_from |
String | Nein | Startdatum-Filter (JJJJ-MM-TT) |
date_to |
String | Nein | Enddatum-Filter (JJJJ-MM-TT) |
selection_id |
Integer | Nein | Filtern nach Themenfeld-ID (IDs vom /selections-Endpunkt abrufen) |
ai_system |
String | Nein | Filtern nach AI-System: chatgpt, gemini, perplexity oder claude |
limit |
Integer | Nein | Anzahl der zurückzugebenden Datensätze (Standard: 1000, Max: 10000) |
offset |
Integer | Nein | Anzahl der zu überspringenden Datensätze für Paginierung (Standard: 0) |
Beispielanfrage:
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"
Beispielantwort:
{
"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
}
}
Gibt eine Liste Ihrer Themenfelder (Auswahlen) mit ihren IDs zurück. Verwenden Sie diese IDs, um Daten im /data-Endpunkt zu filtern.
Parameter: Keine
Beispielanfrage:
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/selections
Beispielantwort:
{
"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"
}
]
}
Datenfeld-Referenz
Jeder Datensatz in der /data-Antwort enthält folgende Felder:
Dimensionen
| Feld | Geben Sie | Beschreibung |
|---|---|---|
date |
String | Analysedatum im Format JJJJMMTT |
topic_area |
String | Name des überwachten Themenfelds (Auswahl) |
prompt |
String | Der an das AI-System gesendete Prompt-Text |
category |
String | Dem Prompt zugewiesene Kategorie |
funnel_stage |
String | Marketing-Funnel-Stufe (z.B. Bekanntheit, Überlegung, Entscheidung) |
ai_system |
String | Die abgefragte AI-Plattform (chatgpt, gemini, perplexity, claude) |
brand |
String | Die Marke, die auf Erwähnungen verfolgt wird |
Metriken
| Feld | Geben Sie | Bereich | Beschreibung |
|---|---|---|---|
visibility_score |
Zahl | 0–100 | Gesamter Sichtbarkeitswert der Marke in der AI-Antwort |
mention_count |
Zahl | 0+ | Anzahl der Erwähnungen der Marke in der AI-Antwort |
position_score |
Zahl | 0–100 | Positionsranking-Wert — höhere Werte bedeuten frühere Erwähnungen |
sentiment_score |
Zahl | -1 bis +1 | Sentimentwert von -1 (negativ) bis +1 (positiv) |
web_search_used |
Boolean | true/false | Ob das AI-System eine Websuche zur Generierung der Antwort verwendet hat |
Antwortformat
Alle Antworten werden als JSON mit UTF-8-Kodierung zurückgegeben. Der HTTP-Content-Type-Header ist gesetzt auf application/json.
HTTP-Statuscodes
| Statuscode | Bedeutung |
|---|---|
| 200 OK | Anfrage erfolgreich |
| 401 Unauthorized | API-Schlüssel fehlt, ungültig oder deaktiviert |
| 429 Too Many Requests | Rate Limit überschritten — 60 Sekunden warten |
Fehlerbehandlung
Fehlerantworten enthalten immer einen JSON-Body mit einer Fehlermeldung:
{
"error": "API key required. Use the Authorization: Bearer <key> header."
}
| Fehler | Ursache | Lösung |
|---|---|---|
API key required |
Kein API-Schlüssel in der Anfrage | Fügen Sie den Authorization: Bearer-Header hinzu (Query-Parameter funktioniert nur beim CSV-Endpunkt) |
Invalid or inactive API key |
Schlüssel ist falsch, gelöscht oder deaktiviert | Überprüfen Sie den Schlüssel auf Ihrer API-Schlüssel-Seite; erstellen Sie bei Bedarf einen neuen |
Rate limit exceeded |
Mehr als 100 Anfragen in 60 Sekunden | 60 Sekunden warten, dann erneut versuchen; Ergebnisse ggf. zwischenspeichern |
Codebeispiele
import requests
API_KEY = "avt_your_key_here"
BASE_URL = "https://your-domain.com/api/v1/looker"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Alle Themenfelder abrufen
selections = requests.get(f"{BASE_URL}/selections", headers=headers).json()
print(selections)
# Sichtbarkeitsdaten für Januar 2025 abrufen
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']}")
# Durch alle Ergebnisse paginieren
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}` };
// Sichtbarkeitsdaten abrufen
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`);
# Schema abrufen
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/schema
# Daten mit Filtern abrufen
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"
# Themenfelder abrufen
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());
// Daten in das aktive Tabellenblatt schreiben
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);
}