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
| Ruta | Qué hace |
|---|---|
| GET /organizations/{orgId}/tasks | Lista con filtros: scope, status, contactId, conversationId, limit (1–500, default 100). Pendientes primero, las más nuevas arriba. |
| POST /organizations/{orgId}/tasks | Crea una tarea: contactId, title y dueAt obligatorios; description, conversationId y assignedToUserId opcionales. |
| GET /organizations/{orgId}/tasks/counts | Conteos para badges: badge, mine, overdue, dueToday, teamPending. |
| GET /organizations/{orgId}/contacts/{contactId}/tasks | Tareas de un contacto (para la ficha del contacto). |
| PATCH /organizations/{orgId}/tasks/{taskId} | Edita title, description, dueAt o assignedToUserId. |
| PATCH /organizations/{orgId}/tasks/{taskId}/claim | Toma 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 conassignedToUserId: null.scope=all(o sin parámetro) → todas las de la organización.status=pending→ sin completar y condueAten el futuro.status=overdue→ sin completar y ya vencida.status=completed→ concompletedAt.- Cada tarea trae
origin(MANUALoBOT), 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
assignedToUserIdla tarea nace con dueño y él recibe el aviso; connullva a la cola del equipo. claimsolo funciona sobre tareas sin dueño. Para reasignar una que ya lo tiene, usaPATCHcon otroassignedToUserId.- 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: nullyassignedToUserId: 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.descriptioncon 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:
completedByUserIdqueda 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
- Tu CRM crea la tarea al detectar un seguimiento (por ejemplo, tras
sale.completedo una cotización enviada), conconversationIdpara que aparezca en el inbox. - Los asesores la ven en la cola (
scope=team) y la toman conclaim. - Al terminar la marcan con
complete; el panel se entera portask.changed. - Cada mañana,
scope=team&status=overduemuestra lo que el bot dejó pendiente durante la noche y nadie ha atendido.
Notas
dueAtes 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.