Tasks
A task has a title, a priority, a start date and optionally a recurrence, reminders, an assignee and a linked contact. A recurring task produces occurrences, each with its own status (todo or done).
- GET
/v1/tasks/occurrencesList task occurrences - GET
/v1/tasks/optionsRetrieve the task options of an entity - POST
/v1/tasksCreate a task - GET
/v1/tasks/{id}Retrieve a task - PATCH
/v1/tasks/{id}Update a task - DELETE
/v1/tasks/{id}Delete a task - PUT
/v1/tasks/{id}/occurrences/statusMark an occurrence as done or to do - POST
/v1/tasks/{id}/occurrences/skipSkip an occurrence
Create a task
Section titled “Create a task”curl -s -X POST "$MLT_API_URL/v1/tasks" \ -H "Authorization: Bearer $MLT_TOKEN" -H "Content-Type: application/json" \ -d '{ "entityId": "0192f3a1-7c2e-7b4d-9a61-200000000002", "title": "Relancer Marie Durand - état des lieux", "priority": "high", "startAt": "2026-10-06T07:00:00.000Z", "timezone": "Europe/Paris", "reminders": [{ "offsetMinutes": 60 }], "assigneeId": "0192f3a1-7c2e-7b4d-9a61-300000000003", "contactId": "0192f3a1-7c2e-7b4d-9a61-600000000001" }'const task = await fetch(`${process.env.MLT_API_URL}/v1/tasks`, { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ entityId, title: 'Relancer Marie Durand - état des lieux', priority: 'high', startAt: '2026-10-06T07:00:00.000Z', timezone: 'Europe/Paris', reminders: [{ offsetMinutes: 60 }], assigneeId, contactId, }),}).then((r) => r.json());task = requests.post(f"{api}/v1/tasks", headers=headers, json={ "entityId": entity_id, "title": "Relancer Marie Durand - état des lieux", "priority": "high", "startAt": "2026-10-06T07:00:00.000Z", "timezone": "Europe/Paris", "reminders": [{"offsetMinutes": 60}], "assigneeId": assignee_id, "contactId": contact_id,}).json()$task = json_decode((string) $http->post("$api/v1/tasks", [ 'headers' => $headers, 'json' => [ 'entityId' => $entityId, 'title' => 'Relancer Marie Durand - état des lieux', 'priority' => 'high', 'startAt' => '2026-10-06T07:00:00.000Z', 'timezone' => 'Europe/Paris', 'reminders' => [['offsetMinutes' => 60]], 'assigneeId' => $assigneeId, 'contactId' => $contactId, ],])->getBody(), true);| Field | Description |
|---|---|
priority |
low, medium (default) or high. |
startAt |
Date of the (first) occurrence, ISO 8601. |
timezone |
IANA time zone (default Europe/Paris), used for the recurrence and the reminders. |
reminders |
Up to 5, in minutes before each occurrence (GET /v1/tasks/options gives the defaults of the entity). Reminders outside the working hours of the entity are postponed to the next working slot. |
assigneeId |
A member who can use tasks in the entity (else 422 invalid_assignee). The assignee is notified. |
contactId |
An address book contact of the same entity. |
Recurrence
Section titled “Recurrence”{ "frequency": "weekly", "interval": 1, "weekdays": ["MO", "TH"], "until": "2026-12-31" }frequency:daily,weeklyormonthly;interval: every n periods (1-99).weekdays(weekly only):MO,TU,WE,TH,FR,SA,SU.- End with
until(a date, inclusive) orcount(1-1000), not both. Without either, the task repeats indefinitely.
Occurrences
Section titled “Occurrences”List what is due with GET /v1/tasks/occurrences?from=…&to=… (400 days max). scope=mine (default) returns the tasks created by or assigned to the caller; scope=team every task the caller can see (tasks.read_all).
- Mark one as done:
PUT /v1/tasks/{id}/occurrences/statuswith{ "occurrenceAt": "2026-10-06T07:00:00.000Z", "status": "done" }. This sends thetask.completedwebhook. - Skip one occurrence of a recurring task:
POST /v1/tasks/{id}/occurrences/skip.
occurrenceAt must be an occurrence of the task, as returned by the list (else 422 invalid_occurrence).