asana
Important
Version 3.X.X is the newest release of our Node client library and currently in public beta. This means that while it has the latest Asana features, we're still putting on the final touches to ensure it's as stable and reliable as possible.
🛠️ Looking Ahead
This version will receive updates going forward, and it’s on track to reach full stability soon. Your input is invaluable in this process! If you spot any issues, have suggestions, or need help, don’t hesitate to reach out. You can open a GitHub issue or submit your feedback directly to us.
📖 Get Started with Examples and Resources
For now, if you’re in search of a version that has stood the test of time and is proven to be stable, we recommend using version 1.0.2. You can easily install it using: npm install asana@1.0.2
and following v1 samples and documentation.
- API version: 1.0
- Package version: 3.0.0
Installation
npm install from npmjs
npm install asana --save
For browser
Include the latest release directly from GitHub:
<script src="https://github.com/Asana/node-asana/releases/download/v3.0.0/asana-min.js"></script>
Example usage (NOTE: be careful not to expose your access token):
<script>
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let usersApiInstance = new Asana.UsersApi();
let user_gid = "me";
let opts = {};
usersApiInstance.getUser(user_gid, opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
</script>
Webpack Configuration
Using Webpack you may encounter the following error: "Module not found: Error:
Cannot resolve module", most certainly you should disable AMD loader. Add/merge
the following section to your webpack config:
module: {
rules: [
{
parser: {
amd: false
}
}
]
}
Getting Started
Please follow the installation instruction and execute the following JS code:
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let usersApiInstance = new Asana.UsersApi();
let user_gid = "me";
let opts = {
"opt_fields": "email,name,photo,photo.image_1024x1024,photo.image_128x128,photo.image_21x21,photo.image_27x27,photo.image_36x36,photo.image_60x60,workspaces,workspaces.name"
};
usersApiInstance.getUser(user_gid, opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
Example: GET, POST, PUT, DELETE on tasks
GET - get multiple tasks
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let opts = {
"limit": 50,
"project": "<YOUR_PROJECT_GID>",
"modified_since": "2012-02-22T02:06:58.158Z",
"opt_fields": "actual_time_minutes,approval_status,assignee,assignee.name,assignee_section,assignee_section.name,assignee_status,completed,completed_at,completed_by,completed_by.name,created_at,created_by,custom_fields,custom_fields.asana_created_field,custom_fields.created_by,custom_fields.created_by.name,custom_fields.currency_code,custom_fields.custom_label,custom_fields.custom_label_position,custom_fields.date_value,custom_fields.date_value.date,custom_fields.date_value.date_time,custom_fields.description,custom_fields.display_value,custom_fields.enabled,custom_fields.enum_options,custom_fields.enum_options.color,custom_fields.enum_options.enabled,custom_fields.enum_options.name,custom_fields.enum_value,custom_fields.enum_value.color,custom_fields.enum_value.enabled,custom_fields.enum_value.name,custom_fields.format,custom_fields.has_notifications_enabled,custom_fields.is_formula_field,custom_fields.is_global_to_workspace,custom_fields.is_value_read_only,custom_fields.multi_enum_values,custom_fields.multi_enum_values.color,custom_fields.multi_enum_values.enabled,custom_fields.multi_enum_values.name,custom_fields.name,custom_fields.number_value,custom_fields.people_value,custom_fields.people_value.name,custom_fields.precision,custom_fields.resource_subtype,custom_fields.text_value,custom_fields.type,dependencies,dependents,due_at,due_on,external,external.data,followers,followers.name,hearted,hearts,hearts.user,hearts.user.name,html_notes,is_rendered_as_separator,liked,likes,likes.user,likes.user.name,memberships,memberships.project,memberships.project.name,memberships.section,memberships.section.name,modified_at,name,notes,num_hearts,num_likes,num_subtasks,offset,parent,parent.created_by,parent.name,parent.resource_subtype,path,permalink_url,projects,projects.name,resource_subtype,start_at,start_on,tags,tags.name,uri,workspace,workspace.name"
};
tasksApiInstance.getTasks(opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
POST - create a task
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let body = {
"data": {
"name": "New Task",
"approval_status": "pending",
"assignee_status": "upcoming",
"completed": false,
"external": {
"gid": "1234",
"data": "A blob of information.",
},
"html_notes": "<body>Mittens <em>really</em> likes the stuff from Humboldt.</body>",
"is_rendered_as_separator": false,
"liked": true,
"assignee": "me",
"projects": ["<YOUR_PROJECT_GID>"],
},
};
let opts = {};
tasksApiInstance.createTask(body, opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
PUT - update a task
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let task_gid = "<YOUR_TASK_GID>";
let body = {
"data": {
"name": "Updated Task",
},
};
let opts = {};
tasksApiInstance.updateTask(body, task_gid, opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
DELETE - delete a task
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let task_gid = "<YOUR_TASK_GID>";
tasksApiInstance.deleteTask(task_gid).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
Documentation for API Endpoints
All URIs are relative to https://app.asana.com/api/1.0
Class | Method | HTTP request | Description |
---|
Asana.AttachmentsApi | createAttachmentForObject | POST /attachments | Upload an attachment |
Asana.AttachmentsApi | deleteAttachment | DELETE /attachments/{attachment_gid} | Delete an attachment |
Asana.AttachmentsApi | getAttachment | GET /attachments/{attachment_gid} | Get an attachment |
Asana.AttachmentsApi | getAttachmentsForObject | GET /attachments | Get attachments from an object |
Asana.AuditLogAPIApi | getAuditLogEvents | GET /workspaces/{workspace_gid}/audit_log_events | Get audit log events |
Asana.BatchAPIApi | createBatchRequest | POST /batch | Submit parallel requests |
Asana.CustomFieldSettingsApi | getCustomFieldSettingsForPortfolio | GET /portfolios/{portfolio_gid}/custom_field_settings | Get a portfolio's custom fields |
Asana.CustomFieldSettingsApi | getCustomFieldSettingsForProject | GET /projects/{project_gid}/custom_field_settings | Get a project's custom fields |
Asana.CustomFieldsApi | createCustomField | POST /custom_fields | Create a custom field |
Asana.CustomFieldsApi | createEnumOptionForCustomField | POST /custom_fields/{custom_field_gid}/enum_options | Create an enum option |
Asana.CustomFieldsApi | deleteCustomField | DELETE /custom_fields/{custom_field_gid} | Delete a custom field |
Asana.CustomFieldsApi | getCustomField | GET /custom_fields/{custom_field_gid} | Get a custom field |
Asana.CustomFieldsApi | getCustomFieldsForWorkspace | GET /workspaces/{workspace_gid}/custom_fields | Get a workspace's custom fields |
Asana.CustomFieldsApi | insertEnumOptionForCustomField | POST /custom_fields/{custom_field_gid}/enum_options/insert | Reorder a custom field's enum |
Asana.CustomFieldsApi | updateCustomField | PUT /custom_fields/{custom_field_gid} | Update a custom field |
Asana.CustomFieldsApi | updateEnumOption | PUT /enum_options/{enum_option_gid} | Update an enum option |
Asana.EventsApi | getEvents | GET /events | Get events on a resource |
Asana.GoalRelationshipsApi | addSupportingRelationship | POST /goals/{goal_gid}/addSupportingRelationship | Add a supporting goal relationship |
Asana.GoalRelationshipsApi | getGoalRelationship | GET /goal_relationships/{goal_relationship_gid} | Get a goal relationship |
Asana.GoalRelationshipsApi | getGoalRelationships | GET /goal_relationships | Get goal relationships |
Asana.GoalRelationshipsApi | removeSupportingRelationship | POST /goals/{goal_gid}/removeSupportingRelationship | Removes a supporting goal relationship |
Asana.GoalRelationshipsApi | updateGoalRelationship | PUT /goal_relationships/{goal_relationship_gid} | Update a goal relationship |
Asana.GoalsApi | addFollowers | POST /goals/{goal_gid}/addFollowers | Add a collaborator to a goal |
Asana.GoalsApi | createGoal | POST /goals | Create a goal |
Asana.GoalsApi | createGoalMetric | POST /goals/{goal_gid}/setMetric | Create a goal metric |
Asana.GoalsApi | deleteGoal | DELETE /goals/{goal_gid} | Delete a goal |
Asana.GoalsApi | getGoal | GET /goals/{goal_gid} | Get a goal |
Asana.GoalsApi | getGoals | GET /goals | Get goals |
Asana.GoalsApi | getParentGoalsForGoal | GET /goals/{goal_gid}/parentGoals | Get parent goals from a goal |
Asana.GoalsApi | removeFollowers | POST /goals/{goal_gid}/removeFollowers | Remove a collaborator from a goal |
Asana.GoalsApi | updateGoal | PUT /goals/{goal_gid} | Update a goal |
Asana.GoalsApi | updateGoalMetric | POST /goals/{goal_gid}/setMetricCurrentValue | Update a goal metric |
Asana.JobsApi | getJob | GET /jobs/{job_gid} | Get a job by id |
Asana.MembershipsApi | createMembership | POST /memberships | Create a membership |
Asana.MembershipsApi | deleteMembership | DELETE /memberships/{membership_gid} | Delete a membership |
Asana.MembershipsApi | getMembership | GET /memberships/{membership_gid} | Get a membership |
Asana.MembershipsApi | getMemberships | GET /memberships | Get multiple memberships |
Asana.OrganizationExportsApi | createOrganizationExport | POST /organization_exports | Create an organization export request |
Asana.OrganizationExportsApi | getOrganizationExport | GET /organization_exports/{organization_export_gid} | Get details on an org export request |
Asana.PortfolioMembershipsApi | getPortfolioMembership | GET /portfolio_memberships/{portfolio_membership_gid} | Get a portfolio membership |
Asana.PortfolioMembershipsApi | getPortfolioMemberships | GET /portfolio_memberships | Get multiple portfolio memberships |
Asana.PortfolioMembershipsApi | getPortfolioMembershipsForPortfolio | GET /portfolios/{portfolio_gid}/portfolio_memberships | Get memberships from a portfolio |
Asana.PortfoliosApi | addCustomFieldSettingForPortfolio | POST /portfolios/{portfolio_gid}/addCustomFieldSetting | Add a custom field to a portfolio |
Asana.PortfoliosApi | addItemForPortfolio | POST /portfolios/{portfolio_gid}/addItem | Add a portfolio item |
Asana.PortfoliosApi | addMembersForPortfolio | POST /portfolios/{portfolio_gid}/addMembers | Add users to a portfolio |
Asana.PortfoliosApi | createPortfolio | POST /portfolios | Create a portfolio |
Asana.PortfoliosApi | deletePortfolio | DELETE /portfolios/{portfolio_gid} | Delete a portfolio |
Asana.PortfoliosApi | getItemsForPortfolio | GET /portfolios/{portfolio_gid}/items | Get portfolio items |
Asana.PortfoliosApi | getPortfolio | GET /portfolios/{portfolio_gid} | Get a portfolio |
Asana.PortfoliosApi | getPortfolios | GET /portfolios | Get multiple portfolios |
Asana.PortfoliosApi | removeCustomFieldSettingForPortfolio | POST /portfolios/{portfolio_gid}/removeCustomFieldSetting | Remove a custom field from a portfolio |
Asana.PortfoliosApi | removeItemForPortfolio | POST /portfolios/{portfolio_gid}/removeItem | Remove a portfolio item |
Asana.PortfoliosApi | removeMembersForPortfolio | POST /portfolios/{portfolio_gid}/removeMembers | Remove users from a portfolio |
Asana.PortfoliosApi | updatePortfolio | PUT /portfolios/{portfolio_gid} | Update a portfolio |
Asana.ProjectBriefsApi | createProjectBrief | POST /projects/{project_gid}/project_briefs | Create a project brief |
Asana.ProjectBriefsApi | deleteProjectBrief | DELETE /project_briefs/{project_brief_gid} | Delete a project brief |
Asana.ProjectBriefsApi | getProjectBrief | GET /project_briefs/{project_brief_gid} | Get a project brief |
Asana.ProjectBriefsApi | updateProjectBrief | PUT /project_briefs/{project_brief_gid} | Update a project brief |
Asana.ProjectMembershipsApi | getProjectMembership | GET /project_memberships/{project_membership_gid} | Get a project membership |
Asana.ProjectMembershipsApi | getProjectMembershipsForProject | GET /projects/{project_gid}/project_memberships | Get memberships from a project |
Asana.ProjectStatusesApi | createProjectStatusForProject | POST /projects/{project_gid}/project_statuses | Create a project status |
Asana.ProjectStatusesApi | deleteProjectStatus | DELETE /project_statuses/{project_status_gid} | Delete a project status |
Asana.ProjectStatusesApi | getProjectStatus | GET /project_statuses/{project_status_gid} | Get a project status |
Asana.ProjectStatusesApi | getProjectStatusesForProject | GET /projects/{project_gid}/project_statuses | Get statuses from a project |
Asana.ProjectTemplatesApi | deleteProjectTemplate | DELETE /project_templates/{project_template_gid} | Delete a project template |
Asana.ProjectTemplatesApi | getProjectTemplate | GET /project_templates/{project_template_gid} | Get a project template |
Asana.ProjectTemplatesApi | getProjectTemplates | GET /project_templates | Get multiple project templates |
Asana.ProjectTemplatesApi | getProjectTemplatesForTeam | GET /teams/{team_gid}/project_templates | Get a team's project templates |
Asana.ProjectTemplatesApi | instantiateProject | POST /project_templates/{project_template_gid}/instantiateProject | Instantiate a project from a project template |
Asana.ProjectsApi | addCustomFieldSettingForProject | POST /projects/{project_gid}/addCustomFieldSetting | Add a custom field to a project |
Asana.ProjectsApi | addFollowersForProject | POST /projects/{project_gid}/addFollowers | Add followers to a project |
Asana.ProjectsApi | addMembersForProject | POST /projects/{project_gid}/addMembers | Add users to a project |
Asana.ProjectsApi | createProject | POST /projects | Create a project |
Asana.ProjectsApi | createProjectForTeam | POST /teams/{team_gid}/projects | Create a project in a team |
Asana.ProjectsApi | createProjectForWorkspace | POST /workspaces/{workspace_gid}/projects | Create a project in a workspace |
Asana.ProjectsApi | deleteProject | DELETE /projects/{project_gid} | Delete a project |
Asana.ProjectsApi | duplicateProject | POST /projects/{project_gid}/duplicate | Duplicate a project |
Asana.ProjectsApi | getProject | GET /projects/{project_gid} | Get a project |
Asana.ProjectsApi | getProjects | GET /projects | Get multiple projects |
Asana.ProjectsApi | getProjectsForTask | GET /tasks/{task_gid}/projects | Get projects a task is in |
Asana.ProjectsApi | getProjectsForTeam | GET /teams/{team_gid}/projects | Get a team's projects |
Asana.ProjectsApi | getProjectsForWorkspace | GET /workspaces/{workspace_gid}/projects | Get all projects in a workspace |
Asana.ProjectsApi | getTaskCountsForProject | GET /projects/{project_gid}/task_counts | Get task count of a project |
Asana.ProjectsApi | projectSaveAsTemplate | POST /projects/{project_gid}/saveAsTemplate | Create a project template from a project |
Asana.ProjectsApi | removeCustomFieldSettingForProject | POST /projects/{project_gid}/removeCustomFieldSetting | Remove a custom field from a project |
Asana.ProjectsApi | removeFollowersForProject | POST /projects/{project_gid}/removeFollowers | Remove followers from a project |
Asana.ProjectsApi | removeMembersForProject | POST /projects/{project_gid}/removeMembers | Remove users from a project |
Asana.ProjectsApi | updateProject | PUT /projects/{project_gid} | Update a project |
Asana.RulesApi | triggerRule | POST /rule_triggers/{rule_trigger_gid}/run | Trigger a rule |
Asana.SectionsApi | addTaskForSection | POST /sections/{section_gid}/addTask | Add task to section |
Asana.SectionsApi | createSectionForProject | POST /projects/{project_gid}/sections | Create a section in a project |
Asana.SectionsApi | deleteSection | DELETE /sections/{section_gid} | Delete a section |
Asana.SectionsApi | getSection | GET /sections/{section_gid} | Get a section |
Asana.SectionsApi | getSectionsForProject | GET /projects/{project_gid}/sections | Get sections in a project |
Asana.SectionsApi | insertSectionForProject | POST /projects/{project_gid}/sections/insert | Move or Insert sections |
Asana.SectionsApi | updateSection | PUT /sections/{section_gid} | Update a section |
Asana.StatusUpdatesApi | createStatusForObject | POST /status_updates | Create a status update |
Asana.StatusUpdatesApi | deleteStatus | DELETE /status_updates/{status_update_gid} | Delete a status update |
Asana.StatusUpdatesApi | getStatus | GET /status_updates/{status_update_gid} | Get a status update |
Asana.StatusUpdatesApi | getStatusesForObject | GET /status_updates | Get status updates from an object |
Asana.StoriesApi | createStoryForTask | POST /tasks/{task_gid}/stories | Create a story on a task |
Asana.StoriesApi | deleteStory | DELETE /stories/{story_gid} | Delete a story |
Asana.StoriesApi | getStoriesForTask | GET /tasks/{task_gid}/stories | Get stories from a task |
Asana.StoriesApi | getStory | GET /stories/{story_gid} | Get a story |
Asana.StoriesApi | updateStory | PUT /stories/{story_gid} | Update a story |
Asana.TagsApi | createTag | POST /tags | Create a tag |
Asana.TagsApi | createTagForWorkspace | POST /workspaces/{workspace_gid}/tags | Create a tag in a workspace |
Asana.TagsApi | deleteTag | DELETE /tags/{tag_gid} | Delete a tag |
Asana.TagsApi | getTag | GET /tags/{tag_gid} | Get a tag |
Asana.TagsApi | getTags | GET /tags | Get multiple tags |
Asana.TagsApi | getTagsForTask | GET /tasks/{task_gid}/tags | Get a task's tags |
Asana.TagsApi | getTagsForWorkspace | GET /workspaces/{workspace_gid}/tags | Get tags in a workspace |
Asana.TagsApi | updateTag | PUT /tags/{tag_gid} | Update a tag |
Asana.TaskTemplatesApi | getTaskTemplate | GET /task_templates/{task_template_gid} | Get a task template |
Asana.TaskTemplatesApi | getTaskTemplates | GET /task_templates | Get multiple task templates |
Asana.TaskTemplatesApi | instantiateTask | POST /task_templates/{task_template_gid}/instantiateTask | Instantiate a task from a task template |
Asana.TasksApi | addDependenciesForTask | POST /tasks/{task_gid}/addDependencies | Set dependencies for a task |
Asana.TasksApi | addDependentsForTask | POST /tasks/{task_gid}/addDependents | Set dependents for a task |
Asana.TasksApi | addFollowersForTask | POST /tasks/{task_gid}/addFollowers | Add followers to a task |
Asana.TasksApi | addProjectForTask | POST /tasks/{task_gid}/addProject | Add a project to a task |
Asana.TasksApi | addTagForTask | POST /tasks/{task_gid}/addTag | Add a tag to a task |
Asana.TasksApi | createSubtaskForTask | POST /tasks/{task_gid}/subtasks | Create a subtask |
Asana.TasksApi | createTask | POST /tasks | Create a task |
Asana.TasksApi | deleteTask | DELETE /tasks/{task_gid} | Delete a task |
Asana.TasksApi | duplicateTask | POST /tasks/{task_gid}/duplicate | Duplicate a task |
Asana.TasksApi | getDependenciesForTask | GET /tasks/{task_gid}/dependencies | Get dependencies from a task |
Asana.TasksApi | getDependentsForTask | GET /tasks/{task_gid}/dependents | Get dependents from a task |
Asana.TasksApi | getSubtasksForTask | GET /tasks/{task_gid}/subtasks | Get subtasks from a task |
Asana.TasksApi | getTask | GET /tasks/{task_gid} | Get a task |
Asana.TasksApi | getTasks | GET /tasks | Get multiple tasks |
Asana.TasksApi | getTasksForProject | GET /projects/{project_gid}/tasks | Get tasks from a project |
Asana.TasksApi | getTasksForSection | GET /sections/{section_gid}/tasks | Get tasks from a section |
Asana.TasksApi | getTasksForTag | GET /tags/{tag_gid}/tasks | Get tasks from a tag |
Asana.TasksApi | getTasksForUserTaskList | GET /user_task_lists/{user_task_list_gid}/tasks | Get tasks from a user task list |
Asana.TasksApi | removeDependenciesForTask | POST /tasks/{task_gid}/removeDependencies | Unlink dependencies from a task |
Asana.TasksApi | removeDependentsForTask | POST /tasks/{task_gid}/removeDependents | Unlink dependents from a task |
Asana.TasksApi | removeFollowerForTask | POST /tasks/{task_gid}/removeFollowers | Remove followers from a task |
Asana.TasksApi | removeProjectForTask | POST /tasks/{task_gid}/removeProject | Remove a project from a task |
Asana.TasksApi | removeTagForTask | POST /tasks/{task_gid}/removeTag | Remove a tag from a task |
Asana.TasksApi | searchTasksForWorkspace | GET /workspaces/{workspace_gid}/tasks/search | Search tasks in a workspace |
Asana.TasksApi | setParentForTask | POST /tasks/{task_gid}/setParent | Set the parent of a task |
Asana.TasksApi | updateTask | PUT /tasks/{task_gid} | Update a task |
Asana.TeamMembershipsApi | getTeamMembership | GET /team_memberships/{team_membership_gid} | Get a team membership |
Asana.TeamMembershipsApi | getTeamMemberships | GET /team_memberships | Get team memberships |
Asana.TeamMembershipsApi | getTeamMembershipsForTeam | GET /teams/{team_gid}/team_memberships | Get memberships from a team |
Asana.TeamMembershipsApi | getTeamMembershipsForUser | GET /users/{user_gid}/team_memberships | Get memberships from a user |
Asana.TeamsApi | addUserForTeam | POST /teams/{team_gid}/addUser | Add a user to a team |
Asana.TeamsApi | createTeam | POST /teams | Create a team |
Asana.TeamsApi | getTeam | GET /teams/{team_gid} | Get a team |
Asana.TeamsApi | getTeamsForUser | GET /users/{user_gid}/teams | Get teams for a user |
Asana.TeamsApi | getTeamsForWorkspace | GET /workspaces/{workspace_gid}/teams | Get teams in a workspace |
Asana.TeamsApi | removeUserForTeam | POST /teams/{team_gid}/removeUser | Remove a user from a team |
Asana.TeamsApi | updateTeam | PUT /teams/{team_gid} | Update a team |
Asana.TimePeriodsApi | getTimePeriod | GET /time_periods/{time_period_gid} | Get a time period |
Asana.TimePeriodsApi | getTimePeriods | GET /time_periods | Get time periods |
Asana.TimeTrackingEntriesApi | createTimeTrackingEntry | POST /tasks/{task_gid}/time_tracking_entries | Create a time tracking entry |
Asana.TimeTrackingEntriesApi | deleteTimeTrackingEntry | DELETE /time_tracking_entries/{time_tracking_entry_gid} | Delete a time tracking entry |
Asana.TimeTrackingEntriesApi | getTimeTrackingEntriesForTask | GET /tasks/{task_gid}/time_tracking_entries | Get time tracking entries for a task |
Asana.TimeTrackingEntriesApi | getTimeTrackingEntry | GET /time_tracking_entries/{time_tracking_entry_gid} | Get a time tracking entry |
Asana.TimeTrackingEntriesApi | updateTimeTrackingEntry | PUT /time_tracking_entries/{time_tracking_entry_gid} | Update a time tracking entry |
Asana.TypeaheadApi | typeaheadForWorkspace | GET /workspaces/{workspace_gid}/typeahead | Get objects via typeahead |
Asana.UserTaskListsApi | getUserTaskList | GET /user_task_lists/{user_task_list_gid} | Get a user task list |
Asana.UserTaskListsApi | getUserTaskListForUser | GET /users/{user_gid}/user_task_list | Get a user's task list |
Asana.UsersApi | getFavoritesForUser | GET /users/{user_gid}/favorites | Get a user's favorites |
Asana.UsersApi | getUser | GET /users/{user_gid} | Get a user |
Asana.UsersApi | getUsers | GET /users | Get multiple users |
Asana.UsersApi | getUsersForTeam | GET /teams/{team_gid}/users | Get users in a team |
Asana.UsersApi | getUsersForWorkspace | GET /workspaces/{workspace_gid}/users | Get users in a workspace or organization |
Asana.WebhooksApi | createWebhook | POST /webhooks | Establish a webhook |
Asana.WebhooksApi | deleteWebhook | DELETE /webhooks/{webhook_gid} | Delete a webhook |
Asana.WebhooksApi | getWebhook | GET /webhooks/{webhook_gid} | Get a webhook |
Asana.WebhooksApi | getWebhooks | GET /webhooks | Get multiple webhooks |
Asana.WebhooksApi | updateWebhook | PUT /webhooks/{webhook_gid} | Update a webhook |
Asana.WorkspaceMembershipsApi | getWorkspaceMembership | GET /workspace_memberships/{workspace_membership_gid} | Get a workspace membership |
Asana.WorkspaceMembershipsApi | getWorkspaceMembershipsForUser | GET /users/{user_gid}/workspace_memberships | Get workspace memberships for a user |
Asana.WorkspaceMembershipsApi | getWorkspaceMembershipsForWorkspace | GET /workspaces/{workspace_gid}/workspace_memberships | Get the workspace memberships for a workspace |
Asana.WorkspacesApi | addUserForWorkspace | POST /workspaces/{workspace_gid}/addUser | Add a user to a workspace or organization |
Asana.WorkspacesApi | getWorkspace | GET /workspaces/{workspace_gid} | Get a workspace |
Asana.WorkspacesApi | getWorkspaces | GET /workspaces | Get multiple workspaces |
Asana.WorkspacesApi | removeUserForWorkspace | POST /workspaces/{workspace_gid}/removeUser | Remove a user from a workspace or organization |
Asana.WorkspacesApi | updateWorkspace | PUT /workspaces/{workspace_gid} | Update a workspace |
Optional fields
Our opt_fields
feature allows you to request for properties of a resource that you want to be returned in the response (more information here).
NOTE: by default, endpoints that return an array of results (EX: Get multiple tasks, Get multiple projects), will return a compact version of those results (EX: Get multiple tasks returns an array of TaskCompact objects).
Example Request
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let opts = {
"limit": 2,
"project": "<YOUR_PROJECT_GID>"
};
tasksApiInstance.getTasks(opts).then((result) => {
console.log(JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
Example Response
[
{
"gid": "123",
"name": "Task 1",
"resource_type": "task",
"resource_subtype": "default_task"
},
{
"gid": "456",
"name": "Task 2",
"resource_type": "task",
"resource_subtype": "default_task"
}
]
Example Request
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let opts = {
"limit": 1,
"project": "<YOUR_PROJECT_GID>",
"opt_fields": "actual_time_minutes,approval_status,assignee,assignee.name,assignee_section,assignee_section.name,assignee_status,completed,completed_at,completed_by,completed_by.name,created_at,created_by,custom_fields,custom_fields.asana_created_field,custom_fields.created_by,custom_fields.created_by.name,custom_fields.currency_code,custom_fields.custom_label,custom_fields.custom_label_position,custom_fields.date_value,custom_fields.date_value.date,custom_fields.date_value.date_time,custom_fields.description,custom_fields.display_value,custom_fields.enabled,custom_fields.enum_options,custom_fields.enum_options.color,custom_fields.enum_options.enabled,custom_fields.enum_options.name,custom_fields.enum_value,custom_fields.enum_value.color,custom_fields.enum_value.enabled,custom_fields.enum_value.name,custom_fields.format,custom_fields.has_notifications_enabled,custom_fields.is_formula_field,custom_fields.is_global_to_workspace,custom_fields.is_value_read_only,custom_fields.multi_enum_values,custom_fields.multi_enum_values.color,custom_fields.multi_enum_values.enabled,custom_fields.multi_enum_values.name,custom_fields.name,custom_fields.number_value,custom_fields.people_value,custom_fields.people_value.name,custom_fields.precision,custom_fields.resource_subtype,custom_fields.text_value,custom_fields.type,dependencies,dependents,due_at,due_on,external,external.data,followers,followers.name,hearted,hearts,hearts.user,hearts.user.name,html_notes,is_rendered_as_separator,liked,likes,likes.user,likes.user.name,memberships,memberships.project,memberships.project.name,memberships.section,memberships.section.name,modified_at,name,notes,num_hearts,num_likes,num_subtasks,offset,parent,parent.created_by,parent.name,parent.resource_subtype,path,permalink_url,projects,projects.name,resource_subtype,start_at,start_on,tags,tags.name,uri,workspace,workspace.name"
};
tasksApiInstance.getTasks(opts).then((result) => {
console.log(JSON.stringify(result.data, null, 2));
}, (error) => {
console.error(error.response.body);
});
Example Response
[
{
"gid": "129839839",
"actual_time_minutes": null,
"assignee": {
"gid": "120938293",
"name": "user@example.com"
},
"assignee_status": "upcoming",
"assignee_section": {
"gid": "1094838938",
"name": "Recently assigned"
},
"completed": false,
"completed_at": null,
"completed_by": null,
"created_at": "2023-01-01T20:31:21.717Z",
"created_by": {
"gid": "1201784467042440",
"resource_type": "user"
},
"custom_fields": [
{
"gid": "191859815",
"enabled": true,
"name": "Estimated time",
"description": "Asana-created. Estimate time to complete a task.",
"number_value": null,
"precision": 0,
"format": "duration",
"currency_code": null,
"custom_label": null,
"created_by": null,
"custom_label_position": null,
"display_value": null,
"resource_subtype": "number",
"is_formula_field": false,
"is_value_read_only": false,
"type": "number"
}
],
"dependencies": [],
"dependents": [],
"due_at": "2025-01-20T02:06:58.000Z",
"due_on": "2025-01-19",
"followers": [
{
"gid": "120938293",
"name": "user@example.com"
}
],
"hearted": true,
"hearts": [
{
"gid": "594849843",
"user": {
"gid": "120938293",
"name": "user@example.com"
}
}
],
"html_notes": "<body>Example task notes</body>",
"is_rendered_as_separator": false,
"liked": true,
"likes": [
{
"gid": "58303939",
"user": {
"gid": "120938293",
"name": "user@example.com"
}
}
],
"memberships": [
{
"project": {
"gid": "4567",
"name": "Example Project"
},
"section": {
"gid": "8900",
"name": "Untitled section"
}
}
],
"modified_at": "2023-01-25T21:24:06.996Z",
"name": "Task 1",
"notes": "Example task notes",
"num_hearts": 1,
"num_likes": 1,
"num_subtasks": 0,
"parent": null,
"permalink_url": "https://app.asana.com/0/58303939/129839839",
"projects": [
{
"gid": "4567",
"name": "Example Project"
}
],
"start_at": null,
"start_on": null,
"tags": [],
"resource_subtype": "default_task",
"workspace": {
"gid": "111111",
"name": "Example Workspace"
}
}
]
By default, endpoints that return an array of results (EX: Get multiple tasks, Get multiple projects), will return a Collection object.
This collection object contains a nextPage
method that can be used to fetch for the next page of results. NOTE: in order to use nextPage
you must have provided a limit
query parameter argument in the initial request.
Use case
You may run into the following error when making a request to an endpoint that has >1000 results:
"The result is too large. You should use pagination (may require specifying a workspace)!"
In this scenario you will want to use pagaintion to gather your results. To do this, you will need to provide a limit
query parameter argument in your request. This limit
query parameter represents the number of results per page. NOTE: the limit
can only be between 1 and 100.
EX: Pagination gather all resources
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let opts = {
"project": "<YOUR_PROJECT_GID>"
"limit": 100
};
async function getAllTasks(opts) {
let tasks = await tasksApiInstance.getTasks(opts).then(async (firstPage) => {
let res = []
res = res.concat(firstPage.data);
let nextPage = await firstPage.nextPage();
while(nextPage.data) {
res = res.concat(nextPage.data);
nextPage = await nextPage.nextPage();
}
return res;
}, (error) => {
console.error(error.response.body);
});
console.log('Tasks: ' + JSON.stringify(tasks, null, 2));
}
getAllTasks(opts);
EX: Pagination do something per page
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let opts = {
'project': "<YOUR_PROJECT_GID>",
'limit': 10
};
pageIndex = 1;
tasksApiInstance.getTasks(opts).then(async (firstPage) => {
console.log(`Page ${pageIndex}: ` + JSON.stringify(firstPage.data, null, 2));
let nextPage = await firstPage.nextPage();
while(nextPage.data) {
pageIndex += 1;
console.log(`Page ${pageIndex}: ` + JSON.stringify(nextPage.data, null, 2));
nextPage = await nextPage.nextPage();
}
}, (error) => {
console.error(error.response.body);
});
If you do not want a Collection object returned and want to implement your own pagination, you can disable pagination by setting RETURN_COLLECTION
to false
:
EX: Turning off pagination
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.RETURN_COLLECTION = false;
let tasksApiInstance = new Asana.TasksApi();
let opts = {
'project': "<YOUR_PROJECT_GID>",
'limit': 1
};
tasksApiInstance.getTasks(opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result, null, 2));
})
Sample response:
API called successfully. Returned data: {
"data": [
{
"gid": "<TASK_GID>",
"name": "Task 1",
"resource_type": "task",
"resource_subtype": "default_task"
},
],
"next_page": {
"offset": "gjJl2xAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJib3JkZXJfcmHilbI6IltcIlZ5IixcIjlaWlhVMkkzUUdOoXcEIsMTIwNDYxNTc0NTypNDI3MF0iLCJpYXQiOjE2OTc4MjgsSkjjQsImV4cCI6MTY5NzgyOTM2NH0.5VuMfKvqexoEsKfoPFtayWBNWiKvfR7_hN6MJaaIkx8",
"path": "/tasks?project=123456&limit=1&offset=gjJl2xAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJib3JkZXJfcmHilbI6IltcIlZ5IixcIjlaWlhVMkkzUUdOoXcEIsMTIwNDYxNTc0NTypNDI3MF0iLCJpYXQiOjE2OTc4MjgsSkjjQsImV4cCI6MTY5NzgyOTM2NH0.5VuMfKvqexoEsKfoPFtayWBNWiKvfR7_hN6MJaaIkx8",
"uri": "https://app.asana.com/api/1.0/tasks?project=123456&limit=1&offset=gjJl2xAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJib3JkZXJfcmHilbI6IltcIlZ5IixcIjlaWlhVMkkzUUdOoXcEIsMTIwNDYxNTc0NTypNDI3MF0iLCJpYXQiOjE2OTc4MjgsSkjjQsImV4cCI6MTY5NzgyOTM2NH0.5VuMfKvqexoEsKfoPFtayWBNWiKvfR7_hN6MJaaIkx8"
}
}
Getting events
In order to get events you will need a sync token. This sync token can be acquired in the error message from the initial
request to getEvents.
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let eventsApiInstance = new Asana.EventsApi();
let resource = "<YOUR_TASK_OR_PROJECT_GID>";
let opts = {
"sync": ""
};
const timeouts = 5000
const setSyncToken = async () => {
await eventsApiInstance.getEvents(resource, opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
let syncToken = error.response.body.sync;
opts['sync'] = syncToken;
console.log(syncToken);
});
}
const getEvents = async () => {
console.log("Setting Sync Token");
await setSyncToken();
console.log(`Fetching events every ${timeouts/1000} second(s) since sync ${opts['sync']}:`);
while(true) {
await eventsApiInstance.getEvents(resource, opts).then((result) => {
console.log('API called successfully. Returned data: ' + JSON.stringify(result.data, null, 2));
}, (error) => {
if (error.status === 412) {
let syncToken = error.response.body.sync;
opts['sync'] = syncToken;
console.log(syncToken);
} else{
console.error(error.response.text);
}
});
await new Promise(resolve => setTimeout(resolve, timeouts));
}
}
getEvents();
Accessing repsonse data
.
.
.
tasksApiInstance.getTask(task_gid, opts).then((task) => {
let taskName = task.data.name;
let taskNotes = task.data.notes;
console.log(`taskName: ${taskName}`);
console.log(`taskNotes: ${taskNotes}`);
}, (error) => {
console.error(error.response.body);
});
Accessing response status code and headers
Use the <METHOD_NAME>WithHttpInfo
(EX: getTaskWithHttpInfo
) method to make a request that returns a response with headers.
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
let tasksApiInstance = new Asana.TasksApi();
let task_gid = "<YOUR_TASK_GID>";
let opts = {};
tasksApiInstance.getTaskWithHttpInfo(task_gid, opts).then((response_and_data) => {
let data = response_and_data.data;
let response = response_and_data.response;
let task = data.data;
let headers = response.headers;
console.log(task);
console.log(headers);
}, (error) => {
console.error(error.response.body);
});
EX: Asana-Enable header
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.defaultHeaders['asana-enable'] = 'new_goal_memberships';
EX: Asana-Disable header
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.defaultHeaders['asana-disable'] = 'new_goal_memberships';
Using the callApi
method
Use the callApi
method to make http calls when the endpoint does not exist in the current library version or has bugs
Example: GET, POST, PUT, DELETE on tasks
GET - get a task
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.callApi(
path='/tasks/{task_gid}',
httpMethod='GET',
pathParams={"task_gid": "<YOUR_TASK_GID>"},
queryParams={},
headerParams={},
formParams={},
bodyParam=null,
authNames=['token'],
contentTypes=[],
accepts=['application/json; charset=UTF-8'],
returnType='Blob'
).then((response_and_data) => {
let result = response_and_data.data;
let task = result.data;
console.log(task.name);
}, (error) => {
console.error(error.response.body);
});
GET - get multiple tasks -> with opt_fields
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.callApi(
path='/tasks',
httpMethod='GET',
pathParams={},
queryParams={
"limit": 50,
"modified_since": '2012-02-22T02:06:58.158Z',
"project": '<YOUR_PROJECT_GID>',
"opt_fields": 'name,notes'
},
headerParams={},
formParams={},
bodyParam=null,
authNames=['token'],
contentTypes=[],
accepts=['application/json; charset=UTF-8'],
returnType='Blob'
).then((response_and_data) => {
let result = response_and_data.data;
let tasks = result.data;
if (tasks.length > 0) {
console.log(`Task 1 Name: ${tasks[0].name}`);
console.log(`Task 1 Notes: ${tasks[0].notes}`);
}
}, (error) => {
console.error(error.response.body);
});
POST - create a task
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.callApi(
path='/tasks',
httpMethod='POST',
pathParams={},
queryParams={},
headerParams={},
formParams={},
bodyParam={
data: {
"name": "New Task",
"approval_status": "pending",
"assignee_status": "upcoming",
"completed": false,
"html_notes": "<body>Mittens <em>really</em> likes the stuff from Humboldt.</body>",
"is_rendered_as_separator": false,
"liked": true,
"assignee": "me",
"projects": ["<YOUR_PROJECT_GID>"],
}
},
authNames=['token'],
contentTypes=[],
accepts=['application/json; charset=UTF-8'],
returnType='Blob'
).then((response_and_data) => {
let result = response_and_data.data;
let task = result.data;
console.log(task.name);
}, (error) => {
console.error(error.response.body);
});
PUT - update a task
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.callApi(
path='/tasks/{task_gid}',
httpMethod='PUT',
pathParams={task_gid: "<YOUR_TASK_GID>"},
queryParams={},
headerParams={},
formParams={},
bodyParam={
"data": {
"name": "Updated Task",
"html_notes": "<body>Updated task notes</body>",
"due_at": "2025-01-20T02:06:58.147Z"
}
},
authNames=['token'],
contentTypes=[],
accepts=['application/json; charset=UTF-8'],
returnType='Blob'
).then((response_and_data) => {
let result = response_and_data.data;
let task = result.data;
console.log(task.name);
}, (error) => {
console.error(error.response.body);
});
DELETE - delete a task
const Asana = require('asana');
let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';
client.callApi(
path='/tasks/{task_gid}',
httpMethod='DELETE',
pathParams={"task_gid": "<YOUR_TASK_GID>"},
queryParams={},
headerParams={},
formParams={},
bodyParam=null,
authNames=['token'],
contentTypes=[],
accepts=['application/json; charset=UTF-8'],
returnType='Blob'
).then((response_and_data) => {
let result = response_and_data.data;
let result = result.data;
console.log(result);
}, (error) => {
console.error(error.response.body);
});