3.0.4 • Published 25 days ago

asana v3.0.4

Weekly downloads
10,713
License
Apache 2.0
Repository
github
Last release
25 days ago

asana GitHub release NPM Version

  • API version: 1.0
  • Package version: 3.0.4

Installation

For Node.js

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.4/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"; // String | A string identifying a user. This can either be the string \"me\", an email, or the gid of a user.
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" // [String] | This endpoint returns a compact resource, which excludes some properties by default. To include those optional properties, set this query parameter to a comma-separated list of the properties you wish to include.
};

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, // Number | Results per page. The number of objects to return per page. The value must be between 1 and 100.
    "project": "<YOUR_PROJECT_GID>", // String | The project to filter tasks on.
    "modified_since": "2012-02-22T02:06:58.158Z", // Date | Only return tasks that have been modified since the given time.  *Note: A task is considered “modified” if any of its properties change, or associations between it and other objects are modified (e.g.  a task being added to a project). A task is not considered modified just because another object it is associated with (e.g. a subtask) is modified. Actions that count as modifying the task include assigning, renaming, completing, and adding stories.*
    "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" // [String] | This endpoint returns a compact resource, which excludes some properties by default. To include those optional properties, set this query parameter to a comma-separated list of the properties you wish to include.
};

// GET - get multiple tasks
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 = {};

// POST - Create a task
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 = {};

// PUT - Update a task
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>";

// DELETE - Delete a task
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

