Documents & Productivity — entry 004 of 31

Asana

Verified Jul 2026

Asana's REST API exposes the full data model behind its task and project management app -- tasks, projects, portfolios, goals, and custom fields -- so teams can build integrations, dashboards, and automations on their own workspace data. Every plan, including the free tier for up to 10 users, gets real API access, with paid plans simply raising the per-minute rate limit from 150 to 1,500 requests. Responses are JSON over a stable, versioned REST surface documented at developers.asana.com.

project-managementtask-managementcollaborationworkflow
AuthenticationAPI KeySign up with the provider to obtain credentials.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreemiumA usable free tier exists, with paid plans for more volume.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score81out of 100
Authentication15/25API key required
Pricing17/20Freemium tier available
Docs20/20Machine-readable spec file bundled
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 81 on greatapis.com
<a href="https://greatapis.com/api/asana/"><img src="https://greatapis.com/badge/asana.svg" alt="Scored 81 on greatapis.com"></a>

Auth quickstart

  1. Get a key at the provider
  2. Send it on every request as a headerAuthorization: <key>
  3. The exact header isn't documented — Authorization is a common default; confirm in the provider's docs.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Endpoints

Servers
https://app.asana.com/api/1.0
Auth
personalAccessTokenoauth2
Attachments4

An *attachment* object represents any file attached to a task in Asana, whether it’s an uploaded file or one associated via a third-party service such as Dropbox or Google Drive.

GET/attachmentsGet attachments from an object
Parameters
NameInRequiredType
parentqueryyesstring
Responses
StatusDescriptionSchema
200Successfully retrieved the specified object's attachments.
400
401
403
404
500
POST/attachmentsUpload an attachment
Request body

multipart/form-dataAttachmentRequest (required)

Responses
StatusDescriptionSchema
200Successfully uploaded the attachment to the parent object.
400
401
403
404
500
GET/attachments/{attachment_gid}Get an attachment
Responses
StatusDescriptionSchema
200Successfully retrieved the record for a single attachment.
400
401
402
403
404
424
500
501
503
504
DELETE/attachments/{attachment_gid}Delete an attachment
Responses
StatusDescriptionSchema
200Successfully deleted the specified attachment.
400
401
403
404
500
Audit log API1

