Pipory
Node reference

Asana

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.

Scopes

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.

Operations (172)

Tasks

OperationWhat it doesScope
createTaskCreate tasktasks:write
getTaskGet tasktasks:read
updateTaskUpdate tasktasks:write
completeTaskComplete tasktasks:write
deleteTaskDelete tasktasks:delete
duplicateTaskDuplicate tasktasks:write
listTasksList taskstasks:read
listTasksForProjectList tasks in a projecttasks:read
listTasksForSectionList tasks in a sectiontasks:read
listTasksForTagList tasks with a tagtasks:read
listTasksForUserTaskListList tasks in a My Tasks listtasks:read
getUserTaskListGet a user's My Tasks listtasks:read
searchTasksSearch tasks in a workspacetasks:read
getTaskByCustomIdGet task by custom IDtasks:read
createSubtaskCreate subtasktasks:write
listSubtasksList subtaskstasks:read
setTaskParentSet a task's parenttasks:write
addProjectToTaskAdd task to a projecttasks:write
removeProjectFromTaskRemove task from a projecttasks:write
listProjectsForTaskList a task's projectsprojects:read
addTagToTaskAdd tag to a tasktasks:write
removeTagFromTaskRemove tag from a tasktasks:write
listTagsForTaskList a task's tagstags:read
addFollowersAdd followers to a tasktasks:write
removeFollowersRemove followers from a tasktasks:write

Task dependencies

OperationWhat it doesScope
listDependenciesList dependenciestasks:read
addDependenciesAdd dependenciestasks:write
removeDependenciesRemove dependenciestasks:write
listDependentsList dependentstasks:read
addDependentsAdd dependentstasks:write
removeDependentsRemove dependentstasks:write

Comments & activity

OperationWhat it doesScope
addCommentComment on a taskstories:write
listStoriesList a task's comments and activitystories:read
getStoryGet a comment / storystories:read
updateStoryUpdate a commentstories:write
deleteStoryDelete a commentstories:delete
listReactionsList reactions on a comment or status update(any valid token — Asana declares no scope for the reactions read)

Attachments

OperationWhat it doesScope
addAttachmentByUrlAttach an external URLattachments:write
listAttachmentsList attachments on an objectattachments:read
getAttachmentGet attachmentattachments:read
deleteAttachmentDelete attachmentattachments:delete

Projects

OperationWhat it doesScope
createProjectCreate projectprojects:write
createProjectInWorkspaceCreate project in a workspaceprojects:write
createProjectInTeamCreate project in a teamprojects:write
getProjectGet projectprojects:read
updateProjectUpdate projectprojects:write
deleteProjectDelete projectprojects:delete
listProjectsList projectsprojects:read
listProjectsForWorkspaceList a workspace's projectsprojects:read
listProjectsForTeamList a team's projectsprojects:read
searchProjectsSearch projects in a workspaceprojects:read
duplicateProjectDuplicate projectprojects:write
saveProjectAsTemplateSave project as a template(any valid token — Asana declares no scope for saveAsTemplate; you still need edit access to the project)
getProjectTaskCountsGet a project's task countsprojects:read
addProjectMembersAdd members to a project(any valid token — Asana declares no scope for the project member and follower writes)
removeProjectMembersRemove members from a project(any valid token — Asana declares no scope for the project member and follower writes)
addProjectFollowersAdd followers to a project(any valid token — Asana declares no scope for the project member and follower writes)
removeProjectFollowersRemove followers from a project(any valid token — Asana declares no scope for the project member and follower writes)
listProjectMembershipsList a project's memberships(any valid token — Asana declares no scope for the project-membership reads)
getProjectMembershipGet project membership(any valid token — Asana declares no scope for the project-membership reads)

Sections

OperationWhat it doesScope
createSectionCreate section(any valid token — Asana declares no scope for the section endpoints; you need edit access to the project)
getSectionGet section(any valid token — Asana declares no scope for the section endpoints)
updateSectionRename section(any valid token — Asana declares no scope for the section endpoints; you need edit access to the project)
deleteSectionDelete section(any valid token — Asana declares no scope for the section endpoints; you need edit access to the project)
listSectionsList a project's sections(any valid token — Asana declares no scope for the section endpoints)
addTaskToSectionAdd task to sectiontasks:write
moveSectionMove / reorder section(any valid token — Asana declares no scope for the section endpoints; you need edit access to the project)

