VitrinaAPI

Automatizar respuestas y asignaciones

Respuestas guardadas que un agente aplica en un clic, y el enrutamiento de conversaciones.

Una macro la dispara una persona desde el inbox. Una regla de asignación corre sola, sin que nadie la llame, cada vez que llega una conversación nueva.

Macros

Una macro guarda texto para el cliente (content, o un paso send_message) y una lista ordenada de actions. Esa lista acepta notas, etiquetas, cambios de estado, posponer, asignar a un agente o a un equipo, y mover un lead de etapa. Un paso que falla queda registrado y los siguientes corren igual. Por eso un 200 con fallas adentro es normal.

Leer pide macros:read; el CRUD pide macros:write. Ejecutar también pide solo macros:read, aunque correr una macro le mande un mensaje al cliente y cambie el estado del ticket. Tenlo en cuenta al repartir ese permiso.

curl -X POST https://api.vitrinadev.com/api/v1/macros \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Cierre agradecido",
    "content": "Gracias por escribirnos, [[nombre]]. Cualquier otra duda, aquí estamos.",
    "actions": [{ "type": "change_status", "value": "resolved" }],
    "params": [{ "key": "nombre", "label": "Nombre del cliente", "input_type": "text" }]
  }'
{
  "data": {
    "id": "d3d3d3d3-0000-4000-8000-000000000001",
    "tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
    "name": "Cierre agradecido",
    "content": "Gracias por escribirnos, [[nombre]]. Cualquier otra duda, aquí estamos.",
    "actions": [{ "id": "a1", "type": "change_status", "value": "resolved" }],
    "params": [{ "key": "nombre", "label": "Nombre del cliente", "input_type": "text" }],
    "active": true,
    "usage_count": 0,
    "created_at": "2026-09-22T13:00:00.000Z",
    "updated_at": "2026-09-22T13:00:00.000Z"
  }
}

Las plantillas tienen dos tipos de marcador. {{auto}} se resuelve solo desde la conversación; [[manual]] es lo que el agente tiene que completar.

El flujo revisado son dos llamadas. GET /macros/{id}/prepare arma el borrador sin enviar nada, y POST /macros/{id}/run envía el texto que el agente aprobó y corre los pasos. POST /macros/{id}/apply es la versión directa, sin revisión, pensada para macros sin parámetros manuales y para automatización.

Reglas de asignación

El enrutamiento es ordenado y gana la primera coincidencia. Cada regla filtra por canal (match_channels) y, si quieres, por origen (match_sources). Apunta a un destino: un equipo o una lista de agentes. Gana la primera regla, en orden de priority, cuyo filtro coincida y cuyo destino no esté vacío.

Leer pide routing:read; escribir, routing:write.

curl -X POST https://api.vitrinadev.com/api/v1/assignment-rules \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "WhatsApp → equipo de soporte",
    "match_channels": ["whatsapp"],
    "team_id": "cccccccc-0000-4000-8000-000000000001"
  }'
{
  "data": {
    "id": "d5d5d5d5-0000-4000-8000-000000000001",
    "tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
    "name": "WhatsApp → equipo de soporte",
    "priority": 0,
    "enabled": true,
    "match_sources": null,
    "match_channels": ["whatsapp"],
    "team_id": "cccccccc-0000-4000-8000-000000000001",
    "assignee_user_ids": null,
    "assignment_mode": "auto_round_robin",
    "is_portal_default": false,
    "created_at": "2026-09-22T13:00:00.000Z",
    "updated_at": "2026-09-22T13:00:00.000Z"
  }
}

Una regla nueva se agrega siempre al final; mandar una priority propia se rechaza. Para reordenar, usa PUT /assignment-rules/order con todos los ids en el orden nuevo. Se aplica todo o nada.

Dar de baja a un miembro con DELETE /memberships/{id} (Equipo) quita su id de cada regla y de la rotación de cada canal. La asignación solo reparte entre miembros activos. Si guardas tu propia copia de assignee_user_ids, puede quedar desactualizada: vuelve a leerla antes de usarla.

Los contratos completos están en la referencia de Macros y de Reglas de asignación.

En esta página