- name
- ticktick
- description
- Manage TickTick tasks and projects from the command line with OAuth2 auth, batch operations, and rate limit handling.
TickTick CLI Skill
Manage TickTick tasks and projects from the command line.
Setup
1. Install dependencies
pip install -e .
# or just: pip install requests2. Register a TickTick Developer App
- Go to TickTick Developer Center
- Create a new application
- Set the redirect URI to
http://localhost:8080 - Note your
Client IDandClient Secret
3. Authenticate
# Set credentials and start OAuth flow
python -m ticktick.cli auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET
# Check authentication status
python -m ticktick.cli auth --status
# Logout (clear tokens, keep credentials)
python -m ticktick.cli auth --logoutIf installed via pip install -e ., you can also use:
ticktick auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRETHeadless / Manual Authentication
# Use manual mode on headless servers
python -m ticktick.cli auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --manualThis prints an authorization URL. Open it in a browser, approve access, then copy the full redirect URL (it looks like http://localhost:8080/?code=XXXXX&state=STATE) and paste it back into the CLI.
Tokens are stored in ~/.clawdbot/credentials/ticktick-cli/config.json.
Commands
List Tasks
# List all tasks
python -m ticktick.cli tasks
# List tasks from a specific project
python -m ticktick.cli tasks --list "Work"
# Filter by status
python -m ticktick.cli tasks --status pending
python -m ticktick.cli tasks --status completed
# JSON output
python -m ticktick.cli tasks --jsonCreate Task
# Basic task creation
python -m ticktick.cli task "Buy groceries" --list "Personal"
# With description and priority
python -m ticktick.cli task "Review PR" --list "Work" --content "Check the new auth changes" --priority high
# With due date
python -m ticktick.cli task "Submit report" --list "Work" --due tomorrow
python -m ticktick.cli task "Plan vacation" --list "Personal" --due "in 7 days"
python -m ticktick.cli task "Meeting" --list "Work" --due "2024-12-25"
# With tags
python -m ticktick.cli task "Research" --list "Work" --tag research important
# With start and due date (creates a time block)
python -m ticktick.cli task "Meeting" --list "Work" --start "2026-04-26T14:00:00+02:00" --due "2026-04-26T15:30:00+02:00"Update Task
# Update by task name or ID
python -m ticktick.cli task "Buy groceries" --update --priority medium
python -m ticktick.cli task "abc123" --update --due tomorrow --content "Updated notes"
# Rename a task
python -m ticktick.cli task "Old Name" --update --new-title "New Name"
# Limit search to specific project
python -m ticktick.cli task "Review PR" --update --list "Work" --priority low
# Update with start and due date (time block)
python -m ticktick.cli task "Meeting" --update --start "2026-04-26T14:00:00+02:00" --due "2026-04-26T15:30:00+02:00"Complete Task
# Mark task as complete
python -m ticktick.cli complete "Buy groceries"
# Complete with project filter
python -m ticktick.cli complete "Review PR" --list "Work"Abandon Task (Won't Do)
# Mark task as won't do
python -m ticktick.cli abandon "Old task"
# Abandon with project filter
python -m ticktick.cli abandon "Obsolete item" --list "Do"Batch Abandon (Multiple Tasks)
# Abandon multiple tasks in a single API call
python -m ticktick.cli batch-abandon <taskId1> <taskId2> <taskId3>
# With JSON output
python -m ticktick.cli batch-abandon abc123def456... xyz789... --jsonNote: batch-abandon requires task IDs (24-character hex strings), not task names. Use tasks --json to get task IDs first.
Attach File to Task
# Attach a file by task name
python -m ticktick.cli attach "Buy groceries" /path/to/file.pdf --list "Personal"
# Attach by task ID
python -m ticktick.cli attach abc123def456789012345678 /path/to/image.png
# JSON output
python -m ticktick.cli attach "Report" /tmp/report.pdf --list "Work" --jsonNote: Attachment upload requires sessionCookie and v2DeviceId in the credentials config file. These use the TickTick web session API, not OAuth. If uploads fail with 401/403, the session cookie has expired — get a fresh t cookie from your browser.
List Projects
# List all projects
python -m ticktick.cli lists
# JSON output
python -m ticktick.cli lists --jsonCreate Project
# Create new project
python -m ticktick.cli list "New Project"
# With color
python -m ticktick.cli list "Work Tasks" --color "#FF5733"Update Project
# Rename project
python -m ticktick.cli list "Old Name" --update --new-name "New Name"
# Change color
python -m ticktick.cli list "Work" --update --color "#00FF00"Options Reference
Priority Levels
none- No priority (default)low- Low prioritymedium- Medium priorityhigh- High priority
Start / Due Date Formats
today- Todaytomorrow- Tomorrowin N days- In N days (e.g., "in 3 days")next monday- Next occurrence of weekday- ISO date with timezone -
2026-04-26T17:00:00+02:00(preferred for precision) - ISO date -
YYYY-MM-DDor full ISO format
Important: Always use explicit timezone offsets (e.g. +02:00) for ISO dates to avoid UTC conversion issues.
Global Options
--json- Output results in JSON format (useful for scripting)--help- Show help for any command
Agent Usage Tips
When using this skill as an AI agent:
- Always use
--jsonflag for machine-readable output - List projects first with
lists --jsonto get valid project IDs - Use project IDs rather than names when possible for reliability
- Check task status before completing to avoid errors
Example agent workflow:
# 1. Get available projects
python -m ticktick.cli lists --json
# 2. Create a task in a specific project
python -m ticktick.cli task "Agent task" --list "PROJECT_ID" --priority high --json
# 3. Later, mark it complete
python -m ticktick.cli complete "Agent task" --list "PROJECT_ID" --jsonConfiguration
Tokens are stored in ~/.clawdbot/credentials/ticktick-cli/config.json:
{
"clientId": "YOUR_CLIENT_ID",
"clientSecret": "YOUR_CLIENT_SECRET",
"accessToken": "...",
"refreshToken": "...",
"tokenExpiry": 1234567890000,
"redirectUri": "http://localhost:8080"
}Note: Credentials are stored in plaintext. The CLI sets file permissions to 700/600; treat this file as sensitive.
The CLI automatically refreshes tokens when they expire.
Troubleshooting
"Not authenticated" error
Run python -m ticktick.cli auth to authenticate.
"Project not found" error
Use python -m ticktick.cli lists to see available projects and their IDs.
"Task not found" error
- Check the task title matches exactly (case-insensitive)
- Try using the task ID instead
- Use
--listto narrow the search to a specific project
Token expired errors
The CLI auto-refreshes tokens. If issues persist, run python -m ticktick.cli auth again.
File Attachments
The CLI supports file attachments via the attach command. Attachments use a different API (/api/v1/, NOT /open/v1/) and require a session cookie — not OAuth.
Requirements
- Session cookie (
tcookie from ticktick.com browser login) — stored in config assessionCookie - X-Device header — JSON with
platform,version,idfields - OAuth tokens do NOT work for attachments
Manual curl upload (alternative to attach command)
# Read credentials
CONFIG="$HOME/.clawdbot/credentials/ticktick-cli/config.json"
COOKIE=$(python3 -c "import json; print(json.load(open('$CONFIG'))['sessionCookie'])")
DEVICE_ID=$(python3 -c "import json; print(json.load(open('$CONFIG')).get('v2DeviceId','clawagent00000000000001'))")
XDEVICE="{\"platform\":\"web\",\"version\":6430,\"id\":\"$DEVICE_ID\"}"
# Generate attachment ID (24-char hex)
ATT_ID=$(python3 -c "import secrets; print(secrets.token_hex(12))")
# Upload
curl -s -X POST \
"https://api.ticktick.com/api/v1/attachment/upload/{PROJECT_ID}/{TASK_ID}/$ATT_ID" \
-H "Cookie: t=$COOKIE" \
-H "X-Device: $XDEVICE" \
-H "User-Agent: Mozilla/5.0 (rv:145.0) Firefox/145.0" \
-H "Origin: https://ticktick.com" \
-H "Referer: https://ticktick.com/webapp/" \
-F "file=@/path/to/file.pdf;type=application/pdf;filename=myfile.pdf"Upload endpoint details
- URL:
https://api.ticktick.com/api/v1/attachment/upload/{projectId}/{taskId}/{attachmentId} - Method: POST multipart/form-data
- Auth: Cookie
t={sessionCookie}+X-Deviceheader (JSON) - File field:
file(standard multipart) - Response: JSON with
id,refId,path,size,fileName,fileType,createdTime - fileType values:
IMAGE,PDF,OTHER(auto-detected by server)
Important notes
- The
attachmentIdis client-generated (24-char hex, e.g.secrets.token_hex(12)) - Session cookies expire. When you get 401/403/access_forbidden on attachment uploads, the cookie is dead. Ask the user for a fresh
tcookie from their browser (ticktick.com → DevTools → Application → Cookies →t). UpdatesessionCookiein config. Never ask for the user's password. - The V1 API (
/open/v1/) does NOT return attachments in task responses - V2 batch endpoint (
/api/v2/batch/task) needs session cookie + X-Device header to work
API Notes
This CLI uses the TickTick Open API v1.
Rate Limits
- 100 requests per minute
- 300 requests per 5 minutes
The CLI makes multiple API calls per operation (listing projects to find a task), so bulk operations can hit limits quickly.
Batch Endpoint
The CLI supports TickTick's batch endpoint for bulk operations:
POST https://api.ticktick.com/open/v1/batch/task
{
"add": [...],
"update": [...],
"delete": [...]
}Use batch-abandon to abandon multiple tasks in one API call.
Other Limitations
- Maximum 500 tasks per project
- Some advanced features (focus time, habits) not supported by the API