Fijar SLAs y automatizar acciones
Los objetivos de tiempo de un ticket y las automatizaciones que corren solas.
POST /slas guarda un objetivo de tiempo; POST /triggers guarda una automatización. Los dos recursos suelen configurarse juntos, porque el trigger más común avisa que un SLA está por vencer.
SLAs
Una política de SLA lleva un nombre y dos objetivos opcionales en minutos: primera respuesta y resolución. El filtro applies_to dice a qué conversaciones aplica: canal, marca o prioridad, lo mismo que el enrutamiento del workspace ya usa para distinguirlas. business_hours_only pausa el reloj fuera del horario del equipo en vez de contar tiempo corrido.
Leer pide slas:read; escribir, slas:write.
curl -X POST https://api.vitrinadev.com/api/v1/slas \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Soporte estándar",
"target_first_response_minutes": 30,
"target_resolution_minutes": 1440,
"business_hours_only": true,
"applies_to": { "channel": "whatsapp" }
}'{
"data": {
"id": "d7d7d7d7-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"name": "Soporte estándar",
"target_first_response_minutes": 30,
"target_resolution_minutes": 1440,
"business_hours_only": true,
"applies_to": { "channel": "whatsapp" },
"active": true,
"created_at": "2026-01-10T13:00:00.000Z",
"updated_at": "2026-09-10T13:00:00.000Z"
}
}name es único por workspace y repetirlo devuelve un 409. Los dos objetivos son independientes: una política puede fijar solo primera respuesta, solo resolución, o ambos.
Ninguna política se aplica sola todavía
Todavía nada resuelve de forma automática qué política aplica a una
conversación o a un ticket a partir de applies_to. Ese cruce lo hacen las
superficies que ya conocen el SLA, como el tablero de tickets y el reloj de
cobertura. Borrar una política con DELETE /slas/{id} tampoco recalcula nada
hacia atrás: los tickets que ya la tenían conservan el estado de cobertura al
que habían llegado.
Triggers
Un trigger dispara cuando ocurre su event. Los eventos incluyen que una conversación quede inactiva, que llegue un mensaje, o que un ticket se cree, se resuelva o se asigne. Antes de correr, el trigger revisa sus conditions, un árbol { logic: 'all' | 'any', items: [{ field, op, value }] }. Si esas condiciones se cumplen, ejecuta sus actions en orden.
Una acción puede enviar un mensaje, agregar una nota privada o llamar un webhook. También puede asignar a una persona o a un equipo, mover un lead de etapa, agregar una etiqueta, cambiar el estado o posponer.
Leer pide triggers:read; escribir, triggers:write.
curl -X POST https://api.vitrinadev.com/api/v1/triggers \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Avisar si nadie responde en 2 horas",
"event": "conversation_idle",
"duration_hours": 2,
"conditions": { "logic": "all", "items": [{ "field": "channel", "op": "eq", "value": "whatsapp" }] },
"actions": [{ "type": "assign_team", "value": "cccccccc-0000-4000-8000-000000000001" }]
}'{
"data": {
"id": "d8d8d8d8-0000-4000-8000-000000000001",
"name": "Avisar si nadie responde en 2 horas",
"event": "conversation_idle",
"duration_hours": 2,
"conditions": { "logic": "all", "items": [{ "id": "c1", "field": "channel", "op": "eq", "value": "whatsapp" }] },
"actions": [{ "id": "a1", "type": "assign_team", "value": "cccccccc-0000-4000-8000-000000000001" }],
"enabled": true,
"fire_once_per_conversation": true,
"stop_after_run": false,
"run_count": 0,
"last_run_at": null
}
}event: "conversation_idle" exige duration_hours, entre 1 y 720; cualquier otro evento lo ignora. El id de cada condición y de cada acción es una llave local dentro del propio trigger. Sirve para que una edición futura pueda decir cuál reemplazar, y no apunta a ningún otro recurso. Si no la mandas, la API la asigna.
Trampa
Editar un trigger no presta autoridad de envío
Crear o editar un trigger con una acción send_message o add_private_note
no pide el scope messages:send. El mensaje sale cuando el trigger dispara,
no en la llamada que lo crea, y esa llamada no le da a tu credencial permiso
para enviar.
Los contratos completos están en la referencia de SLAs y de Triggers. Para recibir sla.breached y los eventos que un trigger dispara, ve Webhooks.