Install
openclaw skills install ticktickpowerManage TickTick tasks and projects from the command line with OAuth2 auth, batch operations, and rate limit handling.
openclaw skills install ticktickpowerManage TickTick tasks and projects from the command line.
pip install -e .
# or just: pip install requests
http://localhost:8080Client ID and Client Secret# 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 --logout
If installed via pip install -e ., you can also use:
ticktick auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET
# Use manual mode on headless servers
python -m ticktick.cli auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --manual
This 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.
# 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 --json
# 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 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"
# Mark task as complete
python -m ticktick.cli complete "Buy groceries"
# Complete with project filter
python -m ticktick.cli complete "Review PR" --list "Work"
# 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"
# 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... --json
Note: batch-abandon requires task IDs (24-character hex strings), not task names. Use tasks --json to get task IDs first.
# 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" --json
Note: 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 all projects
python -m ticktick.cli lists
# JSON output
python -m ticktick.cli lists --json
# Create new project
python -m ticktick.cli list "New Project"
# With color
python -m ticktick.cli list "Work Tasks" --color "#FF5733"
# 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"
none - No priority (default)low - Low prioritymedium - Medium priorityhigh - High prioritytoday - Todaytomorrow - Tomorrowin N days - In N days (e.g., "in 3 days")next monday - Next occurrence of weekday2026-04-26T17:00:00+02:00 (preferred for precision)YYYY-MM-DD or full ISO formatImportant: Always use explicit timezone offsets (e.g. +02:00) for ISO dates to avoid UTC conversion issues.
--json - Output results in JSON format (useful for scripting)--help - Show help for any commandWhen using this skill as an AI agent:
--json flag for machine-readable outputlists --json to get valid project IDsExample 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" --json
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.
Run python -m ticktick.cli auth to authenticate.
Use python -m ticktick.cli lists to see available projects and their IDs.
--list to narrow the search to a specific projectThe CLI auto-refreshes tokens. If issues persist, run python -m ticktick.cli auth again.
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.
t cookie from ticktick.com browser login) — stored in config as sessionCookieplatform, version, id fieldsattach 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"
https://api.ticktick.com/api/v1/attachment/upload/{projectId}/{taskId}/{attachmentId}t={sessionCookie} + X-Device header (JSON)file (standard multipart)id, refId, path, size, fileName, fileType, createdTimeIMAGE, PDF, OTHER (auto-detected by server)attachmentId is client-generated (24-char hex, e.g. secrets.token_hex(12))t cookie from their browser (ticktick.com → DevTools → Application → Cookies → t). Update sessionCookie in config. Never ask for the user's password./open/v1/) does NOT return attachments in task responses/api/v2/batch/task) needs session cookie + X-Device header to workThis CLI uses the TickTick Open API v1.
The CLI makes multiple API calls per operation (listing projects to find a task), so bulk operations can hit limits quickly.
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.