Todoist node reference - all 88 operations, the credential it needs, and a worked example.
Todoist unified API v1 (Project management). 88 operations: tasks (create, quick-add, list, filter queries, update, move, complete, reopen, delete, completed-by-date, productivity stats); projects (CRUD, archive, search, collaborators); sections; personal and shared labels; comments; time and location reminders; workspace folders; workspaces, members and invitations; project templates; user, activity log and ID migration.
Credential: Todoist API token - see Credentials.
Each operation below lists the scope it needs. Scopes are requested by an OAuth application in the scope parameter of the authorization URL, and consented to by the user. Todoist publishes exactly SIX scopes and they partition the API by verb, not by resource — there is no tasks:read or projects:write, so a grant is all-or-nothing across the whole account. The two that surprise people are siblings rather than a hierarchy: data:read_write does NOT include data:delete, so an app that can create and edit tasks still cannot delete one, and deleting a PROJECT needs a third scope (project:delete) on top of both. data:read_write does, however, include data:read and task:add. The remaining scope, backups:read, covers only the backup endpoints this node declines. The credential Pipory stores is normally a personal API token, and a personal token carries no scopes at all — created at Settings > Integrations > Developer, it acts with the full authority of the account that minted it, so for that credential the column below tells you what an OAuth app would have to ask for rather than what is missing. That changes what a 403 means: on a personal token it is almost never a permission checkbox, it is a PLAN gate (reminders, filters, comments, uploads, the activity log and backups are each gated by the Todoist plan, and the numeric limits are served per-user in the user_plan_limits object rather than fixed in the docs) or a workspace role the user does not hold. One more thing that is not a scope at all: an OAuth access token issued to a newly-registered Todoist app expires one hour after it is issued and must be refreshed, while a personal token does not expire — so a 401 on an OAuth credential is usually an aged-out token. Limit the blast radius by minting the personal token under a Todoist account that only collaborates on the projects the workflow needs. If a run fails with a permission error, the node names the missing scope in the error - grant it and re-run; you do not need to rebuild the workflow.
| Operation | What it does | Scope |
|---|
createTask | Create task | data:read_write (task:add alone is enough — it permits adding tasks and nothing else) |
quickAddTask | Quick add task (natural language) | data:read_write (task:add alone is enough — it permits adding tasks and nothing else) |
getTask | Get task | data:read |
listTasks | List active tasks | data:read |
listTasksByFilter | List tasks matching a filter query | data:read |
updateTask | Update task | data:read_write |
moveTask | Move task to project / section / parent | data:read_write |
completeTask | Complete task | data:read_write |
reopenTask | Reopen task | data:read_write |
deleteTask | Delete task | data:delete |
listCompletedTasksByCompletionDate | List completed tasks by completion date | data:read |
listCompletedTasksByDueDate | List completed tasks by due date | data:read |
getProductivityStats | Get productivity stats (karma) | data:read |
| Operation | What it does | Scope |
|---|
createProject | Create project | data:read_write |
getProject | Get project | data:read |
listProjects | List projects | data:read |
listArchivedProjects | List archived projects | data:read |
searchProjects | Search projects by name | data:read |
updateProject | Update project | data:read_write |
archiveProject | Archive project | data:read_write |
unarchiveProject | Unarchive project | data:read_write |
deleteProject | Delete project | project:delete |
listProjectCollaborators | List project collaborators | data:read |
joinProject | Join project | data:read_write |
getProjectPermissions | Get project role permissions | data:read |
| Operation | What it does | Scope |
|---|
createSection | Create section | data:read_write |
getSection | Get section | data:read |
listSections | List sections | data:read |
searchSections | Search sections by name | data:read |
updateSection | Update section | data:read_write |
archiveSection | Archive section | data:read_write |
unarchiveSection | Unarchive section | data:read_write |
deleteSection | Delete section | data:delete |
| Operation | What it does | Scope |
|---|
createLabel | Create personal label | data:read_write |
getLabel | Get label | data:read |
listLabels | List personal labels | data:read |
searchLabels | Search labels by name | data:read |
updateLabel | Update label | data:read_write |
deleteLabel | Delete personal label | data:delete |
listSharedLabels | List shared labels | data:read |
renameSharedLabel | Rename shared label everywhere | data:read_write |
removeSharedLabel | Remove shared label from all tasks | data:delete |
| Operation | What it does | Scope |
|---|
createComment | Add comment to a task or project | data:read_write |
getComment | Get comment | data:read |
listComments | List comments | data:read |
updateComment | Update comment | data:read_write |
deleteComment | Delete comment | data:delete |
| Operation | What it does | Scope |
|---|
createReminder | Create reminder | data:read_write |
getReminder | Get reminder | data:read |
listReminders | List reminders | data:read |
updateReminder | Update reminder | data:read_write |
deleteReminder | Delete reminder | data:delete |
createLocationReminder | Create location reminder | data:read_write |
getLocationReminder | Get location reminder | data:read |
listLocationReminders | List location reminders | data:read |
updateLocationReminder | Update location reminder | data:read_write |
deleteLocationReminder | Delete location reminder | data:delete |
| Operation | What it does | Scope |
|---|
createFolder | Create folder | data:read_write |
getFolder | Get folder | data:read |
listFolders | List folders in a workspace | data:read |
updateFolder | Update folder | data:read_write |
deleteFolder | Delete folder | data:delete |
| Operation | What it does | Scope |
|---|
listWorkspaces | List workspaces | data:read |
getWorkspace | Get workspace | data:read |
createWorkspace | Create workspace | (data:read_write, and Todoist documents no workspace-specific scope — creating a workspace is gated by the account's plan rather than by a checkbox) |
updateWorkspace | Update workspace | (data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope) |
joinWorkspace | Join workspace | data:read_write |
listWorkspaceUsers | List workspace members | data:read |
inviteWorkspaceUsers | Invite people to a workspace | (data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope) |
updateWorkspaceUser | Change a member's workspace role | (data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope) |
removeWorkspaceUser | Remove a member from a workspace | (data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope) |
listWorkspaceActiveProjects | List a workspace's active projects | data:read |
listWorkspaceArchivedProjects | List a workspace's archived projects | data:read |
getWorkspacePlanDetails | Get workspace plan details | data:read |
listWorkspaceInvitations | List pending workspace invitations | data:read |
listAllWorkspaceInvitations | List all workspace invitations | (data:read, plus an ADMIN role in that workspace — the all-invitations view is admin-only) |
deleteWorkspaceInvitation | Delete a workspace invitation | (data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope) |
acceptWorkspaceInvitation | Accept a workspace invitation | data:read_write |
rejectWorkspaceInvitation | Reject a workspace invitation | data:read_write |
| Operation | What it does | Scope |
|---|
exportProjectAsTemplateFile | Export project as a template file (CSV) | data:read |
exportProjectAsTemplateUrl | Export project as a shareable template URL | data:read |
importTemplateIntoProject | Import a template into a project | data:read_write |
| Operation | What it does | Scope |
|---|
getUser | Get the authenticated user | data:read |
listActivity | List activity log events | data:read (the activity log is a Todoist Pro / Business feature — on a Free account this is a plan gate, not a scope problem) |
getIdMappings | Translate old (v9) IDs to v1 IDs | data:read |
getOrCreateEmail | Get or create the email address for a project or task | data:read_write |
disableEmail | Disable the email address for a project or task | data:read_write |
deleteUpload | Delete an uploaded file | data:delete |
File an inbound request as a triaged task, in one call
A form or an inbound email needs to become a real, routed task — right project, right section, right label, right urgency, due tomorrow — not a bare line in the Inbox that someone has to sort later. Create task takes all of it in one request, so the workflow never needs a second call to move or label what it just created. Watch the priority direction: the API number is inverted against the apps, so urgent is 4 here even though Todoist labels it P1. Typing 1 files the task at the LOWEST priority and nothing errors.
Set Operation to createTask, then fill in:
| Field | Value | Notes |
|---|
content | Reply to {{ myTrigger.company }} about {{ myTrigger.subject }} | The task title |
projectId | {{ vars.todoistSalesProject }} | Leave blank to drop the task in the Inbox instead |
sectionId | {{ vars.todoistTriageSection }} | Optional — files it under a column rather than loose in the project |
labels | inbound, needs-reply | Comma-separated label NAMES, not IDs |
priority | 4 | Urgent. 4 is the top of the scale and Todoist shows it as P1 — see the scenario above |
dueString | tomorrow at 9am | Natural language, parsed by Todoist. The only due form that can express a recurrence such as every Monday |
deadlineDate | 2026-08-20 | A deadline is separate from the due date — when the work is actually owed, as opposed to when you plan to do it |
Sets {{task.id}} (an opaque v1 string like 6XGgmFVcrG5RRjVr, not a number), {{task.content}}, {{task.url}} and {{task.task}} (the full object). url is built by the node rather than returned: Todoist removed the url property from the task object in API v1, so a later node that links a human to the task keeps working. Feed {{task.id}} into Add comment or Complete task downstream.