Motion
PROJECT MANAGEMENT · TASKS
Tasks, projects, recurring tasks, and comments in the workspaces they connected.
Acts as the person, not as itself
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Credentials never touch the agent
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Every call on the record
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
What an agent can do
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
motion_delete_beta_custom_field_values_project_by_projectid_custom_fields_by_valueidWRITEClear a custom field value on a project via DELETE /beta/custom-field-values/project/{projectId}/custom-fields/{valueId}. Clear one custom field's value on one project. The field DEFINITION and every other project's value for it are untouched -- only this project's value is removed. Served from Motion's `/beta/` API surface, which the vendor may change without a version bump. It uses the same host and the same API key as the `/v1/` tools.
motion_delete_beta_custom_field_values_task_by_taskid_custom_fields_by_valueidWRITEClear a custom field value on a task via DELETE /beta/custom-field-values/task/{taskId}/custom-fields/{valueId}. Clear one custom field's value on one task. The field DEFINITION and every other task's value for it are untouched -- only this task's value is removed. Served from Motion's `/beta/` API surface, which the vendor may change without a version bump. It uses the same host and the same API key as the `/v1/` tools.
motion_delete_beta_workspaces_by_workspaceid_custom_fields_by_idWRITEDelete workspace custom field via DELETE /beta/workspaces/{workspaceId}/custom-fields/{id}. Permanently delete a custom field DEFINITION from a workspace. This changes the workspace's shared schema and discards the values every task and project in it held for that field. It is not the same as clearing one task's value -- use the clear-value tools for that. Changes the workspace's shared configuration. It takes effect for every member of that workspace and every task and project in it, not only for this connection. Served from Motion's `/beta/` API surface, which the vendor may change without a version bump. It uses the same host and the same API key as the `/v1/` tools.
motion_delete_v1_recurring_tasks_by_idWRITEDelete recurring task via DELETE /v1/recurring-tasks/{id}. Permanently delete a recurring task definition, stopping it from generating any further tasks. Tasks it already generated are not removed by this call.
motion_delete_v1_tasks_by_idWRITEDelete task via DELETE /v1/tasks/{id}. Permanently delete one task. There is no undo and no trash to restore it from: the task and its comments and custom field values go with it, and Motion reschedules whatever it was blocking.
motion_delete_v1_tasks_by_id_assigneeWRITEUnassign task via DELETE /v1/tasks/{id}/assignee. Remove the assignee from a task, leaving the task itself in place. The task becomes unassigned rather than deleted; Motion stops scheduling it into the former assignee's calendar.
motion_get_beta_workspaces_by_workspaceid_custom_fieldsREADList workspace custom fields via GET /beta/workspaces/{workspaceId}/custom-fields. List the custom fields defined on one workspace, with their ids, names and types. Those ids are what the set-value tools need. Served from Motion's `/beta/` surface, which is a distinct prefix on the same host and the same API key. Served from Motion's `/beta/` API surface, which the vendor may change without a version bump. It uses the same host and the same API key as the `/v1/` tools.
motion_get_v1_commentsREADList task comments via GET /v1/comments. List the comments on one task, oldest first. `taskId` is REQUIRED -- Motion refuses the call with 400 naming the field when it is absent.
motion_get_v1_projectsREADList projects via GET /v1/projects. List the projects of one workspace. `workspaceId` is REQUIRED -- Motion refuses the call with 400 naming the field when it is absent.
motion_get_v1_projects_by_idREADGet project via GET /v1/projects/{id}. Fetch one project in full by its id. The reply carries id, name, description, workspaceId, statusId, priorityLevel, dueDate, startDate, labelIds, managerId, color, type, stages, customFieldValues, createdByUserId, createdTime, updatedTime, completedTime. An id that does not exist answers 404 'Project with ID <id> not found'.
motion_get_v1_recurring_tasksREADList recurring tasks via GET /v1/recurring-tasks. List the recurring task definitions of one workspace -- the rules that generate tasks, not the generated tasks themselves. `workspaceId` is REQUIRED; Motion refuses the call with 400 'workspaceId must be a string' when it is absent. Like List tasks, this route validates parameter names strictly and refuses an unknown one with 400.
motion_get_v1_schedulesREADList schedules via GET /v1/schedules. List the schedules on the API key owner's account -- the named working-hours windows Motion schedules tasks into, each with its timezone and its per-weekday start and end times. It takes no arguments and describes the owner's own availability.
motion_get_v1_statusesREADList task statuses via GET /v1/statuses. List the task statuses defined in one workspace, each with its name and whether it is the default or a resolved status. `workspaceId` is REQUIRED. Statuses are per-workspace, and their NAMES are what the `status` filter on List tasks matches, so read them from here rather than guessing.
motion_get_v1_tasksREADList tasks via GET /v1/tasks. List tasks visible to this API key, newest page first. Every filter is optional and they combine; with none, Motion returns the key owner's tasks across all their workspaces. The reply is `{"meta": {...}, "tasks": [...]}` and pages through `cursor`. Motion validates this route's parameter names strictly: an unknown one is refused with 400 rather than ignored.
motion_get_v1_tasks_by_idREADGet task via GET /v1/tasks/{id}. Fetch one task in full by its id. The reply carries id, name, description, duration, dueDate, deadlineType, startOn, priority, labels, status, assignees, project, workspace, customFieldValues, chunks, scheduledStart, scheduledEnd, schedulingIssue, completed, completedTime, parentRecurringTaskId, creator, createdTime, updatedTime, lastInteractedTime. An id that does not exist answers 404 'Task not found'.
motion_get_v1_usersREADList users via GET /v1/users. List the users of a workspace or of a team. Supply EITHER `workspaceId` OR `teamId` -- Motion refuses the call with 400 'Must provide either a teamId or a workspaceId' when both are absent. Each user carries id, name and email.
motion_get_v1_users_meREADGet my user via GET /v1/users/me. Fetch the user this API key belongs to: id, name and email. It takes no arguments and is the cheapest way to confirm a key works and to learn whose account it is acting as.
motion_get_v1_workspacesREADList workspaces via GET /v1/workspaces. List every workspace this API key can reach, with each workspace's id, name, type, teamId, labels and taskStatuses. This is the starting point for most of the other tools: List projects, List statuses, List recurring tasks and the custom-field tools all need a workspace id.
motion_patch_v1_tasks_by_idWRITEUpdate task via PATCH /v1/tasks/{id}. Update a task in place. The body carries only the fields to change, named as Get task returns them. Changing `duration`, `dueDate`, `deadlineType` or `status` can make Motion reschedule the task and everything queued behind it. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field.
motion_patch_v1_tasks_by_id_moveWRITEMove task to another workspace via PATCH /v1/tasks/{id}/move. Move a task into a different workspace, and optionally reassign it. The body names the destination `workspaceId` and may name an `assigneeId`. Statuses, labels and custom fields are defined PER WORKSPACE, so a move can drop the values that do not exist in the destination. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field.
motion_post_beta_custom_field_values_project_by_projectidWRITESet a custom field value on a project via POST /beta/custom-field-values/project/{projectId}. Set a custom field's value on one project. The body names the field (by an id from List workspace custom fields) and the value to store. Affects that project only. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field. Served from Motion's `/beta/` API surface, which the vendor may change without a version bump. It uses the same host and the same API key as the `/v1/` tools.
motion_post_beta_custom_field_values_task_by_taskidWRITESet a custom field value on a task via POST /beta/custom-field-values/task/{taskId}. Set a custom field's value on one task. The body names the field (by an id from List workspace custom fields) and the value to store. Affects that task only. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field. Served from Motion's `/beta/` API surface, which the vendor may change without a version bump. It uses the same host and the same API key as the `/v1/` tools.
motion_post_beta_workspaces_by_workspaceid_custom_fieldsWRITECreate workspace custom field via POST /beta/workspaces/{workspaceId}/custom-fields. Define a new custom field on a workspace. The body names the field and its type. This changes the workspace's SHARED schema: the new field appears for every member and on every task and project in it, not only for this connection. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field. Changes the workspace's shared configuration. It takes effect for every member of that workspace and every task and project in it, not only for this connection. Served from Motion's `/beta/` API surface, which the vendor may change without a version bump. It uses the same host and the same API key as the `/v1/` tools.
motion_post_v1_commentsWRITECreate comment via POST /v1/comments. Add a comment to a task. The body names the `taskId` and the comment content. A comment is visible to everyone with access to the task and notifies its watchers. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field.
motion_post_v1_projectsWRITECreate project via POST /v1/projects. Create a project in a workspace. The body is Motion's own project object: `name` and `workspaceId` identify it, and the other fields a project carries are the ones Get project returns -- id, name, description, workspaceId, statusId, priorityLevel, dueDate, startDate, labelIds, managerId, color, type, stages, customFieldValues, createdByUserId, createdTime, updatedTime, completedTime. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field.
motion_post_v1_recurring_tasksWRITECreate recurring task via POST /v1/recurring-tasks. Create a recurring task definition: a rule that generates a task on a schedule. The body names the workspace, the task to generate and the recurrence. This creates the RULE, so it keeps producing tasks until it is deleted. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field.
motion_post_v1_tasksWRITECreate task via POST /v1/tasks. Create a task. The body is Motion's own task object: `name` and `workspaceId` identify it, and the other fields a task carries are the ones Get task returns -- id, name, description, duration, dueDate, deadlineType, startOn, priority, labels, status, assignees, project, workspace, customFieldValues, chunks, scheduledStart, scheduledEnd, schedulingIssue, completed, completedTime, parentRecurringTaskId, creator, createdTime, updatedTime, lastInteractedTime. Motion auto-schedules the task into the owner's calendar unless told otherwise, so a created task also moves real calendar time. The `body` argument is a free-form JSON object: Motion publishes no machine-readable schema for this endpoint and the recovered documentation carries no field table, so Agentic Fabriq does not constrain it. Use the field names the matching read tool returns, and read Motion's error body on a 400 -- it names the offending field.
Often connected alongside
Put Motion behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.