Tags

OperationWhat it doesScope
createTagCreate tagtags:write
createTagInWorkspaceCreate tag in a workspacetags:write
getTagGet tagtags:read
updateTagUpdate tagtags:write
deleteTagDelete tag(any valid token — Asana declares no scope for the tag delete, unlike every other tag endpoint)
listTagsList tagstags:read
listTagsForWorkspaceList a workspace's tagstags:read

Status updates

OperationWhat it doesScope
createStatusUpdatePost a status update(any valid token — Asana declares no scope for the status-update endpoints)
listStatusUpdatesList status updates on an object(any valid token — Asana declares no scope for the status-update endpoints)
getStatusUpdateGet status update(any valid token — Asana declares no scope for the status-update endpoints)
deleteStatusUpdateDelete status update(any valid token — Asana declares no scope for the status-update endpoints)

Templates & jobs

OperationWhat it doesScope
listProjectTemplatesList project templatesproject_templates:read
getProjectTemplateGet project templateproject_templates:read
listProjectTemplatesForTeamList a team's project templatesproject_templates:read
instantiateProjectCreate project from a templateprojects:write
listTaskTemplatesList task templatestask_templates:read
getTaskTemplateGet task templatetask_templates:read
instantiateTaskCreate task from a template(any valid token — Asana declares no scope for instantiateTask, unlike instantiateProject)
getJobGet job (poll an async operation)jobs:read

Custom fields

OperationWhat it doesScope
listCustomFieldsList a workspace's custom fieldscustom_fields:read
getCustomFieldGet custom fieldcustom_fields:read
createCustomFieldCreate custom fieldcustom_fields:write
updateCustomFieldUpdate custom fieldcustom_fields:write
deleteCustomFieldDelete custom field(any valid token — Asana declares no scope for the custom-field delete)
createEnumOptionAdd an enum optioncustom_fields:write
insertEnumOptionReorder an enum optioncustom_fields:write
updateEnumOptionUpdate / disable an enum optioncustom_fields:write
addCustomFieldToProjectAdd custom field to a projectprojects:write
removeCustomFieldFromProjectRemove custom field from a projectprojects:write
listProjectCustomFieldSettingsList a project's custom fieldsprojects:read
listTeamCustomFieldSettingsList a team's custom fieldsteams:read

Users

OperationWhat it doesScope
getUserGet user (or me)users:read
listUsersList usersusers:read
listUsersForWorkspaceList a workspace's usersusers:read
listUsersForTeamList a team's usersusers:read
listUserFavoritesList a user's favoritesusers:read
updateUserUpdate 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)

Workspaces

OperationWhat it doesScope
listWorkspacesList workspacesworkspaces:read
getWorkspaceGet workspaceworkspaces:read
updateWorkspaceUpdate workspace(any valid token — Asana declares no scope for the workspace write; you must be an admin)
addUserToWorkspaceAdd user to a workspace(any valid token — Asana declares no scope for the workspace member writes; you must be an admin)
removeUserFromWorkspaceRemove user from a workspace(any valid token — Asana declares no scope for the workspace member writes; you must be an admin)
typeaheadTypeahead search (resolve names to GIDs)workspaces.typeahead:read

Teams & memberships

OperationWhat it doesScope
getTeamGet teamteams:read
createTeamCreate team(any valid token — Asana declares no scope for the team writes; you must be able to create teams in the organization)
updateTeamUpdate team(any valid token — Asana declares no scope for the team writes)
listTeamsForWorkspaceList a workspace's teamsteams:read
listTeamsForUserList a user's teamsteams:read
addUserToTeamAdd user to a team(any valid token — Asana declares no scope for the team member writes)
removeUserFromTeamRemove user from a team(any valid token — Asana declares no scope for the team member writes)
listTeamMembershipsList team membershipsteam_memberships:read
getTeamMembershipGet team membershipteam_memberships:read
listTeamMembershipsForTeamList a team's membershipsteam_memberships:read
listTeamMembershipsForUserList a user's team membershipsteam_memberships:read
listWorkspaceMembershipsList a workspace's memberships(any valid token — Asana declares no scope for the workspace-membership reads)
getWorkspaceMembershipGet workspace membership(any valid token — Asana declares no scope for the workspace-membership reads)
listWorkspaceMembershipsForUserList a user's workspace memberships(any valid token — Asana declares no scope for the workspace-membership reads)
listMembershipsList memberships (project / goal / portfolio)(any valid token — Asana declares no scope for the generic membership endpoints)
getMembershipGet membership(any valid token — Asana declares no scope for the generic membership endpoints)
createMembershipAdd a member with an access level(any valid token — Asana declares no scope for the generic membership endpoints)
updateMembershipChange a member's access level(any valid token — Asana declares no scope for the generic membership endpoints)
deleteMembershipRemove a member(any valid token — Asana declares no scope for the generic membership endpoints)

