Receta 4 — Carga por archivo CSV (upload)¶
Lo que vas a lograr: lanzar una campaña subiendo un archivo .csv directamente
(multipart) con POST /api/campaign/start-upload, en lugar de pegar el CSV como texto dentro
del JSON. Útil cuando tu lista es grande, la exportas directo de Excel, o tu pipeline genera un
archivo en disco.
start (CSV inline) vs. start-upload (archivo) — ¿cuál uso?¶
Ambos lanzan una campaña real de inmediato; la validación, la selección de agent y el comportamiento de marcado son idénticos. La única diferencia es cómo le pasas el CSV.
POST /api/campaign/start |
POST /api/campaign/start-upload |
|
|---|---|---|
| Content-Type | application/json |
multipart/form-data |
| El CSV va en… | el campo csv_content (texto plano) |
un archivo adjunto (file) |
| Ideal para | listas chicas/medianas armadas por código | archivos grandes, exports de Excel, pipelines que generan .csv |
| Manejo de saltos de línea | tienes que escapar \n dentro del JSON |
el archivo va tal cual, sin escapar nada |
| Límite de tamaño | 10 MB | 10 MB |
| Respuesta | misma (incluye campaign_id) |
misma (incluye campaign_id) |
Regla práctica: si ya tienes el CSV como archivo, usa start-upload — te evita escapar
saltos de línea y comillas dentro del JSON. Si armas la lista en memoria desde tu código, start
con csv_content suele ser más directo.
Prerrequisitos¶
- API Key con scope
full. - Un archivo
.csvválido (ver columnas requeridas abajo). Máximo 10 MB.
Paso 1 — Preparar el archivo CSV¶
Las columnas requeridas dependen del campaign_type (igual que en start):
campaign_type |
Columnas requeridas |
|---|---|
collections |
to_number, lead_id, client_name, debt |
sdr |
to_number, lead_id, client_name |
cx |
to_number, lead_id, client_name |
interviewer |
to_number, lead_id, client_name, position |
to_numberen formato E.164 (+525512345678).lead_idúnico por contacto.- Las columnas extra (ej.
Fecha_Limite_Pago) se preservan y se pasan al motor de llamadas. - Las filas sin
to_numbero sinlead_idse saltan.
Si quieres la plantilla exacta de un tipo:
Ejemplo de leads.csv (cobranza):
to_number,lead_id,client_name,debt
+525512345678,L001,Juan Pérez,5000.00
+525598765432,L002,María García,3500.50
Export de Excel: puedes subir el archivo tal como lo exporta Excel. El sistema lo decodifica como UTF-8 y maneja automáticamente el marcador inicial (BOM) de los exports "CSV UTF-8" de Excel, con un fallback para exports más antiguos. No necesitas convertirlo a mano.
Paso 2 — Subir el archivo y lanzar la campaña¶
POST /api/campaign/start-upload espera multipart/form-data. Con curl, cada campo va con
-F; el archivo se adjunta con -F "file=@ruta":
curl -s -X POST "$API_BASE_URL/api/campaign/start-upload" \
-H "X-API-Key: $API_KEY" \
-F "file=@leads.csv" \
-F "name=Cobranza Enero" \
-F "agent_id=agent_abc123" \
-F "campaign_type=collections" \
-F "customer_email=ops@tuempresa.com"
| Campo del form | Requerido | Notas |
|---|---|---|
file |
Sí | El archivo .csv. Máx. 10 MB. |
name |
Sí | Nombre de la campaña. |
agent_id |
No | Si se omite, usa el agent default de tu organización (si está configurado). |
campaign_type |
No | Default collections. Debe coincidir con el tipo del agent. |
customer_email |
No | Email para notificaciones. |
Respuesta (200) — idéntica a la de start:
{
"success": true,
"campaign_id": 789,
"total_leads": 2,
"agent_id": "agent_abc123",
"campaign_type": "collections",
"message": "Campaign 'Cobranza Enero' started"
}
⚠️ Igual que
start, esto dispara llamadas reales de inmediato. Si es tu primera vez, valida antes con la Receta 2 — Probar sin impacto.
Ejemplo en Python¶
import requests
API_BASE_URL = "https://api.neuronstudio.ai"
API_KEY = "nrn_live_tu_key_aqui"
headers = {"X-API-Key": API_KEY}
with open("leads.csv", "rb") as f:
resp = requests.post(
f"{API_BASE_URL}/api/campaign/start-upload",
headers=headers,
files={"file": ("leads.csv", f, "text/csv")},
data={
"name": "Cobranza Enero",
"agent_id": "agent_abc123",
"campaign_type": "collections",
},
)
print(resp.json())
Paso 3 — Continuar el flujo normal¶
A partir del campaign_id que devuelve el upload, el resto del flujo es idéntico al de la
Receta 1:
- Monitorear:
GET /api/campaign/status. - Obtener resultados (polling):
GET /api/analytics/calls?campaign_ids=789— ver Receta 3 para el loop con cursor. - Detalle de una llamada:
GET /api/analytics/call/{call_id}.
Errores comunes¶
| Código | Causa | Cómo resolverlo |
|---|---|---|
400 |
Faltan columnas requeridas para el campaign_type. |
Revisa la tabla de columnas del Paso 1. El cuerpo del error indica el problema de validación (de forma genérica). |
400 |
El archivo supera 10 MB, está vacío, o no se puede decodificar. | Divide la lista en archivos más chicos; verifica que sea un .csv de texto válido. |
403 |
Tu API Key tiene scope read, no full. |
start-upload requiere scope full. Pide una key con scope full a tu contacto de Neuron. |
403 |
El agent_id no pertenece a tu organización. |
Usa un agent_id de GET /api/agents. |
409 |
Ya hay una campaña activa. | Solo puede haber una campaña activa por organización. Espera a que termine, o stop la actual. |
422 |
La funcionalidad no está habilitada para tu organización. | Contacta a tu equipo de Neuron. |
429 |
Límite de uso alcanzado. | Espera el tiempo indicado en el header Retry-After y reintenta. |
Todos los errores devuelven un cuerpo con
error_idyrequest_id. Si necesitas soporte, cita esos dos valores para que tu equipo de Neuron correlacione el caso.
Resumen¶
1. Preparar leads.csv (columnas según campaign_type; máx 10 MB)
│
2. POST /api/campaign/start-upload (multipart: file + name + agent_id + campaign_type)
│ → campaign_id ⚠️ llamadas reales
│
3. Flujo normal ──► status → analytics/calls (polling + cursor) → analytics/call/{id}
Si prefieres pasar el CSV como texto en lugar de archivo, mira POST /api/campaign/start en la
Receta 1 — Primera integración.