Asana's audit log is an immutable log of [important events](/docs/supported-auditlogevents) in your organization's Asana instance. The audit log API allows you to monitor and act upon important security and compliance-related changes. Organizations might use this API endpoint to: * Set up proactive alerting with a Security Information and Event Management (SIEM) tool like [Splunk](https://asana.com/guide/help/api/splunk) * Conduct reactive investigations when a security incident takes place * Visualize key domain data in aggregate to identify security trends Note that since the API provides insight into what is happening in an Asana instance, the data is [read-only](/docs/get-audit-log-events). That is, there are no "write" or "update" endpoints for audit log events. Only [Service Accounts](https://asana.com/guide/help/premium/service-accounts) in [Enterprise Domains](https://asana.com/enterprise) can access audit log API endpoints. Authentication with a Service Account's [personal access token](/docs/personal-access-token) is required. For a full list of supported events, see [supported AuditLogEvents](/docs/supported-auditlogevents).

GET/workspaces/{workspace_gid}/audit_log_eventsGet audit log events
Responses
StatusDescriptionSchema
200AuditLogEvents were successfully retrieved.
400
401
403
404
500
Batch API1

There are many cases where you want to accomplish a variety of work in the Asana API but want to minimize the number of HTTP requests you make. For example: * Modern browsers limit the number of requests that a single web page can make at once. * Mobile apps will use more battery life to keep the cellular radio on when making a series of requests. * There is an overhead cost to developing software that can make multiple requests in parallel. * Some cloud platforms handle parallelism poorly, or disallow it entirely. To make development easier in these use cases, Asana provides a **batch API** that enables developers to perform multiple “actions” by making only a single HTTP request. #### Making a batch request To make a batch request, send a `POST` request to `/batch`. Like other `POST` endpoints, the body should contain a `data` envelope. Inside this envelope should be a single `actions` field, containing a list of “action” objects. Each action represents a standard request to an existing endpoint in the Asana API. **The maximum number of actions allowed in a single batch request is 10**. Making a batch request with no actions in it will result in a `400 Bad Request`. When the batch API receives the list of actions to execute, it will dispatch those actions to the already-implemented endpoints specified by the `relative_path` and `method` for each action. This happens in parallel, so all actions in the request will be processed simultaneously. There is no guarantee of the execution order for these actions, nor is there a way to use the output of one action as the input of another action (such as creating a task and then commenting on it). The response to the batch request will contain (within the `data` envelope) a list of result objects, one for each action. The results are guaranteed to be in the same order as the actions in the request (e.g., the first result in the response corresponds to the first action in the request) The batch API will always attempt to return a `200 Success` response with individual result objects for each individual action in the request. Only in certain cases (such as missing authorization or malformed JSON in the body) will the entire request fail with another status code. Even if every individual action in the request fails, the batch API will still return a `200 Success` response, and each result object in the response will contain the errors encountered with each action. #### Rate limiting The batch API fully respects all of our rate limiting. This means that a batch request counts against *both* the standard rate limiter and the concurrent request limiter as though you had made a separate HTTP request for every individual action. For example, a batch request with five actions counts as five separate requests in the standard rate limiter, and counts as five concurrent requests in the concurrent request limiter. The batch request itself incurs no cost. If any of the actions in a batch request would exceed any of the enforced limits, the *entire* request will fail with a `429 Too Many Requests` error. This is to prevent the unpredictability of which actions might succeed if not all of them could succeed. #### Restrictions Not every endpoint can be accessed through the batch API. Specifically, the following actions cannot be taken and will result in a `400 Bad Request` for that action: * Uploading attachments * Creating, getting, or deleting organization exports * Any SCIM operations * Nested calls to the batch API

POST/batchSubmit parallel requests
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully completed the requested batch API operations.
400
401
403
404
500
Custom fields8

_Note: Custom fields are a premium feature. Integrations which work with custom fields need to handle an assortment of use cases for free and premium users in context of free and premium organizations. For a detailed examination of which data users will have access in different circumstances, review the section below on access control._ In the Asana application, tasks, projects, and portfolios can hold user-specified [custom fields](https://asana.com/guide/help/premium/custom-fields) which provide extra information (e.g., a "priority" property with an associated value, or a number representing the time required to complete a task). This lets a user define the type of information that each item within a project or portfolio can contain in addition to the built-in fields that Asana provides. `display_value` is a read-only field that will always be a string. For apps that use custom fields, this is a great way to safely display/export the value of a custom field, regardless of its type. We suggest apps use this field in order to future-proof for changes to custom fields. #### Characteristics of custom fields * There is metadata that defines the custom field. This metadata can be shared across an entire workspace, or be specific to a project or portfolio. * Creating a custom field setting on a project or portfolio means each direct child will have the custom field. This is conceptually akin to adding columns in a database or a spreadsheet: every task (row) in the project (table) can contain information for that field, including "blank" values (i.e., `null` data). For portfolio custom fields, every project (row) in the portfolio (table) will contain information for the custom field. * Custom field settings only go one child deep. This means that a custom field setting on a portfolio will give each project the custom field, but not each task within those projects. * Tasks have custom field _values_ assigned to them. #### Types of custom fields Integrations using custom fields need to be aware of the six basic types that a custom field can adopt. These types are: * `text` - an arbitrary, relatively short string of text * `number` - a number with a defined level of precision * `enum` - a selection of a single option from a defined list of options (i.e., mutually exclusive selections) * `multi_enum` - a selection of one or more options from a defined list of options (i.e., mutually inclusive selections) * `date` - a reference date with an optional time value * `people` - a list of active contributors (i.e., where their relationship to the work is defined in the custom field title) #### Example use case Consider an organization that has defined a custom field for "Priority". This field is of `enum` type and can have user-defined values of `Low`, `Medium`, or `High`. This is the field metadata, and it is visible within, and shared across, the entire organization. A project is then created in the organization, called "Bugs", and the "Priority" custom field is associated with that project. This will allow all tasks within the "Bugs" project to have an associated "Priority". A new task is created within "Bugs". This task, then, has a field named "Priority" which can take on the custom field value of one of `[null]`, `Low`, `Medium`, and `High`. #### Custom fields in the API These custom fields are accessible via the API through a number of endpoints at the top level (e.g. `/custom_fields` and `/custom_field_settings`) and through requests on workspaces, portfolios, projects, and tasks resources. The API also provides a way to fetch both the metadata and data which define each particular custom field, so that a client application may render proper UI to display or edit the values. Text fields are currently limited to 1024 characters. On tasks, their custom field value will have a `text_value` property to represent this field. Number fields can have an arbitrary `precision` associated with them; for example, a precision of `2` would round its value to the second (hundredths) place (e.g., `1.2345` would round to `1.23`). On tasks, the custom field value will have a `number_value` property to represent this field. #### Enum fields Enum fields represent a selection from a list of options. On the metadata, they will contain all of the options in an array. Each option has 4 properties: * `gid` - the GID of this enum option. Note that this is the GID of the individual _option_. The custom field itself has a separate `gid`. * `name` - the name of the option (e.g., "Choice #1") * `enabled` - whether this field is enabled. Disabled fields are not available to choose from when disabled, and are visually hidden in the Asana application, but they remain in the metadata for custom field values which were set to the option before the option was disabled. * `color` - a color associated with this choice. On the task's custom field value, the enum will have an `enum_value` property which will be the same as one of the choices from the list defined in the custom field metadata. #### Querying an organization for its custom fields For custom fields shared across the workspace or organization, the workspace [can be queried](/docs/get-a-workspaces-custom-fields) for its list of defined custom fields. Like other collection queries, the fields will be returned as a compact record; slightly different from most other compact records is the fact that the compact record for custom fields includes `type` as well as `gid` and `name`. #### Accessing custom field definitions The [custom fields](/docs/get-a-custom-field) reference describes how the metadata which defines a custom field is accessed. A GET request with a `gid` can be issued on the `/custom_fields` endpoint to fetch the full definition of a single custom field given its `gid` from (for instance) listing all custom fields on a workspace, or getting the `gid` from a custom field settings object or a task. #### Associating custom fields with a project or portfolio A mapping between a custom field and a project or portfolio is handled with a [custom field settings](/docs/asana-custom-field-settings) object. This object contains a reference for each of the custom fields and the project or portfolio, as well as additional information about the status of that particular custom field (e.g., `is_important`, which defines whether or not the custom field will appear in the list/grid on the Asana application). #### Accessing custom field values on tasks or projects The [tasks](/docs/get-a-task) reference has information on how custom fields look on tasks. custom fields will return as an array on the property `custom_fields`, and each entry will contain, side-by-side, the compact representation of the custom field metadata and a `{typename}_value` property that stores the value set for the custom field. Of particular note is that the top-level `gid` of each entry in the `custom_fields` array is the `gid` of the custom field metadata, as it is the compact representation of this metadata. This can be used to refer to the full metadata by making a request to the `/custom_fields/{custom_fields_id}` endpoint as described above. Custom fields can be set just as in the Asana-defined fields on a task via `POST` or `PUT` requests. You can see an example in the [update a task](/docs/update-a-task) endpoint. Custom fields on projects follow this same pattern. #### Warning: Program defensively with regards to custom field definitions Asana application users have the ability to change the definitions of custom field metadata. This means that as you write scripts or applications to work with them, it is possible for the definitions to change at any time, which may cause an application using them to break or malfunction if it makes assumptions about the metadata for a particular custom field. When using custom fields, it is a good idea to program *defensively*, meaning you your application should double-check that the custom field metadata are what it expects. Storing the state of the custom field metadata for too long if you dynamically create a model for it can cause your model to become out of sync with the model stored in Asana. For example, if you encounter an `enum` value on a task that does not match any option in your metadata model, your metadata model has become out of date with the custom field metadata. #### Enabled and disabled values When information that is contained in a custom field value loses a logical association with its metadata definition, the value becomes disabled. This can happen in a couple of simple ways, for example, if you remove the custom field metadata from a project, or move a task with a custom field to a different project which does not have the custom field metadata associated with it. The value remains on the task, and the custom field metadata can still be found and examined, but as the context in which the custom field makes sense is gone, the custom field cannot change its value; it can only be cleared. _Note: Tasks that are associated with multiple projects do not become disabled, so long as at least one of the projects is still associated with the custom field metadata. In other words, tasks with multiple projects will retain logically associated to the set of custom field metadata represented by all of their projects._ Moving the task back under a project with that custom field applied to it or applying the custom field metadata to the current project will return the custom field value to an enabled state. In this scenario, the custom field will be re-enabled and editable again. In the Asana application, disabled fields are grayed out and not allowed to change, other than to be discarded. In the API, we return a property `enabled: false` to inform the external application that the value has been disabled. Note that the API enforces the same operations on disabled custom field values as hold in the Asana application: they may not have their values changed, since the lack of context for the values of a custom field in general doesn't provide enough information to know what new values should be. Setting the custom field value to `null` will clear and remove the custom field value from the task. #### Custom field access control Custom fields are a complex feature of the Asana platform, and their access in the Asana application and in the API vary based on the status of the user and project. When building your application, it is best to be defensive and not assume the given user will have read or write access to a custom field, and fail gracefully when this occurs.

POST/custom_fieldsCreate a custom field
Request body

application/json

Responses
StatusDescriptionSchema
201Custom field successfully created.
400
401
403
404
500
GET/custom_fields/{custom_field_gid}Get a custom field
Responses
StatusDescriptionSchema
200Successfully retrieved the complete definition of a custom field’s metadata.
400
401
403
404
500
PUT/custom_fields/{custom_field_gid}Update a custom field
Request body

application/json

Responses
StatusDescriptionSchema
200The custom field was successfully updated.
400
401
403
404
500
DELETE/custom_fields/{custom_field_gid}Delete a custom field
Responses
StatusDescriptionSchema
200The custom field was successfully deleted.
400
401
403
404
500
POST/custom_fields/{custom_field_gid}/enum_optionsCreate an enum option
Request body

application/json

Responses
StatusDescriptionSchema
201Custom field enum option successfully created.
400
401
403
404
500
POST/custom_fields/{custom_field_gid}/enum_options/insertReorder a custom field's enum
Request body

application/json

Responses
StatusDescriptionSchema
200Custom field enum option successfully reordered.
400
401
403
404
500
PUT/enum_options/{enum_option_gid}Update an enum option
Parameters
NameInRequiredType
enum_option_gidpathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200Successfully updated the specified custom field enum.
400
401
403
404
500
GET/workspaces/{workspace_gid}/custom_fieldsGet a workspace's custom fields
Responses
StatusDescriptionSchema
200Successfully retrieved all custom fields for the given workspace.
400
401
403
404
500
Custom field settings2

Custom fields are attached to a particular project with the custom field settings resource. This resource both represents the many-to-many join of the custom field and project as well as stores information that is relevant to that particular pairing. For instance, the `is_important` property determines some possible application-specific handling of that custom field.

GET/portfolios/{portfolio_gid}/custom_field_settingsGet a portfolio's custom fields
Responses
StatusDescriptionSchema
200Successfully retrieved custom field settings objects for a portfolio.
400
401
403
404
500
GET/projects/{project_gid}/custom_field_settingsGet a project's custom fields
Responses
StatusDescriptionSchema
200Successfully retrieved custom field settings objects for a project.
400
401
403
404
500
Events1

An event is an object representing a change to a resource that was observed by an event subscription. Event streams rely on the same infrastructure as webhooks, which ensures events are delivered within a minute (on average). This system is designed for at most once delivery, meaning in exceptional circumstances a small number of events may be missing from the stream. For this reason, if your use case requires strong guarantees about processing all changes on a resource and cannot tolerate any missing events, regardless of how rare that might be, we recommend building a fallback polling system that fetches the resource periodically as well. Note that while webhooks cannot be replayed once delivered, events are retrievable from the event stream for 24 hours after being processed. In general, requesting events on a resource is faster and subject to higher rate limits than requesting the resource itself. Additionally, change events "bubble up" (e.g., listening to events on a project would include when stories are added to tasks in the project, and even to subtasks). Establish an initial sync token by making a request with no sync token. The response will be a `412 Precondition Failed` error - the same as if the sync token had expired. Subsequent requests should always provide the sync token from the immediately preceding call. Sync tokens may not be valid if you attempt to go "backward" in the history by requesting previous tokens, though re-requesting the current sync token is generally safe, and will always return the same results. When you receive a `412 Precondition Failed` error, it means that the sync token is either invalid or expired. If you are attempting to keep a set of data in sync, this signals you may need to re-crawl the data. Sync tokens always expire after 24 hours, but may expire sooner, depending on load on the service.

GET/eventsGet events on a resource
Parameters
NameInRequiredType
resourcequeryyesstring
syncquerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved events.
400
401
403
404
500
Goals10

A goal is an object in the goal-tracking system that helps your organization drive measurable results.

GET/goalsGet goals
Parameters
NameInRequiredType
portfolioquerynostring
projectquerynostring
is_workspace_levelquerynoboolean
teamquerynostring
workspacequerynostring
time_periodsquerynoarray
Responses
StatusDescriptionSchema
200Successfully retrieved the requested goals.
400
401
402
403
404
500
POST/goalsCreate a goal
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new goal.
400
401
402
403
404
500
GET/goals/{goal_gid}Get a goal
Responses
StatusDescriptionSchema
200Successfully retrieved the record for a single goal.
400
401
402
403
404
500
PUT/goals/{goal_gid}Update a goal
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the goal.
400
401
403
404
500
DELETE/goals/{goal_gid}Delete a goal
Responses
StatusDescriptionSchema
200Successfully deleted the specified goal.
400
401
402
403
404
500
POST/goals/{goal_gid}/addFollowersAdd a collaborator to a goal
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added users as collaborators.
400
401
402
403
404
500
GET/goals/{goal_gid}/parentGoalsGet parent goals from a goal
Responses
StatusDescriptionSchema
200Successfully retrieved the specified goal's parent goals.
400
401
402
403
404
500
POST/goals/{goal_gid}/removeFollowersRemove a collaborator from a goal
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed users as collaborators.
400
401
402
403
404
500
POST/goals/{goal_gid}/setMetricCreate a goal metric
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully created a new goal metric.
400
401
402
403
404
500
POST/goals/{goal_gid}/setMetricCurrentValueUpdate a goal metric
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the goal metric.
400
401
402
403
404
500
Goal relationships5

A goal relationship is an object representing the relationship between a goal and another goal, a project, or a portfolio.

GET/goal_relationshipsGet goal relationships
Parameters
NameInRequiredType
supported_goalqueryyesstring
resource_subtypequerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved the requested goal relationships.
400
401
403
404
500
GET/goal_relationships/{goal_relationship_gid}Get a goal relationship
Responses
StatusDescriptionSchema
200Successfully retrieved the record for the goal relationship.
400
401
403
404
500
PUT/goal_relationships/{goal_relationship_gid}Update a goal relationship
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the goal relationship.
400
401
403
404
500
POST/goals/{goal_gid}/addSupportingRelationshipAdd a supporting goal relationship
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully created the goal relationship.
400
401
403
404
500
POST/goals/{goal_gid}/removeSupportingRelationshipRemoves a supporting goal relationship
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the goal relationship.
400
401
403
404
500
Jobs1

Jobs represent processes that handle asynchronous work. A job created when an endpoint requests an action that will be handled asynchronously, such as project or task duplication. Only the creator of the duplication process can access the duplication status of the new object. *Note*: With any work that is handled asynchronously (e.g., [project instantation from a template](/docs/instantiate-a-project-from-a-project-template), duplicating a [task](/docs/duplicate-a-task) or [project](/docs/duplicate-a-project), etc.), the *intermittent states* of newly-created objects may not be consistent. That is, object properties may return different values each time when polled until the job `status` has returned a `succeeded` value.

GET/jobs/{job_gid}Get a job by id
Responses
StatusDescriptionSchema
200Successfully retrieved Job.
400
401
403
404
500
Organization exports2

An `organization_export` object represents a request to export the complete data of an organization in JSON format. To export an organization using this API: * Create an `organization_export` [request](/docs/create-an-organization-export-request) and store the ID that is returned. * Request the `organization_export` every few minutes, until the `state` field contains ‘finished’. * Download the file located at the URL in the `download_url` field. * Exports can take a long time, from several minutes to a few hours for large organizations. *Note: These endpoints are only available to [Service Accounts](https://asana.com/guide/help/premium/service-accounts) of an [Enterprise](https://asana.com/enterprise) organization.*

POST/organization_exportsCreate an organization export request
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created organization export request.
400
401
403
404
500
GET/organization_exports/{organization_export_gid}Get details on an org export request
Responses
StatusDescriptionSchema
200Successfully retrieved organization export object.
400
401
403
404
500
Portfolios12

A portfolio gives a high-level overview of the status of multiple initiatives in Asana. Portfolios provide a dashboard overview of the state of multiple projects, including a progress report and the most recent [status update](/docs/asana-statuses). Portfolios have some restrictions on size. Each portfolio has a max of 500 items and, like projects, a maximum of 20 custom fields.

GET/portfoliosGet multiple portfolios
Parameters
NameInRequiredType
workspacequeryyesstring
ownerqueryyesstring
Responses
StatusDescriptionSchema
200Successfully retrieved portfolios.
400
401
403
404
500
POST/portfoliosCreate a portfolio
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created portfolio.
400
401
403
404
500
GET/portfolios/{portfolio_gid}Get a portfolio
Responses
StatusDescriptionSchema
200Successfully retrieved the requested portfolio.
400
401
403
404
500
PUT/portfolios/{portfolio_gid}Update a portfolio
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the portfolio.
400
401
403
404
500
DELETE/portfolios/{portfolio_gid}Delete a portfolio
Responses
StatusDescriptionSchema
200Successfully deleted the specified portfolio.
400
401
403
404
500
POST/portfolios/{portfolio_gid}/addCustomFieldSettingAdd a custom field to a portfolio
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added the custom field to the portfolio.
400
401
403
404
500
POST/portfolios/{portfolio_gid}/addItemAdd a portfolio item
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added the item to the portfolio.
400
401
403
404
500
POST/portfolios/{portfolio_gid}/addMembersAdd users to a portfolio
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added members to the portfolio.
400
401
403
404
500
GET/portfolios/{portfolio_gid}/itemsGet portfolio items
Responses
StatusDescriptionSchema
200Successfully retrieved the requested portfolio's items.
400
401
403
404
500
POST/portfolios/{portfolio_gid}/removeCustomFieldSettingRemove a custom field from a portfolio
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the custom field from the portfolio.
400
401
403
404
500
POST/portfolios/{portfolio_gid}/removeItemRemove a portfolio item
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the item from the portfolio.
400
401
403
404
500
POST/portfolios/{portfolio_gid}/removeMembersRemove users from a portfolio
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the members from the portfolio.
400
401
403
404
500
Portfolio memberships3

This object determines if a user is a member of a portfolio.

GET/portfolio_membershipsGet multiple portfolio memberships
Responses
StatusDescriptionSchema
200Successfully retrieved portfolio memberships.
400
401
403
404
500
GET/portfolio_memberships/{portfolio_membership_gid}Get a portfolio membership
Responses
StatusDescriptionSchema
200Successfully retrieved the requested portfolio membership.
400
401
403
404
500
GET/portfolios/{portfolio_gid}/portfolio_membershipsGet memberships from a portfolio
Responses
StatusDescriptionSchema
200Successfully retrieved the requested portfolio's memberships.
400
401
403
404
500
Projects19

A project represents a prioritized list of tasks in Asana or a board with columns of tasks represented as cards. A project exists in a single workspace or organization and is accessible to a subset of users in that workspace or organization, depending on its permissions. Projects in organizations are shared with a single team. Currently, the team of a project cannot be changed via the API. Non-organization workspaces do not have teams and so you should not specify the team of project in a regular workspace. Followers of a project are a subset of the members of that project. Followers of a project will receive all updates including tasks created, added and removed from that project. Members of the project have access to and will receive status updates of the project. Adding followers to a project will add them as members if they are not already, removing followers from a project will not affect membership. **Note:** You can use certain project endpoints to operate on [user task lists](/docs/user-task-lists) ([My Tasks](https://asana.com/guide/help/fundamentals/my-tasks)) by substituting the `{project_gid}` with the `{user_task_list_gid}`. For example, you can perform operations on the custom fields of a [user task list](/docs/user-task-lists) by using the following projects endpoints: [Add a custom field to a project](/docs/add-a-custom-field-to-a-project), [Remove a custom field from a project](/docs/remove-a-custom-field-from-a-project) and [Get a project's custom fields](/docs/get-a-projects-custom-fields)

GET/projectsGet multiple projects
Parameters
NameInRequiredType
workspacequerynostring
teamquerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved projects.
400
401
403
404
500
POST/projectsCreate a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully retrieved projects.
400
401
403
404
500
GET/projects/{project_gid}Get a project
Responses
StatusDescriptionSchema
200Successfully retrieved the requested project.
400
401
403
404
500
PUT/projects/{project_gid}Update a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the project.
400
401
403
404
500
DELETE/projects/{project_gid}Delete a project
Responses
StatusDescriptionSchema
200Successfully deleted the specified project.
400
401
403
404
500
POST/projects/{project_gid}/addCustomFieldSettingAdd a custom field to a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added the custom field to the project.
400
401
403
404
500
POST/projects/{project_gid}/addFollowersAdd followers to a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added followers to the project.
400
401
403
404
500
POST/projects/{project_gid}/addMembersAdd users to a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added members to the project.
400
401
403
404
500
POST/projects/{project_gid}/duplicateDuplicate a project
Request body

application/json

Responses
StatusDescriptionSchema
201Successfully created the job to handle duplication.
400
401
403
404
500
POST/projects/{project_gid}/removeCustomFieldSettingRemove a custom field from a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the custom field from the project.
400
401
403
404
500
POST/projects/{project_gid}/removeFollowersRemove followers from a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed followers from the project.
400
401
403
404
500
POST/projects/{project_gid}/removeMembersRemove users from a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the members from the project.
400
401
403
404
500
POST/projects/{project_gid}/saveAsTemplateCreate a project template from a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the job to handle project template creation.
400
401
403
404
500
GET/projects/{project_gid}/task_countsGet task count of a project
Responses
StatusDescriptionSchema
200Successfully retrieved the requested project's task counts.
400
401
403
404
500
GET/tasks/{task_gid}/projectsGet projects a task is in
Responses
StatusDescriptionSchema
200Successfully retrieved the projects for the given task.
400
401
403
404
500
GET/teams/{team_gid}/projectsGet a team's projects
Responses
StatusDescriptionSchema
200Successfully retrieved the requested team's projects.
400
401
403
404
500
POST/teams/{team_gid}/projectsCreate a project in a team
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the specified project.
400
401
403
404
500
GET/workspaces/{workspace_gid}/projectsGet all projects in a workspace
Responses
StatusDescriptionSchema
200Successfully retrieved the requested workspace's projects.
400
401
403
404
500
POST/workspaces/{workspace_gid}/projectsCreate a project in a workspace
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new project in the specified workspace.
400
401
403
404
500
Project briefs4

A project brief object represents a rich text document that describes a project. Please note that this API is in *preview*, and is expected to change. This API is to be used for development and testing only as an advance view into the upcoming rich text format experience in the task description. For more information, see [this post](https://forum.asana.com/t/project-brief-api-now-available-as-a-preview/150885) in the developer forum.

GET/project_briefs/{project_brief_gid}Get a project brief
Responses
StatusDescriptionSchema
200Successfully retrieved the record for a project brief.
400
401
402
403
404
424
500
501
503
504
PUT/project_briefs/{project_brief_gid}Update a project brief
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the project brief.
400
401
403
404
500
DELETE/project_briefs/{project_brief_gid}Delete a project brief
Responses
StatusDescriptionSchema
200Successfully deleted the specified project brief.
400
401
403
404
500
POST/projects/{project_gid}/project_briefsCreate a project brief
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new project brief.
400
401
402
403
404
500
Project memberships2

With the introduction of “comment-only” projects in Asana, a user’s membership in a project comes with associated permissions. These permissions (i.e., whether a user has full access to the project or comment-only access) are accessible through the project memberships endpoints described here.

GET/project_memberships/{project_membership_gid}Get a project membership
Responses
StatusDescriptionSchema
200Successfully retrieved the requested project membership.
400
401
403
404
500
GET/projects/{project_gid}/project_membershipsGet memberships from a project
Responses
StatusDescriptionSchema
200Successfully retrieved the requested project's memberships.
400
401
403
404
500
Project statuses4

*Deprecated: new integrations should prefer using [status updates](/docs/asana-statuses)* A project status is an update on the progress of a particular project, and is sent out to all project followers when created. These updates include both text describing the update and a color code intended to represent the overall state of the project: "green" for projects that are on track, "yellow" for projects at risk, "red" for projects that are behind, and "blue" for projects on hold. Project statuses can be created and deleted, but not modified.

GET/project_statuses/{project_status_gid}Get a project status
Responses
StatusDescriptionSchema
200Successfully retrieved the specified project's status updates.
400
401
403
404
500
DELETE/project_statuses/{project_status_gid}Delete a project status
Responses
StatusDescriptionSchema
200Successfully deleted the specified project status.
400
401
403
404
500
GET/projects/{project_gid}/project_statusesGet statuses from a project
Responses
StatusDescriptionSchema
200Successfully retrieved the specified project's status updates.
400
401
403
404
500
POST/projects/{project_gid}/project_statusesCreate a project status
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new story.
400
401
403
404
500
Project templates4

A project template is an object that allows new projects to be created with a predefined setup, which may include tasks, sections, rules, etc. It simplifies the process of running a workflow that involves a similar set of work every time. Project templates in organizations are shared with a single team. Currently, the team of a project template cannot be changed via the API.

GET/project_templatesGet multiple project templates
Responses
StatusDescriptionSchema
200Successfully retrieved the requested team's or workspace's project templates.
400
401
403
404
500
GET/project_templates/{project_template_gid}Get a project template
Responses
StatusDescriptionSchema
200Successfully retrieved the requested project template.
400
401
403
404
500
POST/project_templates/{project_template_gid}/instantiateProjectInstantiate a project from a project template
Request body

application/json

Responses
StatusDescriptionSchema
201Successfully created the job to handle project instantiation.
400
401
403
404
500
GET/teams/{team_gid}/project_templatesGet a team's project templates
Responses
StatusDescriptionSchema
200Successfully retrieved the requested team's project templates.
400
401
403
404
500
Sections7

A section is a subdivision of a project that groups tasks together. It can either be a header above a list of tasks in a list view or a column in a board view of a project. Sections are largely a shared idiom in Asana’s API for both list and board views of a project regardless of the project’s layout. The ‘memberships’ property when [getting a task](/docs/get-a-task) will return the information for the section or the column under ‘section’ in the response.

GET/projects/{project_gid}/sectionsGet sections in a project
Responses
StatusDescriptionSchema
200Successfully retrieved sections in project.
400
401
403
404
500
POST/projects/{project_gid}/sectionsCreate a section in a project
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the specified section.
400
401
403
404
500
POST/projects/{project_gid}/sections/insertMove or Insert sections
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully moved the specified section.
400
401
403
404
500
GET/sections/{section_gid}Get a section
Responses
StatusDescriptionSchema
200Successfully retrieved section.
400
401
403
404
500
PUT/sections/{section_gid}Update a section
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the specified section.
400
401
403
404
500
DELETE/sections/{section_gid}Delete a section
Responses
StatusDescriptionSchema
200Successfully deleted the specified section.
400
401
403
404
500
POST/sections/{section_gid}/addTaskAdd task to section
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added the task.
400
401
403
404
500
Status updates4

A status update is an update on the progress of a particular object, and is sent out to all followers when created. These updates include both text describing the update and a `status_type` intended to represent the overall state of the project. These include: `on_track` for projects that are on track, `at_risk` for projects at risk, `off_track` for projects that are behind, and `on_hold` for projects on hold. Status updates can be created and deleted, but not modified.

GET/status_updatesGet status updates from an object
Parameters
NameInRequiredType
parentqueryyesstring
created_sincequerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved the specified object's status updates.
400
401
403
404
500
POST/status_updatesCreate a status update
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new status update.
400
401
403
404
500
GET/status_updates/{status_gid}Get a status update
Responses
StatusDescriptionSchema
200Successfully retrieved the specified object's status updates.
400
401
403
404
500
DELETE/status_updates/{status_gid}Delete a status update
Responses
StatusDescriptionSchema
200Successfully deleted the specified status.
400
401
403
404
500
Stories5

*See [our forum post](https://forum.asana.com/t/no-more-parsing-story-text-new-fields-on-stories/42924) for more info on when conditional fields are returned.* A story represents an activity associated with an object in the Asana system. Stories are generated by the system whenever users take actions such as creating or assigning tasks, or moving tasks between projects. "Comments" are also a form of user-generated story.

GET/stories/{story_gid}Get a story
Responses
StatusDescriptionSchema
200Successfully retrieved the specified story.
400
401
403
404
500
PUT/stories/{story_gid}Update a story
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully retrieved the specified story.
400
401
403
404
500
DELETE/stories/{story_gid}Delete a story
Responses
StatusDescriptionSchema
200Successfully deleted the specified story.
400
401
403
404
500
GET/tasks/{task_gid}/storiesGet stories from a task
Responses
StatusDescriptionSchema
200Successfully retrieved the specified task's stories.
400
401
403
404
500
POST/tasks/{task_gid}/storiesCreate a story on a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new story.
400
401
403
404
500
Tags8

A tag is a label that can be attached to any task in Asana. It exists in a single workspace or organization. Tags have some metadata associated with them, but it is possible that we will simplify them in the future so it is not encouraged to rely too heavily on it. Unlike projects, tags do not provide any ordering on the tasks they are associated with.

GET/tagsGet multiple tags
Parameters
NameInRequiredType
workspacequerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved the specified set of tags.
400
401
403
404
500
POST/tagsCreate a tag
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the newly specified tag.
400
401
403
404
500
GET/tags/{tag_gid}Get a tag
Responses
StatusDescriptionSchema
200Successfully retrieved the specified tag.
400
401
403
404
500
PUT/tags/{tag_gid}Update a tag
Responses
StatusDescriptionSchema
200Successfully updated the specified tag.
400
401
403
404
500
DELETE/tags/{tag_gid}Delete a tag
Responses
StatusDescriptionSchema
200Successfully deleted the specified tag.
400
401
403
404
500
GET/tasks/{task_gid}/tagsGet a task's tags
Responses
StatusDescriptionSchema
200Successfully retrieved the tags for the given task.
400
401
403
404
500
GET/workspaces/{workspace_gid}/tagsGet tags in a workspace
Responses
StatusDescriptionSchema
200Successfully retrieved the specified set of tags.
400
401
403
404
500
POST/workspaces/{workspace_gid}/tagsCreate a tag in a workspace
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the newly specified tag.
400
401
403
404
500
Tasks26

The task is the basic object around which many operations in Asana are centered. In the Asana application, multiple tasks populate the middle pane according to some view parameters, and the set of selected tasks determines the more detailed information presented in the details pane. Sections are unique in that they will be included in the `memberships` field of task objects returned in the API when the task is within a section. They can also be used to manipulate the ordering of a task within a project. [Queries](/docs/get-multiple-tasks) return a [compact representation of each task object](/docs/task-compact). To retrieve *all* fields or *specific set* of the fields, use [field selectors](/docs/input-output-options) to manipulate what data is included in a response.

GET/projects/{project_gid}/tasksGet tasks from a project
Responses
StatusDescriptionSchema
200Successfully retrieved the requested project's tasks.
400
401
403
404
500
GET/sections/{section_gid}/tasksGet tasks from a section
Responses
StatusDescriptionSchema
200Successfully retrieved the section's tasks.
400
401
403
404
500
GET/tags/{tag_gid}/tasksGet tasks from a tag
Responses
StatusDescriptionSchema
200Successfully retrieved the tasks associated with the specified tag.
400
401
403
404
500
GET/tasksGet multiple tasks
Parameters
NameInRequiredType
assigneequerynostring
projectquerynostring
sectionquerynostring
workspacequerynostring
completed_sincequerynostring
modified_sincequerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved requested tasks.
400
401
403
404
500
POST/tasksCreate a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new task.
400
401
403
404
500
GET/tasks/{task_gid}Get a task
Responses
StatusDescriptionSchema
200Successfully retrieved the specified task.
400
401
403
404
500
PUT/tasks/{task_gid}Update a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the specified task.
400
401
403
404
500
DELETE/tasks/{task_gid}Delete a task
Responses
StatusDescriptionSchema
200Successfully deleted the specified task.
400
401
403
404
500
POST/tasks/{task_gid}/addDependenciesSet dependencies for a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully set the specified dependencies on the task.
400
401
402
403
404
500
POST/tasks/{task_gid}/addDependentsSet dependents for a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully set the specified dependents on the given task.
400
401
402
403
404
500
POST/tasks/{task_gid}/addFollowersAdd followers to a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added the specified followers to the task.
400
401
403
404
500
POST/tasks/{task_gid}/addProjectAdd a project to a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added the specified project to the task.
400
401
403
404
500
POST/tasks/{task_gid}/addTagAdd a tag to a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added the specified tag to the task.
400
401
403
404
500
GET/tasks/{task_gid}/dependenciesGet dependencies from a task
Responses
StatusDescriptionSchema
200Successfully retrieved the specified task's dependencies.
400
401
402
403
404
500
GET/tasks/{task_gid}/dependentsGet dependents from a task
Responses
StatusDescriptionSchema
200Successfully retrieved the specified dependents of the task.
400
401
402
403
404
500
POST/tasks/{task_gid}/duplicateDuplicate a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the job to handle duplication.
400
401
403
404
500
POST/tasks/{task_gid}/removeDependenciesUnlink dependencies from a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully unlinked the dependencies from the specified task.
400
401
402
403
404
500
POST/tasks/{task_gid}/removeDependentsUnlink dependents from a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully unlinked the specified tasks as dependents.
400
401
402
403
404
500
POST/tasks/{task_gid}/removeFollowersRemove followers from a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the specified followers from the task.
400
401
403
404
500
POST/tasks/{task_gid}/removeProjectRemove a project from a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the specified project from the task.
400
401
403
404
500
POST/tasks/{task_gid}/removeTagRemove a tag from a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully removed the specified tag from the task.
400
401
403
404
500
POST/tasks/{task_gid}/setParentSet the parent of a task
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully changed the parent of the specified subtask.
400
401
403
404
500
GET/tasks/{task_gid}/subtasksGet subtasks from a task
Responses
StatusDescriptionSchema
200Successfully retrieved the specified task's subtasks.
400
401
403
404
500
POST/tasks/{task_gid}/subtasksCreate a subtask
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the specified subtask.
400
401
403
404
500
GET/user_task_lists/{user_task_list_gid}/tasksGet tasks from a user task list
Responses
StatusDescriptionSchema
200Successfully retrieved the user task list's tasks.
400
401
403
404
500
GET/workspaces/{workspace_gid}/tasks/searchSearch tasks in a workspace
Parameters
NameInRequiredType
textquerynostring
resource_subtypequerynostring
assignee.anyquerynostring
assignee.notquerynostring
portfolios.anyquerynostring
projects.anyquerynostring
projects.notquerynostring
projects.allquerynostring
sections.anyquerynostring
sections.notquerynostring
sections.allquerynostring
tags.anyquerynostring
tags.notquerynostring
tags.allquerynostring
teams.anyquerynostring
followers.notquerynostring
created_by.anyquerynostring
created_by.notquerynostring
assigned_by.anyquerynostring
assigned_by.notquerynostring
liked_by.notquerynostring
commented_on_by.notquerynostring
due_on.beforequerynostring
due_on.afterquerynostring
due_onquerynostring
due_at.beforequerynostring
due_at.afterquerynostring
start_on.beforequerynostring
start_on.afterquerynostring
start_onquerynostring
created_on.beforequerynostring
created_on.afterquerynostring
created_onquerynostring
created_at.beforequerynostring
created_at.afterquerynostring
completed_on.beforequerynostring
completed_on.afterquerynostring
completed_onquerynostring
completed_at.beforequerynostring
completed_at.afterquerynostring
modified_on.beforequerynostring
modified_on.afterquerynostring
modified_onquerynostring
modified_at.beforequerynostring
modified_at.afterquerynostring
is_blockingquerynoboolean
is_blockedquerynoboolean
has_attachmentquerynoboolean
completedquerynoboolean
is_subtaskquerynoboolean
sort_byquerynostring
sort_ascendingquerynoboolean
Responses
StatusDescriptionSchema
200Successfully retrieved the section's tasks.
400
401
403
404
500
Teams7

A team is used to group related projects and people together within an organization. Each project in an organization is associated with a team.

POST/teamsCreate a team
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created a new team.
400
401
403
404
500
PUT/teamsUpdate a team
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the team.
400
401
403
404
500
GET/teams/{team_gid}Get a team
Responses
StatusDescriptionSchema
200Successfully retrieved the record for a single team.
400
401
403
404
500
POST/teams/{team_gid}/addUserAdd a user to a team
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully added user to the team.
400
401
403
404
500
POST/teams/{team_gid}/removeUserRemove a user from a team
Request body

application/json (required)

Responses
StatusDescriptionSchema
204Returns an empty data record
400
401
403
404
500
GET/users/{user_gid}/teamsGet teams for a user
Parameters
NameInRequiredType
organizationqueryyesstring
Responses
StatusDescriptionSchema
200Returns the team records for all teams in the organization or workspace to which the given user is assigned.
400
401
403
404
500
GET/workspaces/{workspace_gid}/teamsGet teams in a workspace
Responses
StatusDescriptionSchema
200Returns the team records for all teams in the organization or workspace accessible to the authenticated user.
400
401
403
404
500
Team memberships4

This object determines if a user is a member of a team.

GET/team_membershipsGet team memberships
Parameters
NameInRequiredType
teamquerynostring
userquerynostring
workspacequerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved the requested team memberships.
400
401
403
404
500
GET/team_memberships/{team_membership_gid}Get a team membership
Responses
StatusDescriptionSchema
200Successfully retrieved the requested team membership.
400
401
403
404
500
GET/teams/{team_gid}/team_membershipsGet memberships from a team
Responses
StatusDescriptionSchema
200Successfully retrieved the requested team's memberships.
400
401
403
404
500
GET/users/{user_gid}/team_membershipsGet memberships from a user
Parameters
NameInRequiredType
workspacequeryyesstring
Responses
StatusDescriptionSchema
200Successfully retrieved the requested users's memberships.
400
401
403
404
500
Time periods2

A time period is an object that represents a domain-scoped date range that can be set on [goals](/docs/goals).

GET/time_periodsGet time periods
Parameters
NameInRequiredType
start_onquerynostring
end_onquerynostring
workspacequeryyesstring
Responses
StatusDescriptionSchema
200Successfully retrieved the requested time periods.
400
401
403
404
500
GET/time_periods/{time_period_gid}Get a time period
Responses
StatusDescriptionSchema
200Successfully retrieved the record for a single time period.
400
401
403
404
500
Typeahead1

The typeahead search API provides search for objects from a single workspace.

GET/workspaces/{workspace_gid}/typeaheadGet objects via typeahead
Parameters
NameInRequiredType
resource_typequeryyesstring
typequerynostring
queryquerynostring
countquerynointeger
Responses
StatusDescriptionSchema
200Successfully retrieved objects via a typeahead search algorithm.
400
401
403
404
500
Users5

A user object represents an account in Asana that can be given access to various workspaces, projects, and tasks. Like other objects in the system, users are referred to by numerical IDs. However, the special string identifier `me` can be used anywhere a user ID is accepted, to refer to the current authenticated user (e.g, `GET /users/me`).

GET/teams/{team_gid}/usersGet users in a team
Responses
StatusDescriptionSchema
200Returns the user records for all the members of the team, including guests and limited access users
400
401
403
404
500
GET/usersGet multiple users
Parameters
NameInRequiredType
workspacequerynostring
teamquerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved the requested user records.
400
401
403
404
500
GET/users/{user_gid}Get a user
Responses
StatusDescriptionSchema
200Returns the user specified.
400
401
403
404
500
GET/users/{user_gid}/favoritesGet a user's favorites
Parameters
NameInRequiredType
resource_typequeryyesstring
workspacequeryyesstring
Responses
StatusDescriptionSchema
200Returns the specified user's favorites.
400
401
403
404
500
GET/workspaces/{workspace_gid}/usersGet users in a workspace or organization
Responses
StatusDescriptionSchema
200Return the users in the specified workspace or org.
400
401
403
404
500
User task lists2

A user task list represents the tasks assigned to a particular user. This list is the user's [My Tasks](https://asana.com/guide/help/fundamentals/my-tasks) list.

GET/user_task_lists/{user_task_list_gid}Get a user task list
Responses
StatusDescriptionSchema
200Successfully retrieved the user task list.
400
401
403
404
500
GET/users/{user_gid}/user_task_listGet a user's task list
Parameters
NameInRequiredType
workspacequeryyesstring
Responses
StatusDescriptionSchema
200Successfully retrieved the user's task list.
400
401
403
404
500
Webhooks5

Webhooks allow you to subscribe to notifications about events that occur on Asana resources (e.g., tasks, projects, stories, etc.). For a more detailed explanation of webhooks see the [overview of webhooks](/docs/overview-of-webhooks).

GET/webhooksGet multiple webhooks
Parameters
NameInRequiredType
workspacequeryyesstring
resourcequerynostring
Responses
StatusDescriptionSchema
200Successfully retrieved the requested webhooks.
400
401
403
404
500
POST/webhooksEstablish a webhook
Request body

application/json (required)

Responses
StatusDescriptionSchema
201Successfully created the requested webhook.
400
401
403
404
500
GET/webhooks/{webhook_gid}Get a webhook
Responses
StatusDescriptionSchema
200Successfully retrieved the requested webhook.
400
401
403
404
500
PUT/webhooks/{webhook_gid}Update a webhook
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Successfully updated the webhook.
400
401
403
404
500
DELETE/webhooks/{webhook_gid}Delete a webhook
Responses
StatusDescriptionSchema
200Successfully retrieved the requested webhook.
400
401
403
404
500
Workspaces5

A *workspace* is the highest-level organizational unit in Asana. All projects and tasks have an associated workspace. An *organization* is a special kind of workspace that represents a company. In an organization, you can group your projects into teams. You can read more about how organizations work on the Asana Guide. To tell if your workspace is an organization or not, check its `is_organization` property. Over time, we intend to migrate most workspaces into organizations and to release more organization-specific functionality. We may eventually deprecate using workspace-based APIs for organizations. Currently, and until after some reasonable grace period following any further announcements, you can still reference organizations in any `workspace` parameter.

GET/workspacesGet multiple workspaces
Responses
StatusDescriptionSchema
200Return all workspaces visible to the authorized user.
400
401
403
404
500
GET/workspaces/{workspace_gid}Get a workspace
Responses
StatusDescriptionSchema
200Return the full workspace record.
400
401
403
404
500
PUT/workspaces/{workspace_gid}Update a workspace
Request body

application/json (required)

Responses
StatusDescriptionSchema
200Update for the workspace was successful.
400
401
403
404
500
POST/workspaces/{workspace_gid}/addUserAdd a user to a workspace or organization
Request body

application/json (required)

Responses
StatusDescriptionSchema
200The user was added successfully to the workspace or organization.
400
401
403
404
500
POST/workspaces/{workspace_gid}/removeUserRemove a user from a workspace or organization
Request body

application/json (required)

Responses
StatusDescriptionSchema
204The user was removed successfully to the workspace or organization.
400
401
403
404
500
Workspace memberships3

This object determines if a user is a member of a workspace.

GET/users/{user_gid}/workspace_membershipsGet workspace memberships for a user
Responses
StatusDescriptionSchema
200Successfully retrieved the requested user's workspace memberships.
400
401
403
404
500
GET/workspace_memberships/{workspace_membership_gid}Get a workspace membership
Responses
StatusDescriptionSchema
200Successfully retrieved the requested workspace membership.
400
401
403
404
500
GET/workspaces/{workspace_gid}/workspace_membershipsGet the workspace memberships for a workspace
Responses
StatusDescriptionSchema
200Successfully retrieved the requested workspace's memberships.

Try it

Developer reference

Base URLhttps://app.asana.com/api/1.0
Rate limit

150 requests/minute on the free tier; 1,500 requests/minute on paid tiers. The search endpoint is capped separately at 60 requests/minute.

Key endpoints
  • GET/tasks
  • POST/tasks
  • GET/tasks/{task_gid}
  • PUT/tasks/{task_gid}
  • GET/projects