Portfolios

OperationWhat it doesScope
createPortfolioCreate portfolioportfolios:write
getPortfolioGet portfolioportfolios:read
updatePortfolioUpdate portfolioportfolios:write
deletePortfolioDelete portfolio(any valid token — Asana declares no scope for the portfolio delete)
listPortfoliosList portfoliosportfolios:read
duplicatePortfolioDuplicate portfolioportfolios:write
listPortfolioItemsList a portfolio's itemsportfolios:read
addPortfolioItemAdd item to a portfolioportfolios:write
removePortfolioItemRemove item from a portfolioportfolios:write
addPortfolioMembersAdd members to a portfolio(any valid token — Asana declares no scope for the portfolio member writes)
removePortfolioMembersRemove members from a portfolio(any valid token — Asana declares no scope for the portfolio member writes)
addCustomFieldToPortfolioAdd custom field to a portfolioportfolios:write
removeCustomFieldFromPortfolioRemove custom field from a portfolioportfolios:write
listPortfolioCustomFieldSettingsList a portfolio's custom fieldsportfolios:read

Goals

OperationWhat it doesScope
createGoalCreate goal(any valid token — Asana declares goals:read for the reads but no scope for the goal writes)
getGoalGet goalgoals:read
updateGoalUpdate goal(any valid token — Asana declares goals:read for the reads but no scope for the goal writes)
deleteGoalDelete goal(any valid token — Asana declares goals:read for the reads but no scope for the goal writes)
listGoalsList goalsgoals:read
listParentGoalsList a goal's parent goalsgoals:read
addGoalFollowersAdd followers to a goal(any valid token — Asana declares no scope for the goal follower writes)
removeGoalFollowersRemove followers from a goal(any valid token — Asana declares no scope for the goal follower writes)
setGoalMetricSet a goal's metric(any valid token — Asana declares no scope for the goal metric writes)
updateGoalMetricUpdate a goal's current metric value(any valid token — Asana declares no scope for the goal metric writes)
addCustomFieldToGoalAdd custom field to a goalgoals:write
removeCustomFieldFromGoalRemove custom field from a goalgoals:write
listGoalCustomFieldSettingsList a goal's custom fieldsgoals:read
listGoalStoriesList a goal's commentsstories:read
addGoalCommentComment on a goalstories:write

Time tracking

OperationWhat it doesScope
createTimeEntryLog 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)
listTimeEntriesForTaskList a task's time entriestime_tracking_entries:read
listTimeEntriesList time entriestime_tracking_entries:read
getTimeEntryGet time entrytime_tracking_entries:read
updateTimeEntryUpdate 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)
deleteTimeEntryDelete 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)

Webhooks, events & rules

OperationWhat it doesScope
listWebhooksList webhookswebhooks:read
createWebhookEstablish a webhookwebhooks:write
getWebhookGet webhookwebhooks:read
updateWebhookUpdate webhook filterswebhooks:write
deleteWebhookDelete webhookwebhooks:delete
getEventsGet events for a resource (sync token)(any valid token — Asana declares no scope for the event streams; you need read access to the resource)
getWorkspaceEventsGet workspace events (sync token)(any valid token — Asana declares no scope for the event streams; you need read access to the workspace)
triggerRuleTrigger an Asana rule(any valid token — Asana declares no scope for rule triggers; the rule must use an 'incoming web request' trigger)

Example

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:

FieldValueNotes
nameEscalation: {{ myTrigger.subject }}Required
projectId1201234567890123A 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
notesReported 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
optFieldsname, permalink_url, assignee.nameAsana 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.