Documentación REST API
Acceda a sus datos de visibilidad AI de forma programática a través de la API REST. Úsela con cualquier herramienta que soporte solicitudes HTTP.
Resumen
Genere una clave API personal en la configuración de su cuenta. Luego use solicitudes HTTP GET estándar con su clave API para obtener puntuaciones de visibilidad, recuentos de menciones y datos de sentimiento de ChatGPT, Gemini, Perplexity y Claude. Funciona con Excel, Google Sheets, Power BI, Tableau, Python y cualquier otro cliente HTTP.
URL base
Todos los endpoints de la API están disponibles bajo la siguiente URL base:
https://your-domain.com/api/v1/looker/
Reemplace your-domain.com con el dominio real de su instancia del AI Visibility Tool.
Autenticación
Todas las solicitudes API requieren autenticación mediante una clave API personal. Puede crear claves API en la configuración de su cuenta en "Claves API".
Cómo autenticarse
Incluya su clave API en cada solicitud como token Bearer en el encabezado Authorization:
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/data
avt_ seguido de 48 caracteres. Mantenga su clave API en secreto — proporciona acceso completo de lectura a sus datos de visibilidad.
Gestión de claves API
- Crear claves: Menú de cuenta → Claves API → Crear clave API
- Máximo 3 claves activas al mismo tiempo
- Las claves se muestran solo una vez en la creación — guárdelas de forma segura
- Elimine las claves no utilizadas en cualquier momento desde la página de Claves API
Acceso por solicitud (MPP)
Como alternativa a las claves API gratuitas, los agentes de IA pueden pagar un pequeño precio fijo por solicitud a través del Protocolo de Pagos de Máquina (MPP). Esto permite a los agentes con capacidad de pago acceder a datos de visibilidad al instante, sin necesidad de registrar una cuenta o provisionar una clave API primero.
How the 402 payment flow works
- El agente llama a un endpoint de pago sin una clave API y sin una credencial de pago.
- El servidor responde con HTTP 402 Pago Requerido. El encabezado WWW-Authenticate: Payment lleva un desafío MPP con el precio y los métodos de pago aceptados.
- El agente obtiene una credencial de pago para el desafío: ya sea un pago con tarjeta a través de un Token de Pago Compartido de Stripe o un pago en stablecoin en la red Tempo.
- El agente reintenta la misma solicitud con un encabezado Authorization: Payment que contiene la credencial. El pago se verifica y los datos se devuelven con 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="...", ...
# Reintentar con la credencial de pago
curl -H "Authorization: Payment <credential>" \
https://your-domain.com/api/v1/looker/data
Precios
| 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) |
Descubrimiento legible por máquina
Los agentes pueden descubrir automáticamente los endpoints de pago, precios y métodos de pago a través de la especificación OpenAPI, que incluye extensiones x-payment-info para cada endpoint pagable:
https://your-domain.com/openapi.json
Límites de velocidad
| Límite | Valor |
|---|---|
| Solicitudes por minuto | 100 por clave API |
| Registros máximos por solicitud | 10,000 |
Cuando se excede el límite de velocidad, la API devuelve HTTP 429. Espere 60 segundos antes de reintentar.
Endpoints
Devuelve el esquema de datos con nombres de campos, tipos e información semántica. Útil para comprender la estructura de datos antes de consultar.
Parámetros: Ninguno
Solicitud de ejemplo:
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/schema
Respuesta de ejemplo:
{
"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"
}
}
]
}
Devuelve los resultados de su análisis de visibilidad AI. Soporta filtrado por fecha, área temática y sistema AI. Incluye paginación para grandes conjuntos de datos.
Parámetros de consulta:
| Parámetro | Escriba | Requerido | Descripción |
|---|---|---|---|
date_from |
String | No | Filtro de fecha de inicio (AAAA-MM-DD) |
date_to |
String | No | Filtro de fecha de fin (AAAA-MM-DD) |
selection_id |
Entero | No | Filtrar por ID de área temática (obtener IDs del endpoint /selections) |
ai_system |
String | No | Filtrar por sistema AI: chatgpt, gemini, perplexity o claude |
limit |
Entero | No | Número de registros a devolver (predeterminado: 1000, máx: 10000) |
offset |
Entero | No | Número de registros a omitir para paginación (predeterminado: 0) |
Solicitud de ejemplo:
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"
Respuesta de ejemplo:
{
"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
}
}
Devuelve una lista de sus áreas temáticas (selecciones) con sus IDs. Use estos IDs para filtrar datos en el endpoint /data.
Parámetros: Ninguno
Solicitud de ejemplo:
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/selections
Respuesta de ejemplo:
{
"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"
}
]
}
Referencia de campos de datos
Cada registro en la respuesta de /data contiene los siguientes campos:
Dimensiones
| Campo | Escriba | Descripción |
|---|---|---|
date |
String | Fecha de análisis en formato AAAAMMDD |
topic_area |
String | Nombre del área temática (selección) que se está monitoreando |
prompt |
String | El texto del prompt enviado al sistema de AI |
category |
String | Categoría asignada al prompt |
funnel_stage |
String | Etapa del embudo de marketing (p. ej. Conciencia, Consideración, Decisión) |
ai_system |
String | La plataforma AI consultada (chatgpt, gemini, perplexity, claude) |
brand |
String | La marca que se rastrea en busca de menciones |
Métricas
| Campo | Escriba | Rango | Descripción |
|---|---|---|---|
visibility_score |
Número | 0–100 | Puntuación general de visibilidad de la marca en la respuesta AI |
mention_count |
Número | 0+ | Número de veces que la marca fue mencionada en la respuesta de AI |
position_score |
Número | 0–100 | Puntuación de clasificación de posición — valores más altos indican menciones más tempranas |
sentiment_score |
Número | -1 a +1 | Puntuación de sentimiento de -1 (negativo) a +1 (positivo) |
web_search_used |
Booleano | true/false | Si el sistema de AI utilizó búsqueda web para generar la respuesta |
Formato de respuesta
Todas las respuestas se devuelven como JSON con codificación UTF-8. El encabezado HTTP Content-Type está configurado como application/json.
Códigos de estado HTTP
| Código de estado | Significado |
|---|---|
| 200 OK | Solicitud exitosa |
| 401 Unauthorized | Clave API faltante, inválida o desactivada |
| 429 Too Many Requests | Límite de velocidad excedido — espere 60 segundos |
Manejo de errores
Las respuestas de error siempre incluyen un cuerpo JSON con un mensaje de error:
{
"error": "API key required. Use the Authorization: Bearer <key> header."
}
| Error | Causa | Solución |
|---|---|---|
API key required |
No hay clave API en la solicitud | Agregue el encabezado Authorization: Bearer (el parámetro de consulta solo funciona para el punto de conexión CSV) |
Invalid or inactive API key |
La clave es incorrecta, eliminada o desactivada | Verifique la clave en su página de Claves API; cree una nueva si es necesario |
Rate limit exceeded |
Más de 100 solicitudes en 60 segundos | Espere 60 segundos, luego reintente; considere almacenar los resultados en caché |
Ejemplos de código
import requests
API_KEY = "avt_your_key_here"
BASE_URL = "https://your-domain.com/api/v1/looker"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Obtener todas las áreas temáticas
selections = requests.get(f"{BASE_URL}/selections", headers=headers).json()
print(selections)
# Obtener datos de visibilidad para enero 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']}")
# Paginar a través de todos los resultados
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}` };
// Obtener datos de visibilidad
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`);
# Obtener esquema
curl -H "Authorization: Bearer avt_your_key_here" \
https://your-domain.com/api/v1/looker/schema
# Obtener datos con filtros
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"
# Obtener áreas temáticas
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());
// Escribir datos en la hoja activa
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);
}