Ir al contenido

API

La conexión de API es para que tu sistema de gestiones mande cada ticket nuevo a Sniff! cuando se cierra la gestión. La crea el Admin en Configuración › Conexiones › API › Conectar. Es una por workspace.

Al crear la conexión Sniff! muestra el token una sola vez, con el aviso Copiá el token ahora: no se vuelve a mostrar. y el botón Copiar. Tiene la forma sniff_<prefijo>_<secreto>. Guardalo en tu sistema: después sólo vas a ver el prefijo y la fecha del último uso.

Si lo perdés o querés rotarlo, usá Regenerar token. El token anterior deja de andar en el acto y aparece el nuevo, también una sola vez. Al eliminar la conexión el token queda inválido.

Cada pedido lleva el token en una de estas cabeceras:

Authorization: Bearer sniff_ab12cd34_…
X-API-Key: sniff_ab12cd34_…

Sin token, o con uno que no corresponde a una conexión activa, la respuesta es 401. Hay un límite de pedidos por minuto por token: si lo superás, la API responde 429 con la cabecera Retry-After.

POST https://app.sniff.com.ar/api/v1/tickets

El cuerpo es un ticket en el formato ticket/1.0 descripto en Formato del ticket. La API sólo crea: un source_ticket_id ya importado en la conexión no se modifica.

Hay dos formas de mandarlo:

  • JSON: Content-Type: application/json y el ticket como cuerpo. Sirve para tickets sin archivos (por ejemplo, una conversación de WhatsApp con sus mensajes en comments). Máximo 10 MiB.
  • Multipart: multipart/form-data con una parte ticket que trae el JSON y una parte por cada archivo referenciado. El nombre de cada parte de archivo es la ruta que figura en el ticket (assets/...). Es la forma de mandar una llamada con su grabación.

Todo archivo que el ticket referencia tiene que venir en el pedido, y no puede venir ninguno que el ticket no referencie. Cada archivo se verifica contra su referencia: tamaño exacto, SHA-256 y que el contenido sea del tipo declarado (ver Archivos y límites).

201 Created con el ticket tal como quedó en Sniff!:

{
"id": "0192f3a1-5b7c-7d20-9e4a-3c8b1f2d6a01",
"source_ticket_id": "gestion-48213",
"status": "NEW",
"channel": "call",
"created_at": "2026-10-16T14:05:11.312Z"
}

status es el estado inicial del ticket: TRANSCRIBED si trajo la conversación en comments, NEW si trajo sólo la grabación (se transcribe si la conexión tiene Transcribir audios) y SKIPPED si no trajo ni mensajes ni grabación (no hay nada que evaluar). channel es call si hay grabación, whatsapp si el campo source del ticket contiene la palabra «whatsapp» y chat en el resto de los casos.

Código Cuándo
201 Ticket creado.
400 El ticket es válido pero no se puede importar: el asignado no es un usuario del workspace que pueda ser evaluado, falta un archivo referenciado, un archivo no coincide con su referencia o llegó un archivo que el ticket no referencia. El mensaje dice cuál.
401 Falta el token o no es válido.
409 El source_ticket_id ya fue importado: «la API sólo crea tickets».
413 El JSON supera 10 MiB o los archivos del pedido superan el tamaño admitido.
422 El JSON no cumple el contrato (campo desconocido, fecha sin zona horaria, usuario referenciado que no está en users, etc.). La respuesta lista cada error con su ubicación.
429 Demasiados pedidos por minuto.

GET https://app.sniff.com.ar/api/v1/tickets/{source_ticket_id}

Devuelve el mismo objeto que la creación, con el estado actual del ticket, o 404 si ese id no se importó por esta conexión.

Si además tenés una conexión de Carga masiva, podés subir el mismo ZIP que subirías desde la app:

  • POST https://app.sniff.com.ar/api/v1/deliveries con multipart/form-data: la parte file con el ZIP y, opcionalmente, delivery_id. Responde 202 con la entrega en estado RECEIVED; se procesa en segundo plano. Si el workspace no tiene conexión de carga masiva, responde 400.
  • GET https://app.sniff.com.ar/api/v1/deliveries/{delivery_id} para ver el resultado: estado, conteos y errores por ticket.

Las entregas subidas así aparecen en Ver entregas de la conexión de carga masiva con la marca (API). Formato y reglas en Carga masiva.

Una llamada saliente de la operadora Ana Pérez con su grabación en MP3. Primero calculá el tamaño y el SHA-256 del archivo:

Ventana de terminal
stat -c %s llamada-48213.mp3
shasum -a 256 llamada-48213.mp3

Guardá el ticket en ticket.json con esos valores:

{
"schema_version": "ticket/1.0",
"source_ticket_id": "gestion-48213",
"subject": "Llamada saliente",
"source": "central",
"created_at": "2026-10-16T13:40:00-03:00",
"updated_at": "2026-10-16T13:46:30-03:00",
"requester_source_user_id": "cliente-7781",
"assignee_source_user_id": "op-ana",
"custom_fields": { "cartera": "Tarjeta", "dias_atraso": 42 },
"users": [
{ "source_user_id": "op-ana", "role": "agent", "name": "Ana Pérez", "email": "ana.perez@agencianorte.com" },
{ "source_user_id": "cliente-7781", "role": "user", "name": "Cliente" }
],
"comments": [],
"calls": [
{
"source_call_id": "gestion-48213-llamada",
"created_at": "2026-10-16T13:40:00-03:00",
"direction": "outbound",
"media": {
"path": "assets/llamada-48213.mp3",
"file_name": "llamada-48213.mp3",
"content_type": "audio/mpeg",
"bytes": 2318944,
"sha256": "9f2c1a7e0b4d5c6e8a1b2c3d4e5f60718293a4b5c6d7e8f9a0b1c2d3e4f5a6b7"
},
"fields": { "duration_seconds": 390 }
}
],
"tags": ["saliente"]
}

Y mandalo:

Ventana de terminal
curl -X POST https://app.sniff.com.ar/api/v1/tickets \
-H "Authorization: Bearer sniff_ab12cd34_tu-token" \
-F "ticket=@ticket.json;type=application/json" \
-F "assets/llamada-48213.mp3=@llamada-48213.mp3;type=audio/mpeg"

El mail de op-ana tiene que ser el de un usuario del workspace con rol Reviewee o Evaluador y reviewee y que no esté Inactivo; si no, la respuesta es 400 con el motivo. Repetir el mismo pedido devuelve 409.

sniff.com.ar · Pedir una demo · Privacidad · Términos · ¿Falta algo? Escribinos a info@sniff.com.ar.