From todoist-extensions
This skill should be used when the user asks to "call the Todoist API", "create/read/update/delete tasks or projects", "implement OAuth", "set up webhooks", "use the sync endpoint", "authenticate with Todoist", "handle Todoist data models", or any request involving the Todoist API v1 for building integrations or extensions. Load this skill before generating or reviewing any Todoist API code.
npx claudepluginhub caleb-terry/caleb-plugins --plugin todoist-extensionsThis skill uses the workspace's default tool permissions.
Always load the detailed references when working with the Todoist API:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Performs token-optimized structural code search using tree-sitter AST parsing to discover symbols, outline files, and unfold code without reading full files.
Always load the detailed references when working with the Todoist API:
references/api-endpoints.md — all REST endpoints for tasks, projects, sections, labels, comments, filtersreferences/sync-endpoint.md — sync endpoint for batched reads and writes with incremental syncreferences/authentication.md — OAuth2 flow, scopes, personal tokens, short-lived extension tokensreferences/webhooks.md — webhook registration, event types, HMAC verification, payload structurereferences/data-models.md — complete field-by-field schemas for all Todoist objectshttps://api.todoist.com/api/v1
All requests require: Authorization: Bearer {token}
Token sources:
references/authentication.md)x-todoist-apptoken header in UI extension requests| Method | Endpoint | Description |
|---|---|---|
| GET | /tasks | List tasks (filterable by project, section) |
| POST | /tasks | Create a task |
| GET | /tasks/{id} | Get a task |
| POST | /tasks/{id} | Update a task |
| DELETE | /tasks/{id} | Delete a task |
| POST | /tasks/{id}/close | Complete a task |
| POST | /tasks/{id}/reopen | Reopen a task |
| GET | /projects | List projects |
| POST | /projects | Create a project |
| GET | /projects/{id} | Get a project |
| POST | /projects/{id} | Update a project |
| DELETE | /projects/{id} | Delete a project |
| GET | /sections | List sections |
| POST | /sections | Create a section |
| GET | /labels | List labels |
| POST | /labels | Create a label |
| GET | /comments | List comments (by task_id or project_id) |
| POST | /comments | Create a comment |
| POST | /sync | Sync endpoint (read/write batched) |
All list endpoints use cursor-based pagination:
limit parameter (default varies by endpoint)next_cursor — pass as cursor in next requestnext_cursor is null, no more results| Scope | Access Level |
|---|---|
task:add | Create tasks only |
data:read | Read all data |
data:read_write | Read and write all data |
data:delete | Delete tasks, comments, etc. |
project:delete | Delete projects |
backups:read | Access user backups |
priority: 1 (normal) to 4 (urgent)due object: date (YYYY-MM-DD), optional time (HH:mm), optional timezone (IANA)deadline is separate from due — use for hard deadlines distinct from schedulingduration: amount (number) + unit ("minute" | "hour" | "day"){
"error_tag": "INVALID_ARGUMENT_VALUE",
"error_code": 40,
"error": "Invalid argument value",
"http_code": 400,
"error_extra": {
"argument": "priority",
"explanation": "must be between 1 and 4"
}
}
Handle 429 (rate limit) using error_extra.retry_after for backoff.