Tasks
Tasks can be created, listed, updated, marked done, and commented on via the API.
Account API keys (il_live_) can only access record-scoped tasks. Standalone tasks return Task is not on a record.
Personal API keys (il_user_) can access all tasks you have permission for, including standalone tasks. They also have access to additional endpoints for listing and creating standalone tasks (see Standalone tasks below).
All endpoints require an API key with read access to the task's workspace. Write operations additionally require the key to not be read-only.
Create a task on a record
POST /api/tasks/onRecord/<table_id>/<record_id>/create
Request body
{
"title": "Send proposal",
"details": "Draft is attached to the record",
"assignee_email": "sam@example.com",
"due_date": "2026-05-01",
"due_time": "09:00",
"reminder_offset_mins": 30
}
| Field | Type | Notes |
|---|---|---|
title |
string | Required. |
details |
string | Optional long text. |
assignee_user_id |
int | Takes precedence if both id and email are given. |
assignee_email |
string | Must be a current space member. |
due_date |
YYYY-MM-DD |
Optional. |
due_time |
HH:MM |
Optional, only valid alongside due_date. |
reminder_offset_mins |
int | Minutes before the due datetime. Requires due_time. |
reminder_time |
HH:MM |
Time of day on due_date (date-only tasks). Mutually exclusive with reminder_offset_mins. |
Response
{
"id": 19,
"creator_user_id": 4,
"assignee_user_id": 9,
"account_id": 1,
"space_id": 2,
"table_id": 101,
"record_id": 42,
"title": "Send proposal",
"details": "Draft is attached to the record",
"due_date": "2026-05-01",
"due_time": "09:00:00",
"reminder_offset_mins": 30,
"reminder_time": null,
"reminder_at": "2026-05-01 08:30:00",
"reminder_sent_at": null,
"status": "open",
"completed_at": null,
"completed_by_user_id": null,
"created_at": "2026-04-15 14:32:01",
"updated_at": "2026-04-15 14:32:01"
}
List tasks on a record
GET /api/tasks/onRecord/<table_id>/<record_id>/list
Query parameters
status—openordone. Omit for all.limit(default 50, max 200)offset(default 0)
Get a single task
GET /api/task/<task_id>/get
Returns the task row plus comment_count, subscribers (user ids),
subscribed (boolean for the calling key's owning user), table_name,
record_title, and a recent_comments array with the latest 20
comments.
Update a task
POST /api/task/<task_id>/update
Any of title, details, due_date, due_time, reminder_offset_mins,
reminder_time, assignee_user_id, assignee_email. Reassignment fires a
single TASK_ASSIGNED notification to the new assignee.
Delete a task
POST /api/task/<task_id>/delete
Mark done / undone
POST /api/task/<task_id>/markDone
POST /api/task/<task_id>/markUndone
Both return {"ok": true|false, "status": "done"|"open"}. ok is
false when the call is idempotent (e.g. marking an already-done task
done again).
Subscribe / unsubscribe
POST /api/task/<task_id>/subscribe
POST /api/task/<task_id>/unsubscribe
| Field | Type | Notes |
|---|---|---|
force |
bool | If true, no-op when already in target state instead of returning an error |
Returns {"ok": true, "subscribed": true} or {"ok": true, "subscribed": false}.
Without force, subscribing when already subscribed (or unsubscribing when not) returns an error.
Comments
GET /api/task/<task_id>/comments/get (limit, offset)
POST /api/task/<task_id>/comments/create {content}
POST /api/task/<task_id>/comment/<comment_id>/update {content}
POST /api/task/<task_id>/comment/<comment_id>/delete
Comments created via an API key have user_id = 0, user_name =
"API: <key name>", and api_key_id set — same convention as record
comments. Authors can edit their own comments for 15 minutes after
creation.
Task comments support the same mention token format as record comments:
@{<user_id>:<display_name>}. Only current workspace members are valid.
When a valid token is created, the mentioned user gets a
task.comment.mention notification and is auto-subscribed to the task.
Task comments support the same mention token format as record comments:
@{<user_id>:<display_name>}. Only current workspace members are valid.
When a valid token is created, the mentioned user gets a
task.comment.mention notification and is auto-subscribed to the task.
Task comments support the same mention token format as record comments:
@{<user_id>:<display_name>}. Only current workspace members are valid.
When a valid token is created, the mentioned user gets a
task.comment.mention notification and is auto-subscribed to the task.
Standalone tasks (personal keys only)
These endpoints are only available with personal API keys (il_user_).
List your tasks
POST /api/tasks/list
| Field | Type | Notes |
|---|---|---|
tab |
string | my (default), delegated, or all |
search |
string | Optional text search |
include_done |
bool | Include completed tasks (default false) |
limit |
int | Default 50, max 200 |
offset |
int | Default 0 |
Create a standalone task
POST /api/tasks/create
| Field | Type | Notes |
|---|---|---|
title |
string | Required |
details |
string | Optional |
assignee_user_id |
int | Optional (defaults to yourself) |
assignee_email |
string | Alternative to user_id |
due_date |
YYYY-MM-DD |
Optional |
due_time |
HH:MM |
Optional |
reminder_offset_mins |
int | Minutes before due datetime |
reminder_time |
HH:MM |
Time of day on due_date |
Badge count
POST /api/tasks/badgeCount
Returns {"count": <n>} — open tasks assigned to you that are due today or overdue.
File attachments
Task and task-comment endpoints accept an attachments array shaped like
record file fields: [{path,name,size,type,host},...]. Session-only
— attachments cannot be set or uploaded with API keys. Attempting to
include attachments in a public-API call returns
Attachments cannot be set via the public API.
The browser-only upload endpoints (no API key access) are:
POST /api/tasks/upload (new standalone)
POST /api/tasks/onRecord/<table_id>/<record_id>/upload (new record-linked)
POST /api/task/<task_id>/upload (existing task)
POST /api/task/<task_id>/comments/upload (existing task's comment)
Each takes {name, type, data} (data = base64-encoded bytes, max 50 MB).
Existing-task uploads return {name,path,size,type,host}. New-task uploads
return staged metadata with a staged_token. Pass the metadata through to
the task/comment create or update payload as attachments: [...].
For new tasks, the file stays in local session staging until Task::create()
assigns the task id, then uploads once to final task-{id}-... storage and
returns the final path on the created task.
Removing an attachment via /task/<id>/update (by passing an attachments
array that omits an entry the task previously had) queues the dropped path
for delayed S3 cleanup. Task comment attachments are frozen at post — to
remove a comment's attachment, delete the comment.
Permission errors
| Error | Meaning |
|---|---|
Task is not on a record |
Account API key tried to reach a standalone task. |
API key not authorized for this workspace |
Account key's space whitelist excludes this task's space. |
API key is read-only |
Read-only key attempted a write operation. |
Endpoint not available to personal API keys |
Personal key tried to call an endpoint not in its allowlist. |
Not authorized |
Task whose space the user cannot read, or non-creator/non-assignee trying to edit. |