ClassMethodHTTP requestDescription
Asana.AllocationsApicreateAllocationPOST /allocationsCreate an allocation
Asana.AllocationsApideleteAllocationDELETE /allocations/{allocation_gid}Delete an allocation
Asana.AllocationsApigetAllocationGET /allocations/{allocation_gid}Get an allocation
Asana.AllocationsApigetAllocationsGET /allocationsGet multiple allocations
Asana.AllocationsApiupdateAllocationPUT /allocations/{allocation_gid}Update an allocation
Asana.AttachmentsApicreateAttachmentForObjectPOST /attachmentsUpload an attachment
Asana.AttachmentsApideleteAttachmentDELETE /attachments/{attachment_gid}Delete an attachment
Asana.AttachmentsApigetAttachmentGET /attachments/{attachment_gid}Get an attachment
Asana.AttachmentsApigetAttachmentsForObjectGET /attachmentsGet attachments from an object
Asana.AuditLogAPIApigetAuditLogEventsGET /workspaces/{workspace_gid}/audit_log_eventsGet audit log events
Asana.BatchAPIApicreateBatchRequestPOST /batchSubmit parallel requests
Asana.CustomFieldSettingsApigetCustomFieldSettingsForPortfolioGET /portfolios/{portfolio_gid}/custom_field_settingsGet a portfolio's custom fields
Asana.CustomFieldSettingsApigetCustomFieldSettingsForProjectGET /projects/{project_gid}/custom_field_settingsGet a project's custom fields
Asana.CustomFieldsApicreateCustomFieldPOST /custom_fieldsCreate a custom field
Asana.CustomFieldsApicreateEnumOptionForCustomFieldPOST /custom_fields/{custom_field_gid}/enum_optionsCreate an enum option
Asana.CustomFieldsApideleteCustomFieldDELETE /custom_fields/{custom_field_gid}Delete a custom field
Asana.CustomFieldsApigetCustomFieldGET /custom_fields/{custom_field_gid}Get a custom field
Asana.CustomFieldsApigetCustomFieldsForWorkspaceGET /workspaces/{workspace_gid}/custom_fieldsGet a workspace's custom fields
Asana.CustomFieldsApiinsertEnumOptionForCustomFieldPOST /custom_fields/{custom_field_gid}/enum_options/insertReorder a custom field's enum
Asana.CustomFieldsApiupdateCustomFieldPUT /custom_fields/{custom_field_gid}Update a custom field
Asana.CustomFieldsApiupdateEnumOptionPUT /enum_options/{enum_option_gid}Update an enum option
Asana.EventsApigetEventsGET /eventsGet events on a resource
Asana.GoalRelationshipsApiaddSupportingRelationshipPOST /goals/{goal_gid}/addSupportingRelationshipAdd a supporting goal relationship
Asana.GoalRelationshipsApigetGoalRelationshipGET /goal_relationships/{goal_relationship_gid}Get a goal relationship
Asana.GoalRelationshipsApigetGoalRelationshipsGET /goal_relationshipsGet goal relationships
Asana.GoalRelationshipsApiremoveSupportingRelationshipPOST /goals/{goal_gid}/removeSupportingRelationshipRemoves a supporting goal relationship
Asana.GoalRelationshipsApiupdateGoalRelationshipPUT /goal_relationships/{goal_relationship_gid}Update a goal relationship
Asana.GoalsApiaddFollowersPOST /goals/{goal_gid}/addFollowersAdd a collaborator to a goal
Asana.GoalsApicreateGoalPOST /goalsCreate a goal
Asana.GoalsApicreateGoalMetricPOST /goals/{goal_gid}/setMetricCreate a goal metric
Asana.GoalsApideleteGoalDELETE /goals/{goal_gid}Delete a goal
Asana.GoalsApigetGoalGET /goals/{goal_gid}Get a goal
Asana.GoalsApigetGoalsGET /goalsGet goals
Asana.GoalsApigetParentGoalsForGoalGET /goals/{goal_gid}/parentGoalsGet parent goals from a goal
Asana.GoalsApiremoveFollowersPOST /goals/{goal_gid}/removeFollowersRemove a collaborator from a goal
Asana.GoalsApiupdateGoalPUT /goals/{goal_gid}Update a goal
Asana.GoalsApiupdateGoalMetricPOST /goals/{goal_gid}/setMetricCurrentValueUpdate a goal metric
Asana.JobsApigetJobGET /jobs/{job_gid}Get a job by id
Asana.MembershipsApicreateMembershipPOST /membershipsCreate a membership
Asana.MembershipsApideleteMembershipDELETE /memberships/{membership_gid}Delete a membership
Asana.MembershipsApigetMembershipGET /memberships/{membership_gid}Get a membership
Asana.MembershipsApigetMembershipsGET /membershipsGet multiple memberships
Asana.MembershipsApiupdateMembershipPUT /memberships/{membership_gid}Update a membership
Asana.OrganizationExportsApicreateOrganizationExportPOST /organization_exportsCreate an organization export request
Asana.OrganizationExportsApigetOrganizationExportGET /organization_exports/{organization_export_gid}Get details on an org export request
Asana.PortfolioMembershipsApigetPortfolioMembershipGET /portfolio_memberships/{portfolio_membership_gid}Get a portfolio membership
Asana.PortfolioMembershipsApigetPortfolioMembershipsGET /portfolio_membershipsGet multiple portfolio memberships
Asana.PortfolioMembershipsApigetPortfolioMembershipsForPortfolioGET /portfolios/{portfolio_gid}/portfolio_membershipsGet memberships from a portfolio
Asana.PortfoliosApiaddCustomFieldSettingForPortfolioPOST /portfolios/{portfolio_gid}/addCustomFieldSettingAdd a custom field to a portfolio
Asana.PortfoliosApiaddItemForPortfolioPOST /portfolios/{portfolio_gid}/addItemAdd a portfolio item
Asana.PortfoliosApiaddMembersForPortfolioPOST /portfolios/{portfolio_gid}/addMembersAdd users to a portfolio
Asana.PortfoliosApicreatePortfolioPOST /portfoliosCreate a portfolio
Asana.PortfoliosApideletePortfolioDELETE /portfolios/{portfolio_gid}Delete a portfolio
Asana.PortfoliosApigetItemsForPortfolioGET /portfolios/{portfolio_gid}/itemsGet portfolio items
Asana.PortfoliosApigetPortfolioGET /portfolios/{portfolio_gid}Get a portfolio
Asana.PortfoliosApigetPortfoliosGET /portfoliosGet multiple portfolios
Asana.PortfoliosApiremoveCustomFieldSettingForPortfolioPOST /portfolios/{portfolio_gid}/removeCustomFieldSettingRemove a custom field from a portfolio
Asana.PortfoliosApiremoveItemForPortfolioPOST /portfolios/{portfolio_gid}/removeItemRemove a portfolio item
Asana.PortfoliosApiremoveMembersForPortfolioPOST /portfolios/{portfolio_gid}/removeMembersRemove users from a portfolio
Asana.PortfoliosApiupdatePortfolioPUT /portfolios/{portfolio_gid}Update a portfolio
Asana.ProjectBriefsApicreateProjectBriefPOST /projects/{project_gid}/project_briefsCreate a project brief
Asana.ProjectBriefsApideleteProjectBriefDELETE /project_briefs/{project_brief_gid}Delete a project brief
Asana.ProjectBriefsApigetProjectBriefGET /project_briefs/{project_brief_gid}Get a project brief
Asana.ProjectBriefsApiupdateProjectBriefPUT /project_briefs/{project_brief_gid}Update a project brief
Asana.ProjectMembershipsApigetProjectMembershipGET /project_memberships/{project_membership_gid}Get a project membership
Asana.ProjectMembershipsApigetProjectMembershipsForProjectGET /projects/{project_gid}/project_membershipsGet memberships from a project
Asana.ProjectStatusesApicreateProjectStatusForProjectPOST /projects/{project_gid}/project_statusesCreate a project status
Asana.ProjectStatusesApideleteProjectStatusDELETE /project_statuses/{project_status_gid}Delete a project status
Asana.ProjectStatusesApigetProjectStatusGET /project_statuses/{project_status_gid}Get a project status
Asana.ProjectStatusesApigetProjectStatusesForProjectGET /projects/{project_gid}/project_statusesGet statuses from a project
Asana.ProjectTemplatesApideleteProjectTemplateDELETE /project_templates/{project_template_gid}Delete a project template
Asana.ProjectTemplatesApigetProjectTemplateGET /project_templates/{project_template_gid}Get a project template
Asana.ProjectTemplatesApigetProjectTemplatesGET /project_templatesGet multiple project templates
Asana.ProjectTemplatesApigetProjectTemplatesForTeamGET /teams/{team_gid}/project_templatesGet a team's project templates
Asana.ProjectTemplatesApiinstantiateProjectPOST /project_templates/{project_template_gid}/instantiateProjectInstantiate a project from a project template
Asana.ProjectsApiaddCustomFieldSettingForProjectPOST /projects/{project_gid}/addCustomFieldSettingAdd a custom field to a project
Asana.ProjectsApiaddFollowersForProjectPOST /projects/{project_gid}/addFollowersAdd followers to a project
Asana.ProjectsApiaddMembersForProjectPOST /projects/{project_gid}/addMembersAdd users to a project
Asana.ProjectsApicreateProjectPOST /projectsCreate a project
Asana.ProjectsApicreateProjectForTeamPOST /teams/{team_gid}/projectsCreate a project in a team
Asana.ProjectsApicreateProjectForWorkspacePOST /workspaces/{workspace_gid}/projectsCreate a project in a workspace
Asana.ProjectsApideleteProjectDELETE /projects/{project_gid}Delete a project
Asana.ProjectsApiduplicateProjectPOST /projects/{project_gid}/duplicateDuplicate a project
Asana.ProjectsApigetProjectGET /projects/{project_gid}Get a project
Asana.ProjectsApigetProjectsGET /projectsGet multiple projects
Asana.ProjectsApigetProjectsForTaskGET /tasks/{task_gid}/projectsGet projects a task is in
Asana.ProjectsApigetProjectsForTeamGET /teams/{team_gid}/projectsGet a team's projects
Asana.ProjectsApigetProjectsForWorkspaceGET /workspaces/{workspace_gid}/projectsGet all projects in a workspace
Asana.ProjectsApigetTaskCountsForProjectGET /projects/{project_gid}/task_countsGet task count of a project
Asana.ProjectsApiprojectSaveAsTemplatePOST /projects/{project_gid}/saveAsTemplateCreate a project template from a project
Asana.ProjectsApiremoveCustomFieldSettingForProjectPOST /projects/{project_gid}/removeCustomFieldSettingRemove a custom field from a project
Asana.ProjectsApiremoveFollowersForProjectPOST /projects/{project_gid}/removeFollowersRemove followers from a project
Asana.ProjectsApiremoveMembersForProjectPOST /projects/{project_gid}/removeMembersRemove users from a project
Asana.ProjectsApiupdateProjectPUT /projects/{project_gid}Update a project
Asana.RulesApitriggerRulePOST /rule_triggers/{rule_trigger_gid}/runTrigger a rule
Asana.SectionsApiaddTaskForSectionPOST /sections/{section_gid}/addTaskAdd task to section
Asana.SectionsApicreateSectionForProjectPOST /projects/{project_gid}/sectionsCreate a section in a project
Asana.SectionsApideleteSectionDELETE /sections/{section_gid}Delete a section
Asana.SectionsApigetSectionGET /sections/{section_gid}Get a section
Asana.SectionsApigetSectionsForProjectGET /projects/{project_gid}/sectionsGet sections in a project
Asana.SectionsApiinsertSectionForProjectPOST /projects/{project_gid}/sections/insertMove or Insert sections
Asana.SectionsApiupdateSectionPUT /sections/{section_gid}Update a section
Asana.StatusUpdatesApicreateStatusForObjectPOST /status_updatesCreate a status update
Asana.StatusUpdatesApideleteStatusDELETE /status_updates/{status_update_gid}Delete a status update
Asana.StatusUpdatesApigetStatusGET /status_updates/{status_update_gid}Get a status update
Asana.StatusUpdatesApigetStatusesForObjectGET /status_updatesGet status updates from an object
Asana.StoriesApicreateStoryForTaskPOST /tasks/{task_gid}/storiesCreate a story on a task
Asana.StoriesApideleteStoryDELETE /stories/{story_gid}Delete a story
Asana.StoriesApigetStoriesForTaskGET /tasks/{task_gid}/storiesGet stories from a task
Asana.StoriesApigetStoryGET /stories/{story_gid}Get a story
Asana.StoriesApiupdateStoryPUT /stories/{story_gid}Update a story
Asana.TagsApicreateTagPOST /tagsCreate a tag
Asana.TagsApicreateTagForWorkspacePOST /workspaces/{workspace_gid}/tagsCreate a tag in a workspace
Asana.TagsApideleteTagDELETE /tags/{tag_gid}Delete a tag
Asana.TagsApigetTagGET /tags/{tag_gid}Get a tag
Asana.TagsApigetTagsGET /tagsGet multiple tags
Asana.TagsApigetTagsForTaskGET /tasks/{task_gid}/tagsGet a task's tags
Asana.TagsApigetTagsForWorkspaceGET /workspaces/{workspace_gid}/tagsGet tags in a workspace
Asana.TagsApiupdateTagPUT /tags/{tag_gid}Update a tag
Asana.TaskTemplatesApideleteTaskTemplateDELETE /task_templates/{task_template_gid}Delete a task template
Asana.TaskTemplatesApigetTaskTemplateGET /task_templates/{task_template_gid}Get a task template
Asana.TaskTemplatesApigetTaskTemplatesGET /task_templatesGet multiple task templates
Asana.TaskTemplatesApiinstantiateTaskPOST /task_templates/{task_template_gid}/instantiateTaskInstantiate a task from a task template
Asana.TasksApiaddDependenciesForTaskPOST /tasks/{task_gid}/addDependenciesSet dependencies for a task
Asana.TasksApiaddDependentsForTaskPOST /tasks/{task_gid}/addDependentsSet dependents for a task
Asana.TasksApiaddFollowersForTaskPOST /tasks/{task_gid}/addFollowersAdd followers to a task
Asana.TasksApiaddProjectForTaskPOST /tasks/{task_gid}/addProjectAdd a project to a task
Asana.TasksApiaddTagForTaskPOST /tasks/{task_gid}/addTagAdd a tag to a task
Asana.TasksApicreateSubtaskForTaskPOST /tasks/{task_gid}/subtasksCreate a subtask
Asana.TasksApicreateTaskPOST /tasksCreate a task
Asana.TasksApideleteTaskDELETE /tasks/{task_gid}Delete a task
Asana.TasksApiduplicateTaskPOST /tasks/{task_gid}/duplicateDuplicate a task
Asana.TasksApigetDependenciesForTaskGET /tasks/{task_gid}/dependenciesGet dependencies from a task
Asana.TasksApigetDependentsForTaskGET /tasks/{task_gid}/dependentsGet dependents from a task
Asana.TasksApigetSubtasksForTaskGET /tasks/{task_gid}/subtasksGet subtasks from a task
Asana.TasksApigetTaskGET /tasks/{task_gid}Get a task
Asana.TasksApigetTaskForCustomIDGET /workspaces/{workspace_gid}/tasks/custom_id/{custom_id}Get a task for a given custom ID
Asana.TasksApigetTasksGET /tasksGet multiple tasks
Asana.TasksApigetTasksForProjectGET /projects/{project_gid}/tasksGet tasks from a project
Asana.TasksApigetTasksForSectionGET /sections/{section_gid}/tasksGet tasks from a section
Asana.TasksApigetTasksForTagGET /tags/{tag_gid}/tasksGet tasks from a tag
Asana.TasksApigetTasksForUserTaskListGET /user_task_lists/{user_task_list_gid}/tasksGet tasks from a user task list
Asana.TasksApiremoveDependenciesForTaskPOST /tasks/{task_gid}/removeDependenciesUnlink dependencies from a task
Asana.TasksApiremoveDependentsForTaskPOST /tasks/{task_gid}/removeDependentsUnlink dependents from a task
Asana.TasksApiremoveFollowerForTaskPOST /tasks/{task_gid}/removeFollowersRemove followers from a task
Asana.TasksApiremoveProjectForTaskPOST /tasks/{task_gid}/removeProjectRemove a project from a task
Asana.TasksApiremoveTagForTaskPOST /tasks/{task_gid}/removeTagRemove a tag from a task
Asana.TasksApisearchTasksForWorkspaceGET /workspaces/{workspace_gid}/tasks/searchSearch tasks in a workspace
Asana.TasksApisetParentForTaskPOST /tasks/{task_gid}/setParentSet the parent of a task
Asana.TasksApiupdateTaskPUT /tasks/{task_gid}Update a task
Asana.TeamMembershipsApigetTeamMembershipGET /team_memberships/{team_membership_gid}Get a team membership
Asana.TeamMembershipsApigetTeamMembershipsGET /team_membershipsGet team memberships
Asana.TeamMembershipsApigetTeamMembershipsForTeamGET /teams/{team_gid}/team_membershipsGet memberships from a team
Asana.TeamMembershipsApigetTeamMembershipsForUserGET /users/{user_gid}/team_membershipsGet memberships from a user
Asana.TeamsApiaddUserForTeamPOST /teams/{team_gid}/addUserAdd a user to a team
Asana.TeamsApicreateTeamPOST /teamsCreate a team
Asana.TeamsApigetTeamGET /teams/{team_gid}Get a team
Asana.TeamsApigetTeamsForUserGET /users/{user_gid}/teamsGet teams for a user
Asana.TeamsApigetTeamsForWorkspaceGET /workspaces/{workspace_gid}/teamsGet teams in a workspace
Asana.TeamsApiremoveUserForTeamPOST /teams/{team_gid}/removeUserRemove a user from a team
Asana.TeamsApiupdateTeamPUT /teams/{team_gid}Update a team
Asana.TimePeriodsApigetTimePeriodGET /time_periods/{time_period_gid}Get a time period
Asana.TimePeriodsApigetTimePeriodsGET /time_periodsGet time periods
Asana.TimeTrackingEntriesApicreateTimeTrackingEntryPOST /tasks/{task_gid}/time_tracking_entriesCreate a time tracking entry
Asana.TimeTrackingEntriesApideleteTimeTrackingEntryDELETE /time_tracking_entries/{time_tracking_entry_gid}Delete a time tracking entry
Asana.TimeTrackingEntriesApigetTimeTrackingEntriesForTaskGET /tasks/{task_gid}/time_tracking_entriesGet time tracking entries for a task
Asana.TimeTrackingEntriesApigetTimeTrackingEntryGET /time_tracking_entries/{time_tracking_entry_gid}Get a time tracking entry
Asana.TimeTrackingEntriesApiupdateTimeTrackingEntryPUT /time_tracking_entries/{time_tracking_entry_gid}Update a time tracking entry
Asana.TypeaheadApitypeaheadForWorkspaceGET /workspaces/{workspace_gid}/typeaheadGet objects via typeahead
Asana.UserTaskListsApigetUserTaskListGET /user_task_lists/{user_task_list_gid}Get a user task list
Asana.UserTaskListsApigetUserTaskListForUserGET /users/{user_gid}/user_task_listGet a user's task list
Asana.UsersApigetFavoritesForUserGET /users/{user_gid}/favoritesGet a user's favorites
Asana.UsersApigetUserGET /users/{user_gid}Get a user
Asana.UsersApigetUsersGET /usersGet multiple users
Asana.UsersApigetUsersForTeamGET /teams/{team_gid}/usersGet users in a team
Asana.UsersApigetUsersForWorkspaceGET /workspaces/{workspace_gid}/usersGet users in a workspace or organization
Asana.WebhooksApicreateWebhookPOST /webhooksEstablish a webhook
Asana.WebhooksApideleteWebhookDELETE /webhooks/{webhook_gid}Delete a webhook
Asana.WebhooksApigetWebhookGET /webhooks/{webhook_gid}Get a webhook
Asana.WebhooksApigetWebhooksGET /webhooksGet multiple webhooks
Asana.WebhooksApiupdateWebhookPUT /webhooks/{webhook_gid}Update a webhook
Asana.WorkspaceMembershipsApigetWorkspaceMembershipGET /workspace_memberships/{workspace_membership_gid}Get a workspace membership
Asana.WorkspaceMembershipsApigetWorkspaceMembershipsForUserGET /users/{user_gid}/workspace_membershipsGet workspace memberships for a user
Asana.WorkspaceMembershipsApigetWorkspaceMembershipsForWorkspaceGET /workspaces/{workspace_gid}/workspace_membershipsGet the workspace memberships for a workspace
Asana.WorkspacesApiaddUserForWorkspacePOST /workspaces/{workspace_gid}/addUserAdd a user to a workspace or organization
Asana.WorkspacesApigetWorkspaceGET /workspaces/{workspace_gid}Get a workspace
Asana.WorkspacesApigetWorkspacesGET /workspacesGet multiple workspaces
Asana.WorkspacesApiremoveUserForWorkspacePOST /workspaces/{workspace_gid}/removeUserRemove a user from a workspace or organization
Asana.WorkspacesApiupdateWorkspacePUT /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).

