PROJECT MANAGEMENT · TASKS
Tasks, projects, labels, and filters in that person’s own account.
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
todoist_delete_api_v1_access_tokensWRITERevoke the access tokens obtained via OAuth via DELETE /api/v1/access_tokens
todoist_delete_api_v1_comments_by_comment_idWRITEDelete a comment by ID via DELETE /api/v1/comments/{comment_id}
todoist_delete_api_v1_emailsWRITEDisable the current email to a Todoist object via DELETE /api/v1/emails
todoist_delete_api_v1_folders_by_folder_idWRITEDelete a folder. Projects in the folder will be moved out of it. via DELETE /api/v1/folders/{folder_id}
todoist_delete_api_v1_labels_by_label_idWRITEDeletes a personal label. All instances of the label will be removed from tasks via DELETE /api/v1/labels/{label_id}
todoist_delete_api_v1_location_reminders_by_reminder_idWRITEDelete a location reminder by ID. via DELETE /api/v1/location_reminders/{reminder_id}
todoist_delete_api_v1_projects_by_project_idWRITEDeletes a project and all of its sections and tasks. via DELETE /api/v1/projects/{project_id}
todoist_delete_api_v1_reminders_by_reminder_idWRITEDelete a reminder by ID. via DELETE /api/v1/reminders/{reminder_id}
todoist_delete_api_v1_sections_by_section_idWRITEDelete the section and all of its tasks via DELETE /api/v1/sections/{section_id}
todoist_delete_api_v1_tasks_by_task_idWRITEDelete a task and all of its subtasks. Returns `NOT_FOUND` when the task does not exist and `FORBIDDEN` when the authenticated user cannot modify the task. via DELETE /api/v1/tasks/{task_id}
todoist_delete_api_v1_uploadsWRITEDelete an uploaded file. The file must belong to the authenticated user. Returns `FILE_NOT_FOUND` when the upload cannot be found. via DELETE /api/v1/uploads
todoist_delete_api_v1_workspaces_by_workspace_idWRITEDeletes a workspace. via DELETE /api/v1/workspaces/{workspace_id}
todoist_delete_api_v1_workspaces_by_workspace_id_users_by_user_idWRITERemoves a user from a workspace. via DELETE /api/v1/workspaces/{workspace_id}/users/{user_id}
todoist_get_api_v1_activitiesREADGet activity logs. Returns a paginated list of activity events for the user. Events can be filtered by object type (project, item, note, section), event type, and other criteria. Uses cursor-based pagination for efficient navigation through results. via GET /api/v1/activities
todoist_get_api_v1_backupsREADTodoist creates a backup archive of users' data on a daily basis. Backup archives can also be accessed from the web app (Todoist Settings -> Backups). This endpoint accepts the `backups:read` scope, the `data:read_write` scope, or a personal API token. The `backups:read` scope bypasses MFA and only grants access to `GET /api/v1/backups`. When using `data:read_write` or a personal API token for an account with MFA enabled, the MFA token is required. via GET /api/v1/backups
todoist_get_api_v1_backups_downloadREADDownload a backup archive. This endpoint requires the `data:read_write` scope. The `backups:read` scope only grants access to `GET /api/v1/backups`. Validates that the requested backup belongs to the authenticated user and redirects to a signed CloudFront URL that expires after one minute. via GET /api/v1/backups/download
todoist_get_api_v1_commentsREADGet all comments for a given task or project. Exactly one of `task_id` or `project_id` arguments is required. Providing neither or both will return an error. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/comments
todoist_get_api_v1_comments_by_comment_idREADReturns a single comment by ID via GET /api/v1/comments/{comment_id}
todoist_get_api_v1_foldersREADGet all folders for a workspace. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/folders
todoist_get_api_v1_folders_by_folder_idREADReturn the folder for the given folder ID. via GET /api/v1/folders/{folder_id}
todoist_get_api_v1_id_mappings_by_obj_name_by_obj_idsREADTranslates IDs from v1 to v2 or vice versa. IDs are not unique across object types, hence the need to specify the object type. When V1 ids are provided, the function will return the corresponding V2 ids, if they exist, and vice versa. When no objects are found, an empty list is returned. via GET /api/v1/id_mappings/{obj_name}/{obj_ids}
todoist_get_api_v1_labelsREADGet all user labels. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/labels
todoist_get_api_v1_labels_by_label_idREADReturn a personal label by ID. Returns `NOT_FOUND` when the label does not exist or the ID is invalid. via GET /api/v1/labels/{label_id}
todoist_get_api_v1_labels_searchREADSearch user labels by name. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/labels/search
todoist_get_api_v1_labels_sharedREADReturns a set of unique strings containing [shared labels](https://www.todoist.com/help/articles/introduction-to-labels-dSo2eE#h_01HE1NNWMV8MCXNVF10GT13ZEX) from active tasks. via GET /api/v1/labels/shared
todoist_get_api_v1_location_remindersREADGet all active location reminders. Optionally filter by `task_id` to return only location reminders for a specific task. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/location_reminders
todoist_get_api_v1_location_reminders_by_reminder_idREADReturn a single location reminder by ID. via GET /api/v1/location_reminders/{reminder_id}
todoist_get_api_v1_projectsREADGet all active user projects, optionally filtered by folder or workspace. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/projects
todoist_get_api_v1_projects_archivedREADGet the user's archived projects. via GET /api/v1/projects/archived
todoist_get_api_v1_projects_by_project_idREADReturns a project object related to the given ID via GET /api/v1/projects/{project_id}
todoist_get_api_v1_projects_by_project_id_collaboratorsREADGet all collaborators for a given project. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/projects/{project_id}/collaborators
todoist_get_api_v1_projects_permissionsREADReturns a list of all the available roles and the associated actions they can perform in a project. via GET /api/v1/projects/permissions
todoist_get_api_v1_projects_searchREADSearch active user projects by name. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/projects/search
todoist_get_api_v1_remindersREADGet all active reminders. Optionally filter by `task_id` to return only reminders for a specific task. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/reminders
todoist_get_api_v1_reminders_by_reminder_idREADReturn a single reminder by ID. via GET /api/v1/reminders/{reminder_id}
todoist_get_api_v1_sectionsREADGet all active sections for the user, optionally filtered by project. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/sections
todoist_get_api_v1_sections_by_section_idREADReturn the section for the given section ID via GET /api/v1/sections/{section_id}
todoist_get_api_v1_sections_searchREADSearch active sections by name, optionally filtered by project. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/sections/search
todoist_get_api_v1_tasksREADGet all active tasks for the user. All provided parameters are used to narrow down the list of tasks. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/tasks
todoist_get_api_v1_tasks_by_task_idREADReturns a single active (non-completed) task by ID via GET /api/v1/tasks/{task_id}
todoist_get_api_v1_tasks_completed_by_completion_dateREADRetrieves a list of completed tasks strictly limited by the specified completion date range (up to 3 months). It can retrieve completed items: - From all the projects the user has joined in a workspace - From all the projects of the user - That match many [supported filters](https://todoist.com/help/articles/introduction-to-filters-V98wIH) By default, the response is limited to a page containing a maximum of 50 items (configurable using `limit`). Subsequent pages of results can be fetched by using the `next_cursor` value from the response as the `cursor` value for the next request. via GET /api/v1/tasks/completed/by_completion_date
todoist_get_api_v1_tasks_completed_by_due_dateREADRetrieves a list of completed items strictly limited by the specified due date range (up to 6 weeks). It can retrieve completed items: - From within a project, section, or parent item - From all the projects the user has joined in a workspace - From all the projects of the user - That match many [supported filters](https://todoist.com/help/articles/introduction-to-filters-V98wIH) By default, the response is limited to a page containing a maximum of 50 items (configurable using `limit`). Subsequent pages of results can be fetched by using the `next_cursor` value from the response as the `cursor` value for the next request. via GET /api/v1/tasks/completed/by_due_date
todoist_get_api_v1_tasks_completed_statsREADGet comprehensive productivity statistics for the authenticated user. This endpoint is used to display information about the [Karma system](https://www.todoist.com/help/articles/introduction-to-karma-OgWkWy). Returns detailed completion statistics including: - Daily completion counts with per-project breakdowns for the last 7 days - Weekly completion counts with per-project breakdowns for the last 4 weeks - Total completed task count - Karma score, trend, graph data, and update history - Goal settings (daily/weekly goals, ignore days, vacation mode) - Streak information (current, last, and maximum daily and weekly streaks) - Project color mappings for visualization via GET /api/v1/tasks/completed/stats
todoist_get_api_v1_tasks_filterREADGet all tasks matching the filter. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/tasks/filter
todoist_get_api_v1_templates_fileREADGet a template for a project as a CSV file via GET /api/v1/templates/file
todoist_get_api_v1_templates_urlREADGet a template for a project as a shareable URL. The URL can then be passed to `https://todoist.com/api/v1/import/project_from_url?t_url=<url>` to make a shareable template. via GET /api/v1/templates/url
todoist_get_api_v1_usage_billing_historyREADList the caller's usage-billing ledger entries, newest first. Use `types` to filter the entries to list. This is a paginated endpoint. See the [Pagination guide](#tag/Pagination) for details on using cursor-based pagination. via GET /api/v1/usage_billing/history
todoist_get_api_v1_usage_billing_stateREADRead the caller's usage-billing credit state for a product. via GET /api/v1/usage_billing/state
todoist_get_api_v1_usage_billing_usage_summaryREADTotal the caller's settled usage over a window. `/history` is a ledger with one row per movement, so a total spanning more than one page cannot come from it. This answers the one question the UI asks of the whole ledger at once: how many runs, and what they cost. Only settled usage counts. `void`, `expiry` and `chargeback` draw the balance down as well, but they reverse a grant rather than report usage. via GET /api/v1/usage_billing/usage_summary
todoist_get_api_v1_userREADGet information about the currently authenticated user. This is the OIDC userinfo endpoint. OAuth tokens of any product audience are accepted as long as they carry the `user:read` scope (implied by `data:read`). via GET /api/v1/user
todoist_get_api_v1_workspacesREADReturns all workspaces where the user is a member. via GET /api/v1/workspaces
todoist_get_api_v1_workspaces_by_workspace_idREADReturns a workspace by ID. via GET /api/v1/workspaces/{workspace_id}
todoist_get_api_v1_workspaces_by_workspace_id_projects_activeREADReturns all active workspace projects, including those visible but not joined by the user. _For guests, returns all joined workspace projects only._ via GET /api/v1/workspaces/{workspace_id}/projects/active
todoist_get_api_v1_workspaces_by_workspace_id_projects_archivedREADReturn archived projects in a workspace. Workspace guests cannot list archived projects and receive a `FORBIDDEN` error. Results are paginated by `cursor` and `limit`. via GET /api/v1/workspaces/{workspace_id}/projects/archived
todoist_get_api_v1_workspaces_invitationsREADReturn a list of user emails who have a pending invitation to a workspace. The list is not paginated. All workspace members can access this list. via GET /api/v1/workspaces/invitations
todoist_get_api_v1_workspaces_invitations_allREADReturn a list containing details of all pending invitation to a workspace. This list is not paginated. All workspace members can access this list. via GET /api/v1/workspaces/invitations/all
todoist_get_api_v1_workspaces_plan_detailsREADLists details of the workspace's current plan and usage via GET /api/v1/workspaces/plan_details
todoist_get_api_v1_workspaces_usersREADReturns all workspace_users for a given workspace if workspace_id is provided. Otherwise, returns all workspace_users for all workspaces that the requesting user is part of. _Not accessible by guests._ via GET /api/v1/workspaces/users
todoist_post_api_v1_access_tokens_migrate_personal_tokenWRITETokens obtained via the old email/password authentication method can be migrated to the new OAuth access token. Migrating your users' personal tokens will allow users to see your app in their Todoist Settings page and give them the ability to manage their app authorization. A successful response has `200 OK` status and `application/json` Content-Type. via POST /api/v1/access_tokens/migrate_personal_token
todoist_post_api_v1_commentsWRITECreates a new comment on a project or task and returns it. Exactly one of `task_id` or `project_id` arguments is required. Providing neither or both will return an error. via POST /api/v1/comments
todoist_post_api_v1_comments_by_comment_idWRITEUpdate a comment by ID and returns its content via POST /api/v1/comments/{comment_id}
todoist_post_api_v1_foldersWRITECreate a new folder in the given workspace. via POST /api/v1/folders
todoist_post_api_v1_folders_by_folder_idWRITEUpdate an existing folder. via POST /api/v1/folders/{folder_id}
todoist_post_api_v1_labelsWRITECreate a personal label. Premium limits apply to personal label creation. Free users who exceed the plan limit receive a premium-only error. via POST /api/v1/labels
todoist_post_api_v1_labels_by_label_idWRITEUpdate a personal label. At least one mutable field must be provided. Passing `null` for an optional field keeps the existing value unchanged. via POST /api/v1/labels/{label_id}
todoist_post_api_v1_labels_shared_removeWRITERemove the given shared label from all active tasks via POST /api/v1/labels/shared/remove
todoist_post_api_v1_labels_shared_renameWRITERename the given shared label from all active tasks via POST /api/v1/labels/shared/rename
todoist_post_api_v1_location_remindersWRITECreate a new location reminder for a task. via POST /api/v1/location_reminders
todoist_post_api_v1_location_reminders_by_reminder_idWRITEUpdate an existing location reminder. via POST /api/v1/location_reminders/{reminder_id}
todoist_post_api_v1_payments_cancel_plan_with_redirect_to_stripeWRITEStart a hosted cancellation flow and return the redirect URL. via POST /api/v1/payments/cancel_plan_with_redirect_to_stripe
todoist_post_api_v1_payments_get_subscription_infoWRITEReturn the current user's subscription state. via POST /api/v1/payments/get_subscription_info
todoist_post_api_v1_payments_reactivate_planWRITEReactivate a previously canceled subscription. Returns the fresh `SubscriptionInfo` after reactivation so callers can avoid a follow-up fetch. Raises `NO_CANCELABLE_SUBSCRIPTION` if there is no active subscription to reactivate. via POST /api/v1/payments/reactivate_plan
todoist_post_api_v1_projectsWRITECreates a new project and returns it via POST /api/v1/projects
todoist_post_api_v1_projects_by_project_idWRITEUpdates a project and returns it. via POST /api/v1/projects/{project_id}
todoist_post_api_v1_projects_by_project_id_archiveWRITEMarks a project as archived. For personal projects, this will archive it just for the initiating user (leaving it visible to any other collaborators). For workspace projects, this will archive it for all workspace users, removing it from view. via POST /api/v1/projects/{project_id}/archive
todoist_post_api_v1_projects_by_project_id_joinWRITE_Only used for workspaces_ This endpoint is used to join a workspace project by a workspace_user and is only usable by the workspace user. via POST /api/v1/projects/{project_id}/join
todoist_post_api_v1_projects_by_project_id_unarchiveWRITEMarks a previously archived project as active again. For personal projects, this will make the project visible again for the initiating user. For workspace projects, this will make the project visible again for all applicable workspace users. via POST /api/v1/projects/{project_id}/unarchive
todoist_post_api_v1_remindersWRITECreate a new reminder for a task. For **relative** reminders, provide `minute_offset` (minutes before the task's due time). For **absolute** reminders, provide a `due` dictionary with a specific date/time. Supported `due` keys are `date` or `string`, with optional `lang`, `timezone`, and `is_recurring`. via POST /api/v1/reminders
todoist_post_api_v1_reminders_by_reminder_idWRITEUpdate an existing reminder. via POST /api/v1/reminders/{reminder_id}
todoist_post_api_v1_revokeWRITERevoke an access token according to RFC 7009 OAuth Token Revocation. This endpoint accepts form-encoded data and follows the OAuth 2.0 Token Revocation specification. The client must authenticate using HTTP Basic authentication with their client credentials. Authentication is performed via the Authorization header with the format: Authorization: Basic base64(client_id:client_secret) via POST /api/v1/revoke
todoist_post_api_v1_sectionsWRITECreate a new section via POST /api/v1/sections
todoist_post_api_v1_sections_by_section_idWRITEUpdate a section. via POST /api/v1/sections/{section_id}
todoist_post_api_v1_sections_by_section_id_archiveWRITEMarks a section as archived. via POST /api/v1/sections/{section_id}/archive
todoist_post_api_v1_sections_by_section_id_unarchiveWRITEMarks a section as active again. via POST /api/v1/sections/{section_id}/unarchive
todoist_post_api_v1_tasksWRITECreate a new task. via POST /api/v1/tasks
todoist_post_api_v1_tasks_by_task_idWRITEUpdates an existing task. via POST /api/v1/tasks/{task_id}
todoist_post_api_v1_tasks_by_task_id_closeWRITECloses a task. The command performs in the same way as our official clients: Regular tasks are marked complete and moved to history, along with their subtasks. Tasks with [recurring due dates](https://todoist.com/help/articles/introduction-to-recurring-dates-YUYVJJAV) will be scheduled to their next occurrence. via POST /api/v1/tasks/{task_id}/close
todoist_post_api_v1_tasks_by_task_id_moveWRITEMoves task to another project, section or parent. via POST /api/v1/tasks/{task_id}/move
todoist_post_api_v1_tasks_by_task_id_reopenWRITEReopens a task. Any ancestor tasks or sections will also be marked as uncomplete and restored from history. The reinstated tasks and sections will appear at the end of the list within their parent, after any previously active tasks. via POST /api/v1/tasks/{task_id}/reopen
todoist_post_api_v1_tasks_quickWRITEAdd a new task using Quick Add with natural language processing. Quick Add allows creating tasks with rich metadata using natural language text. This endpoint uses the same parsing engine as Todoist's official clients, supporting dates, projects, labels, priorities, assignees, and more in a single text string. ## Basic Syntax Overview - **Due dates**: Natural language like `today`, `tomorrow at 5pm`, `next Monday` - **Projects**: `#ProjectName` (use `#My\\ Project` for names with spaces) - **Sections**: `/SectionName` (requires a project to be specified) - **Labels**: `@labelname` (multiple labels supported) - **Priority**: `p1` to `p4`, `P1` to `P4`, or `!!1` to `!!4` - **Assignees**: `+Name` (requires a project to be specified) - **Deadlines**: `{date expression}` (e.g., `{tomorrow}`, `{in 3 days}`) - **Reminders**: `!30m` (30 min before), `!1h` (1 hour before), `!0mb` (at due time), `!14:00` (absolute time), `!30 min before` (verbose, English only) - **Descriptions**: ` // description text` (must be at the end) ## Examples - `"Buy milk today at 5pm #Shopping @groceries p1"` - `"Team meeting next Monday at 10am #Work +JohnDoe !30m"` - `"Review PR {Friday} // Check the new authentication flow"` - `"Submit report tomorrow #Work /Urgent @important // Include Q3 metrics"` ## Important Notes - Natural language date parsing supports multiple languages based on account settings - If parsing fails for any element, the task is still created (with unparsed text remaining in the content) - Use the `meta` parameter to see detailed parsing results for debugging For comprehensive documentation including all supported date formats, language support, and advanced syntax, see the [Quick Add help article](https://www.todoist.com/help/articles/use-task-quick-add-in-todoist-va4Lhpzz). via POST /api/v1/tasks/quick
todoist_post_api_v1_templates_import_into_project_from_template_idWRITEImport a saved template into an existing project. The target project must exist and must not be frozen. The response includes the imported objects so clients can update local state immediately. via POST /api/v1/templates/import_into_project_from_template_id
todoist_post_api_v1_usage_billing_top_upWRITEIn V1, create a hosted Stripe Checkout session to top up the authenticated user's personal Automations wallet. The user must have a personal Stripe customer and an active personal Todoist Pro subscription. A Business or workspace subscription alone does not qualify. A Business member who also has personal Todoist Pro tops up their personal wallet. If the personal Stripe customer or personal Todoist Pro prerequisite is not met, the endpoint returns HTTP 400 with error tag `USAGE_BILLING_TOP_UP_UNAVAILABLE` and error code `605`. via POST /api/v1/usage_billing/top_up
todoist_post_api_v1_workspacesWRITECreates a new workspace and returns it. via POST /api/v1/workspaces
todoist_post_api_v1_workspaces_by_workspace_idWRITEUpdates an existing workspace and returns it. via POST /api/v1/workspaces/{workspace_id}
todoist_post_api_v1_workspaces_by_workspace_id_users_by_user_idWRITEUpdates a workspace user's role. via POST /api/v1/workspaces/{workspace_id}/users/{user_id}
todoist_post_api_v1_workspaces_by_workspace_id_users_inviteWRITEInvites users to a workspace by email. via POST /api/v1/workspaces/{workspace_id}/users/invite
todoist_post_api_v1_workspaces_invitations_deleteWRITEDeletes a workspace invitation. Only admins can delete invitations. via POST /api/v1/workspaces/invitations/delete
todoist_post_api_v1_workspaces_joinWRITEJoin a workspace via link or via workspace ID, if the user can auto-join the workspace by domain. ## Joining by Domain This is possible if: - The user is verified - The user has a user e-mail belonging to a domain that is set as a domain name for a workspace - That workspace has the auto-join by domain feature enabled via POST /api/v1/workspaces/join
todoist_put_api_v1_emailsWRITEGet or create an email to a Todoist object, currently only projects and tasks are supported. via PUT /api/v1/emails
todoist_put_api_v1_notification_settingWRITEUpdate a notification delivery preference. The API accepts the legacy `dont_notify` flag and stores the inverse as the user's delivery preference for the requested notification type and channel. via PUT /api/v1/notification_setting
todoist_put_api_v1_workspaces_invitations_by_invite_code_acceptWRITEAccept a workspace invitation. Usable by authenticated users only. via PUT /api/v1/workspaces/invitations/{invite_code}/accept
todoist_put_api_v1_workspaces_invitations_by_invite_code_rejectWRITEReject a workspace invitation. Usable by authenticated users only. via PUT /api/v1/workspaces/invitations/{invite_code}/reject
Put Todoist behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.