Install
openclaw skills install @hfarazi/ticktickpowerManage TickTick tasks and projects from the command line with OAuth2 auth, batch operations, and rate limit handling.
openclaw skills install @hfarazi/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.