Tareas

Una tarea es un pendiente con fecha sobre un contacto: "llamar a Ana el martes", "enviar la cotización", "el cliente pidió asesor fuera de horario". Puede tener dueño o quedar en la cola del equipo para que alguien la tome. Las crean las personas desde el inbox o la API, y también el bot.

Referencia completa en Contenido y CRM · Tareas. Permisos: contacts:read para listar y completar las propias, contacts:write para crear, editar, tomar y borrar.

Endpoints

RutaQué hace
GET /organizations/{orgId}/tasksLista con filtros: scope, status, contactId, conversationId, limit (1–500, default 100). Pendientes primero, las más nuevas arriba.
POST /organizations/{orgId}/tasksCrea una tarea: contactId, title y dueAt obligatorios; description, conversationId y assignedToUserId opcionales.
GET /organizations/{orgId}/tasks/countsConteos para badges: badge, mine, overdue, dueToday, teamPending.
GET /organizations/{orgId}/contacts/{contactId}/tasksTareas de un contacto (para la ficha del contacto).
PATCH /organizations/{orgId}/tasks/{taskId}Edita title, description, dueAt o assignedToUserId.
PATCH /organizations/{orgId}/tasks/{taskId}/claimToma una tarea de la cola del equipo y la asigna a quien llama.
PATCH /organizations/{orgId}/tasks/{taskId}/complete{ completed: true | false } marca completa o la reabre.
DELETE /organizations/{orgId}/tasks/{taskId}Elimina la tarea.

Alcance y estado

  • scope=mine → asignadas a quien llama. scope=team → la cola del equipo: tareas con assignedToUserId: null. scope=all (o sin parámetro) → todas las de la organización.
  • status=pending → sin completar y con dueAt en el futuro. status=overdue → sin completar y ya vencida. status=completed → con completedAt.
  • Cada tarea trae origin (MANUAL o BOT), el contacto resumido, quién la creó, quién la tiene y quién la completó.
# La cola del equipo, solo lo vencido
curl "https://api.mosend.dev/organizations/${ORG_ID}/tasks?scope=team&status=overdue" \
  -H "X-Api-Key: ${API_KEY}"

Crear, tomar y completar

# Tarea para el equipo (sin dueño): cualquiera la puede tomar
curl -X POST "https://api.mosend.dev/organizations/${ORG_ID}/tasks" \
  -H "X-Api-Key: ${API_KEY}" -H "Content-Type: application/json" \
  -d '{
    "contactId": "<contactId>",
    "conversationId": "<conversationId>",
    "title": "Enviar cotización del plan anual",
    "description": "Pidió precio para 5 usuarios; ya tiene NIT registrado.",
    "dueAt": "2026-09-09T14:00:00-05:00",
    "assignedToUserId": null
  }'

# Tomarla
curl -X PATCH "https://api.mosend.dev/organizations/${ORG_ID}/tasks/${TASK_ID}/claim" -H "X-Api-Key: ${API_KEY}"

# Completarla (o reabrirla con false)
curl -X PATCH "https://api.mosend.dev/organizations/${ORG_ID}/tasks/${TASK_ID}/complete" \
  -H "X-Api-Key: ${API_KEY}" -H "Content-Type: application/json" \
  -d '{ "completed": true }'
  • Con assignedToUserId la tarea nace con dueño y él recibe el aviso; con null va a la cola del equipo.
  • claim solo funciona sobre tareas sin dueño. Para reasignar una que ya lo tiene, usa PATCH con otro assignedToUserId.
  • Completar o reabrir una tarea ajena (ni asignado ni creador) exige organizations:write (admin u owner).

Tareas que crea el bot

Cuando un cliente pide hablar con una persona y el equipo está fuera de horario, el bot no traspasa a nadie: crea una tarea para el equipo, le dice al cliente cuándo lo contactan y sigue atendiendo. Cómo se configura está en Handoff a humano · Fuera de horario. Esas tareas se reconocen por:

  • origin: "BOT", createdByUserId: null y assignedToUserId: null (cola del equipo).
  • dueAt = la próxima apertura del horario más los minutos de gracia configurados; el recordatorio al equipo sale al vencer, no de madrugada.
  • description con el canal, el agente que atendía, el motivo y un resumen de la conversación que redacta la IA. Si el cliente insiste esa misma noche, se anota en la misma tarea en vez de crear otra.
  • Se completan solas cuando una persona responde en esa conversación: completedByUserId queda con quien contestó. No hace falta cerrarlas a mano.

Evento en vivo: task.changed

Cada creación, edición, toma, cierre, reapertura o borrado emite task.changed en el canal en tiempo real de la organización (el WebSocket que usa el panel). Es lo que hace que la lista, el badge y la pestaña del inbox se refresquen sin recargar.

{
  "action": "created",          // created | updated | claimed | completed | reopened | deleted
  "taskId": "…",
  "contactId": "…",
  "conversationId": "…",        // o null
  "assignedToUserId": null,     // null = tarea de equipo
  "title": "Enviar cotización del plan anual"
}

No es un webhook saliente: hoy no hay evento de tareas en Webhooks salientes. Para sincronizar con un sistema externo, consulta GET …/tasks con los filtros de arriba.

Flujo típico

  1. Tu CRM crea la tarea al detectar un seguimiento (por ejemplo, tras sale.completed o una cotización enviada), con conversationId para que aparezca en el inbox.
  2. Los asesores la ven en la cola (scope=team) y la toman con claim.
  3. Al terminar la marcan con complete; el panel se entera por task.changed.
  4. Cada mañana, scope=team&status=overdue muestra lo que el bot dejó pendiente durante la noche y nadie ha atendido.

Notas

  • dueAt es un instante ISO 8601; envíalo con zona horaria para que "hoy" y "vencida" coincidan con el horario de la organización.
  • Si tu API key tiene scope por número, las tareas se ven igual: no dependen del número, sino del contacto.