Pipory
Node reference

Todoist

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.

Scopes

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.

Operations (88)

Tasks

OperationWhat it doesScope
createTaskCreate taskdata:read_write (task:add alone is enough — it permits adding tasks and nothing else)
quickAddTaskQuick add task (natural language)data:read_write (task:add alone is enough — it permits adding tasks and nothing else)
getTaskGet taskdata:read
listTasksList active tasksdata:read
listTasksByFilterList tasks matching a filter querydata:read
updateTaskUpdate taskdata:read_write
moveTaskMove task to project / section / parentdata:read_write
completeTaskComplete taskdata:read_write
reopenTaskReopen taskdata:read_write
deleteTaskDelete taskdata:delete
listCompletedTasksByCompletionDateList completed tasks by completion datedata:read
listCompletedTasksByDueDateList completed tasks by due datedata:read
getProductivityStatsGet productivity stats (karma)data:read

Projects

OperationWhat it doesScope
createProjectCreate projectdata:read_write
getProjectGet projectdata:read
listProjectsList projectsdata:read
listArchivedProjectsList archived projectsdata:read
searchProjectsSearch projects by namedata:read
updateProjectUpdate projectdata:read_write
archiveProjectArchive projectdata:read_write
unarchiveProjectUnarchive projectdata:read_write
deleteProjectDelete projectproject:delete
listProjectCollaboratorsList project collaboratorsdata:read
joinProjectJoin projectdata:read_write
getProjectPermissionsGet project role permissionsdata:read

Sections

OperationWhat it doesScope
createSectionCreate sectiondata:read_write
getSectionGet sectiondata:read
listSectionsList sectionsdata:read
searchSectionsSearch sections by namedata:read
updateSectionUpdate sectiondata:read_write
archiveSectionArchive sectiondata:read_write
unarchiveSectionUnarchive sectiondata:read_write
deleteSectionDelete sectiondata:delete

Labels

OperationWhat it doesScope
createLabelCreate personal labeldata:read_write
getLabelGet labeldata:read
listLabelsList personal labelsdata:read
searchLabelsSearch labels by namedata:read
updateLabelUpdate labeldata:read_write
deleteLabelDelete personal labeldata:delete
listSharedLabelsList shared labelsdata:read
renameSharedLabelRename shared label everywheredata:read_write
removeSharedLabelRemove shared label from all tasksdata:delete

Comments

OperationWhat it doesScope
createCommentAdd comment to a task or projectdata:read_write
getCommentGet commentdata:read
listCommentsList commentsdata:read
updateCommentUpdate commentdata:read_write
deleteCommentDelete commentdata:delete

Reminders

OperationWhat it doesScope
createReminderCreate reminderdata:read_write
getReminderGet reminderdata:read
listRemindersList remindersdata:read
updateReminderUpdate reminderdata:read_write
deleteReminderDelete reminderdata:delete
createLocationReminderCreate location reminderdata:read_write
getLocationReminderGet location reminderdata:read
listLocationRemindersList location remindersdata:read
updateLocationReminderUpdate location reminderdata:read_write
deleteLocationReminderDelete location reminderdata:delete

Workspace folders

OperationWhat it doesScope
createFolderCreate folderdata:read_write
getFolderGet folderdata:read
listFoldersList folders in a workspacedata:read
updateFolderUpdate folderdata:read_write
deleteFolderDelete folderdata:delete

Workspaces & members

OperationWhat it doesScope
listWorkspacesList workspacesdata:read
getWorkspaceGet workspacedata:read
createWorkspaceCreate 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)
updateWorkspaceUpdate workspace(data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope)
joinWorkspaceJoin workspacedata:read_write
listWorkspaceUsersList workspace membersdata:read
inviteWorkspaceUsersInvite people to a workspace(data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope)
updateWorkspaceUserChange a member's workspace role(data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope)
removeWorkspaceUserRemove a member from a workspace(data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope)
listWorkspaceActiveProjectsList a workspace's active projectsdata:read
listWorkspaceArchivedProjectsList a workspace's archived projectsdata:read
getWorkspacePlanDetailsGet workspace plan detailsdata:read
listWorkspaceInvitationsList pending workspace invitationsdata:read
listAllWorkspaceInvitationsList all workspace invitations(data:read, plus an ADMIN role in that workspace — the all-invitations view is admin-only)
deleteWorkspaceInvitationDelete a workspace invitation(data:read_write, plus an ADMIN role in that workspace — Todoist documents no workspace-specific scope)
acceptWorkspaceInvitationAccept a workspace invitationdata:read_write
rejectWorkspaceInvitationReject a workspace invitationdata:read_write

Templates

OperationWhat it doesScope
exportProjectAsTemplateFileExport project as a template file (CSV)data:read
exportProjectAsTemplateUrlExport project as a shareable template URLdata:read
importTemplateIntoProjectImport a template into a projectdata:read_write

Account & activity

OperationWhat it doesScope
getUserGet the authenticated userdata:read
listActivityList activity log eventsdata:read (the activity log is a Todoist Pro / Business feature — on a Free account this is a plan gate, not a scope problem)
getIdMappingsTranslate old (v9) IDs to v1 IDsdata:read
getOrCreateEmailGet or create the email address for a project or taskdata:read_write
disableEmailDisable the email address for a project or taskdata:read_write
deleteUploadDelete an uploaded filedata:delete

Example

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:

FieldValueNotes
contentReply 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
labelsinbound, needs-replyComma-separated label NAMES, not IDs
priority4Urgent. 4 is the top of the scale and Todoist shows it as P1 — see the scenario above
dueStringtomorrow at 9amNatural language, parsed by Todoist. The only due form that can express a recurrence such as every Monday
deadlineDate2026-08-20A 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.