Google Tasks
Access the Google Tasks API with managed OAuth authentication. Manage task lists and tasks with full CRUD operations.
Quick Start
CLI:
maton google-tasks task list -l <tasklistId>
maton api '/google-tasks/tasks/v1/lists/<tasklistId>/tasks'
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-tasks/tasks/v1/lists/<tasklistId>/tasks')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://api.maton.ai/google-tasks/{native-api-path}
Maton proxies requests to tasks.googleapis.com and automatically injects your OAuth token.
Installation
NPM:
npm install -g @maton-ai/cli
Homebrew:
brew install maton-ai/cli/maton
Authentication
CLI:
maton login # Opens browser for API key
maton login --interactive # Skip browser, paste API key directly
maton whoami # Show current auth state
Manual:
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
- Set your API key as
MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Connection Management
Manage your Google Tasks OAuth connections at https://api.maton.ai.
List Connections
CLI:
maton connection list google-tasks --status ACTIVE
maton api -X GET /connections -f app=google-tasks -f status=ACTIVE
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=google-tasks&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
Create Connection
CLI:
maton connection create google-tasks
maton api /connections -f app=google-tasks
Python:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-tasks'}).encode()
req = urllib.request.Request('https://api.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
Get Connection
CLI:
maton connection view {connection_id}
maton api /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-02-07T02:35:51.002199Z",
"last_updated_time": "2026-02-07T05:32:30.369186Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "google-tasks",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
CLI:
maton connection delete {connection_id}
maton api -X DELETE /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
Specifying Connection
If you have multiple Google Tasks connections, specify which one to use:
CLI:
maton google-tasks tasklist list --connection {connection_id}
maton api /google-tasks/tasks/v1/users/@me/lists --connection {connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-tasks/tasks/v1/users/@me/lists')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always specify the connection to ensure requests go to the intended account.
Security & Permissions
- Access is scoped to task lists and tasks with full CRUD operations within the connected Google Tasks account.
- All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.
API Reference
Task Lists
List All Task Lists
GET /google-tasks/tasks/v1/users/@me/lists
Query Parameters:
maxResults- Maximum number of task lists to return (default: 20, max: 100)pageToken- Token for pagination
Example:
maton google-tasks tasklist list
Get Task List
GET /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
Example:
maton google-tasks tasklist view <tasklistId>
Create Task List
POST /google-tasks/tasks/v1/users/@me/lists
Content-Type: application/json
{
"title": "New Task List"
}
Example:
maton google-tasks tasklist create --title 'New Task List'
Update Task List (PATCH - partial update)
PATCH /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
Content-Type: application/json
{
"title": "Updated Title"
}
Example:
maton google-tasks tasklist update <tasklistId> --title 'Updated Title'
Update Task List (PUT - full replace)
PUT /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
Content-Type: application/json
{
"title": "Replaced Title"
}
Example:
maton google-tasks tasklist update <tasklistId> --title 'Replaced Title' --replace
Delete Task List
DELETE /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
Example:
maton google-tasks tasklist delete <tasklistId>
Tasks
List Tasks
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks?showCompleted=true
Query Parameters:
maxResults- Maximum number of tasks to return (default: 20, max: 100)pageToken- Token for paginationshowCompleted- Include completed tasks (default: true)showDeleted- Include deleted tasks (default: false)showHidden- Include hidden tasks (default: false)dueMin- Lower bound for due date (RFC 3339 timestamp)dueMax- Upper bound for due date (RFC 3339 timestamp)completedMin- Lower bound for completion date (RFC 3339 timestamp)completedMax- Upper bound for completion date (RFC 3339 timestamp)updatedMin- Lower bound for last update time (RFC 3339 timestamp)
Example:
maton google-tasks task list -l <tasklistId> --show-completed
Get Task
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Example:
maton google-tasks task view <taskId> -l <tasklistId>
Create Task
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks
Content-Type: application/json
{
"title": "New Task",
"notes": "Task description",
"due": "2026-03-01T00:00:00.000Z"
}
Query Parameters (optional):
parent- Parent task ID (for subtasks)previous- Previous sibling task ID (for positioning)
Example:
maton google-tasks task create -l <tasklistId> --title 'New Task' --notes 'Task description' --due 2026-03-01
Update Task (PATCH - partial update)
PATCH /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Content-Type: application/json
{
"title": "Updated Task Title",
"status": "completed"
}
Example:
maton google-tasks task update <taskId> -l <tasklistId> --title 'Updated Task Title' --status completed
Update Task (PUT - full replace)
PUT /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Content-Type: application/json
{
"title": "Replaced Task",
"notes": "New notes",
"status": "needsAction"
}
Example:
maton google-tasks task update <taskId> -l <tasklistId> --title 'Replaced Task' --notes 'New notes' --status needsAction --replace
Delete Task
DELETE /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Example:
maton google-tasks task delete <taskId> -l <tasklistId>
Move Task
Reposition a task within a task list or change its parent.
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}/move
Query Parameters (optional):
parent- New parent task ID (for making it a subtask)previous- Previous sibling task ID (for positioning after this task)
Example:
maton google-tasks task move <taskId> -l <tasklistId> --previous <siblingTaskId>
Clear Completed Tasks
Delete all completed tasks from a task list.
POST /google-tasks/tasks/v1/lists/{tasklistId}/clear
Example:
maton google-tasks tasklist clear <tasklistId>
Task Resource Fields
| Field | Type | Description |
|-------|------|-------------|
| kind | string | Always "tasks#task" (output only) |
| id | string | Task identifier |
| etag | string | ETag of the resource |
| title | string | Task title (max 1024 characters) |
| updated | string | Last modification time (RFC 3339, output only) |
| selfLink | string | URL to this task (output only) |
| parent | string | Parent task ID (output only) |
| position | string | Position among siblings (output only) |
| notes | string | Task notes (max 8192 characters) |
| status | string | "needsAction" or "completed" |
| due | string | Due date (RFC 3339 timestamp) |
| completed | string | Completion date (RFC 3339, output only) |
| deleted | boolean | Whether task is deleted |
| hidden | boolean | Whether task is hidden |
| links | array | Collection of links (output only) |
| webViewLink | string | Link to task in Google Tasks UI (output only) |
Task List Resource Fields
| Field | Type | Description |
|-------|------|-------------|
| kind | string | Always "tasks#taskList" (output only) |
| id | string | Task list identifier |
| etag | string | ETag of the resource |
| title | string | Task list title (max 1024 characters) |
| updated | string | Last modification time (RFC 3339, output only) |
| selfLink | string | URL to this task list (output only) |
Pagination
Google Tasks uses token-based pagination. The CLI automatically paginates with '--paginate'.
Example:
maton google-tasks task list -l <tasklistId> --paginate
Code Examples
CLI
# List all task lists
maton google-tasks tasklist list
# Filter with jq — e.g., extract task list titles
maton google-tasks tasklist list --json --jq '.items[].title'
# Create a task with a due date
maton google-tasks task create -l <tasklistId> --title 'Write spec' --due 2026-12-01
JavaScript
// List all task lists
const response = await fetch(
'https://api.maton.ai/google-tasks/tasks/v1/users/@me/lists',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
// Create a new task
const createResponse = await fetch(
`https://api.maton.ai/google-tasks/tasks/v1/lists/${tasklistId}/tasks`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'New Task',
notes: 'Task description',
due: '2026-03-01T00:00:00.000Z'
})
}
);
Python
import os
import requests
# List all task lists
response = requests.get(
'https://api.maton.ai/google-tasks/tasks/v1/users/@me/lists',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
# Create a new task
create_response = requests.post(
f'https://api.maton.ai/google-tasks/tasks/v1/lists/{tasklist_id}/tasks',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
json={
'title': 'New Task',
'notes': 'Task description',
'due': '2026-03-01T00:00:00.000Z'
}
)
Notes
- Task list IDs and task IDs are opaque strings (base64-encoded)
- Status values are "needsAction" or "completed"
- Due dates are RFC 3339 timestamps
- Maximum title length: 1024 characters
- Maximum notes length: 8192 characters
- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.
Error Handling
| Status | Meaning | |--------|---------| | 400 | Missing Google Tasks connection | | 401 | Invalid or missing Maton API key | | 404 | Task or task list not found | | 429 | Rate limited | | 4xx/5xx | Passthrough error from Google Tasks API |
Troubleshooting: API Key Issues
CLI:
- Check your auth state:
maton whoami
- Verify the API key is valid by listing connections:
maton connection list
Manual:
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
Troubleshooting: Invalid App Name
- Ensure your URL path starts with
google-tasks. For example:
- Correct:
https://api.maton.ai/google-tasks/tasks/v1/users/@me/lists - Incorrect:
https://api.maton.ai/tasks/v1/users/@me/lists
扫码联系在线客服