# Send Motion to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "motion",
    "name": "Motion",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/byungkyu/motion",
    "canonicalUrl": "https://clawhub.ai/byungkyu/motion",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/motion",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=motion",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md",
      "LICENSE.txt"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "motion",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T10:51:56.283Z",
      "expiresAt": "2026-05-07T10:51:56.283Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=motion",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=motion",
        "contentDisposition": "attachment; filename=\"motion-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "motion"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/motion"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/motion",
    "downloadUrl": "https://openagent3.xyz/downloads/motion",
    "agentUrl": "https://openagent3.xyz/skills/motion/agent",
    "manifestUrl": "https://openagent3.xyz/skills/motion/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/motion/agent.md"
  }
}
```
## Documentation

### Motion

Access the Motion API with managed OAuth authentication. Manage tasks, projects, workspaces, comments, and recurring tasks with full CRUD operations.

### Quick Start

# List tasks
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/motion/v1/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://gateway.maton.ai/motion/{native-api-path}

Replace {native-api-path} with the actual Motion API endpoint path. The gateway proxies requests to api.usemotion.com and automatically injects your OAuth token.

### Authentication

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"

### Getting Your API Key

Sign in or create an account at maton.ai
Go to maton.ai/settings
Copy your API key

### Connection Management

Manage your Motion OAuth connections at https://ctrl.maton.ai.

### List Connections

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=motion&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

python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'motion'}).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

### Get Connection

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": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
    "status": "ACTIVE",
    "creation_time": "2025-12-08T07:20:53.488460Z",
    "last_updated_time": "2026-01-31T20:03:32.593153Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "motion",
    "metadata": {}
  }
}

Open the returned url in a browser to complete OAuth authorization.

### Delete Connection

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

### Specifying Connection

If you have multiple Motion 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/motion/v1/tasks')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If omitted, the gateway uses the default (oldest) active connection.

### Task Operations

List Tasks

GET /motion/v1/tasks

Query Parameters:

workspaceId (string) - Filter by workspace
projectId (string) - Filter by project
assigneeId (string) - Filter by assignee
status (array) - Filter by status (cannot combine with includeAllStatuses)
includeAllStatuses (boolean) - Return tasks across all statuses
label (string) - Filter by label
name (string) - Search task names (case-insensitive)
cursor (string) - Pagination cursor

Example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.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))
EOF

Get 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 title
workspaceId (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 status
projectId (string) - Associated project
description (string) - GitHub Flavored Markdown supported
priority (string) - ASAP, HIGH, MEDIUM, or LOW
labels (array) - Label names to add
assigneeId (string) - User ID for task assignment
autoScheduled (object) - Auto-scheduling settings with startDate, deadlineType (HARD, SOFT, NONE), and schedule

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://gateway.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))
EOF

Update 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}/unassign

### Project Operations

List Projects

GET /motion/v1/projects?workspaceId={workspaceId}

Query Parameters:

workspaceId (string, required) - Workspace ID
cursor (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 name
workspaceId (string) - Workspace ID

Optional Fields:

dueDate (datetime, ISO 8601) - Project deadline
description (string) - HTML input accepted
labels (array) - Label names
priority (string) - ASAP, HIGH, MEDIUM (default), or LOW
projectDefinitionId (string) - Template ID (requires stages array if provided)
stages (array) - Stage objects for project templates

### Workspace Operations

List Workspaces

GET /motion/v1/workspaces

### User Operations

List 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/me

### Comment Operations

List Comments

GET /motion/v1/comments?taskId={taskId}

Query Parameters:

taskId (string, required) - Filter comments by task
cursor (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

### Recurring Task Operations

List Recurring Tasks

GET /motion/v1/recurring-tasks?workspaceId={workspaceId}

Query Parameters:

workspaceId (string, required) - Filter by workspace
cursor (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}

### Schedule Operations

List Schedules

GET /motion/v1/schedules

### Status Operations

List Statuses

GET /motion/v1/statuses?workspaceId={workspaceId}

Query Parameters:

workspaceId (string, required) - Filter by workspace

### Custom Field Operations

List Custom Fields

GET /motion/v1/custom-fields

Create 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}/project

Remove Custom Field from Task

DELETE /motion/v1/custom-fields/{customFieldId}/task

### Pagination

Motion uses cursor-based pagination:

GET /motion/v1/tasks?cursor=CURSOR_VALUE

Response includes pagination metadata:

{
  "tasks": [...],
  "meta": {
    "nextCursor": "abc123",
    "pageSize": 20
  }
}

Use the nextCursor value in subsequent requests to retrieve more results.

### JavaScript

const response = await fetch(
  'https://gateway.maton.ai/motion/v1/tasks',
  {
    headers: {
      'Authorization': \`Bearer ${process.env.MATON_API_KEY}\`
    }
  }
);
const data = await response.json();

### Python

import os
import requests

response = requests.get(
    'https://gateway.maton.ai/motion/v1/tasks',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()

### Notes

All timestamps use ISO 8601 format
Task descriptions support GitHub Flavored Markdown
Project descriptions accept HTML input
Priority values: ASAP, HIGH, MEDIUM, LOW
Deadline types for auto-scheduling: HARD, SOFT, NONE
Rate limits: 12 req/min (Individual), 120 req/min (Team)
IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments

### Error Handling

StatusMeaning400Missing Motion connection or invalid request401Invalid or missing Maton API key429Rate limited4xx/5xxPassthrough error from Motion API

### Resources

Motion API Documentation
Motion API Reference
Motion Cookbooks
Maton Community
Maton Support
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: byungkyu
- Version: 1.0.0
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-04-30T10:51:56.283Z
- Expires at: 2026-05-07T10:51:56.283Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/motion)
- [Send to Agent page](https://openagent3.xyz/skills/motion/agent)
- [JSON manifest](https://openagent3.xyz/skills/motion/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/motion/agent.md)
- [Download page](https://openagent3.xyz/downloads/motion)