ticktick-api-skillTickTick 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 third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
Install via ClawdBot CLI:
clawdbot install byungkyu/ticktick-api-skillAccess 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 |
|-------|------|-------------|
| id | string | Task ID |
| projectId | string | Parent project ID |
| title | string | Task title |
| content | string | Task description/notes (Markdown supported) |
| priority | integer | Priority: 0=None, 1=Low, 3=Medium, 5=High |
| status | integer | 0=Active, 2=Completed |
| dueDate | string | Due date in ISO 8601 format |
| startDate | string | Start date in ISO 8601 format |
| isAllDay | boolean | Whether task is all-day |
| timeZone | string | Timezone (e.g., "America/Los_Angeles") |
| tags | array | List of tag names |
| columnId | string | Kanban column ID (if applicable) |
| sortOrder | number | Sort order within project |
| kind | 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': `Bearer ${process.env.MATON_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'New task',
projectId: 'PROJECT_ID'
})
}
);
import os
import requests
# List 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/projectGenerated Mar 1, 2026
Individuals can automate daily task creation, organization, and completion in TickTick, such as setting up recurring reminders or syncing tasks across devices. This helps users stay organized and productive without manual input.
Small teams can use the skill to manage shared projects, assign tasks, and track progress in real-time through TickTick's API. It enables seamless collaboration by automating task updates and notifications.
Freelancers can integrate TickTick with other tools to automate client project tracking, invoice generation based on completed tasks, and deadline management. This streamlines administrative work and improves time tracking.
Teachers and students can automate assignment scheduling, progress tracking, and study plan creation in TickTick. It supports academic organization by syncing tasks with calendars and setting priority levels.
Users can manage fitness routines, medication reminders, and wellness goals by creating and updating tasks in TickTick. This promotes habit formation and health monitoring through automated check-ins.
Offer a premium service that integrates TickTick with other apps for advanced automation, such as email-to-task conversion or AI-powered task prioritization. Revenue comes from monthly or annual user subscriptions.
Provide customized TickTick API solutions for businesses to embed task management into their internal systems, like CRM or ERP software. Revenue is generated through licensing fees and support contracts.
Develop a mobile app that uses the TickTick skill for basic task management with free access, while charging for premium features like analytics, team collaboration, or third-party integrations.
๐ฌ Integration Tip
Ensure the MATON_API_KEY is securely stored and use the Maton-Connection header for multi-account setups to avoid authentication issues.
Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
Connect to 100+ APIs (Google Workspace, Microsoft 365, GitHub, Notion, Slack, Airtable, HubSpot, etc.) with managed OAuth. Use this skill when users want to...
Build, debug, and deploy websites using HTML, CSS, JavaScript, and modern frameworks following production best practices.
YouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Scaffold, test, document, and debug REST and GraphQL APIs. Use when the user needs to create API endpoints, write integration tests, generate OpenAPI specs, test with curl, mock APIs, or troubleshoot HTTP issues.
Search for jobs across LinkedIn, Indeed, Glassdoor, ZipRecruiter, Google Jobs, Bayt, Naukri, and BDJobs using the JobSpy MCP server.