Asana node reference - all 172 operations, the credential it needs, and a worked example.
Asana REST API (Project management). 172 operations: tasks (create, get, update, complete, delete, duplicate, list by project/section/tag/My Tasks, premium search, custom-ID lookup, subtasks, reparenting, project and tag membership, followers) and task dependencies; comments and the activity stream, plus reactions; attachments; projects (full CRUD, search, duplicate, save as template, task counts, members, followers, memberships); sections; tags; status updates; project and task templates plus job polling; custom fields and their per-project, per-team, per-portfolio and per-goal settings; users, workspaces, teams, team and workspace memberships, and the generic membership API with access levels; portfolios; goals with metrics and comments; time tracking; and webhook, event-stream and rule-trigger management.
Credential: Asana personal access token - see Credentials.
Each operation below lists the scope it needs. Scopes are requested by an OAuth app at authorization time. This is the one provider on the list where the table is DIAGNOSTIC rather than actionable, and saying so is the whole point: Pipory's Asana credential holds a personal access token, and a PAT is not scoped at all — it inherits the entire permission set of the user who minted it under Settings -> Apps -> Developer apps. So there is no checkbox anywhere for a user to tick, and a 403 never means "add this scope"; it means that USER cannot see or edit that object, or is not an admin for an org-level write. The values below are the exact security[].oauth2 requirements Asana's OpenAPI document declares per endpoint, so they name the capability a refusal is about, and they are precisely what an OAuth app would have to request if the credential is ever swapped for one. Three things about them are worth knowing. First, the naming is not a guide to the resource: addTaskForSection is a Sections endpoint that needs tasks:write, instantiateProject is a Project-templates endpoint that needs projects:write, and attaching a custom field to a project needs projects:write rather than custom_fields:write. Second, 105 of Asana's 249 operations declare NO scope at all and fall back to the global personal-token-or-OAuth requirement — those rows say so in a parenthesised sentence instead of naming a scope, so the node never sends anyone hunting for a grant that does not exist; most of the section, status-update, membership, team-write and goal-write surface is in this group. Third, Asana's spec has a real bug here: goals:write, stories:delete and workspaces.typeahead:read are referenced by operations but missing from its own declared scope list, so a scope picker generated from securitySchemes alone would silently lose delete-comment, goal custom-field writes and typeahead. They are reproduced below as the operations state them. Two gates below are not permissions at all and no token change fixes either: a 402 is a PLAN (task search, project search and every time-tracking write are premium-only), and a 412 on the event streams is Asana handing over a starting sync token rather than refusing anything. If a run fails with a permission error, the node names the missing scope in the error - grant it and re-run; you do not need to rebuild the workflow.
| Operation | What it does | Scope |
|---|
createTask | Create task | tasks:write |
getTask | Get task | tasks:read |
updateTask | Update task | tasks:write |
completeTask | Complete task | tasks:write |
deleteTask | Delete task | tasks:delete |
duplicateTask | Duplicate task | tasks:write |
listTasks | List tasks | tasks:read |
listTasksForProject | List tasks in a project | tasks:read |
listTasksForSection | List tasks in a section | tasks:read |
listTasksForTag | List tasks with a tag | tasks:read |
listTasksForUserTaskList | List tasks in a My Tasks list | tasks:read |
getUserTaskList | Get a user's My Tasks list | tasks:read |
searchTasks | Search tasks in a workspace | tasks:read |
getTaskByCustomId | Get task by custom ID | tasks:read |
createSubtask | Create subtask | tasks:write |
listSubtasks | List subtasks | tasks:read |
setTaskParent | Set a task's parent | tasks:write |
addProjectToTask | Add task to a project | tasks:write |
removeProjectFromTask | Remove task from a project | tasks:write |
listProjectsForTask | List a task's projects | projects:read |
addTagToTask | Add tag to a task | tasks:write |
removeTagFromTask | Remove tag from a task | tasks:write |
listTagsForTask | List a task's tags | tags:read |
addFollowers | Add followers to a task | tasks:write |
removeFollowers | Remove followers from a task | tasks:write |
| Operation | What it does | Scope |
|---|
listDependencies | List dependencies | tasks:read |
addDependencies | Add dependencies | tasks:write |
removeDependencies | Remove dependencies | tasks:write |
listDependents | List dependents | tasks:read |
addDependents | Add dependents | tasks:write |
removeDependents | Remove dependents | tasks:write |
| Operation | What it does | Scope |
|---|
addComment | Comment on a task | stories:write |
listStories | List a task's comments and activity | stories:read |
getStory | Get a comment / story | stories:read |
updateStory | Update a comment | stories:write |
deleteStory | Delete a comment | stories:delete |
listReactions | List reactions on a comment or status update | (any valid token — Asana declares no scope for the reactions read) |
| Operation | What it does | Scope |
|---|
addAttachmentByUrl | Attach an external URL | attachments:write |
listAttachments | List attachments on an object | attachments:read |
getAttachment | Get attachment | attachments:read |
deleteAttachment | Delete attachment | attachments:delete |
| Operation | What it does | Scope |
|---|
createProject | Create project | projects:write |
createProjectInWorkspace | Create project in a workspace | projects:write |
createProjectInTeam | Create project in a team | projects:write |
getProject | Get project | projects:read |
updateProject | Update project | projects:write |
deleteProject | Delete project | projects:delete |
listProjects | List projects | projects:read |
listProjectsForWorkspace | List a workspace's projects | projects:read |
listProjectsForTeam | List a team's projects | projects:read |
searchProjects | Search projects in a workspace | projects:read |
duplicateProject | Duplicate project | projects:write |
saveProjectAsTemplate | Save project as a template | (any valid token — Asana declares no scope for saveAsTemplate; you still need edit access to the project) |
getProjectTaskCounts | Get a project's task counts | projects:read |
addProjectMembers | Add members to a project | (any valid token — Asana declares no scope for the project member and follower writes) |
removeProjectMembers | Remove members from a project | (any valid token — Asana declares no scope for the project member and follower writes) |
addProjectFollowers | Add followers to a project | (any valid token — Asana declares no scope for the project member and follower writes) |
removeProjectFollowers | Remove followers from a project | (any valid token — Asana declares no scope for the project member and follower writes) |
listProjectMemberships | List a project's memberships | (any valid token — Asana declares no scope for the project-membership reads) |
getProjectMembership | Get project membership | (any valid token — Asana declares no scope for the project-membership reads) |
| Operation | What it does | Scope |
|---|
createSection | Create section | (any valid token — Asana declares no scope for the section endpoints; you need edit access to the project) |
getSection | Get section | (any valid token — Asana declares no scope for the section endpoints) |
updateSection | Rename section | (any valid token — Asana declares no scope for the section endpoints; you need edit access to the project) |
deleteSection | Delete section | (any valid token — Asana declares no scope for the section endpoints; you need edit access to the project) |
listSections | List a project's sections | (any valid token — Asana declares no scope for the section endpoints) |
addTaskToSection | Add task to section | tasks:write |
moveSection | Move / reorder section | (any valid token — Asana declares no scope for the section endpoints; you need edit access to the project) |
| Operation | What it does | Scope |
|---|
createTag | Create tag | tags:write |
createTagInWorkspace | Create tag in a workspace | tags:write |
getTag | Get tag | tags:read |
updateTag | Update tag | tags:write |
deleteTag | Delete tag | (any valid token — Asana declares no scope for the tag delete, unlike every other tag endpoint) |
listTags | List tags | tags:read |
listTagsForWorkspace | List a workspace's tags | tags:read |
| Operation | What it does | Scope |
|---|
createStatusUpdate | Post a status update | (any valid token — Asana declares no scope for the status-update endpoints) |
listStatusUpdates | List status updates on an object | (any valid token — Asana declares no scope for the status-update endpoints) |
getStatusUpdate | Get status update | (any valid token — Asana declares no scope for the status-update endpoints) |
deleteStatusUpdate | Delete status update | (any valid token — Asana declares no scope for the status-update endpoints) |
| Operation | What it does | Scope |
|---|
listProjectTemplates | List project templates | project_templates:read |
getProjectTemplate | Get project template | project_templates:read |
listProjectTemplatesForTeam | List a team's project templates | project_templates:read |
instantiateProject | Create project from a template | projects:write |
listTaskTemplates | List task templates | task_templates:read |
getTaskTemplate | Get task template | task_templates:read |
instantiateTask | Create task from a template | (any valid token — Asana declares no scope for instantiateTask, unlike instantiateProject) |
getJob | Get job (poll an async operation) | jobs:read |
| Operation | What it does | Scope |
|---|
listCustomFields | List a workspace's custom fields | custom_fields:read |
getCustomField | Get custom field | custom_fields:read |
createCustomField | Create custom field | custom_fields:write |
updateCustomField | Update custom field | custom_fields:write |
deleteCustomField | Delete custom field | (any valid token — Asana declares no scope for the custom-field delete) |
createEnumOption | Add an enum option | custom_fields:write |
insertEnumOption | Reorder an enum option | custom_fields:write |
updateEnumOption | Update / disable an enum option | custom_fields:write |
addCustomFieldToProject | Add custom field to a project | projects:write |
removeCustomFieldFromProject | Remove custom field from a project | projects:write |
listProjectCustomFieldSettings | List a project's custom fields | projects:read |
listTeamCustomFieldSettings | List a team's custom fields | teams:read |
| Operation | What it does | Scope |
|---|
getUser | Get user (or me) | users:read |
listUsers | List users | users:read |
listUsersForWorkspace | List a workspace's users | users:read |
listUsersForTeam | List a team's users | users:read |
listUserFavorites | List a user's favorites | users:read |
updateUser | Update a user's custom fields | (any valid token — Asana declares no scope for the user update; writing user custom fields is a paid-tier feature) |
| Operation | What it does | Scope |
|---|
listWorkspaces | List workspaces | workspaces:read |
getWorkspace | Get workspace | workspaces:read |
updateWorkspace | Update workspace | (any valid token — Asana declares no scope for the workspace write; you must be an admin) |
addUserToWorkspace | Add user to a workspace | (any valid token — Asana declares no scope for the workspace member writes; you must be an admin) |
removeUserFromWorkspace | Remove user from a workspace | (any valid token — Asana declares no scope for the workspace member writes; you must be an admin) |
typeahead | Typeahead search (resolve names to GIDs) | workspaces.typeahead:read |
| Operation | What it does | Scope |
|---|
getTeam | Get team | teams:read |
createTeam | Create team | (any valid token — Asana declares no scope for the team writes; you must be able to create teams in the organization) |
updateTeam | Update team | (any valid token — Asana declares no scope for the team writes) |
listTeamsForWorkspace | List a workspace's teams | teams:read |
listTeamsForUser | List a user's teams | teams:read |
addUserToTeam | Add user to a team | (any valid token — Asana declares no scope for the team member writes) |
removeUserFromTeam | Remove user from a team | (any valid token — Asana declares no scope for the team member writes) |
listTeamMemberships | List team memberships | team_memberships:read |
getTeamMembership | Get team membership | team_memberships:read |
listTeamMembershipsForTeam | List a team's memberships | team_memberships:read |
listTeamMembershipsForUser | List a user's team memberships | team_memberships:read |
listWorkspaceMemberships | List a workspace's memberships | (any valid token — Asana declares no scope for the workspace-membership reads) |
getWorkspaceMembership | Get workspace membership | (any valid token — Asana declares no scope for the workspace-membership reads) |
listWorkspaceMembershipsForUser | List a user's workspace memberships | (any valid token — Asana declares no scope for the workspace-membership reads) |
listMemberships | List memberships (project / goal / portfolio) | (any valid token — Asana declares no scope for the generic membership endpoints) |
getMembership | Get membership | (any valid token — Asana declares no scope for the generic membership endpoints) |
createMembership | Add a member with an access level | (any valid token — Asana declares no scope for the generic membership endpoints) |
updateMembership | Change a member's access level | (any valid token — Asana declares no scope for the generic membership endpoints) |
deleteMembership | Remove a member | (any valid token — Asana declares no scope for the generic membership endpoints) |
| Operation | What it does | Scope |
|---|
createPortfolio | Create portfolio | portfolios:write |
getPortfolio | Get portfolio | portfolios:read |
updatePortfolio | Update portfolio | portfolios:write |
deletePortfolio | Delete portfolio | (any valid token — Asana declares no scope for the portfolio delete) |
listPortfolios | List portfolios | portfolios:read |
duplicatePortfolio | Duplicate portfolio | portfolios:write |
listPortfolioItems | List a portfolio's items | portfolios:read |
addPortfolioItem | Add item to a portfolio | portfolios:write |
removePortfolioItem | Remove item from a portfolio | portfolios:write |
addPortfolioMembers | Add members to a portfolio | (any valid token — Asana declares no scope for the portfolio member writes) |
removePortfolioMembers | Remove members from a portfolio | (any valid token — Asana declares no scope for the portfolio member writes) |
addCustomFieldToPortfolio | Add custom field to a portfolio | portfolios:write |
removeCustomFieldFromPortfolio | Remove custom field from a portfolio | portfolios:write |
listPortfolioCustomFieldSettings | List a portfolio's custom fields | portfolios:read |
| Operation | What it does | Scope |
|---|
createGoal | Create goal | (any valid token — Asana declares goals:read for the reads but no scope for the goal writes) |
getGoal | Get goal | goals:read |
updateGoal | Update goal | (any valid token — Asana declares goals:read for the reads but no scope for the goal writes) |
deleteGoal | Delete goal | (any valid token — Asana declares goals:read for the reads but no scope for the goal writes) |
listGoals | List goals | goals:read |
listParentGoals | List a goal's parent goals | goals:read |
addGoalFollowers | Add followers to a goal | (any valid token — Asana declares no scope for the goal follower writes) |
removeGoalFollowers | Remove followers from a goal | (any valid token — Asana declares no scope for the goal follower writes) |
setGoalMetric | Set a goal's metric | (any valid token — Asana declares no scope for the goal metric writes) |
updateGoalMetric | Update a goal's current metric value | (any valid token — Asana declares no scope for the goal metric writes) |
addCustomFieldToGoal | Add custom field to a goal | goals:write |
removeCustomFieldFromGoal | Remove custom field from a goal | goals:write |
listGoalCustomFieldSettings | List a goal's custom fields | goals:read |
listGoalStories | List a goal's comments | stories:read |
addGoalComment | Comment on a goal | stories:write |
| Operation | What it does | Scope |
|---|
createTimeEntry | Log time on a task | (any valid token — Asana declares no scope for the time-entry writes; the endpoint is premium-gated and answers 402 on a free plan) |
listTimeEntriesForTask | List a task's time entries | time_tracking_entries:read |
listTimeEntries | List time entries | time_tracking_entries:read |
getTimeEntry | Get time entry | time_tracking_entries:read |
updateTimeEntry | Update time entry | (any valid token — Asana declares no scope for the time-entry writes; the endpoint is premium-gated and answers 402 on a free plan) |
deleteTimeEntry | Delete time entry | (any valid token — Asana declares no scope for the time-entry writes; the endpoint is premium-gated and answers 402 on a free plan) |
| Operation | What it does | Scope |
|---|
listWebhooks | List webhooks | webhooks:read |
createWebhook | Establish a webhook | webhooks:write |
getWebhook | Get webhook | webhooks:read |
updateWebhook | Update webhook filters | webhooks:write |
deleteWebhook | Delete webhook | webhooks:delete |
getEvents | Get events for a resource (sync token) | (any valid token — Asana declares no scope for the event streams; you need read access to the resource) |
getWorkspaceEvents | Get workspace events (sync token) | (any valid token — Asana declares no scope for the event streams; you need read access to the workspace) |
triggerRule | Trigger an Asana rule | (any valid token — Asana declares no scope for rule triggers; the rule must use an 'incoming web request' trigger) |
Open a task in the right project and section, and say why
A support escalation should land in engineering's board as a real, actionable card — in the triage column, assigned, dated, with the customer's context attached as a comment. Creating the task is one call; the two follow-ups matter because Asana splits them out. createTask can file a task into a project but not into a SECTION of it, so a board workflow needs addProjectToTask (or addTaskToSection) afterwards, and a description is not a comment — addComment is what shows up in the activity feed and notifies followers.
Set Operation to createTask, then fill in:
| Field | Value | Notes |
|---|
name | Escalation: {{ myTrigger.subject }} | Required |
projectId | 1201234567890123 | A task must have a home — set a project, or a workspace, or a parent task. The node refuses the request up front rather than letting Asana answer 400 with a message that does not name the fix |
assignee | {{ myTrigger.ownerEmail }} | A user GID, an email address, or me |
dueOn | {{ myTrigger.slaDate }} | YYYY-MM-DD. Use dueAt instead for a specific hour — setting one clears the other |
notes | Reported by {{ myTrigger.customer }}. Severity {{ myTrigger.severity }}. | Plain text; use htmlNotes for formatting |
customFieldsJson | {"1201234567890999": "P1"} | Keyed by custom-field GID, not by field name — run listCustomFields once to find them |
optFields | name, permalink_url, assignee.name | Asana returns COMPACT records by default, so without this you get little more than the gid. Note it REPLACES the default set rather than adding to it |
Sets {{task.id}} (the gid — a numeric-looking STRING; never coerce it to a number or it loses digits), {{task.name}}, {{task.url}} (the permalink) and {{task.task}} (the full record). Chain addProjectToTask with sectionId to drop it into a specific column, then addComment with commentText to post the customer context. A 402 anywhere on this node is a plan gate, not a permission — search and time tracking are premium-only — and a 403 is about what the token's USER can see, since an Asana personal access token is unscoped and carries that person's full access.