todoist-api
Original:🇺🇸 English
Translated
2 scripts
Manages Todoist tasks, projects, sections, labels, comments, completed-task reports, activity logs, ID migration, project templates, and sync workflows through Todoist API v1. Use when the user asks to capture tasks, quick-add work, triage an inbox, resolve Todoist names to IDs, bulk-close or move tasks, add repeated comments, review completed work, manage project structure, export templates, or automate Todoist workflows.
5installs
Added on
NPX Install
npx skill4agent add tristanmanchester/agent-skills todoist-apiTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Todoist API
When to use this skill
Use this skill when work involves Todoist data or automation, especially:
- capture or quick-add new tasks
- inspect, filter, move, complete, reopen, or delete tasks
- manage projects, sections, labels, or comments
- resolve human names to Todoist IDs before writing
- perform safer bulk edits with dry-runs
- review completed work or recent activity
- build Todoist scripts, agents, or integrations around the public API
When not to use this skill
Do not use this skill for:
- editing the user’s local Todoist app UI directly
- calendar-specific workflows that belong in a calendar skill
- attachment upload flows that require multipart handling unless you are prepared to use or the
curlescape hatchraw - non-Todoist task systems
Safety defaults
- Start read-only if the user’s intent is ambiguous.
- Resolve names to IDs before any write.
- Prefer close over delete unless the user explicitly wants permanent removal.
- Run first for bulk or destructive work.
--dry-run - Use for bulk closes, moves, repeated comments, and deletes.
--confirm - If a command may return a large payload, set so stdout stays small and predictable.
--output FILE
Pick the smallest capable surface
- One object, one endpoint → use a low-level REST wrapper such as ,
get-task, orupdate-project.get-comment - Natural-language capture → use .
quick-add-task - Resolve names safely → use ,
resolve-project,resolve-section.resolve-label - Create if missing → use ,
ensure-project,ensure-section.ensure-label - Many matching tasks → use ,
bulk-close-tasks,bulk-move-tasks.bulk-comment-tasks - Completed-work review → use or
report-completed.get-completed-tasks - Full or incremental sync / batched writes → use .
sync - Unwrapped or niche endpoint → use .
raw
Output contract
The main script prints structured output to stdout by default.
- returns a stable JSON envelope with fields like
--format json,action,ok,count,next_cursor,matched_count, andchanged_count.resolved - returns a smaller human-readable summary.
--format summary - writes the full output to a file and prints a small JSON notice to stdout.
--output FILE
This is designed for agent pipelines: stdout stays parseable, stderr carries diagnostics, and retries are built in for transient failures.
Scripts
- — main non-interactive Todoist CLI
scripts/todoist_api.py - — read-only connectivity check
scripts/smoke_test.py
Inspect help first:
bash
python3 scripts/todoist_api.py --help
python3 scripts/todoist_api.py get-tasks-by-filter --help
python3 scripts/todoist_api.py bulk-move-tasks --help
python3 scripts/smoke_test.py --helpQuick start
Set a token:
bash
export TODOIST_API_TOKEN="YOUR_TODOIST_TOKEN"Read-only smoke test:
bash
python3 scripts/smoke_test.pySanity-check access:
bash
python3 scripts/todoist_api.py get-projects --limit 5
python3 scripts/todoist_api.py get-labels --limit 10Resolve names before writes:
bash
python3 scripts/todoist_api.py resolve-project --name "Inbox"
python3 scripts/todoist_api.py resolve-section --project-name "Client Alpha" --name "Next Actions"
python3 scripts/todoist_api.py resolve-label --name "waiting-on"High-value agent workflows
Quick add
bash
python3 scripts/todoist_api.py quick-add-task \
--text "Email Chris tomorrow at 09:00 #Work @follow-up p2"Create-if-missing section
bash
python3 scripts/todoist_api.py ensure-section \
--project-name "Client Alpha" \
--name "Next Actions"Preview a bulk close
bash
python3 scripts/todoist_api.py bulk-close-tasks \
--filter "overdue & @errands" \
--dry-runExecute the same bulk close
bash
python3 scripts/todoist_api.py bulk-close-tasks \
--filter "overdue & @errands" \
--confirmMove matching tasks into a resolved section
bash
python3 scripts/todoist_api.py bulk-move-tasks \
--filter "#Inbox & !recurring" \
--target-project-name "Work" \
--target-section-name "Next Actions" \
--dry-runReport completed work
bash
python3 scripts/todoist_api.py report-completed \
--since "2026-03-01T00:00:00Z" \
--until "2026-03-31T23:59:59Z" \
--by completion \
--output reports/march-completed.jsonRecommended operating pattern
- Resolve or list the target object.
- Read current state with a low-level getter.
- Preview the write with .
--dry-run - Execute with when needed.
--confirm - Verify by re-reading or by running a report command.
Feature index
- Command catalogue and endpoint coverage → references/REFERENCE.md
- Task-first recipes → references/RECIPES.md
- Todoist-specific caveats → references/GOTCHAS.md
Escape hatches
Use when the public CLI surface does not yet wrap a needed endpoint:
rawbash
python3 scripts/todoist_api.py raw \
--method GET \
--path /projects/PROJECT_ID/fullUse when you need incremental sync or batched commands:
syncbash
python3 scripts/todoist_api.py sync \
--sync-token '*' \
--resource-types '["all"]'