EX: Get multiple tasks / getTasks without opt_fields

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>"
};

// GET - get multiple tasks
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"
  }
]

EX: Get multiple tasks / getTasks with opt_fields

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"
};

// GET - get multiple tasks
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"
    }
  }
]

Pagination

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 (response) => {
        let result = [];
        let page = response;
        while(true) {
            // Add items on page to list of results
            result = result.concat(page.data);
            // Fetch the next page
            page = await page.nextPage();
            // If the there is no data in the next page break from the loop
            if (!page.data) {
                break;
            }
        }
        return result;
    }, (error) => {
        console.error(error.response.body);
    });
    // Do something with the tasks. EX: print out results
    console.log('Tasks: ' + JSON.stringify(tasks, null, 2));
}

getAllTasks(opts);

Sample output:

Tasks: [
    {
      "gid": "123",
      "name": "task 1",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "456",
      "name": "task 2",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "789",
      "name": "task 3",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "101112",
      "name": "task 4",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "131415",
      "name": "task 5",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "161718",
      "name": "task 6",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "192021",
      "name": "task 7",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "222324",
      "name": "task 8",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "252627",
      "name": "task 9",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "282930",
      "name": "task 10",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
    {
      "gid": "313233",
      "name": "task 11",
      "resource_type": "task",
      "resource_subtype": "default_task"
    },
]

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": 5,
};

