TickTick
TickTick API integration with managed OAuth. Manage tasks, projects, and task lists. Use this skill when users want to create, update, complete, or organize tasks and projects in TickTick. For other t
TickTick API integration with managed OAuth. Manage tasks, projects, and task lists. Use this skill when users want to create, update, complete, or organize tasks and projects in TickTick. For other t
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Access the TickTick API with managed OAuth authentication. Manage tasks and projects with full CRUD operations.
# List all projects python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/ticktick/open/v1/project') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
https://gateway.maton.ai/ticktick/{native-api-path}
The gateway proxies requests to
api.ticktick.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as
MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your TickTick OAuth connections at
https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=ticktick&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'ticktick'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
{ "connection": { "connection_id": "1fd9c3aa-6b46-456f-aa21-ed154de23ab7", "status": "ACTIVE", "creation_time": "2026-02-07T09:55:40.786711Z", "last_updated_time": "2026-02-07T09:56:30.403237Z", "url": "https://connect.maton.ai/?session_token=...", "app": "ticktick", "metadata": {} } }
Open the returned
url in a browser to complete OAuth authorization.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If you have multiple TickTick connections, specify which one to use with the
Maton-Connection header:
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/ticktick/open/v1/project') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '1fd9c3aa-6b46-456f-aa21-ed154de23ab7') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /ticktick/open/v1/project
Response:
[ { "id": "6984773291819e6d58b746a8", "name": "🏡Memo", "sortOrder": 0, "viewMode": "list", "kind": "TASK" }, { "id": "6984773291819e6d58b746a9", "name": "🦄Wishlist", "sortOrder": -1099511627776, "viewMode": "list", "kind": "TASK" } ]
GET /ticktick/open/v1/project/{projectId}/data
Response:
{ "project": { "id": "69847732b8e5e969f70e7460", "name": "👋Welcome", "sortOrder": -3298534883328, "viewMode": "list", "kind": "TASK" }, "tasks": [ { "id": "69847732b8e5e969f70e7464", "projectId": "69847732b8e5e969f70e7460", "title": "Sample task", "content": "Task description", "priority": 0, "status": 0, "tags": [], "isAllDay": false } ], "columns": [ { "id": "69847732b8e5e969f70e7463", "projectId": "69847732b8e5e969f70e7460", "name": "Getting Start", "sortOrder": -2199023255552 } ] }
POST /ticktick/open/v1/project Content-Type: application/json{ "name": "My New Project", "viewMode": "list" }
Response:
{ "id": "69870cbe8f08b4a6770a38d3", "name": "My New Project", "sortOrder": 0, "viewMode": "list", "kind": "TASK" }
viewMode options:
list - List viewkanban - Kanban board viewtimeline - Timeline viewDELETE /ticktick/open/v1/project/{projectId}
Returns empty response on success (status 200).
GET /ticktick/open/v1/project/{projectId}/task/{taskId}
Response:
{ "id": "69847732b8e5e969f70e7464", "projectId": "69847732b8e5e969f70e7460", "sortOrder": -1099511627776, "title": "Task title", "content": "Task description/notes", "timeZone": "Asia/Shanghai", "isAllDay": true, "priority": 0, "status": 0, "tags": [], "columnId": "69847732b8e5e969f70e7461", "etag": "2sayfdsh", "kind": "TEXT" }
POST /ticktick/open/v1/task Content-Type: application/json{ "title": "New task", "projectId": "6984773291819e6d58b746a8", "content": "Task description", "priority": 0, "dueDate": "2026-02-15T10:00:00+0000", "isAllDay": false }
Response:
{ "id": "69870cb08f08b86b38951175", "projectId": "6984773291819e6d58b746a8", "sortOrder": -1099511627776, "title": "New task", "timeZone": "America/Los_Angeles", "isAllDay": false, "priority": 0, "status": 0, "tags": [], "etag": "gl7ibhor", "kind": "TEXT" }
Priority values:
0 - None1 - Low3 - Medium5 - HighPOST /ticktick/open/v1/task/{taskId} Content-Type: application/json{ "id": "69870cb08f08b86b38951175", "projectId": "6984773291819e6d58b746a8", "title": "Updated task title", "priority": 1 }
Response:
{ "id": "69870cb08f08b86b38951175", "projectId": "6984773291819e6d58b746a8", "title": "Updated task title", "priority": 1, "status": 0, "etag": "hmb7uk8c", "kind": "TEXT" }
POST /ticktick/open/v1/project/{projectId}/task/{taskId}/complete
Returns empty response on success (status 200).
DELETE /ticktick/open/v1/project/{projectId}/task/{taskId}
Returns empty response on success (status 200).
| Field | Type | Description |
|---|---|---|
| string | Task ID |
| string | Parent project ID |
| string | Task title |
| string | Task description/notes (Markdown supported) |
| integer | Priority: 0=None, 1=Low, 3=Medium, 5=High |
| integer | 0=Active, 2=Completed |
| string | Due date in ISO 8601 format |
| string | Start date in ISO 8601 format |
| boolean | Whether task is all-day |
| string | Timezone (e.g., "America/Los_Angeles") |
| array | List of tag names |
| string | Kanban column ID (if applicable) |
| number | Sort order within project |
| string | Task type: "TEXT", "CHECKLIST" |
// List all projects const response = await fetch( 'https://gateway.maton.ai/ticktick/open/v1/project', { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } } ); const projects = await response.json();// Create a task const createResponse = await fetch( 'https://gateway.maton.ai/ticktick/open/v1/task', { method: 'POST', headers: { 'Authorization':, 'Content-Type': 'application/json' }, body: JSON.stringify({ title: 'New task', projectId: 'PROJECT_ID' }) } );Bearer ${process.env.MATON_API_KEY}
import os import requestsList all projects
response = requests.get( 'https://gateway.maton.ai/ticktick/open/v1/project', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'} ) projects = response.json()
Create a task
response = requests.post( 'https://gateway.maton.ai/ticktick/open/v1/task', headers={ 'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}', 'Content-Type': 'application/json' }, json={ 'title': 'New task', 'projectId': 'PROJECT_ID' } )
status values: 0 = Active, 2 = Completed2026-02-15T10:00:00+0000)viewMode for projects: list, kanban, or timelinecolumns field in project data is used for Kanban board columnsjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| 400 | Missing TickTick connection or invalid request |
| 401 | Invalid or missing Maton API key |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from TickTick API |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
ticktick. For example:https://gateway.maton.ai/ticktick/open/v1/projecthttps://gateway.maton.ai/open/v1/projectNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.