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.
El token
Sección titulada «El token»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.
Enviar un ticket
Sección titulada «Enviar un ticket»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/jsony el ticket como cuerpo. Sirve para tickets sin archivos (por ejemplo, una conversación de WhatsApp con sus mensajes encomments). Máximo 10 MiB. - Multipart:
multipart/form-datacon una parteticketque 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).
Respuesta
Sección titulada «Respuesta»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ódigos de respuesta
Sección titulada «Códigos de respuesta»| 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. |
Consultar un ticket
Sección titulada «Consultar un ticket»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.
Entregas por API
Sección titulada «Entregas por API»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/deliveriesconmultipart/form-data: la partefilecon el ZIP y, opcionalmente,delivery_id. Responde202con la entrega en estadoRECEIVED; se procesa en segundo plano. Si el workspace no tiene conexión de carga masiva, responde400.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.
Ejemplo completo con curl
Sección titulada «Ejemplo completo con curl»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:
stat -c %s llamada-48213.mp3shasum -a 256 llamada-48213.mp3Guardá 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:
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.