let pageIndex = 1;

tasksApiInstance.getTasks(opts).then(async (response) => {
    let page = response;
    while(true) {
        // Do something with the page results
        // EX: print the name of the tasks on that page
        console.log(`Page ${pageIndex}: `);
        page.data.forEach(task => {
            console.log(`    ${task.name}`);
        });
        pageIndex += 1;

        page = await page.nextPage();
        // If the there is no data in the next page break from the loop
        if (!page.data) {
            break;
        }
    }
}, (error) => {
    console.error(error.response.body);
});

Sample output:

Page 1:
    task 1
    task 2
    task 3
    task 4
    task 5
Page 2:
    task 6
    task 7
    task 8
    task 9
    task 10
Page 3:
    task 11
    task 12
    task 13
    task 14
    task 15

Turning off Pagination

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>';

// Turn off pagination
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>"; // String | A resource ID to subscribe to. The resource can be a task or project.
let opts = {
    "sync": ""
};
const timeouts = 5000

// Used to fetch for initial sync token
const setSyncToken = async () => {
    await eventsApiInstance.getEvents(resource, opts).then((result) => {
        console.log(JSON.stringify(result.data, null, 2));
    }, (error) => {
        let syncToken = error.response.body.sync;
        opts['sync'] = syncToken;
    });
}

