Access the Motion API with managed OAuth authentication. Manage tasks, projects, workspaces, comments, and recurring tasks with full CRUD operations.
Reference
List Tasks
GET /motion/v1/tasksQuery Parameters:
workspaceId(string) - Filter by workspaceprojectId(string) - Filter by projectassigneeId(string) - Filter by assigneestatus(array) - Filter by status (cannot combine withincludeAllStatuses)includeAllStatuses(boolean) - Return tasks across all statuseslabel(string) - Filter by labelname(string) - Search task names (case-insensitive)cursor(string) - Pagination cursor
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/motion/v1/tasks?workspaceId=WORKSPACE_ID')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFGet Task
GET /motion/v1/tasks/{taskId}Create Task
POST /motion/v1/tasks
Content-Type: application/json
{
"name": "Task name",
"workspaceId": "WORKSPACE_ID",
"dueDate": "2024-03-15T10:00:00Z",
"duration": 60,
"priority": "HIGH",
"description": "Task description in markdown",
"projectId": "PROJECT_ID",
"assigneeId": "USER_ID",
"labels": ["label1", "label2"],
"autoScheduled": {
"startDate": "2024-03-14T09:00:00Z",
"deadlineType": "SOFT",
"schedule": "Work Hours"
}
}Required Fields:
name(string) - Task titleworkspaceId(string) - Workspace ID
Optional Fields:
dueDate(datetime, ISO 8601) - Task deadline (required for scheduled tasks)duration(string | number) - "NONE", "REMINDER", or minutes (integer > 0)status(string) - Defaults to workspace default statusprojectId(string) - Associated projectdescription(string) - GitHub Flavored Markdown supportedpriority(string) - ASAP, HIGH, MEDIUM, or LOWlabels(array) - Label names to addassigneeId(string) - User ID for task assignmentautoScheduled(object) - Auto-scheduling settings withstartDate,deadlineType(HARD, SOFT, NONE), andschedule
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
'name': 'New task',
'workspaceId': 'WORKSPACE_ID',
'priority': 'HIGH',
'duration': 30
}).encode()
req = urllib.request.Request('https://api.maton.ai/motion/v1/tasks', 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))
EOFUpdate Task
PATCH /motion/v1/tasks/{taskId}
Content-Type: application/json
{
"name": "Updated task name",
"status": "Completed",
"priority": "LOW"
}Delete Task
DELETE /motion/v1/tasks/{taskId}Move Task
POST /motion/v1/tasks/{taskId}/move
Content-Type: application/json
{
"workspaceId": "NEW_WORKSPACE_ID"
}Unassign Task
POST /motion/v1/tasks/{taskId}/unassignList Projects
GET /motion/v1/projects?workspaceId={workspaceId}Query Parameters:
workspaceId(string, required) - Workspace IDcursor(string) - Pagination cursor
Get Project
GET /motion/v1/projects/{projectId}Create Project
POST /motion/v1/projects
Content-Type: application/json
{
"name": "Project name",
"workspaceId": "WORKSPACE_ID",
"description": "Project description",
"dueDate": "2024-06-30T00:00:00Z",
"priority": "HIGH",
"labels": ["label1"]
}Required Fields:
name(string) - Project nameworkspaceId(string) - Workspace ID
Optional Fields:
dueDate(datetime, ISO 8601) - Project deadlinedescription(string) - HTML input acceptedlabels(array) - Label namespriority(string) - ASAP, HIGH, MEDIUM (default), or LOWprojectDefinitionId(string) - Template ID (requiresstagesarray if provided)stages(array) - Stage objects for project templates
List Workspaces
GET /motion/v1/workspacesList Users
GET /motion/v1/users?workspaceId={workspaceId}Query Parameters:
workspaceId(string) - Workspace ID (required if no teamId)teamId(string) - Team ID (required if no workspaceId)
Note: You must provide either workspaceId or teamId.
Get Current User
GET /motion/v1/users/meList Comments
GET /motion/v1/comments?taskId={taskId}Query Parameters:
taskId(string, required) - Filter comments by taskcursor(string) - Pagination cursor
Create Comment
POST /motion/v1/comments
Content-Type: application/json
{
"taskId": "TASK_ID",
"content": "Comment in GitHub Flavored Markdown"
}Required Fields:
taskId(string) - Task to comment on
Optional Fields:
content(string) - Comment content in GitHub Flavored Markdown
List Recurring Tasks
GET /motion/v1/recurring-tasks?workspaceId={workspaceId}Query Parameters:
workspaceId(string, required) - Filter by workspacecursor(string) - Pagination cursor
Create Recurring Task
POST /motion/v1/recurring-tasks
Content-Type: application/json
{
"name": "Weekly review",
"workspaceId": "WORKSPACE_ID",
"frequency": "weekly"
}Delete Recurring Task
DELETE /motion/v1/recurring-tasks/{recurringTaskId}List Schedules
GET /motion/v1/schedulesList Statuses
GET /motion/v1/statuses?workspaceId={workspaceId}Query Parameters:
workspaceId(string, required) - Filter by workspace
List Custom Fields
GET /motion/v1/custom-fieldsCreate Custom Field
POST /motion/v1/custom-fields
Content-Type: application/json
{
"name": "Field name",
"type": "text"
}Delete Custom Field
DELETE /motion/v1/custom-fields/{customFieldId}Add Custom Field to Project
POST /motion/v1/custom-fields/{customFieldId}/project
Content-Type: application/json
{
"projectId": "PROJECT_ID"
}Add Custom Field to Task
POST /motion/v1/custom-fields/{customFieldId}/task
Content-Type: application/json
{
"taskId": "TASK_ID"
}Remove Custom Field from Project
DELETE /motion/v1/custom-fields/{customFieldId}/projectRemove Custom Field from Task
DELETE /motion/v1/custom-fields/{customFieldId}/task