Exportaciones
Exportaciones masivas asincrónicas. La primera disponible es el reporte de Llamadas IA — el mismo dataset que exporta la plataforma desde la interfaz, uniendo llamadas, evaluaciones, EPA y campañas, en CSV o Excel.
Endpoints
| Método | Endpoint | Descripción | Permiso |
|---|---|---|---|
| POST | /exports/ai-calls | Iniciar un trabajo de exportación asincrónico de Llamadas IA | analytics:export |
| GET | /exports/{jobId} | Consultar el estado y obtener la URL de descarga | analytics:export |
Ambos endpoints requieren API key + firma HMAC. Revisa Autenticación para el esquema de firma.
Cómo funciona — 3 pasos
La exportación es asincrónica porque la generación puede tomar segundos o minutos según el rango de fechas. Tu integración inicia un trabajo, consulta hasta que termina, y descarga el archivo.
Iniciar el trabajo
POST /exports/ai-calls con fechas y formato. Responde con un jobId.
Consultar estado
GET /exports/{jobId} cada 2–5 segundos hasta que status sea completed.
Descargar el archivo
Abre downloadUrl directamente. Es un enlace firmado válido por 2 horas.
Tip: El downloadUrl es un enlace firmado temporal — cualquiera con el enlace puede descargarlo dentro de las 2 horas. Trátalo como secreto y consúmelo rápido.
Cuerpo del POST — /exports/ai-calls
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
| dateFrom | fecha (yyyy-MM-dd) | Sí | Día inicial inclusivo. |
| dateTo | fecha (yyyy-MM-dd) | Sí | Día final inclusivo. Rango máximo: 92 días. |
| format | "csv" \| "xlsx" | No | Formato de salida. Por defecto: csv. |
| campaignId | texto | No | Filtra a una sola campaña. |
| status | enum | No | evaluated, notEvaluated, pending, processing, failed. |
| outcome | texto | No | Resultado de la llamada (ej. completed, transferred). |
| timezone | zona horaria IANA | No | Ej. "America/Santiago". Por defecto UTC. Afecta el corte de día y el formato de fechas mostradas. |
Estados del trabajo
| Estado | Significado |
|---|---|
| queued | Trabajo creado, todavía no comienza. |
| processing | Generando el archivo. progress va de 0 a 100. |
| completed | Listo. downloadUrl está disponible (válido 2h). |
| failed | Trabajo falló. error contiene el mensaje. |
Cliente de referencia — Python
Solo librería estándar (Python 3.10+). Define las variables API_KEY y HMAC_KEY antes de ejecutar.
#!/usr/bin/env python3
"""Auralytik — Cliente de referencia de Exportación de Llamadas IA. Solo stdlib."""
import argparse, base64, hashlib, hmac, json, os, sys, time
from datetime import datetime, timedelta, timezone
from urllib.parse import urlsplit
from urllib.request import Request, urlopen
from urllib.error import HTTPError
BASE = "https://api.auralytik.ai"
def sign(method, url, body_bytes, hmac_key):
ts = str(int(time.time()))
path = urlsplit(url).path or "/"
body_hash = base64.b64encode(hashlib.sha256(body_bytes).digest()).decode()
canonical = f"{ts}.{method.upper()}.{path}.{body_hash}"
sig = base64.b64encode(
hmac.new(hmac_key.encode(), canonical.encode(), hashlib.sha256).digest()
).decode()
return ts, sig
def call(method, url, api_key, hmac_key, body=None):
headers = {"X-Api-Key": api_key, "Accept": "application/json"}
body_b = b""
if body is not None:
headers["Content-Type"] = "application/json"
body_b = json.dumps(body).encode()
ts, sig = sign(method, url, body_b, hmac_key)
headers["X-Timestamp"] = ts
headers["X-Signature"] = sig
req = Request(url, data=body_b if body else None, method=method, headers=headers)
try:
with urlopen(req, timeout=60) as r: return r.status, json.loads(r.read())
except HTTPError as e: return e.code, json.loads(e.read())
# Iniciar
body = {"dateFrom": "2026-05-03", "dateTo": "2026-05-10",
"format": "csv", "timezone": "America/Santiago"}
status, resp = call("POST", f"{BASE}/api/v1/exports/ai-calls",
os.environ["API_KEY"], os.environ["HMAC_KEY"], body)
job_id = resp["data"]["jobId"]
# Consultar
while True:
_, resp = call("GET", f"{BASE}/api/v1/exports/{job_id}",
os.environ["API_KEY"], os.environ["HMAC_KEY"])
job = resp["data"]
print(f"status={job['status']} progress={job.get('progress', 0)}%")
if job["status"] == "completed": break
if job["status"] == "failed": sys.exit(job.get("error"))
time.sleep(2)
# Descargar
with urlopen(job["downloadUrl"]) as r, open(job["fileName"], "wb") as f:
f.write(r.read())
print(f"Guardado: {job['fileName']}")Llamada de referencia — curl + openssl
Para integraciones desde shell. Requiere openssl.
# 1. Iniciar la exportación
API_KEY="ak_live_..."
HMAC_KEY="hmac_..."
BASE="https://api.auralytik.ai"
BODY='{"dateFrom":"2026-05-03","dateTo":"2026-05-10","format":"csv","timezone":"America/Santiago"}'
TS=$(date +%s)
PATH_REQ="/api/v1/exports/ai-calls"
BODY_HASH=$(echo -n "$BODY" | openssl dgst -sha256 -binary | base64)
SIG=$(echo -n "$TS.POST.$PATH_REQ.$BODY_HASH" | openssl dgst -sha256 -hmac "$HMAC_KEY" -binary | base64)
curl -X POST "$BASE$PATH_REQ" \
-H "X-Api-Key: $API_KEY" \
-H "X-Timestamp: $TS" \
-H "X-Signature: $SIG" \
-H "Content-Type: application/json" \
-d "$BODY"Qué contiene el archivo descargado
Una fila por llamada IA. 18 columnas fijas más una columna dinámica por cada pregunta EPA única (prefijo EPA_).
| Columna | Descripción |
|---|---|
| Estado | Estado de la evaluación (Evaluated, Not Evaluated, Pending, Processing, Failed). |
| Fecha | Fecha y hora de fin de la llamada en la zona horaria solicitada. |
| Teléfono | Número telefónico del cliente. |
| CallId | Identificador único de la llamada. |
| Identidad | Identidad del cliente (RUT, contrato, etc., según campaña). |
| Versión IA | Versión del flujo / bot que atendió la llamada. |
| Resultado | Outcome de la llamada (completed, transferred, no_answer, …). |
| Duración (s) | Segundos de conversación. |
| Nota | Puntaje promedio de la evaluación (0–10). |
| Tipificación | Categoría → Razón → Sub-razón asignada por la IA. |
| Confianza | Confianza % de la tipificación. |
| Campaña | Nombre de la campaña. |
| Transferencia | Función que activó la transferencia a humano, si la hubo. |
| EPA Encuesta | Si la llamada ejecutó encuesta post-llamado (Sí / No). |
| EPA Puntaje | Puntaje calculado de la EPA. |
| EPA Resultado | Razón de finalización de la EPA. |
| EPA Preguntas | Respondidas / total. |
| EPA Completitud | % de preguntas respondidas. |
Compatibilidad con Excel: El CSV se entrega en UTF-8 con BOM y separador por coma — Excel auto-detecta la codificación al abrirlo. El XLSX se abre nativamente.
Errores
| HTTP | Código | Causa |
|---|---|---|
| 400 | VALIDATION_ERROR | Faltan campos, fechas mal formadas, rango > 92 días, formato / status / timezone desconocido. |
| 401 | INVALID_API_KEY | API key faltante o desconocida. |
| 401 | INVALID_SIGNATURE | Cabecera X-Signature ausente, o firma HMAC no coincide. |
| 401 | TIMESTAMP_EXPIRED | X-Timestamp está más de 5 minutos fuera de sincronía con UTC. |
| 403 | INSUFFICIENT_SCOPE | La API key no tiene el permiso analytics:export. |
| 404 | RESOURCE_NOT_FOUND | El jobId no existe o pertenece a otro cliente. |
| 429 | RATE_LIMIT_EXCEEDED | Demasiadas solicitudes por minuto. Espera y reintenta. |
| 503 | INTERNAL_ERROR | Servicio temporalmente no disponible. Reintenta más tarde. |
Límites y retención
- Rango de fechas: hasta 92 días por solicitud.
- Tope de filas: 50,000 filas por exportación (se incluyen las llamadas más recientes).
- TTL de descarga: 2 horas después de completarse el trabajo.
- Retención del trabajo: 72 horas (el registro de estado se auto-elimina).
¿Necesitas ayuda con la integración?
Te entregamos credenciales API ya provisionadas con el permiso correcto, y acompañamos a tu equipo en una primera prueba end-to-end contra un cliente sandbox.
Contactar Soporte