const getEvents = async () => {
    console.log("Setting sync token");
    await setSyncToken();
    // Fetch for new events every 5 seconds
    console.log(`Fetching events every ${timeouts/1000} second(s)`);
    while(true) {
        await eventsApiInstance.getEvents(resource, opts).then((result) => {
            // Print response
            console.log(`Fetching events since sync: ${opts['sync']}`);
            console.log(JSON.stringify(result.data, null, 2));

            // Update the sync token with the new sync token provided in the response
            opts['sync'] = result._response.sync;
        }, (error) => {
            if (error.status === 412) {
                let syncToken = error.response.body.sync;
                opts['sync'] = syncToken;
                console.log(`412 error new sync token: ${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);
});

Adding deprecation flag: "asana-enable" or "asana-disable" header

EX: Asana-Enable header

const Asana = require('asana');

let client = Asana.ApiClient.instance;
let token = client.authentications['token'];
token.accessToken = '<YOUR_ACCESS_TOKEN>';

// Add asana-enable header for the client
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>';

// Add asana-disable header for the client
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>';

// GET - get a task
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>';

// GET - get multiple tasks -> with opt_fields
client.callApi(
    path='/tasks',
    httpMethod='GET',
    pathParams={},
    queryParams={
        "limit": 50,
        "modified_since": '2012-02-22T02:06:58.158Z', // OR new Date("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>';

// POST - create a task
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>';

// PUT - update a task
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>';

// DELETE - delete a task
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);
});
3.0.4

25 days ago

3.0.3

28 days ago

3.0.2

2 months ago

3.0.1

3 months ago

2.0.3

8 months ago

2.0.2

9 months ago

2.0.5

8 months ago

2.0.4

8 months ago

2.0.6

8 months ago

2.0.1

9 months ago

2.0.0

9 months ago

3.0.0

6 months ago

1.0.2

1 year ago

0.0.1

1 year ago

1.0.1

1 year ago

1.0.0

2 years ago

0.18.14

2 years ago

0.18.6

3 years ago

0.18.5

4 years ago

0.18.4

4 years ago

0.18.3

4 years ago

0.18.1

4 years ago

0.18.2

4 years ago

0.18.0

4 years ago

0.17.3

5 years ago

0.17.1

5 years ago

0.17.0

5 years ago

0.16.6

6 years ago

0.16.1

6 years ago

0.16.0

6 years ago

0.15.1

6 years ago

0.15.0

8 years ago

0.14.1

8 years ago

0.14.0

8 years ago

0.13.0

8 years ago

0.12.1

9 years ago

0.12.0

9 years ago

0.11.0

9 years ago

0.9.7

9 years ago

0.9.6

9 years ago

0.9.5

9 years ago

0.9.2

9 years ago

0.9.1

9 years ago

0.9.0

9 years ago

0.8.3

9 years ago

0.8.2

9 years ago

0.8.1

9 years ago

0.8.0

9 years ago

0.7.9

9 years ago

0.7.8

9 years ago

0.7.7

9 years ago

0.7.6

9 years ago

0.7.5

9 years ago

0.7.4

9 years ago

0.7.3

9 years ago

0.7.2

9 years ago

0.7.1

9 years ago

0.7.0

9 years ago

0.6.4

9 years ago

0.6.3

9 years ago

0.6.2

9 years ago

0.6.1

9 years ago

0.6.0

9 years ago

0.5.9

9 years ago

0.5.8

9 years ago

0.5.7

9 years ago

0.5.4

9 years ago

0.5.3

9 years ago

0.5.2

9 years ago

0.4.2

9 years ago

0.4.1

9 years ago

0.4.0

9 years ago

0.3.4

9 years ago

0.3.3

9 years ago

0.3.2

9 years ago

0.3.1

9 years ago

0.3.0

10 years ago

0.2.0

10 years ago

0.1.2

10 years ago

0.1.1

10 years ago

0.1.0

10 years ago