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étodoEndpointDescripciónPermiso
POST/exports/ai-callsIniciar un trabajo de exportación asincrónico de Llamadas IAanalytics:export
GET/exports/{jobId}Consultar el estado y obtener la URL de descargaanalytics: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.

PASO 1

Iniciar el trabajo

POST /exports/ai-calls con fechas y formato. Responde con un jobId.

PASO 2

Consultar estado

GET /exports/{jobId} cada 2–5 segundos hasta que status sea completed.

PASO 3

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

CampoTipoRequeridoNotas
dateFromfecha (yyyy-MM-dd)Día inicial inclusivo.
dateTofecha (yyyy-MM-dd)Día final inclusivo. Rango máximo: 92 días.
format"csv" \| "xlsx"NoFormato de salida. Por defecto: csv.
campaignIdtextoNoFiltra a una sola campaña.
statusenumNoevaluated, notEvaluated, pending, processing, failed.
outcometextoNoResultado de la llamada (ej. completed, transferred).
timezonezona horaria IANANoEj. "America/Santiago". Por defecto UTC. Afecta el corte de día y el formato de fechas mostradas.

Estados del trabajo

EstadoSignificado
queuedTrabajo creado, todavía no comienza.
processingGenerando el archivo. progress va de 0 a 100.
completedListo. downloadUrl está disponible (válido 2h).
failedTrabajo 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_).

ColumnaDescripción
EstadoEstado de la evaluación (Evaluated, Not Evaluated, Pending, Processing, Failed).
FechaFecha y hora de fin de la llamada en la zona horaria solicitada.
TeléfonoNúmero telefónico del cliente.
CallIdIdentificador único de la llamada.
IdentidadIdentidad del cliente (RUT, contrato, etc., según campaña).
Versión IAVersión del flujo / bot que atendió la llamada.
ResultadoOutcome de la llamada (completed, transferred, no_answer, …).
Duración (s)Segundos de conversación.
NotaPuntaje promedio de la evaluación (0–10).
TipificaciónCategoría → Razón → Sub-razón asignada por la IA.
ConfianzaConfianza % de la tipificación.
CampañaNombre de la campaña.
TransferenciaFunción que activó la transferencia a humano, si la hubo.
EPA EncuestaSi la llamada ejecutó encuesta post-llamado (Sí / No).
EPA PuntajePuntaje calculado de la EPA.
EPA ResultadoRazón de finalización de la EPA.
EPA PreguntasRespondidas / 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

HTTPCódigoCausa
400VALIDATION_ERRORFaltan campos, fechas mal formadas, rango > 92 días, formato / status / timezone desconocido.
401INVALID_API_KEYAPI key faltante o desconocida.
401INVALID_SIGNATURECabecera X-Signature ausente, o firma HMAC no coincide.
401TIMESTAMP_EXPIREDX-Timestamp está más de 5 minutos fuera de sincronía con UTC.
403INSUFFICIENT_SCOPELa API key no tiene el permiso analytics:export.
404RESOURCE_NOT_FOUNDEl jobId no existe o pertenece a otro cliente.
429RATE_LIMIT_EXCEEDEDDemasiadas solicitudes por minuto. Espera y reintenta.
503INTERNAL_ERRORServicio 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