Asana

Work management and project tracking

developers.asana.com/docs ↗
Version
1.0
OpenAPI
3.0.0
Endpoints
189
Schemas
435
Updated
3 days ago
Productivity productivity project-management tasks
Use this API in your AI agent

Query structured spec data via REST or MCP. Get exactly what your agent needs.

Get API Key

Server URLs

https://app.asana.com/api/1.0

Authentication

bearer oauth2

Endpoints

Allocations 5 endpoints

GET /allocations

Returns a list of allocations filtered to a specific project or user.

operationId: Allocations_getMultiple

Parameters

Name In Required Type Description
parent query optional string Globally unique identifier for the project to filter allocations by.
assignee query optional string Globally unique identifier for the user the allocation is assigned to.
workspace query optional string Globally unique identifier for the workspace.
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested allocations.
400
401
402
403
404
500
GET /allocations
POST /allocations

Creates a new allocation. Returns the full record of the newly created allocation.

operationId: Allocations_createRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/AllocationsCreateRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The allocation to create."
}

Responses

201 Successfully created a new allocation.
400
401
402
403
404
500
POST /allocations
DELETE /allocations/{allocation_gid}

A specific, existing allocation can be deleted by making a DELETE request on the URL for that allocation. Returns an empty data record.

operationId: Allocations_deleteAllocationById

Responses

200 Successfully deleted the specified allocation.
400
401
402
403
404
500
DELETE /allocations/{allocation_gid}
GET /allocations/{allocation_gid}

Returns the complete allocation record for a single allocation.

operationId: Allocations_getRecordById

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the record for a single allocation.
400
401
402
403
404
500
GET /allocations/{allocation_gid}
PUT /allocations/{allocation_gid}

An existing allocation can be updated by making a PUT request on the URL for that allocation. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. Returns the complete updated allocation record.

operationId: Allocations_updateRecordById

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/AllocationsUpdateRecordByIdRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the allocation."
}

Responses

200 Successfully updated the allocation.
400
401
403
404
500
PUT /allocations/{allocation_gid}

Attachments 4 endpoints

GET /attachments

Returns the compact records for all attachments on the object. There are three possible `parent` values for this request: `project`, `project_brief`, and `task`. For a project, an attachment refers to a file uploaded to the "Key resources" section in the project Overview. For a project brief, an attachment refers to inline files in the project brief itself. For a task, an attachment refers to a file directly associated to that task. Note that within the Asana app, inline images in the task description do not appear in the index of image thumbnails nor as stories in the task. However, requests made to `GET /attachments` for a task will return all of the images in the task, including inline images.

operationId: Attachments_getAllForObject

Parameters

Name In Required Type Description
optional
optional
parent query required string Globally unique identifier for object to fetch statuses from. Must be a GID for a `project`, `project_brief`, or `task`.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified object's attachments.
400
401
403
404
500
GET /attachments
POST /attachments

Upload an attachment. This method uploads an attachment on an object and returns the compact record for the created attachment object. This is possible by either: - Providing the URL of the external resource being attached, or - Downloading the file content first and then uploading it as any other attachment. Note that it is not possible to attach files from third party services such as Dropbox, Box, Vimeo & Google Drive via the API The 100MB size limit on attachments in Asana is enforced on this endpoint. This endpoint expects a multipart/form-data encoded request containing the full contents of the file to be uploaded. Requests made should follow the HTTP/1.1 specification that line terminators are of the form `CRLF` or `\r\n` outlined [here](http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01#Basic-Rules) in order for the server to reliably and properly handle the request.

operationId: Attachments_uploadAttachment

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "multipart/form-data": {
      "schema": {
        "$ref": "#/components/schemas/AttachmentRequest"
      }
    }
  },
  "description": "The file you want to upload.\n\n*Note when using curl:*\n\nBe sure to add an `‘@’` before the file path, and use the `--form`\noption instead of the `-d` option.\n\nWhen uploading PDFs with curl, force the content-type to be pdf by\nappending the content type to the file path: `--form\n\"file=@file.pdf;type=application/pdf\"`."
}

Responses

200 Successfully uploaded the attachment to the parent object.
400
401
403
404
500
POST /attachments
DELETE /attachments/{attachment_gid}

Deletes a specific, existing attachment. Returns an empty data record.

operationId: Attachments_deleteSpecific

Responses

200 Successfully deleted the specified attachment.
400
401
403
404
500
DELETE /attachments/{attachment_gid}
GET /attachments/{attachment_gid}

Get the full record for a single attachment.

operationId: Attachments_getAttachmentRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the record for a single attachment.
400
401
402
403
404
424
500
501
503
504
GET /attachments/{attachment_gid}

Audit log api 1 endpoints

GET /workspaces/{workspace_gid}/audit_log_events

Retrieve the audit log events that have been captured in your domain. This endpoint will return a list of [AuditLogEvent](https://raw.githubusercontent.com) objects, sorted by creation time in ascending order. Note that the Audit Log API captures events from October 8th, 2021 and later. Queries for events before this date will not return results. There are a number of query parameters (below) that can be used to filter the set of [AuditLogEvent](https://raw.githubusercontent.com) objects that are returned in the response. Any combination of query parameters is valid. When no filters are provided, all of the events that have been captured in your domain will match. The list of events will always be [paginated](https://raw.githubusercontent.com). The default limit is 1000 events. The next set of events can be retrieved using the `offset` from the previous response. If there are no events that match the provided filters in your domain, the endpoint will return `null` for the `next_page` field. Querying again with the same filters may return new events if they were captured after the last request. Once a response includes a `next_page` with an `offset`, subsequent requests can be made with the latest `offset` to poll for new events that match the provided filters. *Note: If the filters you provided match events in your domain and `next_page` is present in the response, we will continue to send `next_page` on subsequent requests even when there are no more events that match the filters. This was put in place so that you can implement an audit log stream that will return future events that match these filters. If you are not interested in future events that match the filters you have defined, you can rely on checking empty `data` response for the end of current events that match your filters.* When no `offset` is provided, the response will begin with the oldest events that match the provided filters. It is important to note that [AuditLogEvent](https://raw.githubusercontent.com) objects will be permanently deleted from our systems after 90 days. If you wish to keep a permanent record of these events, we recommend using a SIEM tool to ingest and store these logs.

operationId: AuditLogApi_getAuditLogEvents

Responses

200 AuditLogEvents were successfully retrieved.
400
401
403
404
500
GET /workspaces/{workspace_gid}/audit_log_events

Batch api 1 endpoints

POST /batch

Make multiple requests in parallel to Asana's API.

operationId: BatchApi_submitParallelRequests

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/BatchApiSubmitParallelRequestsRequest"
      }
    }
  },
  "required": true,
  "description": "The requests to batch together via the Batch API."
}

Responses

200 Successfully completed the requested batch API operations.
400
401
403
404
500
POST /batch

Custom field settings 2 endpoints

GET /portfolios/{portfolio_gid}/custom_field_settings

Returns a list of all of the custom fields settings on a portfolio, in compact form.

operationId: CustomFieldSettings_getPortfolioCustomFieldSettings

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved custom field settings objects for a portfolio.
400
401
403
404
500
GET /portfolios/{portfolio_gid}/custom_field_settings
GET /projects/{project_gid}/custom_field_settings

Returns a list of all of the custom fields settings on a project, in compact form. Note that, as in all queries to collections which return compact representation, `opt_fields` can be used to include more data than is returned in the compact representation. See the [documentation for input/output options](https://developers.asana.com/docs/inputoutput-options) for more information.

operationId: CustomFieldSettings_getProjectCustomFieldSettings

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved custom field settings objects for a project.
400
401
403
404
500
GET /projects/{project_gid}/custom_field_settings

Custom fields 8 endpoints

POST /custom_fields

Creates a new custom field in a workspace. Every custom field is required to be created in a specific workspace, and this workspace cannot be changed once set. A custom field’s name must be unique within a workspace and not conflict with names of existing task properties such as `Due Date` or `Assignee`. A custom field’s type must be one of `text`, `enum`, `multi_enum`, `number`, `date`, or `people`. Returns the full record of the newly created custom field.

operationId: CustomFields_createNewFieldRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/CustomFieldsCreateNewFieldRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The custom field object to create."
}

Responses

201 Custom field successfully created.
400
401
403
404
500
POST /custom_fields
DELETE /custom_fields/{custom_field_gid}

A specific, existing custom field can be deleted by making a DELETE request on the URL for that custom field. Locked custom fields can only be deleted by the user who locked the field. Returns an empty data record.

operationId: CustomFields_deleteFieldRecord

Responses

200 The custom field was successfully deleted.
400
401
403
404
500
DELETE /custom_fields/{custom_field_gid}
GET /custom_fields/{custom_field_gid}

Get the complete definition of a custom field’s metadata. Since custom fields can be defined for one of a number of types, and these types have different data and behaviors, there are fields that are relevant to a particular type. For instance, as noted above, enum_options is only relevant for the enum type and defines the set of choices that the enum could represent. The examples below show some of these type-specific custom field definitions.

operationId: CustomFields_getMetadata

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the complete definition of a custom field’s metadata.
400
401
403
404
500
GET /custom_fields/{custom_field_gid}
PUT /custom_fields/{custom_field_gid}

A specific, existing custom field can be updated by making a PUT request on the URL for that custom field. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged When using this method, it is best to specify only those fields you wish to change, or else you may overwrite changes made by another user since you last retrieved the custom field. A custom field’s `type` cannot be updated. An enum custom field’s `enum_options` cannot be updated with this endpoint. Instead see “Work With Enum Options” for information on how to update `enum_options`. Locked custom fields can only be updated by the user who locked the field. Returns the complete updated custom field record.

operationId: CustomFields_updateFieldRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/CustomFieldsUpdateFieldRecordRequest"
      }
    }
  },
  "description": "The custom field object with all updated properties."
}

Responses

200 The custom field was successfully updated.
400
401
403
404
500
PUT /custom_fields/{custom_field_gid}
POST /custom_fields/{custom_field_gid}/enum_options

Creates an enum option and adds it to this custom field’s list of enum options. A custom field can have at most 500 enum options (including disabled options). By default new enum options are inserted at the end of a custom field’s list. Locked custom fields can only have enum options added by the user who locked the field. Returns the full record of the newly created enum option.

operationId: CustomFields_addEnumOption

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/CustomFieldsAddEnumOptionRequest"
      }
    }
  },
  "description": "The enum option object to create."
}

Responses

201 Custom field enum option successfully created.
400
401
403
404
500
POST /custom_fields/{custom_field_gid}/enum_options
POST /custom_fields/{custom_field_gid}/enum_options/insert

Moves a particular enum option to be either before or after another specified enum option in the custom field. Locked custom fields can only be reordered by the user who locked the field.

operationId: CustomFields_reorderEnumOption

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/CustomFieldsReorderEnumOptionRequest"
      }
    }
  },
  "description": "The enum option object to create."
}

Responses

200 Custom field enum option successfully reordered.
400
401
403
404
500
POST /custom_fields/{custom_field_gid}/enum_options/insert
PUT /enum_options/{enum_option_gid}

Updates an existing enum option. Enum custom fields require at least one enabled enum option. Locked custom fields can only be updated by the user who locked the field. Returns the full record of the updated enum option.

operationId: CustomFields_updateEnumOption

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/CustomFieldsUpdateEnumOptionRequest"
      }
    }
  },
  "description": "The enum option object to update"
}

Responses

200 Successfully updated the specified custom field enum.
400
401
403
404
500
PUT /enum_options/{enum_option_gid}
GET /workspaces/{workspace_gid}/custom_fields

Returns a list of the compact representation of all of the custom fields in a workspace.

operationId: CustomFields_listWorkspaceCustomFields

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved all custom fields for the given workspace.
400
401
403
404
500
GET /workspaces/{workspace_gid}/custom_fields

Events 1 endpoints

GET /events

Returns the full record for all events that have occurred since the sync token was created. A `GET` request to the endpoint `/[path_to_resource]/events` can be made in lieu of including the resource ID in the data for the request. Asana limits a single sync token to 100 events. If more than 100 events exist for a given resource, `has_more: true` will be returned in the response, indicating that there are more events to pull. *Note: The resource returned will be the resource that triggered the event. This may be different from the one that the events were requested for. For example, a subscription to a project will contain events for tasks contained within the project.*

operationId: Events_getResourceEvents

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved events.
400
401
403
404
412 The request is missing or has an expired sync token.
500
GET /events

Goal relationships 5 endpoints

GET /goal_relationships

Returns compact goal relationship records.

operationId: GoalRelationships_getCompactRecords

Parameters

Name In Required Type Description
optional
optional
optional
supported_goal query required string Globally unique identifier for the supported goal in the goal relationship.
resource_subtype query optional string If provided, filter to goal relationships with a given resource_subtype.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested goal relationships.
400
401
403
404
500
GET /goal_relationships
GET /goal_relationships/{goal_relationship_gid}

Returns the complete updated goal relationship record for a single goal relationship.

operationId: GoalRelationships_getRecordById

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the record for the goal relationship.
400
401
403
404
500
GET /goal_relationships/{goal_relationship_gid}
PUT /goal_relationships/{goal_relationship_gid}

An existing goal relationship can be updated by making a PUT request on the URL for that goal relationship. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. Returns the complete updated goal relationship record.

operationId: GoalRelationships_updateGoalRelationshipRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalRelationshipsUpdateGoalRelationshipRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the goal relationship."
}

Responses

200 Successfully updated the goal relationship.
400
401
403
404
500
PUT /goal_relationships/{goal_relationship_gid}
POST /goals/{goal_gid}/addSupportingRelationship

Creates a goal relationship by adding a supporting resource to a given goal. Returns the newly created goal relationship record.

operationId: GoalRelationships_createSupportingRelationship

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalRelationshipsCreateSupportingRelationshipRequest"
      }
    }
  },
  "required": true,
  "description": "The supporting resource to be added to the goal"
}

Responses

200 Successfully created the goal relationship.
400
401
403
404
500
POST /goals/{goal_gid}/addSupportingRelationship
POST /goals/{goal_gid}/removeSupportingRelationship

Removes a goal relationship for a given parent goal.

operationId: GoalRelationships_removeSupportingRelationship

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalRelationshipsRemoveSupportingRelationshipRequest"
      }
    }
  },
  "required": true,
  "description": "The supporting resource to be removed from the goal"
}

Responses

200 Successfully removed the goal relationship.
400
401
403
404
500
POST /goals/{goal_gid}/removeSupportingRelationship

Goals 10 endpoints

GET /goals

Returns compact goal records.

operationId: Goals_getCompactRecords

Parameters

Name In Required Type Description
portfolio query optional string Globally unique identifier for supporting portfolio.
project query optional string Globally unique identifier for supporting project.
task query optional string Globally unique identifier for supporting task.
is_workspace_level query optional boolean Filter to goals with is_workspace_level set to query value. Must be used with the workspace parameter.
team query optional string Globally unique identifier for the team.
workspace query optional string Globally unique identifier for the workspace.
time_periods query optional array Globally unique identifiers for the time periods.
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested goals.
400
401
402
403
404
500
GET /goals
POST /goals

Creates a new goal in a workspace or team. Returns the full record of the newly created goal.

operationId: Goals_createNewGoalRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalsCreateNewGoalRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The goal to create."
}

Responses

201 Successfully created a new goal.
400
401
402
403
404
500
POST /goals
DELETE /goals/{goal_gid}

A specific, existing goal can be deleted by making a DELETE request on the URL for that goal. Returns an empty data record.

operationId: Goals_deleteRecord

Responses

200 Successfully deleted the specified goal.
400
401
402
403
404
500
DELETE /goals/{goal_gid}
GET /goals/{goal_gid}

Returns the complete goal record for a single goal.

operationId: Goals_getGoalRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the record for a single goal.
400
401
402
403
404
500
GET /goals/{goal_gid}
PUT /goals/{goal_gid}

An existing goal can be updated by making a PUT request on the URL for that goal. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. Returns the complete updated goal record.

operationId: Goals_updateGoalRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalsUpdateGoalRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the goal."
}

Responses

200 Successfully updated the goal.
400
401
403
404
500
PUT /goals/{goal_gid}
POST /goals/{goal_gid}/addFollowers

Adds followers to a goal. Returns the goal the followers were added to. Each goal can be associated with zero or more followers in the system. Requests to add/remove followers, if successful, will return the complete updated goal record, described above.

operationId: Goals_addCollaboratorsToGoal

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalsAddCollaboratorsToGoalRequest"
      }
    }
  },
  "required": true,
  "description": "The followers to be added as collaborators"
}

Responses

200 Successfully added users as collaborators.
400
401
402
403
404
500
POST /goals/{goal_gid}/addFollowers
GET /goals/{goal_gid}/parentGoals

Returns a compact representation of all of the parent goals of a goal.

operationId: Goals_getParentGoals

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified goal's parent goals.
400
401
402
403
404
500
GET /goals/{goal_gid}/parentGoals
POST /goals/{goal_gid}/removeFollowers

Removes followers from a goal. Returns the goal the followers were removed from. Each goal can be associated with zero or more followers in the system. Requests to add/remove followers, if successful, will return the complete updated goal record, described above.

operationId: Goals_removeFollowersFromGoal

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalsRemoveFollowersFromGoalRequest"
      }
    }
  },
  "required": true,
  "description": "The followers to be removed as collaborators"
}

Responses

200 Successfully removed users as collaborators.
400
401
402
403
404
500
POST /goals/{goal_gid}/removeFollowers
POST /goals/{goal_gid}/setMetric

Creates and adds a goal metric to a specified goal. Note that this replaces an existing goal metric if one already exists.

operationId: Goals_createMetric

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalsCreateMetricRequest"
      }
    }
  },
  "required": true,
  "description": "The goal metric to create."
}

Responses

200 Successfully created a new goal metric.
400
401
402
403
404
500
POST /goals/{goal_gid}/setMetric
POST /goals/{goal_gid}/setMetricCurrentValue

Updates a goal's existing metric's `current_number_value` if one exists, otherwise responds with a 400 status code. Returns the complete updated goal metric record.

operationId: Goals_updateMetricCurrentValue

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/GoalsUpdateMetricCurrentValueRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the goal metric."
}

Responses

200 Successfully updated the goal metric.
400
401
402
403
404
500
POST /goals/{goal_gid}/setMetricCurrentValue

Jobs 1 endpoints

GET /jobs/{job_gid}

Returns the full record for a job.

operationId: Jobs_getById

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved Job.
400
401
403
404
500
GET /jobs/{job_gid}

Memberships 5 endpoints

GET /memberships

Returns compact `goal_membership` or `project_membership` records. The possible types for `parent` in this request are `goal` or `project`. An additional member (user GID or team GID) can be passed in to filter to a specific membership.

operationId: Memberships_getMultiple

Parameters

Name In Required Type Description
parent query optional string Globally unique identifier for `goal` or `project`.
member query optional string Globally unique identifier for `team` or `user`.
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested membership.
400
401
403
404
500
GET /memberships
POST /memberships

Creates a new membership in a `goal` or `project`. `Teams` or `users` can be a member of `goals` or `projects`. Returns the full record of the newly created membership.

operationId: Memberships_createNewRecord

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/MembershipsCreateNewRecordRequest"
      }
    }
  },
  "required": false,
  "description": "The updated fields for the membership."
}

Responses

201 Successfully created the requested membership.
400
401
403
404
500
POST /memberships
DELETE /memberships/{membership_gid}

A specific, existing membership for a `goal` or `project` can be deleted by making a `DELETE` request on the URL for that membership. Returns an empty data record.

operationId: Memberships_deleteRecord

Responses

200 Successfully deleted the requested membership.
400
401
403
404
500
DELETE /memberships/{membership_gid}
GET /memberships/{membership_gid}

Returns compact `project_membership` record for a single membership. `GET` only supports project memberships currently

operationId: Memberships_getMembershipRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the record for a single membership.
400
401
403
404
500
GET /memberships/{membership_gid}
PUT /memberships/{membership_gid}

An existing membership can be updated by making a `PUT` request on the URL for that goal. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. Memberships on `goals` and `projects` can be updated. Returns the full record of the updated membership.

operationId: Memberships_updateMembershipRecord

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/MembershipsUpdateMembershipRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The membership to update."
}

Responses

200 Successfully updated the requested membership.
400
401
403
404
500
PUT /memberships/{membership_gid}

Organization exports 2 endpoints

POST /organization_exports

This method creates a request to export an Organization. Asana will complete the export at some point after you create the request.

operationId: OrganizationExports_createExportRequest

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/OrganizationExportsCreateExportRequestRequest"
      }
    }
  },
  "required": true,
  "description": "The organization to export."
}

Responses

201 Successfully created organization export request.
400
401
403
404
500
POST /organization_exports
GET /organization_exports/{organization_export_gid}

Returns details of a previously-requested Organization export.

operationId: OrganizationExports_getExportDetails

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved organization export object.
400
401
403
404
500
GET /organization_exports/{organization_export_gid}

Portfolio memberships 3 endpoints

GET /portfolio_memberships

Returns a list of portfolio memberships in compact representation. You must specify `portfolio`, `portfolio` and `user`, or `workspace` and `user`.

operationId: PortfolioMemberships_listMultipleMemberships

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved portfolio memberships.
400
401
403
404
500
GET /portfolio_memberships
GET /portfolio_memberships/{portfolio_membership_gid}

Returns the complete portfolio record for a single portfolio membership.

operationId: PortfolioMemberships_getCompleteRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested portfolio membership.
400
401
403
404
500
GET /portfolio_memberships/{portfolio_membership_gid}
GET /portfolios/{portfolio_gid}/portfolio_memberships

Returns the compact portfolio membership records for the portfolio.

operationId: PortfolioMemberships_getCompact

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested portfolio's memberships.
400
401
403
404
500
GET /portfolios/{portfolio_gid}/portfolio_memberships

Portfolios 12 endpoints

GET /portfolios

Returns a list of the portfolios in compact representation that are owned by the current API user.

operationId: Portfolios_listMultiplePortfolios

Parameters

Name In Required Type Description
optional
optional
workspace query required string The workspace or organization to filter portfolios on.
owner query optional string The user who owns the portfolio. Currently, API users can only get a list of portfolios that they themselves own, unless the request is made from a Service Account. In the case of a Service Account, if this parameter is specified, then all portfolios owned by this parameter are returned. Otherwise, all portfolios across the workspace are returned.
opt_fields query optional array 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.

Responses

200 Successfully retrieved portfolios.
400
401
403
404
500
GET /portfolios
POST /portfolios

Creates a new portfolio in the given workspace with the supplied name. Note that portfolios created in the Asana UI may have some state (like the “Priority” custom field) which is automatically added to the portfolio when it is created. Portfolios created via our API will *not* be created with the same initial state to allow integrations to create their own starting state on a portfolio.

operationId: Portfolios_createNewPortfolioRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosCreateNewPortfolioRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The portfolio to create."
}

Responses

201 Successfully created portfolio.
400
401
403
404
500
POST /portfolios
DELETE /portfolios/{portfolio_gid}

An existing portfolio can be deleted by making a DELETE request on the URL for that portfolio. Returns an empty data record.

operationId: Portfolios_deleteRecord

Responses

200 Successfully deleted the specified portfolio.
400
401
403
404
500
DELETE /portfolios/{portfolio_gid}
GET /portfolios/{portfolio_gid}

Returns the complete portfolio record for a single portfolio.

operationId: Portfolios_getRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested portfolio.
400
401
403
404
500
GET /portfolios/{portfolio_gid}
PUT /portfolios/{portfolio_gid}

An existing portfolio can be updated by making a PUT request on the URL for that portfolio. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. Returns the complete updated portfolio record.

operationId: Portfolios_updatePortfolioRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosUpdatePortfolioRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the portfolio."
}

Responses

200 Successfully updated the portfolio.
400
401
403
404
500
PUT /portfolios/{portfolio_gid}
POST /portfolios/{portfolio_gid}/addCustomFieldSetting

Custom fields are associated with portfolios by way of custom field settings. This method creates a setting for the portfolio.

operationId: Portfolios_addCustomFieldSetting

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosAddCustomFieldSettingRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the custom field setting."
}

Responses

200 Successfully added the custom field to the portfolio.
400
401
403
404
500
POST /portfolios/{portfolio_gid}/addCustomFieldSetting
POST /portfolios/{portfolio_gid}/addItem

Add an item to a portfolio. Returns an empty data block.

operationId: Portfolios_addPortfolioItem

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosAddPortfolioItemRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the item being inserted."
}

Responses

200 Successfully added the item to the portfolio.
400
401
403
404
500
POST /portfolios/{portfolio_gid}/addItem
POST /portfolios/{portfolio_gid}/addMembers

Adds the specified list of users as members of the portfolio. Returns the updated portfolio record.

operationId: Portfolios_addMembersToPortfolio

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosAddMembersToPortfolioRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the members being added."
}

Responses

200 Successfully added members to the portfolio.
400
401
403
404
500
POST /portfolios/{portfolio_gid}/addMembers
GET /portfolios/{portfolio_gid}/items

Get a list of the items in compact form in a portfolio.

operationId: Portfolios_getItems

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested portfolio's items.
400
401
403
404
500
GET /portfolios/{portfolio_gid}/items
POST /portfolios/{portfolio_gid}/removeCustomFieldSetting

Removes a custom field setting from a portfolio.

operationId: Portfolios_removeCustomFieldSetting

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosRemoveCustomFieldSettingRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the custom field setting being removed."
}

Responses

200 Successfully removed the custom field from the portfolio.
400
401
403
404
500
POST /portfolios/{portfolio_gid}/removeCustomFieldSetting
POST /portfolios/{portfolio_gid}/removeItem

Remove an item from a portfolio. Returns an empty data block.

operationId: Portfolios_removeItemFromPortfolio

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosRemoveItemFromPortfolioRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the item being removed."
}

Responses

200 Successfully removed the item from the portfolio.
400
401
403
404
500
POST /portfolios/{portfolio_gid}/removeItem
POST /portfolios/{portfolio_gid}/removeMembers

Removes the specified list of users from members of the portfolio. Returns the updated portfolio record.

operationId: Portfolios_removeMembersFromPortfolio

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/PortfoliosRemoveMembersFromPortfolioRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the members being removed."
}

Responses

200 Successfully removed the members from the portfolio.
400
401
403
404
500
POST /portfolios/{portfolio_gid}/removeMembers

Project briefs 4 endpoints

DELETE /project_briefs/{project_brief_gid}

Deletes a specific, existing project brief. Returns an empty data record.

operationId: ProjectBriefs_removeBrief

Responses

200 Successfully deleted the specified project brief.
400
401
403
404
500
DELETE /project_briefs/{project_brief_gid}
GET /project_briefs/{project_brief_gid}

Get the full record for a project brief.

operationId: ProjectBriefs_getFullRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

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

An existing project brief can be updated by making a PUT request on the URL for that project brief. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. Returns the complete updated project brief record.

operationId: ProjectBriefs_updateBriefRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectBriefsUpdateBriefRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the project brief."
}

Responses

200 Successfully updated the project brief.
400
401
403
404
500
PUT /project_briefs/{project_brief_gid}
POST /projects/{project_gid}/project_briefs

Creates a new project brief. Returns the full record of the newly created project brief.

operationId: ProjectBriefs_createNewRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectBriefsCreateNewRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The project brief to create."
}

Responses

201 Successfully created a new project brief.
400
401
402
403
404
500
POST /projects/{project_gid}/project_briefs

Project memberships 2 endpoints

GET /project_memberships/{project_membership_gid}

Returns the complete project record for a single project membership.

operationId: ProjectMemberships_getRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested project membership.
400
401
403
404
500
GET /project_memberships/{project_membership_gid}
GET /projects/{project_gid}/project_memberships

Returns the compact project membership records for the project.

operationId: ProjectMemberships_getCompactRecords

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested project's memberships.
400
401
403
404
500
GET /projects/{project_gid}/project_memberships

Project statuses 4 endpoints

DELETE /project_statuses/{project_status_gid}

*Deprecated: new integrations should prefer the `/status_updates/{status_gid}` route.* Deletes a specific, existing project status update. Returns an empty data record.

operationId: ProjectStatuses_deleteSpecificStatusUpdate

Responses

200 Successfully deleted the specified project status.
400
401
403
404
500
DELETE /project_statuses/{project_status_gid}
GET /project_statuses/{project_status_gid}

*Deprecated: new integrations should prefer the `/status_updates/{status_gid}` route.* Returns the complete record for a single status update.

operationId: ProjectStatuses_getStatusUpdateRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified project's status updates.
400
401
403
404
500
GET /project_statuses/{project_status_gid}
GET /projects/{project_gid}/project_statuses

*Deprecated: new integrations should prefer the `/status_updates` route.* Returns the compact project status update records for all updates on the project.

operationId: ProjectStatuses_getProjectUpdates

Parameters

Name In Required Type Description
optional
optional
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified project's status updates.
400
401
403
404
500
GET /projects/{project_gid}/project_statuses
POST /projects/{project_gid}/project_statuses

*Deprecated: new integrations should prefer the `/status_updates` route.* Creates a new status update on the project. Returns the full record of the newly created project status update.

operationId: ProjectStatuses_createNewStatusUpdateRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectStatusesCreateNewStatusUpdateRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The project status to create."
}

Responses

201 Successfully created a new story.
400
401
403
404
500
POST /projects/{project_gid}/project_statuses

Project templates 5 endpoints

GET /project_templates

Returns the compact project template records for all project templates in the given team or workspace.

operationId: ProjectTemplates_listMultiple

Parameters

Name In Required Type Description
optional
optional
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested team's or workspace's project templates.
400
401
403
404
500
GET /project_templates
DELETE /project_templates/{project_template_gid}

A specific, existing project template can be deleted by making a DELETE request on the URL for that project template. Returns an empty data record.

operationId: ProjectTemplates_deleteTemplateRecord

Responses

200 Successfully deleted the specified project template.
400
401
402
403
404
500
DELETE /project_templates/{project_template_gid}
GET /project_templates/{project_template_gid}

Returns the complete project template record for a single project template.

operationId: ProjectTemplates_getRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested project template.
400
401
403
404
500
GET /project_templates/{project_template_gid}
POST /project_templates/{project_template_gid}/instantiateProject

Creates and returns a job that will asynchronously handle the project instantiation. To form this request, it is recommended to first make a request to [get a project template](https://raw.githubusercontent.com). Then, from the response, copy the `gid` from the object in the `requested_dates` array. This `gid` should be used in `requested_dates` to instantiate a project. _Note: The body of this request will differ if your workspace is an organization. To determine if your workspace is an organization, use the [is_organization](https://raw.githubusercontent.com) parameter._

operationId: ProjectTemplates_instantiateProjectJob

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectTemplatesInstantiateProjectJobRequest"
      }
    }
  },
  "description": "Describes the inputs used for instantiating a project, such as the resulting project's name, which team it should be created in, and values for date variables."
}

Responses

201 Successfully created the job to handle project instantiation.
400
401
403
404
500
POST /project_templates/{project_template_gid}/instantiateProject
GET /teams/{team_gid}/project_templates

Returns the compact project template records for all project templates in the team.

operationId: ProjectTemplates_getAllTemplateRecords

Parameters

Name In Required Type Description
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested team's project templates.
400
401
403
404
500
GET /teams/{team_gid}/project_templates

Projects 19 endpoints

GET /projects

Returns the compact project records for some filtered set of projects. Use one or more of the parameters provided to filter the projects returned. *Note: This endpoint may timeout for large domains. Try filtering by team!*

operationId: Projects_listMultiple

Parameters

Name In Required Type Description
optional
optional
workspace query optional string The workspace or organization to filter projects on.
team query optional string The team to filter projects on.
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved projects.
400
401
403
404
500
GET /projects
POST /projects

Create a new project in a workspace or team. Every project is required to be created in a specific workspace or organization, and this cannot be changed once set. Note that you can use the `workspace` parameter regardless of whether or not it is an organization. If the workspace for your project is an organization, you must also supply a `team` to share the project with. Returns the full record of the newly created project.

operationId: Projects_createNewProjectRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsCreateNewProjectRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The project to create."
}

Responses

201 Successfully retrieved projects.
400
401
403
404
500
POST /projects
DELETE /projects/{project_gid}

A specific, existing project can be deleted by making a DELETE request on the URL for that project. Returns an empty data record.

operationId: Projects_deleteProjectById

Responses

200 Successfully deleted the specified project.
400
401
403
404
500
DELETE /projects/{project_gid}
GET /projects/{project_gid}

Returns the complete project record for a single project.

operationId: Projects_getProjectRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested project.
400
401
403
404
500
GET /projects/{project_gid}
PUT /projects/{project_gid}

A specific, existing project can be updated by making a PUT request on the URL for that project. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. When using this method, it is best to specify only those fields you wish to change, or else you may overwrite changes made by another user since you last retrieved the task. Returns the complete updated project record.

operationId: Projects_updateProjectRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsUpdateProjectRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the project."
}

Responses

200 Successfully updated the project.
400
401
403
404
500
PUT /projects/{project_gid}
POST /projects/{project_gid}/addCustomFieldSetting

Custom fields are associated with projects by way of custom field settings. This method creates a setting for the project.

operationId: Projects_addCustomFieldSetting

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsAddCustomFieldSettingRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the custom field setting."
}

Responses

200 Successfully added the custom field to the project.
400
401
403
404
500
POST /projects/{project_gid}/addCustomFieldSetting
POST /projects/{project_gid}/addFollowers

Adds the specified list of users as followers to the project. Followers are a subset of members who have opted in to receive "tasks added" notifications for a project. Therefore, if the users are not already members of the project, they will also become members as a result of this operation. Returns the updated project record.

operationId: Projects_addFollowersToProject

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsAddFollowersToProjectRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the followers being added."
}

Responses

200 Successfully added followers to the project.
400
401
403
404
500
POST /projects/{project_gid}/addFollowers
POST /projects/{project_gid}/addMembers

Adds the specified list of users as members of the project. Note that a user being added as a member may also be added as a *follower* as a result of this operation. This is because the user's default notification settings (i.e., in the "Notifcations" tab of "My Profile Settings") will override this endpoint's default behavior of setting "Tasks added" notifications to `false`. Returns the updated project record.

operationId: Projects_addMembersToProject

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsAddMembersToProjectRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the members being added."
}

Responses

200 Successfully added members to the project.
400
401
403
404
500
POST /projects/{project_gid}/addMembers
POST /projects/{project_gid}/duplicate

Creates and returns a job that will asynchronously handle the duplication.

operationId: Projects_duplicateProjectJob

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsDuplicateProjectJobRequest"
      }
    }
  },
  "description": "Describes the duplicate's name and the elements that will be duplicated."
}

Responses

201 Successfully created the job to handle duplication.
400
401
403
404
500
POST /projects/{project_gid}/duplicate
POST /projects/{project_gid}/removeCustomFieldSetting

Removes a custom field setting from a project.

operationId: Projects_removeCustomField

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsRemoveCustomFieldRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the custom field setting being removed."
}

Responses

200 Successfully removed the custom field from the project.
400
401
403
404
500
POST /projects/{project_gid}/removeCustomFieldSetting
POST /projects/{project_gid}/removeFollowers

Removes the specified list of users from following the project, this will not affect project membership status. Returns the updated project record.

operationId: Projects_removeProjectFollowers

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsRemoveProjectFollowersRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the followers being removed."
}

Responses

200 Successfully removed followers from the project.
400
401
403
404
500
POST /projects/{project_gid}/removeFollowers
POST /projects/{project_gid}/removeMembers

Removes the specified list of users from members of the project. Returns the updated project record.

operationId: Projects_removeMembersFromProject

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsRemoveMembersFromProjectRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the members being removed."
}

Responses

200 Successfully removed the members from the project.
400
401
403
404
500
POST /projects/{project_gid}/removeMembers
POST /projects/{project_gid}/saveAsTemplate

Creates and returns a job that will asynchronously handle the project template creation. Note that while the resulting project template can be accessed with the API, it won't be visible in the Asana UI until Project Templates 2.0 is launched in the app. See more in [this forum post](https://forum.asana.com/t/a-new-api-for-project-templates/156432).

operationId: Projects_createProjectTemplateJob

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsCreateProjectTemplateJobRequest"
      }
    }
  },
  "required": true,
  "description": "Describes the inputs used for creating a project template, such as the resulting project template's name, which team it should be created in."
}

Responses

201 Successfully created the job to handle project template creation.
400
401
403
404
500
POST /projects/{project_gid}/saveAsTemplate
GET /projects/{project_gid}/task_counts

Get an object that holds task count fields. **All fields are excluded by default**. You must [opt in](https://raw.githubusercontent.com) using `opt_fields` to get any information from this endpoint. This endpoint has an additional [rate limit](https://raw.githubusercontent.com) and each field counts especially high against our [cost limits](/docs/rate-limits#cost-limits). Milestones are just tasks, so they are included in the `num_tasks`, `num_incomplete_tasks`, and `num_completed_tasks` counts.

operationId: Projects_getTaskCounts

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested project's task counts.
400
401
403
404
500
GET /projects/{project_gid}/task_counts
GET /tasks/{task_gid}/projects

Returns a compact representation of all of the projects the task is in.

operationId: Projects_taskProjectsList

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the projects for the given task.
400
401
403
404
500
GET /tasks/{task_gid}/projects
GET /teams/{team_gid}/projects

Returns the compact project records for all projects in the team.

operationId: Projects_getTeamProjects

Parameters

Name In Required Type Description
optional
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested team's projects.
400
401
403
404
500
GET /teams/{team_gid}/projects
POST /teams/{team_gid}/projects

Creates a project shared with the given team. Returns the full record of the newly created project.

operationId: Projects_createProjectForTeam

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsCreateProjectForTeamRequest"
      }
    }
  },
  "required": true,
  "description": "The new project to create."
}

Responses

201 Successfully created the specified project.
400
401
403
404
500
POST /teams/{team_gid}/projects
GET /workspaces/{workspace_gid}/projects

Returns the compact project records for all projects in the workspace. *Note: This endpoint may timeout for large domains. Prefer the `/teams/{team_gid}/projects` endpoint.*

operationId: Projects_getAllInWorkspace

Parameters

Name In Required Type Description
optional
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested workspace's projects.
400
401
403
404
500
GET /workspaces/{workspace_gid}/projects
POST /workspaces/{workspace_gid}/projects

Creates a project in the workspace. If the workspace for your project is an organization, you must also supply a team to share the project with. Returns the full record of the newly created project.

operationId: Projects_createInWorkspace

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/ProjectsCreateInWorkspaceRequest"
      }
    }
  },
  "required": true,
  "description": "The new project to create."
}

Responses

201 Successfully created a new project in the specified workspace.
400
401
403
404
500
POST /workspaces/{workspace_gid}/projects

Rules 1 endpoints

POST /rule_triggers/{rule_trigger_gid}/run

Trigger a rule which uses an ["incoming web request"](https://raw.githubusercontent.com) trigger.

operationId: Rules_triggerRuleRequest

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/RulesTriggerRuleRequestRequest"
      }
    }
  },
  "required": true,
  "description": "A dictionary of variables accessible from within the rule."
}

Responses

200 Successfully triggered a rule.
400
401
402
403
404
500
POST /rule_triggers/{rule_trigger_gid}/run

Sections 7 endpoints

GET /projects/{project_gid}/sections

Returns the compact records for all sections in the specified project.

operationId: Sections_listProjectSections

Parameters

Name In Required Type Description
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved sections in project.
400
401
403
404
500
GET /projects/{project_gid}/sections
POST /projects/{project_gid}/sections

Creates a new section in a project. Returns the full record of the newly created section.

operationId: Sections_createNewSection

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/SectionsCreateNewSectionRequest"
      }
    }
  },
  "description": "The section to create."
}

Responses

201 Successfully created the specified section.
400
401
403
404
500
POST /projects/{project_gid}/sections
POST /projects/{project_gid}/sections/insert

Move sections relative to each other. One of `before_section` or `after_section` is required. Sections cannot be moved between projects. Returns an empty data block.

operationId: Sections_moveOrInsert

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/SectionsMoveOrInsertRequest"
      }
    }
  },
  "description": "The section's move action."
}

Responses

200 Successfully moved the specified section.
400
401
403
404
500
POST /projects/{project_gid}/sections/insert
DELETE /sections/{section_gid}

A specific, existing section can be deleted by making a DELETE request on the URL for that section. Note that sections must be empty to be deleted. The last remaining section cannot be deleted. Returns an empty data block.

operationId: Sections_deleteSection

Responses

200 Successfully deleted the specified section.
400
401
403
404
500
DELETE /sections/{section_gid}
GET /sections/{section_gid}

Returns the complete record for a single section.

operationId: Sections_getRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved section.
400
401
403
404
500
GET /sections/{section_gid}
PUT /sections/{section_gid}

A specific, existing section can be updated by making a PUT request on the URL for that project. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. (note that at this time, the only field that can be updated is the `name` field.) When using this method, it is best to specify only those fields you wish to change, or else you may overwrite changes made by another user since you last retrieved the task. Returns the complete updated section record.

operationId: Sections_updateSectionRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/SectionsUpdateSectionRecordRequest"
      }
    }
  },
  "description": "The section to create."
}

Responses

200 Successfully updated the specified section.
400
401
403
404
500
PUT /sections/{section_gid}
POST /sections/{section_gid}/addTask

Add a task to a specific, existing section. This will remove the task from other sections of the project. The task will be inserted at the top of a section unless an insert_before or insert_after parameter is declared. This does not work for separators (tasks with the resource_subtype of section).

operationId: Sections_addTaskToSection

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/SectionsAddTaskToSectionRequest"
      }
    }
  },
  "description": "The task and optionally the insert location."
}

Responses

200 Successfully added the task.
400
401
403
404
500
POST /sections/{section_gid}/addTask

Status updates 4 endpoints

GET /status_updates

Returns the compact status update records for all updates on the object.

operationId: StatusUpdates_getCompactRecords

Parameters

Name In Required Type Description
parent query required string Globally unique identifier for object to fetch statuses from. Must be a GID for a project, portfolio, or goal.
created_since query optional string Only return statuses that have been created since the given time.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified object's status updates.
400
401
403
404
500
GET /status_updates
POST /status_updates

Creates a new status update on an object. Returns the full record of the newly created status update.

operationId: StatusUpdates_createNewStatusUpdateRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/StatusUpdatesCreateNewStatusUpdateRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The status update to create."
}

Responses

201 Successfully created a new status update.
400
401
403
404
500
POST /status_updates
DELETE /status_updates/{status_update_gid}

Deletes a specific, existing status update. Returns an empty data record.

operationId: StatusUpdates_deleteSpecificStatusUpdate

Responses

200 Successfully deleted the specified status.
400
401
403
404
500
DELETE /status_updates/{status_update_gid}
GET /status_updates/{status_update_gid}

Returns the complete record for a single status update.

operationId: StatusUpdates_getRecordById

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified object's status updates.
400
401
403
404
500
GET /status_updates/{status_update_gid}

Stories 5 endpoints

DELETE /stories/{story_gid}

Deletes a story. A user can only delete stories they have created. Returns an empty data record.

operationId: Stories_deleteStoryRecord

Responses

200 Successfully deleted the specified story.
400
401
403
404
500
DELETE /stories/{story_gid}
GET /stories/{story_gid}

Returns the full record for a single story.

operationId: Stories_getFullRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified story.
400
401
403
404
500
GET /stories/{story_gid}
PUT /stories/{story_gid}

Updates the story and returns the full record for the updated story. Only comment stories can have their text updated, and only comment stories and attachment stories can be pinned. Only one of `text` and `html_text` can be specified.

operationId: Stories_updateFullRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/StoriesUpdateFullRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The comment story to update."
}

Responses

200 Successfully retrieved the specified story.
400
401
403
404
500
PUT /stories/{story_gid}
GET /tasks/{task_gid}/stories

Returns the compact records for all stories on the task.

operationId: Stories_getTaskStories

Parameters

Name In Required Type Description
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified task's stories.
400
401
403
404
500
GET /tasks/{task_gid}/stories
POST /tasks/{task_gid}/stories

Adds a story to a task. This endpoint currently only allows for comment stories to be created. The comment will be authored by the currently authenticated user, and timestamped when the server receives the request. Returns the full record for the new story added to the task.

operationId: Stories_createComment

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/StoriesCreateCommentRequest"
      }
    }
  },
  "required": true,
  "description": "The story to create."
}

Responses

201 Successfully created a new story.
400
401
403
404
500
POST /tasks/{task_gid}/stories

Tags 8 endpoints

GET /tags

Returns the compact tag records for some filtered set of tags. Use one or more of the parameters provided to filter the tags returned.

operationId: Tags_listFilteredTags

Parameters

Name In Required Type Description
optional
optional
workspace query optional string The workspace to filter tags on.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified set of tags.
400
401
403
404
500
GET /tags
POST /tags

Creates a new tag in a workspace or organization. Every tag is required to be created in a specific workspace or organization, and this cannot be changed once set. Note that you can use the workspace parameter regardless of whether or not it is an organization. Returns the full record of the newly created tag.

operationId: Tags_createNewTagRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TagsCreateNewTagRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The tag to create."
}

Responses

201 Successfully created the newly specified tag.
400
401
403
404
500
POST /tags
DELETE /tags/{tag_gid}

A specific, existing tag can be deleted by making a DELETE request on the URL for that tag. Returns an empty data record.

operationId: Tags_removeTag

Responses

200 Successfully deleted the specified tag.
400
401
403
404
500
DELETE /tags/{tag_gid}
GET /tags/{tag_gid}

Returns the complete tag record for a single tag.

operationId: Tags_getRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified tag.
400
401
403
404
500
GET /tags/{tag_gid}
PUT /tags/{tag_gid}

Updates the properties of a tag. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. When using this method, it is best to specify only those fields you wish to change, or else you may overwrite changes made by another user since you last retrieved the tag. Returns the complete updated tag record.

operationId: Tags_updateTagRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully updated the specified tag.
400
401
403
404
500
PUT /tags/{tag_gid}
GET /tasks/{task_gid}/tags

Get a compact representation of all of the tags the task has.

operationId: Tags_getTaskTags

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the tags for the given task.
400
401
403
404
500
GET /tasks/{task_gid}/tags
GET /workspaces/{workspace_gid}/tags

Returns the compact tag records for some filtered set of tags. Use one or more of the parameters provided to filter the tags returned.

operationId: Tags_getFilteredTags

Parameters

Name In Required Type Description
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified set of tags.
400
401
403
404
500
GET /workspaces/{workspace_gid}/tags
POST /workspaces/{workspace_gid}/tags

Creates a new tag in a workspace or organization. Every tag is required to be created in a specific workspace or organization, and this cannot be changed once set. Note that you can use the workspace parameter regardless of whether or not it is an organization. Returns the full record of the newly created tag.

operationId: Tags_createTagInWorkspace

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TagsCreateTagInWorkspaceRequest"
      }
    }
  },
  "required": true,
  "description": "The tag to create."
}

Responses

201 Successfully created the newly specified tag.
400
401
403
404
500
POST /workspaces/{workspace_gid}/tags

Task templates 4 endpoints

GET /task_templates

Returns the compact task template records for some filtered set of task templates. You must specify a `project`

operationId: TaskTemplates_listMultiple

Parameters

Name In Required Type Description
optional
optional
project query optional string The project to filter task templates on.
opt_fields query optional array 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.

Responses

200 Successfully retrieved requested task templates
400
401
403
404
500
GET /task_templates
DELETE /task_templates/{task_template_gid}

A specific, existing task template can be deleted by making a DELETE request on the URL for that task template. Returns an empty data record.

operationId: TaskTemplates_deleteTaskTemplate

Responses

200 Successfully deleted the specified task template.
400
401
402
403
404
500
DELETE /task_templates/{task_template_gid}
GET /task_templates/{task_template_gid}

Returns the complete task template record for a single task template.

operationId: TaskTemplates_getSingleTemplate

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved requested task template
400
401
403
404
500
GET /task_templates/{task_template_gid}
POST /task_templates/{task_template_gid}/instantiateTask

Creates and returns a job that will asynchronously handle the task instantiation.

operationId: TaskTemplates_instantiateTaskJob

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TaskTemplatesInstantiateTaskJobRequest"
      }
    }
  },
  "description": "Describes the inputs used for instantiating a task - the task's name."
}

Responses

201 Successfully created the job to handle task instantiation.
400
401
403
404
500
POST /task_templates/{task_template_gid}/instantiateTask

Tasks 27 endpoints

GET /projects/{project_gid}/tasks

Returns the compact task records for all tasks within the given project, ordered by their priority within the project. Tasks can exist in more than one project at a time.

operationId: Tasks_getTasksByProject

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested project's tasks.
400
401
403
404
500
GET /projects/{project_gid}/tasks
GET /sections/{section_gid}/tasks

*Board view only*: Returns the compact section records for all tasks within the given section.

operationId: Tasks_getSectionTasks

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the section's tasks.
400
401
403
404
500
GET /sections/{section_gid}/tasks
GET /tags/{tag_gid}/tasks

Returns the compact task records for all tasks with the given tag. Tasks can have more than one tag at a time.

operationId: Tasks_getMultipleWithTag

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the tasks associated with the specified tag.
400
401
403
404
500
GET /tags/{tag_gid}/tasks
GET /tasks

Returns the compact task records for some filtered set of tasks. Use one or more of the parameters provided to filter the tasks returned. You must specify a `project` or `tag` if you do not specify `assignee` and `workspace`. For more complex task retrieval, use [workspaces/{workspace_gid}/tasks/search](https://raw.githubusercontent.com).

operationId: Tasks_getMultiple

Parameters

Name In Required Type Description
optional
optional
assignee query optional string The assignee to filter tasks on. If searching for unassigned tasks, assignee.any = null can be specified. *Note: If you specify `assignee`, you must also specify the `workspace` to filter on.*
project query optional string The project to filter tasks on.
section query optional string The section to filter tasks on.
workspace query optional string The workspace to filter tasks on. *Note: If you specify `workspace`, you must also specify the `assignee` to filter on.*
completed_since query optional string Only return tasks that are either incomplete or that have been completed since this time.
modified_since query optional string 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 query optional array 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.

Responses

200 Successfully retrieved requested tasks.
400
401
403
404
500
GET /tasks
POST /tasks

Creating a new task is as easy as POSTing to the `/tasks` endpoint with a data block containing the fields you’d like to set on the task. Any unspecified fields will take on default values. Every task is required to be created in a specific workspace, and this workspace cannot be changed once set. The workspace need not be set explicitly if you specify `projects` or a `parent` task instead.

operationId: Tasks_createNewTask

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksCreateNewTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The task to create."
}

Responses

201 Successfully created a new task.
400
401
403
404
500
POST /tasks
DELETE /tasks/{task_gid}

A specific, existing task can be deleted by making a DELETE request on the URL for that task. Deleted tasks go into the “trash” of the user making the delete request. Tasks can be recovered from the trash within a period of 30 days; afterward they are completely removed from the system. Returns an empty data record.

operationId: Tasks_deleteTask

Responses

200 Successfully deleted the specified task.
400
401
403
404
500
DELETE /tasks/{task_gid}
GET /tasks/{task_gid}

Returns the complete task record for a single task.

operationId: Tasks_getTaskRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified task.
400
401
403
404
500
GET /tasks/{task_gid}
PUT /tasks/{task_gid}

A specific, existing task can be updated by making a PUT request on the URL for that task. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. When using this method, it is best to specify only those fields you wish to change, or else you may overwrite changes made by another user since you last retrieved the task. Returns the complete updated task record.

operationId: Tasks_updateTaskRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksUpdateTaskRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The task to update."
}

Responses

200 Successfully updated the specified task.
400
401
403
404
500
PUT /tasks/{task_gid}
POST /tasks/{task_gid}/addDependencies

Marks a set of tasks as dependencies of this task, if they are not already dependencies. *A task can have at most 30 dependents and dependencies combined*.

operationId: Tasks_setDependenciesForTask

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksSetDependenciesForTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The list of tasks to set as dependencies."
}

Responses

200 Successfully set the specified dependencies on the task.
400
401
402
403
404
500
POST /tasks/{task_gid}/addDependencies
POST /tasks/{task_gid}/addDependents

Marks a set of tasks as dependents of this task, if they are not already dependents. *A task can have at most 30 dependents and dependencies combined*.

operationId: Tasks_setTaskDependents

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksSetTaskDependentsRequest"
      }
    }
  },
  "required": true,
  "description": "The list of tasks to add as dependents."
}

Responses

200 Successfully set the specified dependents on the given task.
400
401
402
403
404
500
POST /tasks/{task_gid}/addDependents
POST /tasks/{task_gid}/addFollowers

Adds followers to a task. Returns an empty data block. Each task can be associated with zero or more followers in the system. Requests to add/remove followers, if successful, will return the complete updated task record, described above.

operationId: Tasks_addFollowersToTask

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksAddFollowersToTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The followers to add to the task."
}

Responses

200 Successfully added the specified followers to the task.
400
401
403
404
500
POST /tasks/{task_gid}/addFollowers
POST /tasks/{task_gid}/addProject

Adds the task to the specified project, in the optional location specified. If no location arguments are given, the task will be added to the end of the project. `addProject` can also be used to reorder a task within a project or section that already contains it. At most one of `insert_before`, `insert_after`, or `section` should be specified. Inserting into a section in an non-order-dependent way can be done by specifying section, otherwise, to insert within a section in a particular place, specify `insert_before` or `insert_after` and a task within the section to anchor the position of this task. A task can have at most 20 projects multi-homed to it. Returns an empty data block.

operationId: Tasks_addProjectToTask

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksAddProjectToTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The project to add the task to."
}

Responses

200 Successfully added the specified project to the task.
400
401
403
404
500
POST /tasks/{task_gid}/addProject
POST /tasks/{task_gid}/addTag

Adds a tag to a task. Returns an empty data block.

operationId: Tasks_addTagToTask

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksAddTagToTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The tag to add to the task."
}

Responses

200 Successfully added the specified tag to the task.
400
401
403
404
500
POST /tasks/{task_gid}/addTag
GET /tasks/{task_gid}/dependencies

Returns the compact representations of all of the dependencies of a task.

operationId: Tasks_getAllDependencies

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified task's dependencies.
400
401
402
403
404
500
GET /tasks/{task_gid}/dependencies
GET /tasks/{task_gid}/dependents

Returns the compact representations of all of the dependents of a task.

operationId: Tasks_getDependents

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified dependents of the task.
400
401
402
403
404
500
GET /tasks/{task_gid}/dependents
POST /tasks/{task_gid}/duplicate

Creates and returns a job that will asynchronously handle the duplication.

operationId: Tasks_duplicateTaskJob

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksDuplicateTaskJobRequest"
      }
    }
  },
  "required": true,
  "description": "Describes the duplicate's name and the fields that will be duplicated."
}

Responses

201 Successfully created the job to handle duplication.
400
401
403
404
500
POST /tasks/{task_gid}/duplicate
POST /tasks/{task_gid}/removeDependencies

Unlinks a set of dependencies from this task.

operationId: Tasks_unlinkDependenciesFromTask

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksUnlinkDependenciesFromTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The list of tasks to unlink as dependencies."
}

Responses

200 Successfully unlinked the dependencies from the specified task.
400
401
402
403
404
500
POST /tasks/{task_gid}/removeDependencies
POST /tasks/{task_gid}/removeDependents

Unlinks a set of dependents from this task.

operationId: Tasks_unlinkDependents

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksUnlinkDependentsRequest"
      }
    }
  },
  "required": true,
  "description": "The list of tasks to remove as dependents."
}

Responses

200 Successfully unlinked the specified tasks as dependents.
400
401
402
403
404
500
POST /tasks/{task_gid}/removeDependents
POST /tasks/{task_gid}/removeFollowers

Removes each of the specified followers from the task if they are following. Returns the complete, updated record for the affected task.

operationId: Tasks_removeFollowersFromTask

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksRemoveFollowersFromTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The followers to remove from the task."
}

Responses

200 Successfully removed the specified followers from the task.
400
401
403
404
500
POST /tasks/{task_gid}/removeFollowers
POST /tasks/{task_gid}/removeProject

Removes the task from the specified project. The task will still exist in the system, but it will not be in the project anymore. Returns an empty data block.

operationId: Tasks_removeProjectFromTask

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksRemoveProjectFromTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The project to remove the task from."
}

Responses

200 Successfully removed the specified project from the task.
400
401
403
404
500
POST /tasks/{task_gid}/removeProject
POST /tasks/{task_gid}/removeTag

Removes a tag from a task. Returns an empty data block.

operationId: Tasks_removeTagFromTask

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksRemoveTagFromTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The tag to remove from the task."
}

Responses

200 Successfully removed the specified tag from the task.
400
401
403
404
500
POST /tasks/{task_gid}/removeTag
POST /tasks/{task_gid}/setParent

parent, or no parent task at all. Returns an empty data block. When using `insert_before` and `insert_after`, at most one of those two options can be specified, and they must already be subtasks of the parent.

operationId: Tasks_setParentTask

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksSetParentTaskRequest"
      }
    }
  },
  "required": true,
  "description": "The new parent of the subtask."
}

Responses

200 Successfully changed the parent of the specified subtask.
400
401
403
404
500
POST /tasks/{task_gid}/setParent
GET /tasks/{task_gid}/subtasks

Returns a compact representation of all of the subtasks of a task.

operationId: Tasks_getSubtaskList

Parameters

Name In Required Type Description
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the specified task's subtasks.
400
401
403
404
500
GET /tasks/{task_gid}/subtasks
POST /tasks/{task_gid}/subtasks

Creates a new subtask and adds it to the parent task. Returns the full record for the newly created subtask.

operationId: Tasks_createSubtaskRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TasksCreateSubtaskRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The new subtask to create."
}

Responses

201 Successfully created the specified subtask.
400
401
403
404
500
POST /tasks/{task_gid}/subtasks
GET /user_task_lists/{user_task_list_gid}/tasks

Returns the compact list of tasks in a user’s My Tasks list. *Note: Access control is enforced for this endpoint as with all Asana API endpoints, meaning a user’s private tasks will be filtered out if the API-authenticated user does not have access to them.* *Note: Both complete and incomplete tasks are returned by default unless they are filtered out (for example, setting `completed_since=now` will return only incomplete tasks, which is the default view for “My Tasks” in Asana.)*

operationId: Tasks_getUserTaskListTasks

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the user task list's tasks.
400
401
403
404
500
GET /user_task_lists/{user_task_list_gid}/tasks
GET /workspaces/{workspace_gid}/tasks/custom_id/{custom_id}

Returns a task given a custom ID shortcode.

operationId: Tasks_getByCustomId

Responses

200 Successfully retrieved task for given custom ID.
400
401
403
404
500
GET /workspaces/{workspace_gid}/tasks/custom_id/{custom_id}
GET /workspaces/{workspace_gid}/tasks/search

To mirror the functionality of the Asana web app's advanced search feature, the Asana API has a task search endpoint that allows you to build complex filters to find and retrieve the exact data you need. #### Premium access Like the Asana web product's advance search feature, this search endpoint will only be available to premium Asana users. A user is premium if any of the following is true: - The workspace in which the search is being performed is a premium workspace - The user is a member of a premium team inside the workspace Even if a user is only a member of a premium team inside a non-premium workspace, search will allow them to find data anywhere in the workspace, not just inside the premium team. Making a search request using credentials of a non-premium user will result in a `402 Payment Required` error. #### Pagination Search results are not stable; repeating the same query multiple times may return the data in a different order, even if the data do not change. Because of this, the traditional [pagination](https://developers.asana.com/docs/#pagination) available elsewhere in the Asana API is not available here. However, you can paginate manually by sorting the search results by their creation time and then modifying each subsequent query to exclude data you have already seen. Page sizes are limited to a maximum of 100 items, and can be specified by the `limit` query parameter. #### Eventual consistency Changes in Asana (regardless of whether they’re made though the web product or the API) are forwarded to our search infrastructure to be indexed. This process can take between 10 and 60 seconds to complete under normal operation, and longer during some production incidents. Making a change to a task that would alter its presence in a particular search query will not be reflected immediately. This is also true of the advanced search feature in the web product. #### Rate limits You may receive a `429 Too Many Requests` response if you hit any of our [rate limits](https://developers.asana.com/docs/#rate-limits). #### Custom field parameters | Parameter name | Custom field type | Accepted type | |---|---|---| | custom_fields.{gid}.is_set | All | Boolean | | custom_fields.{gid}.value | Text | String | | custom_fields.{gid}.value | Number | Number | | custom_fields.{gid}.value | Enum | Enum option ID | | custom_fields.{gid}.starts_with | Text only | String | | custom_fields.{gid}.ends_with | Text only | String | | custom_fields.{gid}.contains | Text only | String | | custom_fields.{gid}.less_than | Number only | Number | | custom_fields.{gid}.greater_than | Number only | Number | For example, if the gid of the custom field is 12345, these query parameter to find tasks where it is set would be `custom_fields.12345.is_set=true`. To match an exact value for an enum custom field, use the gid of the desired enum option and not the name of the enum option: `custom_fields.12345.value=67890`. **Not Supported**: searching for multiple exact matches of a custom field, searching for multi-enum custom field *Note: If you specify `projects.any` and `sections.any`, you will receive tasks for the project **and** tasks for the section. If you're looking for only tasks in a section, omit the `projects.any` from the request.*

operationId: Tasks_searchInWorkspace

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the section's tasks.
400
401
403
404
500
GET /workspaces/{workspace_gid}/tasks/search

Team memberships 4 endpoints

GET /team_memberships

Returns compact team membership records.

operationId: TeamMemberships_getCompactRecords

Parameters

Name In Required Type Description
team query optional string Globally unique identifier for the team.
user query optional string A string identifying a user. This can either be the string "me", an email, or the gid of a user. This parameter must be used with the workspace parameter.
workspace query optional string Globally unique identifier for the workspace. This parameter must be used with the user parameter.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested team memberships.
400
401
403
404
500
GET /team_memberships
GET /team_memberships/{team_membership_gid}

Returns the complete team membership record for a single team membership.

operationId: TeamMemberships_getRecordById

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested team membership.
400
401
403
404
500
GET /team_memberships/{team_membership_gid}
GET /teams/{team_gid}/team_memberships

Returns the compact team memberships for the team.

operationId: TeamMemberships_getCompact

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested team's memberships.
400
401
403
404
500
GET /teams/{team_gid}/team_memberships
GET /users/{user_gid}/team_memberships

Returns the compact team membership records for the user.

operationId: TeamMemberships_getUserCompact

Parameters

Name In Required Type Description
workspace query required string Globally unique identifier for the workspace.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested users's memberships.
400
401
403
404
500
GET /users/{user_gid}/team_memberships

Teams 7 endpoints

POST /teams

Creates a team within the current workspace.

operationId: Teams_createTeamRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TeamsCreateTeamRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The team to create."
}

Responses

201 Successfully created a new team.
400
401
403
404
500
POST /teams
GET /teams/{team_gid}

Returns the full record for a single team.

operationId: Teams_getTeamRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the record for a single team.
400
401
403
404
500
GET /teams/{team_gid}
PUT /teams/{team_gid}

Updates a team within the current workspace.

operationId: Teams_updateTeamRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TeamsUpdateTeamRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The team to update."
}

Responses

200 Successfully updated the team.
400
401
403
404
500
PUT /teams/{team_gid}
POST /teams/{team_gid}/addUser

The user making this call must be a member of the team in order to add others. The user being added must exist in the same organization as the team. Returns the complete team membership record for the newly added user.

operationId: Teams_addUserToTeam

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TeamsAddUserToTeamRequest"
      }
    }
  },
  "required": true,
  "description": "The user to add to the team."
}

Responses

200 Successfully added user to the team.
400
401
403
404
500
POST /teams/{team_gid}/addUser
POST /teams/{team_gid}/removeUser

The user making this call must be a member of the team in order to remove themselves or others.

operationId: Teams_removeUserFromTeam

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TeamsRemoveUserFromTeamRequest"
      }
    }
  },
  "required": true,
  "description": "The user to remove from the team."
}

Responses

204 Returns an empty data record
400
401
403
404
500
POST /teams/{team_gid}/removeUser
GET /users/{user_gid}/teams

Returns the compact records for all teams to which the given user is assigned.

operationId: Teams_getUserTeams

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Returns the team records for all teams in the organization or workspace to which the given user is assigned.
400
401
403
404
500
GET /users/{user_gid}/teams
GET /workspaces/{workspace_gid}/teams

Returns the compact records for all teams in the workspace visible to the authorized user.

operationId: Teams_listWorkspaceTeams

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Returns the team records for all teams in the organization or workspace accessible to the authenticated user.
400
401
403
404
500
GET /workspaces/{workspace_gid}/teams

Time periods 2 endpoints

GET /time_periods

Returns compact time period records.

operationId: TimePeriods_getCompactTimePeriods

Parameters

Name In Required Type Description
start_on query optional string ISO 8601 date string
end_on query optional string ISO 8601 date string
workspace query required string Globally unique identifier for the workspace.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested time periods.
400
401
403
404
500
GET /time_periods
GET /time_periods/{time_period_gid}

Returns the full record for a single time period.

operationId: TimePeriods_getFullRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the record for a single time period.
400
401
403
404
500
GET /time_periods/{time_period_gid}

Time tracking entries 5 endpoints

GET /tasks/{task_gid}/time_tracking_entries

Returns time tracking entries for a given task.

operationId: TimeTrackingEntries_getForTask

Parameters

Name In Required Type Description
optional
optional
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested time tracking entries.
400
401
403
404
500
GET /tasks/{task_gid}/time_tracking_entries
POST /tasks/{task_gid}/time_tracking_entries

Creates a time tracking entry on a given task. Returns the record of the newly created time tracking entry.

operationId: TimeTrackingEntries_createNewTimeEntryRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TimeTrackingEntriesCreateNewTimeEntryRecordRequest"
      }
    }
  },
  "required": true,
  "description": "Information about the time tracking entry."
}

Responses

201 Successfully created a time tracking entry for the task.
400
401
403
404
500
POST /tasks/{task_gid}/time_tracking_entries
DELETE /time_tracking_entries/{time_tracking_entry_gid}

A specific, existing time tracking entry can be deleted by making a `DELETE` request on the URL for that time tracking entry. Returns an empty data record.

operationId: TimeTrackingEntries_deleteTimeEntry

Responses

200 Successfully deleted the specified time tracking entry.
400
401
403
404
500
DELETE /time_tracking_entries/{time_tracking_entry_gid}
GET /time_tracking_entries/{time_tracking_entry_gid}

Returns the complete time tracking entry record for a single time tracking entry.

operationId: TimeTrackingEntries_getRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested time tracking entry.
400
401
403
404
500
GET /time_tracking_entries/{time_tracking_entry_gid}
PUT /time_tracking_entries/{time_tracking_entry_gid}

A specific, existing time tracking entry can be updated by making a `PUT` request on the URL for that time tracking entry. Only the fields provided in the `data` block will be updated; any unspecified fields will remain unchanged. When using this method, it is best to specify only those fields you wish to change, or else you may overwrite changes made by another user since you last retrieved the task. Returns the complete updated time tracking entry record.

operationId: TimeTrackingEntries_updateTimeTrackingEntry

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/TimeTrackingEntriesUpdateTimeTrackingEntryRequest"
      }
    }
  },
  "required": true,
  "description": "The updated fields for the time tracking entry."
}

Responses

200 Successfully updated the time tracking entry.
400
401
403
404
500
PUT /time_tracking_entries/{time_tracking_entry_gid}

Typeahead 1 endpoints

GET /workspaces/{workspace_gid}/typeahead

Retrieves objects in the workspace based via an auto-completion/typeahead search algorithm. This feature is meant to provide results quickly, so do not rely on this API to provide extremely accurate search results. The result set is limited to a single page of results with a maximum size, so you won’t be able to fetch large numbers of results. The typeahead search API provides search for objects from a single workspace. This endpoint should be used to query for objects when creating an auto-completion/typeahead search feature. This API is meant to provide results quickly and should not be relied upon for accurate or exhaustive search results. The results sets are limited in size and cannot be paginated. Queries return a compact representation of each object which is typically the gid and name fields. Interested in a specific set of fields or all of the fields?! Of course you are. Use field selectors to manipulate what data is included in a response. Resources with type `user` are returned in order of most contacted to least contacted. This is determined by task assignments, adding the user to projects, and adding the user as a follower to tasks, messages, etc. Resources with type `project` are returned in order of recency. This is determined when the user visits the project, is added to the project, and completes tasks in the project. Resources with type `task` are returned with priority placed on tasks the user is following, but no guarantee on the order of those tasks. Resources with type `project_template` are returned with priority placed on favorited project templates. Leaving the `query` string empty or omitted will give you results, still following the resource ordering above. This could be used to list users or projects that are relevant for the requesting user's api token.

operationId: Typeahead_getResults

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved objects via a typeahead search algorithm.
400
401
403
404
500
GET /workspaces/{workspace_gid}/typeahead

User task lists 2 endpoints

GET /user_task_lists/{user_task_list_gid}

Returns the full record for a user task list.

operationId: UserTaskLists_getRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the user task list.
400
401
403
404
500
GET /user_task_lists/{user_task_list_gid}
GET /users/{user_gid}/user_task_list

Returns the full record for a user's task list.

operationId: UserTaskLists_getUserTaskList

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the user's task list.
400
401
403
404
500
GET /users/{user_gid}/user_task_list

Users 5 endpoints

GET /teams/{team_gid}/users

Returns the compact records for all users that are members of the team. Results are sorted alphabetically and limited to 2000. For more results use the `/users` endpoint.

operationId: Users_listTeamUsers

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Returns the user records for all the members of the team, including guests and limited access users
400
401
403
404
500
GET /teams/{team_gid}/users
GET /users

Returns the user records for all users in all workspaces and organizations accessible to the authenticated user. Accepts an optional workspace ID parameter. Results are sorted by user ID.

operationId: Users_listMultipleUsers

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested user records.
401
403
404
500
GET /users
GET /users/{user_gid}

Returns the full user record for the single user with the provided ID.

operationId: Users_getUserRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Returns the user specified.
400
401
403
404
500
GET /users/{user_gid}
GET /users/{user_gid}/favorites

Returns all of a user's favorites in the given workspace, of the given type. Results are given in order (The same order as Asana's sidebar).

operationId: Users_getFavoritesForUser

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Returns the specified user's favorites.
400
401
403
404
500
GET /users/{user_gid}/favorites
GET /workspaces/{workspace_gid}/users

Returns the compact records for all users in the specified workspace or organization. Results are sorted alphabetically and limited to 2000. For more results use the `/users` endpoint.

operationId: Users_listWorkspaceUsers

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Return the users in the specified workspace or org.
400
401
403
404
500
GET /workspaces/{workspace_gid}/users

Webhooks 5 endpoints

GET /webhooks

Get the compact representation of all webhooks your app has registered for the authenticated user in the given workspace.

operationId: Webhooks_listMultipleWebhooks

Parameters

Name In Required Type Description
optional
optional
workspace query required string The workspace to query for webhooks in.
resource query optional string Only return webhooks for the given resource.
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested webhooks.
400
401
403
404
500
GET /webhooks
POST /webhooks

Establishing a webhook is a two-part process. First, a simple HTTP POST request initiates the creation similar to creating any other resource. Next, in the middle of this request comes the confirmation handshake. When a webhook is created, we will send a test POST to the target with an `X-Hook-Secret` header. The target must respond with a `200 OK` or `204 No Content` and a matching `X-Hook-Secret` header to confirm that this webhook subscription is indeed expected. We strongly recommend storing this secret to be used to verify future webhook event signatures. The POST request to create the webhook will then return with the status of the request. If you do not acknowledge the webhook’s confirmation handshake it will fail to setup, and you will receive an error in response to your attempt to create it. This means you need to be able to receive and complete the webhook *while* the POST request is in-flight (in other words, have a server that can handle requests asynchronously). Invalid hostnames like localhost will recieve a 403 Forbidden status code. ``` # Request curl -H "Authorization: Bearer <personal_access_token>" \ -X POST https://app.asana.com/api/1.0/webhooks \ -d "resource=8675309" \ -d "target=https://example.com/receive-webhook/7654" ``` ``` # Handshake sent to https://example.com/ POST /receive-webhook/7654 X-Hook-Secret: b537207f20cbfa02357cf448134da559e8bd39d61597dcd5631b8012eae53e81 ``` ``` # Handshake response sent by example.com HTTP/1.1 200 X-Hook-Secret: b537207f20cbfa02357cf448134da559e8bd39d61597dcd5631b8012eae53e81 ``` ``` # Response HTTP/1.1 201 { "data": { "gid": "43214", "resource": { "gid": "8675309", "name": "Bugs" }, "target": "https://example.com/receive-webhook/7654", "active": false, "last_success_at": null, "last_failure_at": null, "last_failure_content": null } } ```

operationId: Webhooks_establishWebhook

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/WebhooksEstablishWebhookRequest"
      }
    }
  },
  "required": true,
  "description": "The webhook workspace and target."
}

Responses

201 Successfully created the requested webhook.
400
401
403
404
500
POST /webhooks
DELETE /webhooks/{webhook_gid}

This method *permanently* removes a webhook. Note that it may be possible to receive a request that was already in flight after deleting the webhook, but no further requests will be issued.

operationId: Webhooks_removeWebhook

Responses

200 Successfully retrieved the requested webhook.
400
401
403
404
500
DELETE /webhooks/{webhook_gid}
GET /webhooks/{webhook_gid}

Returns the full record for the given webhook.

operationId: Webhooks_getWebhookRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested webhook.
400
401
403
404
500
GET /webhooks/{webhook_gid}
PUT /webhooks/{webhook_gid}

An existing webhook's filters can be updated by making a PUT request on the URL for that webhook. Note that the webhook's previous `filters` array will be completely overwritten by the `filters` sent in the PUT request.

operationId: Webhooks_updateWebhookFilters

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/WebhooksUpdateWebhookFiltersRequest"
      }
    }
  },
  "required": true,
  "description": "The updated filters for the webhook."
}

Responses

200 Successfully updated the webhook.
400
401
403
404
500
PUT /webhooks/{webhook_gid}

Workspace memberships 3 endpoints

GET /users/{user_gid}/workspace_memberships

Returns the compact workspace membership records for the user.

operationId: WorkspaceMemberships_getUserMemberships

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested user's workspace memberships.
400
401
403
404
500
GET /users/{user_gid}/workspace_memberships
GET /workspace_memberships/{workspace_membership_gid}

Returns the complete workspace record for a single workspace membership.

operationId: WorkspaceMemberships_getRecordById

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested workspace membership.
400
401
403
404
500
GET /workspace_memberships/{workspace_membership_gid}
GET /workspaces/{workspace_gid}/workspace_memberships

Returns the compact workspace membership records for the workspace.

operationId: WorkspaceMemberships_listForWorkspace

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Successfully retrieved the requested workspace's memberships.
GET /workspaces/{workspace_gid}/workspace_memberships

Workspaces 5 endpoints

GET /workspaces

Returns the compact records for all workspaces visible to the authorized user.

operationId: Workspaces_listMultiple

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Return all workspaces visible to the authorized user.
400
401
403
404
500
GET /workspaces
GET /workspaces/{workspace_gid}

Returns the full workspace record for a single workspace.

operationId: Workspaces_getWorkspaceRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Responses

200 Return the full workspace record.
400
401
403
404
500
GET /workspaces/{workspace_gid}
PUT /workspaces/{workspace_gid}

A specific, existing workspace can be updated by making a PUT request on the URL for that workspace. Only the fields provided in the data block will be updated; any unspecified fields will remain unchanged. Currently the only field that can be modified for a workspace is its name. Returns the complete, updated workspace record.

operationId: Workspaces_updateWorkspaceRecord

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/WorkspacesUpdateWorkspaceRecordRequest"
      }
    }
  },
  "required": true,
  "description": "The workspace object with all updated properties."
}

Responses

200 Update for the workspace was successful.
400
401
403
404
500
PUT /workspaces/{workspace_gid}
POST /workspaces/{workspace_gid}/addUser

Add a user to a workspace or organization. The user can be referenced by their globally unique user ID or their email address. Returns the full user record for the invited user.

operationId: Workspaces_addUserToWorkspace

Parameters

Name In Required Type Description
opt_fields query optional array 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.

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/WorkspacesAddUserToWorkspaceRequest"
      }
    }
  },
  "required": true,
  "description": "The user to add to the workspace."
}

Responses

200 The user was added successfully to the workspace or organization.
400
401
403
404
500
POST /workspaces/{workspace_gid}/addUser
POST /workspaces/{workspace_gid}/removeUser

Remove a user from a workspace or organization. The user making this call must be an admin in the workspace. The user can be referenced by their globally unique user ID or their email address. Returns an empty data record.

operationId: Workspaces_removeUserFromWorkspace

Request Body

{
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/WorkspacesRemoveUserFromWorkspaceRequest"
      }
    }
  },
  "required": true,
  "description": "The user to remove from the workspace."
}

Responses

204 The user was removed successfully to the workspace or organization.
400
401
403
404
500
POST /workspaces/{workspace_gid}/removeUser

Schemas

object AddCustomFieldSettingRequest
{
  "type": "object",
  "required": [
    "custom_field"
  ],
  "properties": {
    "custom_field": {
      "type": "string",
      "example": "14916",
      "description": "The custom field to associate with this container."
    },
    "insert_after": {
      "type": "string",
      "example": "1331",
      "description": "A gid of a Custom Field Setting on this container, after which the new Custom Field Setting will be added.  `insert_before` and `insert_after` parameters cannot both be specified."
    },
    "is_important": {
      "type": "boolean",
      "example": true,
      "description": "Whether this field should be considered important to this container (for instance, to display in the list view of items in the container)."
    },
    "insert_before": {
      "type": "string",
      "example": "1331",
      "description": "A gid of a Custom Field Setting on this container, before which the new Custom Field Setting will be added.  `insert_before` and `insert_after` parameters cannot both be specified."
    }
  }
}
object AddFollowersRequest
{
  "type": "object",
  "required": [
    "followers"
  ],
  "properties": {
    "followers": {
      "type": "string",
      "example": 521621621373,
      "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
    }
  }
}
object AddMembersRequest
{
  "type": "object",
  "required": [
    "members"
  ],
  "properties": {
    "members": {
      "type": "string",
      "example": 521621621373,
      "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
    }
  }
}
object AllocationBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "effort": {
          "type": "object",
          "nullable": true,
          "properties": {
            "type": {
              "enum": [
                "hours",
                "percent"
              ],
              "type": "string",
              "description": "The units used for tracking effort on an allocation, either \"hours\" or \"percent\"."
            },
            "value": {
              "type": "number",
              "example": 50,
              "description": "The numeric effort value on the allocation."
            }
          },
          "description": "The amount of time associated with the allocation, represented as a percentage or number of hours"
        },
        "end_date": {
          "type": "string",
          "format": "date",
          "example": "2024-02-28",
          "description": "The localized day on which the allocation ends."
        },
        "start_date": {
          "type": "string",
          "format": "date",
          "example": "2024-02-28",
          "description": "The localized day on which the allocation starts."
        }
      },
      "x-docs-overrides": {
        "properties.resource_type.example": "allocation"
      }
    }
  ]
}
object AllocationRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AllocationBase"
    },
    {
      "type": "object",
      "properties": {
        "parent": {
          "type": "string",
          "description": "Globally unique identifier for the project the allocation is on."
        },
        "assignee": {
          "type": "string",
          "description": "Globally unique identifier for the user who is assigned to the allocation."
        }
      }
    }
  ]
}
object AllocationResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AllocationBase"
    },
    {
      "type": "object",
      "properties": {
        "parent": {
          "$ref": "#/components/schemas/ProjectCompact",
          "type": "object",
          "description": "The project the allocation is on."
        },
        "assignee": {
          "$ref": "#/components/schemas/UserCompact",
          "type": "object",
          "description": "The user who is assigned to the allocation."
        },
        "created_by": {
          "$ref": "#/components/schemas/UserCompact",
          "type": "object",
          "description": "The user who created the allocation."
        },
        "resource_subtype": {
          "type": "string",
          "example": "project_allocation",
          "description": "The subtype of the allocation."
        }
      }
    }
  ]
}
object AllocationsCreateRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "allOf": [
        {
          "$ref": "#/components/schemas/AllocationRequest"
        },
        {
          "type": "object",
          "required": [
            "assignee",
            "end_date",
            "parent",
            "start_date"
          ]
        }
      ]
    }
  }
}
object AllocationsCreateRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AllocationResponse"
    }
  }
}
object AllocationsDeleteAllocationByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object AllocationsGetMultipleResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AllocationResponse"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object AllocationsGetRecordByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AllocationResponse"
    }
  }
}
object AllocationsUpdateRecordByIdRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AllocationRequest"
    }
  }
}
object AllocationsUpdateRecordByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AllocationResponse"
    }
  }
}
object AsanaNamedResource
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Bug Task",
          "description": "The name of the object."
        }
      }
    }
  ]
}
object AsanaResource
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "12345",
      "readOnly": true,
      "description": "Globally unique identifier of the resource, as a string.",
      "x-insert-after": false
    },
    "resource_type": {
      "type": "string",
      "example": "task",
      "readOnly": true,
      "description": "The base type of this resource.",
      "x-insert-after": "gid"
    }
  },
  "description": "A generic Asana Resource, containing a globally unique identifier."
}
object AttachmentCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Screenshot.png",
          "readOnly": true,
          "description": "The name of the file."
        },
        "resource_subtype": {
          "type": "string",
          "example": "dropbox",
          "description": "The service hosting the attachment. Valid values are `asana`, `dropbox`, `gdrive`, `onedrive`, `box`, `vimeo`, and `external`."
        }
      },
      "description": "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.",
      "x-docs-overrides": {
        "properties.resource_type.example": "attachment"
      }
    }
  ]
}
object AttachmentRequest
{
  "type": "object",
  "required": [
    "parent"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "The URL of the external resource being attached. Required for attachments of type `external`.\n"
    },
    "file": {
      "type": "string",
      "format": "binary",
      "description": "Required for `asana` attachments.\n"
    },
    "name": {
      "type": "string",
      "description": "The name of the external resource being attached. Required for attachments of type `external`.\n"
    },
    "parent": {
      "type": "string",
      "description": "Required identifier of the parent task, project, or project_brief, as a string.\n"
    },
    "connect_to_app": {
      "type": "boolean",
      "description": "*Optional*. Only relevant for external attachments with a parent task. A boolean indicating whether the current app should be connected with the attachment for the purposes of showing an app components widget. Requires the app to have been added to a project the parent task is in.\n"
    },
    "resource_subtype": {
      "enum": [
        "asana",
        "dropbox",
        "gdrive",
        "onedrive",
        "box",
        "vimeo",
        "external"
      ],
      "type": "string",
      "example": "external",
      "description": "The type of the attachment. Must be one of the given values. If not specified, a file attachment of type `asana` will be assumed. Note that if the value of `resource_subtype` is `external`, a `parent`, `name`, and `url` must also be provided.\n"
    }
  }
}
object AttachmentResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AttachmentCompact"
    },
    {
      "type": "object",
      "properties": {
        "host": {
          "type": "string",
          "example": "dropbox",
          "readOnly": true,
          "description": "The service hosting the attachment. Valid values are `asana`, `dropbox`, `gdrive`, `box`, and `vimeo`."
        },
        "size": {
          "type": "integer",
          "example": 12345,
          "readOnly": true,
          "description": "The size of the attachment in bytes. Only present when the `resource_subtype` is `asana`."
        },
        "parent": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TaskCompact"
            },
            {
              "type": "object",
              "nullable": true,
              "readOnly": true,
              "properties": {
                "resource_subtype": {
                  "type": "string",
                  "example": "default_task",
                  "nullable": true,
                  "description": "The resource subtype of the parent resource that the filter applies to."
                }
              },
              "description": "The task this attachment is attached to."
            }
          ]
        },
        "view_url": {
          "type": "string",
          "format": "uri",
          "example": "https://www.dropbox.com/s/123/Screenshot.png",
          "nullable": true,
          "readOnly": true,
          "description": "The URL where the attachment can be viewed, which may be friendlier to users in a browser than just directing them to a raw file. May be null if no view URL exists for the service."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "download_url": {
          "type": "string",
          "format": "uri",
          "example": "https://s3.amazonaws.com/assets/123/Screenshot.png",
          "nullable": true,
          "readOnly": true,
          "description": "The URL containing the content of the attachment.\n*Note:* May be null if the attachment is hosted by [Box](https://www.box.com/) and will be null if the attachment is a Video Message hosted by [Vimeo](https://vimeo.com/). If present, this URL may only be valid for two minutes from the time of retrieval. You should avoid persisting this URL somewhere and just refresh it on demand to ensure you do not keep stale URLs."
        },
        "permanent_url": {
          "type": "string",
          "format": "uri",
          "example": "https://s3.amazonaws.com/assets/123/Screenshot.png",
          "nullable": true,
          "readOnly": true,
          "description": ""
        },
        "connected_to_app": {
          "type": "boolean",
          "readOnly": true,
          "description": "Whether the attachment is connected to the app making the request for the purposes of showing an app components widget. Only present when the `resource_subtype` is `external` or `gdrive`."
        }
      }
    }
  ]
}
object AttachmentsDeleteSpecificResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object AttachmentsGetAllForObjectResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AttachmentCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object AttachmentsGetAttachmentRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AttachmentResponse"
    }
  }
}
object AttachmentsUploadAttachmentResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AttachmentResponse"
    }
  }
}
object AuditLogApiGetAuditLogEventsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AuditLogEvent"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object AuditLogEvent
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "12345",
      "description": "Globally unique identifier of the `AuditLogEvent`, as a string.",
      "x-insert-after": false
    },
    "actor": {
      "$ref": "#/components/schemas/AuditLogEventActor"
    },
    "context": {
      "$ref": "#/components/schemas/AuditLogEventContext"
    },
    "details": {
      "$ref": "#/components/schemas/AuditLogEventDetails"
    },
    "resource": {
      "$ref": "#/components/schemas/AuditLogEventResource"
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "example": "2021-01-01T00:00:00.000Z",
      "description": "The time the event was created."
    },
    "event_type": {
      "type": "string",
      "example": "task_deleted",
      "description": "The type of the event."
    },
    "event_category": {
      "type": "string",
      "example": "deletion",
      "description": "The category that this `event_type` belongs to."
    }
  },
  "description": "An object representing a single event within an Asana domain.\n\nEvery audit log event is comprised of an `event_type`, `actor`, `resource`, and `context`. Some events will include additional metadata about the event under `details`. See our [currently supported list of events](/docs/audit-log-events#supported-audit-log-events) for more details."
}
object AuditLogEventActor
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "1111",
      "description": "Globally unique identifier of the actor, if it is a user."
    },
    "name": {
      "type": "string",
      "example": "Greg Sanchez",
      "description": "The name of the actor, if it is a user."
    },
    "email": {
      "type": "string",
      "example": "gregsanchez@example.com",
      "description": "The email of the actor, if it is a user."
    },
    "actor_type": {
      "enum": [
        "user",
        "asana",
        "asana_support",
        "anonymous",
        "external_administrator"
      ],
      "type": "string",
      "example": "user",
      "description": "The type of actor.\nCan be one of `user`, `asana`, `asana_support`, `anonymous`, or `external_administrator`."
    }
  },
  "description": "The entity that triggered the event. Will typically be a user."
}
object AuditLogEventContext
{
  "type": "object",
  "properties": {
    "user_agent": {
      "type": "string",
      "example": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
      "description": "The user agent of the client that initiated the event, if applicable."
    },
    "context_type": {
      "enum": [
        "web",
        "desktop",
        "mobile",
        "asana_support",
        "asana",
        "email",
        "api"
      ],
      "type": "string",
      "example": "web",
      "description": "The type of context.\nCan be one of `web`, `desktop`, `mobile`, `asana_support`, `asana`, `email`, or `api`."
    },
    "oauth_app_name": {
      "type": "string",
      "description": "The name of the OAuth App that initiated the event.\nOnly present if the `api_authentication_method` is `oauth`."
    },
    "client_ip_address": {
      "type": "string",
      "example": "1.1.1.1",
      "description": "The IP address of the client that initiated the event, if applicable."
    },
    "api_authentication_method": {
      "enum": [
        "cookie",
        "oauth",
        "personal_access_token",
        "service_account"
      ],
      "type": "string",
      "description": "The authentication method used in the context of an API request.\nOnly present if the `context_type` is `api`. Can be one of `cookie`, `oauth`, `personal_access_token`, or `service_account`."
    }
  },
  "description": "The context from which this event originated."
}
object AuditLogEventDetails
{
  "type": "object",
  "properties": {
    "group": {
      "type": "object",
      "additionalProperties": true
    },
    "new_value": {
      "type": "string",
      "nullable": true
    },
    "old_value": {
      "type": "string",
      "nullable": true
    }
  },
  "description": "Event specific details. The schema will vary depending on the `event_type`.",
  "additionalProperties": true
}
object AuditLogEventResource
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "1111",
      "description": "Globally unique identifier of the resource."
    },
    "name": {
      "type": "string",
      "example": "Example Task",
      "nullable": true,
      "description": "The name of the resource."
    },
    "email": {
      "type": "string",
      "description": "The email of the resource, if applicable."
    },
    "resource_type": {
      "type": "string",
      "example": "task",
      "description": "The type of resource."
    },
    "resource_subtype": {
      "type": "string",
      "example": "milestone",
      "description": "The subtype of resource. Most resources will not have a subtype."
    }
  },
  "description": "The primary object that was affected by this event."
}
object BatchApiSubmitParallelRequestsRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/BatchRequest"
    }
  }
}
object BatchApiSubmitParallelRequestsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/BatchResponse"
      }
    }
  }
}
object BatchRequest
{
  "type": "object",
  "properties": {
    "actions": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/BatchRequestAction"
      }
    }
  },
  "description": "A request object for use in a batch request."
}
object BatchRequestAction
{
  "type": "object",
  "required": [
    "relative_path",
    "method"
  ],
  "properties": {
    "data": {
      "type": "object",
      "example": {
        "assignee": "me",
        "workspace": "1337"
      },
      "description": "For `GET` requests, this should be a map of query parameters you would have normally passed in the URL. Options and pagination are not accepted here; put them in `options` instead. For `POST`, `PATCH`, and `PUT` methods, this should be the content you would have normally put in the data field of the body."
    },
    "method": {
      "enum": [
        "get",
        "post",
        "put",
        "delete",
        "patch",
        "head"
      ],
      "type": "string",
      "example": "get",
      "description": "The HTTP method you wish to emulate for the action."
    },
    "options": {
      "type": "object",
      "example": {
        "limit": 3,
        "fields": [
          "name",
          "notes",
          "completed"
        ]
      },
      "properties": {
        "limit": {
          "type": "integer",
          "example": 50,
          "description": "Pagination limit for the request."
        },
        "fields": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "name",
            "gid",
            "notes",
            "completed"
          ],
          "description": "The fields to retrieve in the request."
        },
        "offset": {
          "type": "integer",
          "example": null,
          "description": "Pagination offset for the request."
        }
      },
      "description": "Pagination (`limit` and `offset`) and output options (`fields` or `expand`) for the action. “Pretty” JSON output is not an available option on individual actions; if you want pretty output, specify that option on the parent request."
    },
    "relative_path": {
      "type": "string",
      "example": "/tasks/123",
      "description": "The path of the desired endpoint relative to the API’s base URL. Query parameters are not accepted here; put them in `data` instead."
    }
  },
  "description": "An action object for use in a batch request."
}
object BatchResponse
{
  "type": "object",
  "properties": {
    "body": {
      "type": "object",
      "example": {
        "data": {
          "gid": "1967",
          "name": "Hello, world!",
          "notes": "How are you today?",
          "completed": false
        }
      },
      "description": "The JSON body that the invoked endpoint returned."
    },
    "headers": {
      "type": "object",
      "example": {
        "location": "/tasks/1234"
      },
      "description": "A map of HTTP headers specific to this result. This is primarily used for returning a `Location` header to accompany a `201 Created` result.  The parent HTTP response will contain all common headers."
    },
    "status_code": {
      "type": "integer",
      "example": 200,
      "description": "The HTTP status code that the invoked endpoint returned."
    }
  },
  "description": "A response object returned from a batch request."
}
object CreateMembershipRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/MembershipRequest"
    },
    {
      "type": "object",
      "properties": {
        "role": {
          "type": "string",
          "example": "editor",
          "deprecated": true,
          "description": "*Deprecated: new integrations should use access_level* The role given to the member. Optional argument, will default to `commenter` for goals and the default project role for projects. Can be `editor` or `commenter` for goals. Can be `admin`,`editor` or `commenter` for projects."
        },
        "member": {
          "type": "string",
          "example": 12345,
          "description": "The gid of the user or team."
        },
        "parent": {
          "type": "string",
          "example": "987654",
          "description": "The gid of the `goal` or `project` to add the member to."
        }
      }
    }
  ]
}
object CreateTimeTrackingEntryRequest
{
  "type": "object",
  "properties": {
    "entered_on": {
      "type": "string",
      "format": "date",
      "example": "2023-03-19",
      "description": "*Optional*. The day that this entry is logged on. Defaults to today if not specified"
    },
    "duration_minutes": {
      "type": "integer",
      "example": 12,
      "description": "Time in minutes tracked by the entry. Must be greater than 0"
    }
  }
}
object CustomFieldBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/CustomFieldCompact"
    },
    {
      "type": "object",
      "properties": {
        "format": {
          "enum": [
            "currency",
            "identifier",
            "percentage",
            "custom",
            "duration",
            "none"
          ],
          "type": "string",
          "example": "custom",
          "description": "The format of this custom field."
        },
        "precision": {
          "type": "integer",
          "example": 2,
          "description": "Only relevant for custom fields of type ‘Number’. This field dictates the number of places after the decimal to round to, i.e. 0 is integer values, 1 rounds to the nearest tenth, and so on. Must be between 0 and 6, inclusive.\nFor percentage format, this may be unintuitive, as a value of 0.25 has a precision of 0, while a value of 0.251 has a precision of 1. This is due to 0.25 being displayed as 25%.\nThe identifier format will always have a precision of 0."
        },
        "description": {
          "type": "string",
          "example": "Development team priority",
          "description": "[Opt In](https://raw.githubusercontent.com). The description of the custom field."
        },
        "custom_label": {
          "type": "string",
          "example": "gold pieces",
          "nullable": true,
          "description": "This is the string that appears next to the custom field value. This will be null if the `format` is not `custom`."
        },
        "enum_options": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EnumOption"
          },
          "description": "*Conditional*. Only relevant for custom fields of type `enum`. This array specifies the possible values which an `enum` custom field can adopt. To modify the enum options, refer to [working with enum options](https://raw.githubusercontent.com)."
        },
        "currency_code": {
          "type": "string",
          "example": "EUR",
          "nullable": true,
          "description": "ISO 4217 currency code to format this custom field. This will be null if the `format` is not `currency`."
        },
        "asana_created_field": {
          "enum": [
            "a_v_requirements",
            "account_name",
            "actionable",
            "align_shipping_link",
            "align_status",
            "allotted_time",
            "appointment",
            "approval_stage",
            "approved",
            "article_series",
            "board_committee",
            "browser",
            "campaign_audience",
            "campaign_project_status",
            "campaign_regions",
            "channel_primary",
            "client_topic_type",
            "complete_by",
            "contact",
            "contact_email_address",
            "content_channels",
            "content_channels_needed",
            "content_stage",
            "content_type",
            "contract",
            "contract_status",
            "cost",
            "creation_stage",
            "creative_channel",
            "creative_needed",
            "creative_needs",
            "data_sensitivity",
            "deal_size",
            "delivery_appt",
            "delivery_appt_date",
            "department",
            "department_responsible",
            "design_request_needed",
            "design_request_type",
            "discussion_category",
            "do_this_task",
            "editorial_content_status",
            "editorial_content_tag",
            "editorial_content_type",
            "effort",
            "effort_level",
            "est_completion_date",
            "estimated_time",
            "estimated_value",
            "expected_cost",
            "external_steps_needed",
            "favorite_idea",
            "feedback_type",
            "financial",
            "funding_amount",
            "grant_application_process",
            "hiring_candidate_status",
            "idea_status",
            "ids_link",
            "ids_patient_link",
            "implementation_stage",
            "insurance",
            "interview_area",
            "interview_question_score",
            "itero_scan_link",
            "job_s_applied_to",
            "lab",
            "launch_status",
            "lead_status",
            "localization_language",
            "localization_market_team",
            "localization_status",
            "meeting_minutes",
            "meeting_needed",
            "minutes",
            "mrr",
            "must_localize",
            "name_of_foundation",
            "need_to_follow_up",
            "next_appointment",
            "next_steps_sales",
            "num_people",
            "number_of_user_reports",
            "office_location",
            "onboarding_activity",
            "owner",
            "participants_needed",
            "patient_date_of_birth",
            "patient_email",
            "patient_phone",
            "patient_status",
            "phone_number",
            "planning_category",
            "point_of_contact",
            "position",
            "post_format",
            "prescription",
            "priority",
            "priority_level",
            "product",
            "product_stage",
            "progress",
            "project_size",
            "project_status",
            "proposed_budget",
            "publish_status",
            "reason_for_scan",
            "referral",
            "request_type",
            "research_status",
            "responsible_department",
            "responsible_team",
            "risk_assessment_status",
            "room_name",
            "sales_counterpart",
            "sentiment",
            "shipping_link",
            "social_channels",
            "stage",
            "status",
            "status_design",
            "status_of_initiative",
            "system_setup",
            "task_progress",
            "team",
            "team_marketing",
            "team_responsible",
            "time_it_takes_to_complete_tasks",
            "timeframe",
            "treatment_type",
            "type_work_requests_it",
            "use_agency",
            "user_name",
            "vendor_category",
            "vendor_type",
            "word_count",
            null
          ],
          "type": "string",
          "example": "priority",
          "nullable": true,
          "readOnly": true,
          "description": "*Conditional*. A unique identifier to associate this field with the template source of truth."
        },
        "custom_label_position": {
          "enum": [
            "prefix",
            "suffix",
            null
          ],
          "type": "string",
          "example": "suffix",
          "nullable": true,
          "description": "Only relevant for custom fields with `custom` format. This depicts where to place the custom label. This will be null if the `format` is not `custom`."
        },
        "is_global_to_workspace": {
          "type": "boolean",
          "example": true,
          "readOnly": true,
          "description": "This flag describes whether this custom field is available to every container in the workspace. Before project-specific custom fields, this field was always true."
        },
        "has_notifications_enabled": {
          "type": "boolean",
          "example": true,
          "description": "*Conditional*. This flag describes whether a follower of a task with this field should receive inbox notifications from changes to this field."
        }
      }
    }
  ]
}
object CustomFieldCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Status",
          "description": "The name of the custom field."
        },
        "type": {
          "enum": [
            "text",
            "enum",
            "multi_enum",
            "number",
            "date",
            "people"
          ],
          "type": "string",
          "readOnly": true,
          "description": "*Deprecated: new integrations should prefer the resource_subtype field.* The type of the custom field. Must be one of the given values.\n"
        },
        "enabled": {
          "type": "boolean",
          "example": true,
          "readOnly": true,
          "description": "*Conditional*. Determines if the custom field is enabled or not."
        },
        "id_prefix": {
          "type": "string",
          "example": "ID",
          "nullable": true,
          "description": "This field is the unique custom ID string for the custom field."
        },
        "date_value": {
          "type": "object",
          "nullable": true,
          "properties": {
            "date": {
              "type": "string",
              "example": "2024-08-23",
              "description": "A string representing the date in YYYY-MM-DD format."
            },
            "date_time": {
              "type": "string",
              "example": "2024-08-23T22:00:00.000Z",
              "description": "A string representing the date in ISO 8601 format. If no time value is selected, the value of `date-time` will be `null`."
            }
          },
          "description": "*Conditional*. Only relevant for custom fields of type `date`. This object reflects the chosen date (and optionally, time) value of a `date` custom field. If no date is selected, the value of `date_value` will be `null`."
        },
        "enum_value": {
          "allOf": [
            {
              "$ref": "#/components/schemas/EnumOption"
            },
            {
              "type": "object",
              "nullable": true,
              "description": "*Conditional*. Only relevant for custom fields of type `enum`. This object is the chosen value of an `enum` custom field."
            }
          ]
        },
        "text_value": {
          "type": "string",
          "example": "Some Value",
          "nullable": true,
          "description": "*Conditional*. This string is the value of a `text` custom field."
        },
        "enum_options": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EnumOption"
          },
          "description": "*Conditional*. Only relevant for custom fields of type `enum`. This array specifies the possible values which an `enum` custom field can adopt. To modify the enum options, refer to [working with enum options](https://raw.githubusercontent.com)."
        },
        "number_value": {
          "type": "number",
          "example": 5.2,
          "nullable": true,
          "description": "*Conditional*. This number is the value of a `number` custom field."
        },
        "display_value": {
          "type": "string",
          "example": "blue",
          "nullable": true,
          "readOnly": true,
          "description": "A string representation for the value of the custom field. Integrations that don't require the underlying type should use this field to read values. Using this field will future-proof an app against new custom field types."
        },
        "is_formula_field": {
          "type": "boolean",
          "example": false,
          "description": "*Conditional*. This flag describes whether a custom field is a formula custom field."
        },
        "resource_subtype": {
          "enum": [
            "text",
            "enum",
            "multi_enum",
            "number",
            "date",
            "people"
          ],
          "type": "string",
          "example": "text",
          "readOnly": true,
          "description": "The type of the custom field. Must be one of the given values.\n"
        },
        "multi_enum_values": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EnumOption"
          },
          "description": "*Conditional*. Only relevant for custom fields of type `multi_enum`. This object is the chosen values of a `multi_enum` custom field."
        },
        "representation_type": {
          "enum": [
            "text",
            "enum",
            "multi_enum",
            "number",
            "date",
            "people",
            "formula",
            "custom_id"
          ],
          "type": "string",
          "example": "number",
          "readOnly": true,
          "description": "This field tells the type of the custom field."
        }
      },
      "description": "Custom Fields store the metadata that is used in order to add user-specified information to tasks in Asana. Be sure to reference the [custom fields](https://raw.githubusercontent.com) developer documentation for more information about how custom fields relate to various resources in Asana.\n\nUsers in Asana can [lock custom fields](https://asana.com/guide/help/premium/custom-fields#gl-lock-fields), which will make them read-only when accessed by other users. Attempting to edit a locked custom field will return HTTP error code `403 Forbidden`.",
      "x-docs-overrides": {
        "properties.resource_type.example": "custom_field"
      }
    }
  ]
}
object CustomFieldRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/CustomFieldBase"
    },
    {
      "type": "object",
      "required": [
        "workspace"
      ],
      "properties": {
        "workspace": {
          "type": "string",
          "example": "1331",
          "description": "*Create-Only* The workspace to create a custom field in."
        },
        "owned_by_app": {
          "type": "boolean",
          "description": "*Allow-listed*. Instructs the API that this Custom Field is app-owned. This parameter is allow-listed to specific apps at this point in time. For apps that are not allow-listed, providing this parameter will result in a `403 Forbidden`."
        },
        "people_value": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "The GID of a user."
          },
          "example": [
            "12345"
          ],
          "description": "*Conditional*. Only relevant for custom fields of type `people`. This array of user GIDs reflects the users to be written to a `people` custom field. Note that *write* operations will replace existing users (if any) in the custom field with the users specified in this array."
        }
      }
    }
  ]
}
object CustomFieldResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/CustomFieldBase"
    },
    {
      "type": "object",
      "properties": {
        "id_prefix": {
          "type": "string",
          "example": "ID",
          "nullable": true,
          "description": "This field is the unique custom ID string for the custom field."
        },
        "created_by": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "nullable": true
            }
          ]
        },
        "people_value": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "description": "*Conditional*. Only relevant for custom fields of type `people`. This array of [compact user](https://raw.githubusercontent.com) objects reflects the values of a `people` custom field."
        },
        "is_formula_field": {
          "type": "boolean",
          "example": false,
          "description": "*Conditional*. This flag describes whether a custom field is a formula custom field."
        },
        "is_value_read_only": {
          "type": "boolean",
          "example": false,
          "description": "*Conditional*. This flag describes whether a custom field is read only."
        },
        "representation_type": {
          "enum": [
            "text",
            "enum",
            "multi_enum",
            "number",
            "date",
            "people",
            "formula",
            "custom_id"
          ],
          "type": "string",
          "example": "number",
          "readOnly": true,
          "description": "This field tells the type of the custom field."
        }
      }
    }
  ]
}
object CustomFieldSettingCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "description": "Custom Fields Settings objects represent the many-to-many join of the Custom Field and Project as well as stores information that is relevant to that particular pairing.",
      "x-docs-overrides": {
        "properties.resource_type.example": "custom_field_setting"
      }
    }
  ]
}
object CustomFieldSettingResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/CustomFieldSettingCompact"
    },
    {
      "type": "object",
      "properties": {
        "parent": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "The parent to which the custom field is applied. This can be a project or portfolio and indicates that the tasks or projects that the parent contains may be given custom field values for this custom field."
            }
          ]
        },
        "project": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "*Deprecated: new integrations should prefer the `parent` field.* The id of the project that this custom field settings refers to."
            }
          ]
        },
        "custom_field": {
          "allOf": [
            {
              "$ref": "#/components/schemas/CustomFieldResponse"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "The custom field that is applied to the `parent`."
            }
          ]
        },
        "is_important": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "`is_important` is used in the Asana web application to determine if this custom field is displayed in the list/grid view of a project or portfolio."
        }
      }
    }
  ]
}
object CustomFieldSettingsGetPortfolioCustomFieldSettingsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/CustomFieldSettingResponse"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object CustomFieldSettingsGetProjectCustomFieldSettingsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/CustomFieldSettingResponse"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object CustomFieldsAddEnumOptionRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EnumOptionRequest"
    }
  }
}
object CustomFieldsAddEnumOptionResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EnumOption"
    }
  }
}
object CustomFieldsCreateNewFieldRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CustomFieldRequest"
    }
  }
}
object CustomFieldsCreateNewFieldRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CustomFieldResponse"
    }
  }
}
object CustomFieldsDeleteFieldRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object CustomFieldsGetMetadataResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CustomFieldResponse"
    }
  }
}
object CustomFieldsListWorkspaceCustomFieldsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/CustomFieldResponse"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object CustomFieldsReorderEnumOptionRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EnumOptionInsertRequest"
    }
  }
}
object CustomFieldsReorderEnumOptionResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EnumOption"
    }
  }
}
object CustomFieldsUpdateEnumOptionRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EnumOption"
    }
  }
}
object CustomFieldsUpdateEnumOptionResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EnumOption"
    }
  }
}
object CustomFieldsUpdateFieldRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CustomFieldRequest"
    }
  }
}
object CustomFieldsUpdateFieldRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CustomFieldResponse"
    }
  }
}
object DateVariableCompact
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "1",
      "readOnly": true,
      "description": "Globally unique identifier of the date field in the project template. A value of `1` refers to the project start date, while `2` refers to the project due date."
    },
    "name": {
      "type": "string",
      "example": "Start Date",
      "readOnly": true,
      "description": "The name of the date variable."
    },
    "description": {
      "type": "string",
      "example": "Choose a start date for your project.",
      "readOnly": true,
      "description": "The description of what the date variable is used for when instantiating a project."
    }
  }
}
object DateVariableRequest
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "1",
      "description": "Globally unique identifier of the date field in the project template. A value of `1` refers to the project start date, while `2` refers to the project due date."
    },
    "value": {
      "type": "string",
      "format": "date-time",
      "example": "2022-01-01",
      "nullable": true,
      "description": "The date with which the date variable should be replaced when instantiating a project. This takes a date with `YYYY-MM-DD` format."
    }
  }
}
object EmptyResponse
{
  "type": "object",
  "description": "An empty object. Some endpoints do not return an object on success. The success is conveyed through a 2-- status code and returning an empty object."
}
object EnumOption
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Low",
          "description": "The name of the enum option."
        },
        "color": {
          "type": "string",
          "example": "blue",
          "description": "The color of the enum option. Defaults to ‘none’."
        },
        "enabled": {
          "type": "boolean",
          "example": true,
          "description": "Whether or not the enum option is a selectable value for the custom field."
        }
      },
      "description": "Enum options are the possible values which an enum custom field can adopt. An enum custom field must contain at least 1 enum option but no more than 500.\n\nYou can add enum options to a custom field by using the `POST /custom_fields/custom_field_gid/enum_options` endpoint.\n\n**It is not possible to remove or delete an enum option**. Instead, enum options can be disabled by updating the `enabled` field to false with the `PUT /enum_options/enum_option_gid` endpoint. Other attributes can be updated similarly.\n\nOn creation of an enum option, `enabled` is always set to `true`, meaning the enum option is a selectable value for the custom field. Setting `enabled=false` is equivalent to “trashing” the enum option in the Asana web app within the “Edit Fields” dialog. The enum option will no longer be selectable but, if the enum option value was previously set within a task, the task will retain the value.\n\nEnum options are an ordered list and by default new enum options are inserted at the end. Ordering in relation to existing enum options can be specified on creation by using `insert_before` or `insert_after` to reference an existing enum option. Only one of `insert_before` and `insert_after` can be provided when creating a new enum option.\n\nAn enum options list can be reordered with the `POST /custom_fields/custom_field_gid/enum_options/insert` endpoint.",
      "x-docs-overrides": {
        "properties.resource_type.example": "enum_option"
      }
    }
  ]
}
object EnumOptionInsertRequest
{
  "type": "object",
  "required": [
    "enum_option"
  ],
  "properties": {
    "enum_option": {
      "type": "string",
      "example": "97285",
      "description": "The gid of the enum option to relocate."
    },
    "after_enum_option": {
      "type": "string",
      "example": "12345",
      "description": "An existing enum option within this custom field after which the new enum option should be inserted. Cannot be provided together with before_enum_option."
    },
    "before_enum_option": {
      "type": "string",
      "example": "12345",
      "description": "An existing enum option within this custom field before which the new enum option should be inserted. Cannot be provided together with after_enum_option."
    }
  }
}
object EnumOptionRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/EnumOption"
    },
    {
      "type": "object",
      "properties": {
        "insert_after": {
          "type": "string",
          "example": "12345",
          "description": "An existing enum option within this custom field after which the new enum option should be inserted. Cannot be provided together with before_enum_option."
        },
        "insert_before": {
          "type": "string",
          "example": "12345",
          "description": "An existing enum option within this custom field before which the new enum option should be inserted. Cannot be provided together with after_enum_option."
        }
      }
    }
  ]
}
object Error
{
  "type": "object",
  "properties": {
    "help": {
      "type": "string",
      "example": "For more information on API status codes and how to handle them, read the docs on errors: https://asana.github.io/developer-docs/#errors'",
      "readOnly": true,
      "description": "Additional information directing developers to resources on how to address and fix the problem, if available."
    },
    "phrase": {
      "type": "string",
      "example": "6 sad squid snuggle softly",
      "readOnly": true,
      "description": "*500 errors only*. A unique error phrase which can be used when contacting developer support to help identify the exact occurrence of the problem in Asana’s logs."
    },
    "message": {
      "type": "string",
      "example": "project: Missing input",
      "readOnly": true,
      "description": "Message providing more detail about the error that occurred, if available."
    }
  }
}
object ErrorResponse
{
  "type": "object",
  "properties": {
    "errors": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Error"
      }
    }
  },
  "description": "Sadly, sometimes requests to the API are not successful. Failures can\noccur for a wide range of reasons. In all cases, the API should return\nan HTTP Status Code that indicates the nature of the failure,\nwith a response body in JSON format containing additional information.\n\n\nIn the event of a server error the response body will contain an error\nphrase. These phrases are automatically generated using the\n[node-asana-phrase\nlibrary](https://github.com/Asana/node-asana-phrase) and can be used by\nAsana support to quickly look up the incident that caused the server\nerror."
}
object EventResponse
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "example": "task",
      "readOnly": true,
      "description": "*Deprecated: Refer to the resource_type of the resource.* The type of the resource that generated the event."
    },
    "user": {
      "allOf": [
        {
          "$ref": "#/components/schemas/UserCompact"
        },
        {
          "description": "The user who triggered the event."
        }
      ]
    },
    "action": {
      "type": "string",
      "example": "changed",
      "readOnly": true,
      "description": "The type of action taken on the **resource** that triggered the event.  This can be one of `changed`, `added`, `removed`, `deleted`, or `undeleted` depending on the nature of the event."
    },
    "change": {
      "type": "object",
      "readOnly": true,
      "properties": {
        "field": {
          "type": "string",
          "example": "assignee",
          "readOnly": true,
          "description": "The name of the field that has changed in the resource."
        },
        "action": {
          "type": "string",
          "example": "changed",
          "readOnly": true,
          "description": "The type of action taken on the **field** which has been changed.  This can be one of `changed`, `added`, or `removed` depending on the nature of the change."
        },
        "new_value": {
          "example": {
            "gid": "12345",
            "resource_type": "user"
          },
          "description": "*Conditional.* This property is only present when the value of the event's `change.action` is `changed` _and_ the `new_value` is an Asana resource. This will be only the `gid` and `resource_type` of the resource when the events come from webhooks; this will be the compact representation (and can have fields expanded with [opt_fields](https://raw.githubusercontent.com)) when using the [get events](https://raw.githubusercontent.com) endpoint."
        },
        "added_value": {
          "example": {
            "gid": "12345",
            "resource_type": "user"
          },
          "description": "*Conditional.* This property is only present when the value of the event's `change.action` is `added` _and_ the `added_value` is an Asana resource. This will be only the `gid` and `resource_type` of the resource when the events come from webhooks; this will be the compact representation (and can have fields expanded with [opt_fields](https://raw.githubusercontent.com)) when using the [get events](https://raw.githubusercontent.com) endpoint."
        },
        "removed_value": {
          "example": {
            "gid": "12345",
            "resource_type": "user"
          },
          "description": "*Conditional.* This property is only present when the value of the event's `change.action` is `removed` _and_ the `removed_value` is an Asana resource. This will be only the `gid` and `resource_type` of the resource when the events come from webhooks; this will be the compact representation (and can have fields expanded with [opt_fields](https://raw.githubusercontent.com)) when using the [get events](https://raw.githubusercontent.com) endpoint."
        }
      },
      "description": "Information about the type of change that has occurred. This field is only present when the value of the property `action`, describing the action taken on the **resource**, is `changed`."
    },
    "parent": {
      "allOf": [
        {
          "$ref": "#/components/schemas/AsanaNamedResource"
        },
        {
          "description": "For added/removed events, the parent object that resource was added to or removed from. The parent will be `null` for other event types."
        }
      ]
    },
    "resource": {
      "allOf": [
        {
          "$ref": "#/components/schemas/AsanaNamedResource"
        },
        {
          "description": "The resource which has triggered the event by being modified in some way."
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "example": "2012-02-22T02:06:58.147Z",
      "readOnly": true,
      "description": "The timestamp when the event occurred."
    }
  },
  "description": "An *event* is an object representing a change to a resource that was\nobserved by an event subscription or delivered asynchronously to\nthe target location of an active webhook.\n\nThe event may be triggered by a different `user` than the\nsubscriber. For example, if user A subscribes to a task and user B\nmodified it, the event’s user will be user B. Note: Some events\nare generated by the system, and will have `null` as the user. API\nconsumers should make sure to handle this case.\n\nThe `resource` that triggered the event may be different from the one\nthat the events were requested for or the webhook is subscribed to. For\nexample, a subscription to a project will contain events for tasks\ncontained within the project.\n\n**Note:** pay close attention to the relationship between the fields\n`Event.action` and `Event.change.action`.\n`Event.action` represents the action taken on the resource\nitself, and `Event.change.action` represents how the information\nwithin the resource's fields have been modified.\n\nFor instance, consider these scenarios:\n\n\n* When at task is added to a project, `Event.action` will be\n`added`, `Event.parent` will be an object with the `id` and\n`type` of the project, and there will be no `change` field.\n\n\n* When an assignee is set on the task, `Event.parent` will be\n`null`, `Event.action` will be `changed`,\n`Event.change.action` will be `changed`, and `new_value` will\nbe an object with the user's `id` and `type`.\n\n\n* When a collaborator is added to the task, `Event.parent` will\nbe `null`, `Event.action` will be `changed`,\n`Event.change.action` will be `added`, and `added_value` will be\nan object with the user's `id` and `type`."
}
object EventsGetResourceEvents412Response
{
  "type": "object",
  "properties": {
    "sync": {
      "type": "string",
      "example": "de4774f6915eae04714ca93bb2f5ee81",
      "readOnly": true,
      "description": "A sync token to be used with the next call to the /events endpoint."
    },
    "errors": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "example": "Sync token invalid or too old. If you are attempting to keep resources in sync, you must fetch the full dataset for this query now and use the new sync token for the next sync.",
            "readOnly": true,
            "description": "Message providing more detail about the error that occurred, if available."
          }
        }
      }
    }
  }
}
object EventsGetResourceEventsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/EventResponse"
      }
    },
    "sync": {
      "type": "string",
      "example": "de4774f6915eae04714ca93bb2f5ee81",
      "description": "A sync token to be used with the next call to the /events endpoint."
    },
    "has_more": {
      "type": "boolean",
      "example": true,
      "description": "Indicates whether there are more events to pull."
    }
  },
  "description": "The full record for all events that have occurred since the sync token was created."
}
object GoalAddSubgoalRequest
{
  "type": "object",
  "required": [
    "subgoal"
  ],
  "properties": {
    "subgoal": {
      "type": "string",
      "example": "1331",
      "description": "The goal gid to add as subgoal to a parent goal"
    },
    "insert_after": {
      "type": "string",
      "example": "1331",
      "description": "An id of a subgoal of this parent goal. The new subgoal will be added after the one specified here. `insert_before` and `insert_after` parameters cannot both be specified."
    },
    "insert_before": {
      "type": "string",
      "example": "1331",
      "description": "An id of a subgoal of this parent goal. The new subgoal will be added before the one specified here. `insert_before` and `insert_after` parameters cannot both be specified."
    }
  }
}
object GoalAddSupportingRelationshipRequest
{
  "type": "object",
  "required": [
    "supporting_resource"
  ],
  "properties": {
    "insert_after": {
      "type": "string",
      "example": "1331",
      "description": "An id of a subgoal of this parent goal. The new subgoal will be added after the one specified here. `insert_before` and `insert_after` parameters cannot both be specified. Currently only supported when adding a subgoal."
    },
    "insert_before": {
      "type": "string",
      "example": "1331",
      "description": "An id of a subgoal of this parent goal. The new subgoal will be added before the one specified here. `insert_before` and `insert_after` parameters cannot both be specified. Currently only supported when adding a subgoal."
    },
    "contribution_weight": {
      "type": "number",
      "example": 1,
      "description": "The weight that the supporting resource's progress will contribute to the supported goal's progress. This can only be 0 or 1."
    },
    "supporting_resource": {
      "type": "string",
      "example": "12345",
      "description": "The gid of the supporting resource to add to the parent goal. Must be the gid of a goal, project, task, or portfolio."
    }
  }
}
object GoalAddSupportingWorkRequest
{
  "type": "object",
  "required": [
    "supporting_work"
  ],
  "properties": {
    "supporting_work": {
      "type": "string",
      "example": "1331",
      "description": "The project/task/portfolio gid to add as supporting work for a goal"
    }
  }
}
object GoalBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Grow web traffic by 30%",
          "description": "The name of the goal."
        },
        "liked": {
          "type": "boolean",
          "example": false,
          "description": "True if the goal is liked by the authorized user, false if not."
        },
        "notes": {
          "type": "string",
          "example": "Start building brand awareness.",
          "description": "Free-form textual information associated with the goal (i.e. its description)."
        },
        "due_on": {
          "type": "string",
          "example": "2019-09-15",
          "nullable": true,
          "description": "The localized day on which this goal is due. This takes a date with format `YYYY-MM-DD`."
        },
        "start_on": {
          "type": "string",
          "example": "2019-09-14",
          "nullable": true,
          "description": "The day on which work for this goal begins, or null if the goal has no start date. This takes a date with `YYYY-MM-DD` format, and cannot be set unless there is an accompanying due date."
        },
        "html_notes": {
          "type": "string",
          "example": "<body>Start building brand awareness.</body>",
          "description": "The notes of the goal with formatting as HTML."
        },
        "is_workspace_level": {
          "type": "boolean",
          "example": true,
          "description": "*Conditional*. This property is only present when the `workspace` provided is an organization. Whether the goal belongs to the `workspace` (and is listed as part of the workspace’s goals) or not. If it isn’t a workspace-level goal, it is a team-level goal, and is associated with the goal’s team."
        }
      },
      "x-docs-overrides": {
        "properties.resource_type.example": "goal"
      }
    }
  ]
}
object GoalCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Grow web traffic by 30%",
          "description": "The name of the goal."
        },
        "owner": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "type": "object",
              "nullable": true
            }
          ]
        }
      },
      "x-docs-overrides": {
        "properties.resource_type.example": "goal"
      }
    }
  ]
}
object GoalMembershipBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "goal": {
          "allOf": [
            {
              "$ref": "#/components/schemas/GoalCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "deprecated": true,
              "description": "*Deprecated: new integrations should prefer the `parent` field.* A *Goal* is an object in the goal-tracking system that helps your organization drive measurable results."
            }
          ]
        },
        "role": {
          "enum": [
            "commenter",
            "editor"
          ],
          "type": "string",
          "example": "editor",
          "deprecated": true,
          "description": "*Deprecated: Describes if the member is a commenter or editor in goal.*"
        },
        "member": {
          "$ref": "#/components/schemas/MemberCompact"
        },
        "parent": {
          "allOf": [
            {
              "$ref": "#/components/schemas/GoalCompact"
            },
            {
              "type": "object",
              "readOnly": true
            }
          ]
        },
        "access_level": {
          "enum": [
            "commenter",
            "editor"
          ],
          "type": "string",
          "example": "editor",
          "description": "Describes if member is commenter or editor in goal. This is preferred over role"
        },
        "resource_type": {
          "type": "string",
          "example": "membership",
          "description": "The base type of this resource."
        },
        "resource_subtype": {
          "type": "string",
          "example": "goal_membership",
          "readOnly": true,
          "description": "The type of membership."
        }
      },
      "description": "This object represents a user's connection to a goal.",
      "x-docs-overrides": {
        "properties.resource_type.example": "membership"
      }
    }
  ]
}
object GoalMembershipCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalMembershipBase"
    },
    {
      "type": "object",
      "properties": {
        "is_editor": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "deprecated": true,
          "description": "*Deprecated: new integrations should prefer the `role` field.* Describes if the member is editor in goal."
        },
        "is_commenter": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "deprecated": true,
          "description": "*Deprecated: new integrations should prefer the `role` field.* Describes if the member is comment only in goal."
        }
      }
    }
  ]
}
object GoalMembershipResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalMembershipBase"
    },
    {
      "type": "object",
      "properties": {
        "user": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "deprecated": true,
              "description": "*Deprecated: new integrations should prefer the `member` field.* A *user* object represents an account in Asana that can be given access to various workspaces, projects, and tasks."
            }
          ]
        },
        "workspace": {
          "allOf": [
            {
              "$ref": "#/components/schemas/WorkspaceCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "deprecated": true,
              "description": "*Deprecated:* A *workspace* is the highest-level organizational unit in Asana. All projects and tasks have an associated workspace."
            }
          ]
        }
      }
    }
  ]
}
object GoalMetricBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "unit": {
          "enum": [
            "none",
            "currency",
            "percentage"
          ],
          "type": "string",
          "description": "A supported unit of measure for the goal metric, or none."
        },
        "precision": {
          "type": "integer",
          "example": 2,
          "description": "*Conditional*. Only relevant for goal metrics of type ‘Number’. This field dictates the number of places after the decimal to round to, i.e. 0 is integer values, 1 rounds to the nearest tenth, and so on. Must be between 0 and 6, inclusive.\nFor percentage format, this may be unintuitive, as a value of 0.25 has a precision of 0, while a value of 0.251 has a precision of 1. This is due to 0.25 being displayed as 25%."
        },
        "currency_code": {
          "type": "string",
          "example": "EUR",
          "nullable": true,
          "description": "ISO 4217 currency code to format this custom field. This will be null if the `unit` is not `currency`."
        },
        "progress_source": {
          "enum": [
            "manual",
            "subgoal_progress",
            "project_task_completion",
            "project_milestone_completion",
            "task_completion",
            "external"
          ],
          "type": "string",
          "example": "manual",
          "description": "This field defines how the progress value of a goal metric is being calculated. A goal's progress can be provided manually by the user, calculated automatically from contributing subgoals, projects, or tasks, or managed by an integration with an external data source, such as Salesforce."
        },
        "resource_subtype": {
          "enum": [
            "number"
          ],
          "type": "string",
          "example": "number",
          "readOnly": true,
          "description": "The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning."
        },
        "target_number_value": {
          "type": "number",
          "example": 10.2,
          "description": "This number is the end value of a goal metric of type number. This number cannot equal `initial_number_value`."
        },
        "current_number_value": {
          "type": "number",
          "example": 8.12,
          "description": "This number is the current value of a goal metric of type number."
        },
        "initial_number_value": {
          "type": "number",
          "example": 5.2,
          "description": "This number is the start value of a goal metric of type number."
        },
        "current_display_value": {
          "type": "string",
          "example": "8.12",
          "readOnly": true,
          "description": "This string is the current value of a goal metric of type string."
        }
      }
    }
  ]
}
object GoalMetricCurrentValueRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "current_number_value": {
          "type": "number",
          "example": 8.12,
          "description": "*Conditional*. This number is the current value of a goal metric of type number."
        }
      }
    }
  ]
}
object GoalRelationshipBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalRelationshipCompact"
    },
    {
      "type": "object",
      "properties": {
        "supported_goal": {
          "allOf": [
            {
              "$ref": "#/components/schemas/GoalCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "The goal that the supporting resource supports."
            }
          ]
        }
      }
    }
  ]
}
object GoalRelationshipCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "resource_subtype": {
          "enum": [
            "subgoal",
            "supporting_work"
          ],
          "type": "string",
          "example": "subgoal",
          "readOnly": true,
          "description": "The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning."
        },
        "contribution_weight": {
          "type": "number",
          "example": 1,
          "description": "The weight that the supporting resource's progress contributes to the supported goal's progress. This can only be 0 or 1."
        },
        "supporting_resource": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "The supporting resource that supports the goal. This can be either a project, task, portfolio, or goal."
            }
          ]
        }
      },
      "description": "A *goal relationship* is an object representing the relationship between a goal and another goal, a project, a task, or a portfolio.",
      "x-docs-overrides": {
        "properties.resource_type.example": "goal_relationship"
      }
    }
  ]
}
object GoalRelationshipRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalRelationshipBase"
    },
    {
      "type": "object"
    }
  ]
}
object GoalRelationshipResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalRelationshipBase"
    },
    {
      "type": "object"
    }
  ]
}
object GoalRelationshipsCreateSupportingRelationshipRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalAddSupportingRelationshipRequest"
    }
  }
}
object GoalRelationshipsCreateSupportingRelationshipResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalRelationshipResponse"
    }
  }
}
object GoalRelationshipsGetCompactRecordsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/GoalRelationshipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object GoalRelationshipsGetRecordByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalRelationshipResponse"
    }
  }
}
object GoalRelationshipsRemoveSupportingRelationshipRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalRemoveSupportingRelationshipRequest"
    }
  }
}
object GoalRelationshipsRemoveSupportingRelationshipResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object GoalRelationshipsUpdateGoalRelationshipRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalRelationshipRequest"
    }
  }
}
object GoalRelationshipsUpdateGoalRelationshipRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalRelationshipResponse"
    }
  }
}
object GoalRemoveSubgoalRequest
{
  "type": "object",
  "required": [
    "subgoal"
  ],
  "properties": {
    "subgoal": {
      "type": "string",
      "example": "1331",
      "description": "The goal gid to remove as subgoal from the parent goal"
    }
  }
}
object GoalRemoveSupportingRelationshipRequest
{
  "type": "object",
  "required": [
    "supporting_resource"
  ],
  "properties": {
    "supporting_resource": {
      "type": "string",
      "example": "12345",
      "description": "The gid of the supporting resource to remove from the parent goal. Must be the gid of a goal, project, task, or portfolio."
    }
  }
}
object GoalRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalRequestBase"
    },
    {
      "type": "object",
      "properties": {
        "followers": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "The `gid` of a user."
          },
          "example": [
            "12345"
          ]
        }
      }
    }
  ]
}
object GoalRequestBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalBase"
    },
    {
      "type": "object",
      "properties": {
        "team": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "description": "*Conditional*. This property is only present when the `workspace` provided is an organization."
        },
        "owner": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "description": "The `gid` of a user."
        },
        "workspace": {
          "type": "string",
          "example": "12345",
          "description": "The `gid` of a workspace."
        },
        "time_period": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "description": "The `gid` of a time period."
        }
      }
    }
  ]
}
object GoalResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalBase"
    },
    {
      "type": "object",
      "properties": {
        "team": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TeamCompact"
            },
            {
              "type": "object",
              "nullable": true,
              "description": "*Conditional*. This property is only present when the `workspace` provided is an organization."
            }
          ]
        },
        "likes": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Like"
          },
          "readOnly": true,
          "description": "Array of likes for users who have liked this goal."
        },
        "owner": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "type": "object",
              "nullable": true
            }
          ]
        },
        "metric": {
          "allOf": [
            {
              "$ref": "#/components/schemas/GoalMetricBase"
            },
            {
              "type": "object",
              "nullable": true,
              "properties": {
                "can_manage": {
                  "type": "boolean",
                  "example": true,
                  "readOnly": true,
                  "description": "*Conditional*. Only relevant for `progress_source` of type `external`. This boolean indicates whether the requester has the ability to update the current value of this metric. This returns `true` if the external metric was created by the requester, `false` otherwise."
                }
              }
            }
          ]
        },
        "status": {
          "type": "string",
          "example": "green",
          "nullable": true,
          "readOnly": true,
          "description": "The current status of this goal. When the goal is open, its status can be `green`, `yellow`, and `red` to reflect \"On Track\", \"At Risk\", and \"Off Track\", respectively. When the goal is closed, the value can be `missed`, `achieved`, `partial`, or `dropped`.\n*Note* you can only write to this property if `metric` is set."
        },
        "followers": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "description": "Array of users who are members of this goal."
        },
        "num_likes": {
          "type": "integer",
          "example": 5,
          "readOnly": true,
          "description": "The number of users who have liked this goal."
        },
        "workspace": {
          "allOf": [
            {
              "$ref": "#/components/schemas/WorkspaceCompact"
            },
            {
              "type": "object"
            }
          ]
        },
        "time_period": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TimePeriodCompact"
            },
            {
              "type": "object",
              "nullable": true
            }
          ]
        },
        "current_status_update": {
          "allOf": [
            {
              "$ref": "#/components/schemas/StatusUpdateCompact"
            },
            {
              "nullable": true,
              "description": "The latest `status_update` posted to this goal."
            }
          ]
        }
      }
    }
  ]
}
object GoalUpdateRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/GoalRequestBase"
    },
    {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "example": "green",
          "nullable": true,
          "description": "The current status of this goal. When the goal is open, its status can be `green`, `yellow`, and `red` to reflect \"On Track\", \"At Risk\", and \"Off Track\", respectively. When the goal is closed, the value can be `missed`, `achieved`, `partial`, or `dropped`.\n*Note* you can only write to this property if `metric` is set."
        }
      }
    }
  ]
}
object GoalsAddCollaboratorsToGoalRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskAddFollowersRequest"
    }
  }
}
object GoalsAddCollaboratorsToGoalResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalResponse"
    }
  }
}
object GoalsCreateMetricRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalMetricBase"
    }
  }
}
object GoalsCreateMetricResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalResponse"
    }
  }
}
object GoalsCreateNewGoalRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalRequest"
    }
  }
}
object GoalsCreateNewGoalRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalResponse"
    }
  }
}
object GoalsDeleteRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object GoalsGetCompactRecordsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/GoalCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object GoalsGetGoalRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalResponse"
    }
  }
}
object GoalsGetParentGoalsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/GoalCompact"
      }
    }
  }
}
object GoalsRemoveFollowersFromGoalRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskAddFollowersRequest"
    }
  }
}
object GoalsRemoveFollowersFromGoalResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalResponse"
    }
  }
}
object GoalsUpdateGoalRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalUpdateRequest"
    }
  }
}
object GoalsUpdateGoalRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalResponse"
    }
  }
}
object GoalsUpdateMetricCurrentValueRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalMetricCurrentValueRequest"
    }
  }
}
object GoalsUpdateMetricCurrentValueResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/GoalResponse"
    }
  }
}
object JobCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "status": {
          "enum": [
            "not_started",
            "in_progress",
            "succeeded",
            "failed"
          ],
          "type": "string",
          "example": "in_progress",
          "readOnly": true,
          "description": "The current status of this job. The value is one of: `not_started`, `in_progress`, `succeeded`, or `failed`."
        },
        "new_task": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TaskCompact"
            },
            {
              "type": "object",
              "nullable": true
            }
          ]
        },
        "new_project": {
          "$ref": "#/components/schemas/ProjectCompact"
        },
        "resource_subtype": {
          "type": "string",
          "example": "duplicate_task",
          "readOnly": true,
          "description": "The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning."
        },
        "new_project_template": {
          "$ref": "#/components/schemas/ProjectTemplateCompact"
        }
      },
      "description": "A *job* is an object representing a process that handles asynchronous work.",
      "x-docs-overrides": {
        "properties.resource_type.example": "job"
      }
    }
  ]
}
object JobsGetByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/JobCompact"
    }
  }
}
object Like
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "12345",
      "readOnly": true,
      "description": "Globally unique identifier of the object, as a string."
    },
    "user": {
      "$ref": "#/components/schemas/UserCompact"
    }
  },
  "description": "An object to represent a user's like."
}
object MemberCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Greg Sanchez",
          "description": "The name of the member"
        },
        "resource_type": {
          "type": "string",
          "example": "user",
          "description": "The type of the member (team or user)"
        }
      },
      "description": "A *member* object represents either a team or user.",
      "x-docs-overrides": {
        "properties.resource_type.example": "member"
      }
    }
  ]
}
object MembershipCompact
{
  "anyOf": [
    {
      "$ref": "#/components/schemas/GoalMembershipCompact"
    },
    {
      "$ref": "#/components/schemas/ProjectMembershipCompactResponse"
    }
  ]
}
object MembershipRequest
{
  "type": "object",
  "properties": {
    "access_level": {
      "type": "string",
      "example": "editor",
      "description": "Sets the access level for the member. Can be `editor` or `commenter`. Projects can have `admin` in addition."
    }
  }
}
object MembershipResponse
{
  "anyOf": [
    {
      "$ref": "#/components/schemas/GoalMembershipResponse"
    },
    {
      "$ref": "#/components/schemas/ProjectMembershipCompactResponse"
    }
  ]
}
object MembershipUpdateRequest
{
  "type": "object",
  "properties": {
    "access_level": {
      "type": "string",
      "example": "editor",
      "description": "The role given to the member. Can be `editor` or `commenter`."
    }
  }
}
object MembershipsCreateNewRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CreateMembershipRequest"
    }
  }
}
object MembershipsCreateNewRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/MembershipResponse",
      "type": "object"
    }
  }
}
object MembershipsDeleteRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object MembershipsGetMembershipRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectMembershipCompactResponse"
    }
  }
}
object MembershipsGetMultipleResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/MembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object MembershipsUpdateMembershipRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/MembershipRequest"
    }
  }
}
object MembershipsUpdateMembershipRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/MembershipResponse"
    }
  }
}
object ModifyDependenciesRequest
{
  "type": "object",
  "example": {
    "dependencies": [
      "133713",
      "184253"
    ]
  },
  "properties": {
    "dependencies": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "An array of task gids that a task depends on."
    }
  }
}
object ModifyDependentsRequest
{
  "type": "object",
  "example": {
    "dependents": [
      "133713",
      "184253"
    ]
  },
  "properties": {
    "dependents": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "An array of task gids that are dependents of the given task."
    }
  },
  "description": "A set of dependent tasks."
}
object NextPage
{
  "type": "object",
  "nullable": true,
  "properties": {
    "uri": {
      "type": "string",
      "format": "uri",
      "example": "https://app.asana.com/api/1.0/tasks/12345/attachments?limit=2&offset=eyJ0eXAiOJiKV1iQLCJhbGciOiJIUzI1NiJ9",
      "readOnly": true,
      "description": "A full uri containing the query parameters to fetch for next_page"
    },
    "path": {
      "type": "string",
      "example": "/tasks/12345/attachments?limit=2&offset=eyJ0eXAiOJiKV1iQLCJhbGciOiJIUzI1NiJ9",
      "readOnly": true,
      "description": "A relative path containing the query parameters to fetch for next_page"
    },
    "offset": {
      "type": "string",
      "example": "eyJ0eXAiOJiKV1iQLCJhbGciOiJIUzI1NiJ9",
      "readOnly": true,
      "description": "Pagination offset for the request."
    }
  },
  "description": "*Conditional*. This property is only present when a limit query parameter is provided in the request. When making a paginated request, the API will return a number of results as specified by the limit parameter. If more results exist, then the response will contain a next_page attribute, which will include an offset, a relative path attribute, and a full uri attribute. If there are no more pages available, next_page will be null and no offset will be provided. Note that an offset token will expire after some time, as data may have changed."
}
object OrganizationExportCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "state": {
          "enum": [
            "pending",
            "started",
            "finished",
            "error"
          ],
          "type": "string",
          "example": "started",
          "readOnly": true,
          "description": "The current state of the export."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "download_url": {
          "type": "string",
          "format": "uri",
          "example": "https://asana-export-us-east-1.s3.us-east-1.amazonaws.com/2563645399633793/domain_export/7588024658887731/download/ domain_export_2563645399633793_7588024658887731_2023018-201726.json.gz?X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Content-Sha256=xxxxxxxx&X-Amz-Date=xxxxxxxx&X-Amz-Expires=300&X-Amz-Security-Token=xxxxxxxx& X-Amz-Signature=xxxxxxxx&X-Amz-SignedHeaders=host&x-id=GetObject#_=_",
          "nullable": true,
          "readOnly": true,
          "description": "Download this URL to retreive the full export of the organization\nin JSON format. It will be compressed in a gzip (.gz) container.\n\n*Note: May be null if the export is still in progress or\nfailed.  If present, this URL may only be valid for 1 hour from\nthe time of retrieval. You should avoid persisting this URL\nsomewhere and rather refresh on demand to ensure you do not keep\nstale URLs.*"
        },
        "organization": {
          "$ref": "#/components/schemas/WorkspaceCompact"
        }
      },
      "description": "An *organization_export* object represents a request to export the complete data of an Organization in JSON format.",
      "x-docs-overrides": {
        "properties.resource_type.example": "organization_export"
      }
    }
  ]
}
object OrganizationExportRequest
{
  "type": "object",
  "properties": {
    "organization": {
      "type": "string",
      "example": "1331",
      "description": "Globally unique identifier for the workspace or organization."
    }
  },
  "description": "An *organization_export* request starts a job to export the complete data of the given Organization."
}
object OrganizationExportsCreateExportRequestRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/OrganizationExportRequest"
    }
  }
}
object OrganizationExportsCreateExportRequestResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/OrganizationExportCompact"
    }
  }
}
object OrganizationExportsGetExportDetailsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/OrganizationExportCompact"
    }
  }
}
object PortfolioAddItemRequest
{
  "type": "object",
  "required": [
    "item"
  ],
  "properties": {
    "item": {
      "type": "string",
      "example": "1331",
      "description": "The item to add to the portfolio."
    },
    "insert_after": {
      "type": "string",
      "example": "1331",
      "description": "An id of an item in this portfolio. The new item will be added after the one specified here. `insert_before` and `insert_after` parameters cannot both be specified."
    },
    "insert_before": {
      "type": "string",
      "example": "1331",
      "description": "An id of an item in this portfolio. The new item will be added before the one specified here. `insert_before` and `insert_after` parameters cannot both be specified."
    }
  }
}
object PortfolioBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/PortfolioCompact"
    },
    {
      "type": "object",
      "properties": {
        "color": {
          "enum": [
            "dark-pink",
            "dark-green",
            "dark-blue",
            "dark-red",
            "dark-teal",
            "dark-brown",
            "dark-orange",
            "dark-purple",
            "dark-warm-gray",
            "light-pink",
            "light-green",
            "light-blue",
            "light-red",
            "light-teal",
            "light-brown",
            "light-orange",
            "light-purple",
            "light-warm-gray"
          ],
          "type": "string",
          "example": "light-green",
          "description": "Color of the portfolio."
        }
      }
    }
  ]
}
object PortfolioCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Bug Portfolio",
          "description": "The name of the portfolio."
        }
      },
      "description": "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 [project status](https://raw.githubusercontent.com) update.\nPortfolios have some restrictions on size. Each portfolio has a max of 500 items and, like projects, a max of 20 custom fields.",
      "x-docs-overrides": {
        "properties.resource_type.example": "portfolio"
      }
    }
  ]
}
object PortfolioMembershipCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "user": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "portfolio": {
          "$ref": "#/components/schemas/PortfolioCompact",
          "description": "[Opt In](https://raw.githubusercontent.com). The portfolio the user is a member of."
        }
      },
      "description": "This object determines if a user is a member of a portfolio.",
      "x-docs-overrides": {
        "properties.resource_type.example": "portfolio_membership"
      }
    }
  ]
}
object PortfolioMembershipsGetCompactResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/PortfolioMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object PortfolioMembershipsGetCompleteRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioMembershipCompact"
    }
  }
}
object PortfolioMembershipsListMultipleMembershipsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/PortfolioMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object PortfolioRemoveItemRequest
{
  "type": "object",
  "required": [
    "item"
  ],
  "properties": {
    "item": {
      "type": "string",
      "example": "1331",
      "description": "The item to remove from the portfolio."
    }
  }
}
object PortfolioRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/PortfolioBase"
    },
    {
      "type": "object",
      "properties": {
        "public": {
          "type": "boolean",
          "example": false,
          "description": "True if the portfolio is public to its workspace members."
        },
        "members": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Gid of an object."
          },
          "example": [
            "52164",
            "15363"
          ],
          "readOnly": true,
          "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
        },
        "workspace": {
          "type": "string",
          "example": "167589",
          "description": "Gid of an object."
        }
      }
    }
  ]
}
object PortfolioResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/PortfolioBase"
    },
    {
      "type": "object",
      "properties": {
        "owner": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "due_on": {
          "type": "string",
          "format": "date",
          "example": "2019-09-15",
          "nullable": true,
          "description": "The localized day on which this portfolio is due. This takes a date with format YYYY-MM-DD."
        },
        "public": {
          "type": "boolean",
          "example": false,
          "description": "True if the portfolio is public to its workspace members."
        },
        "members": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "readOnly": true
        },
        "start_on": {
          "type": "string",
          "format": "date",
          "example": "2019-09-14",
          "nullable": true,
          "description": "The day on which work for this portfolio begins, or null if the portfolio has no start date. This takes a date with `YYYY-MM-DD` format. *Note: `due_on` must be present in the request when setting or unsetting the `start_on` parameter. Additionally, `start_on` and `due_on` cannot be the same date.*"
        },
        "workspace": {
          "allOf": [
            {
              "$ref": "#/components/schemas/WorkspaceCompact"
            },
            {
              "type": "object",
              "description": "*Create-only*. The workspace or organization that the portfolio belongs to."
            }
          ]
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "created_by": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "custom_fields": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CustomFieldCompact"
          },
          "description": "Array of Custom Fields."
        },
        "permalink_url": {
          "type": "string",
          "example": "https://app.asana.com/0/resource/123456789/list",
          "readOnly": true,
          "description": "A url that points directly to the object within Asana."
        },
        "project_templates": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ProjectTemplateCompact"
          },
          "readOnly": true,
          "description": "Array of project templates that are in the portfolio"
        },
        "current_status_update": {
          "allOf": [
            {
              "$ref": "#/components/schemas/StatusUpdateCompact"
            },
            {
              "nullable": true,
              "description": "The latest `status_update` posted to this portfolio."
            }
          ]
        },
        "custom_field_settings": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CustomFieldSettingResponse"
          },
          "description": "Array of custom field settings applied to the portfolio."
        }
      }
    }
  ]
}
object PortfoliosAddCustomFieldSettingRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AddCustomFieldSettingRequest"
    }
  }
}
object PortfoliosAddCustomFieldSettingResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CustomFieldSettingResponse"
    }
  }
}
object PortfoliosAddMembersToPortfolioRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AddMembersRequest"
    }
  }
}
object PortfoliosAddMembersToPortfolioResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioResponse"
    }
  }
}
object PortfoliosAddPortfolioItemRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioAddItemRequest"
    }
  }
}
object PortfoliosAddPortfolioItemResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object PortfoliosCreateNewPortfolioRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioRequest"
    }
  }
}
object PortfoliosCreateNewPortfolioRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioResponse"
    }
  }
}
object PortfoliosDeleteRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object PortfoliosGetItemsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object PortfoliosGetRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioResponse"
    }
  }
}
object PortfoliosListMultiplePortfoliosResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/PortfolioCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object PortfoliosRemoveCustomFieldSettingRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/RemoveCustomFieldSettingRequest"
    }
  }
}
object PortfoliosRemoveCustomFieldSettingResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object PortfoliosRemoveItemFromPortfolioRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioRemoveItemRequest"
    }
  }
}
object PortfoliosRemoveItemFromPortfolioResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object PortfoliosRemoveMembersFromPortfolioRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/RemoveMembersRequest"
    }
  }
}
object PortfoliosRemoveMembersFromPortfolioResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioResponse"
    }
  }
}
object PortfoliosUpdatePortfolioRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioRequest"
    }
  }
}
object PortfoliosUpdatePortfolioRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/PortfolioResponse"
    }
  }
}
object Preview
{
  "type": "object",
  "readOnly": true,
  "properties": {
    "text": {
      "type": "string",
      "example": "Great! I like this idea.",
      "description": "Text for the body of the preview."
    },
    "title": {
      "type": "string",
      "example": "Greg",
      "description": "Text to display as the title."
    },
    "footer": {
      "type": "string",
      "example": "Mar 17, 2019 1:25 PM",
      "description": "Text to display in the footer."
    },
    "header": {
      "type": "string",
      "example": "Asana for Slack",
      "description": "Text to display in the header."
    },
    "fallback": {
      "type": "string",
      "example": "Greg: Great! I like this idea.\\n\\nhttps//a_company.slack.com/archives/ABCDEFG/12345678",
      "description": "Some fallback text to display if unable to display the full preview."
    },
    "html_text": {
      "type": "string",
      "example": "<body>Great! I like this idea.</body>",
      "description": "HTML formatted text for the body of the preview."
    },
    "title_link": {
      "type": "string",
      "example": "https://asana.slack.com/archives/ABCDEFG/12345678",
      "description": "Where to title will link to."
    },
    "header_link": {
      "type": "string",
      "example": "https://asana.comn/apps/slack",
      "description": "Where the header will link to."
    }
  },
  "description": "A collection of rich text that will be displayed as a preview to another app.\n\nThis is read-only except for a small group of whitelisted apps."
}
object ProjectBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectCompact"
    },
    {
      "type": "object",
      "properties": {
        "color": {
          "enum": [
            "dark-pink",
            "dark-green",
            "dark-blue",
            "dark-red",
            "dark-teal",
            "dark-brown",
            "dark-orange",
            "dark-purple",
            "dark-warm-gray",
            "light-pink",
            "light-green",
            "light-blue",
            "light-red",
            "light-teal",
            "light-brown",
            "light-orange",
            "light-purple",
            "light-warm-gray",
            "none",
            null
          ],
          "type": "string",
          "example": "light-green",
          "nullable": true,
          "description": "Color of the project."
        },
        "notes": {
          "type": "string",
          "example": "These are things we need to purchase.",
          "description": "Free-form textual information associated with the project (ie., its description)."
        },
        "due_on": {
          "type": "string",
          "format": "date",
          "example": "2019-09-15",
          "nullable": true,
          "description": "The day on which this project is due. This takes a date with format YYYY-MM-DD."
        },
        "public": {
          "type": "boolean",
          "example": false,
          "deprecated": true,
          "description": "*Deprecated:* new integrations use `privacy_setting` instead."
        },
        "members": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "readOnly": true,
          "description": "Array of users who are members of this project."
        },
        "archived": {
          "type": "boolean",
          "example": false,
          "description": "True if the project is archived, false if not. Archived projects do not show in the UI by default and may be treated differently for queries."
        },
        "due_date": {
          "type": "string",
          "format": "date",
          "example": "2019-09-15",
          "nullable": true,
          "description": "*Deprecated: new integrations should prefer the `due_on` field.*"
        },
        "start_on": {
          "type": "string",
          "format": "date",
          "example": "2019-09-14",
          "nullable": true,
          "description": "The day on which work for this project begins, or null if the project has no start date. This takes a date with `YYYY-MM-DD` format. *Note: `due_on` or `due_at` must be present in the request when setting or unsetting the `start_on` parameter. Additionally, `start_on` and `due_on` cannot be the same date.*"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "html_notes": {
          "type": "string",
          "example": "<body>These are things we need to purchase.</body>",
          "description": "[Opt In](https://raw.githubusercontent.com). The notes of the project with formatting as HTML."
        },
        "modified_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this project was last modified.\n*Note: This does not currently reflect any changes in associations such as tasks or comments that may have been added or removed from the project.*"
        },
        "default_view": {
          "enum": [
            "list",
            "board",
            "calendar",
            "timeline"
          ],
          "type": "string",
          "example": "calendar",
          "description": "The default view (list, board, calendar, or timeline) of a project."
        },
        "current_status": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectStatusResponse"
            },
            {
              "type": "object",
              "nullable": true,
              "description": "*Deprecated: new integrations should prefer the `current_status_update` resource.*"
            }
          ]
        },
        "privacy_setting": {
          "enum": [
            "public_to_workspace",
            "private_to_team",
            "private"
          ],
          "type": "string",
          "example": "public_to_workspace",
          "description": "The privacy setting of the project. *Note: Administrators in your organization may restrict the values of `privacy_setting`.*"
        },
        "default_access_level": {
          "enum": [
            "admin",
            "editor",
            "commenter",
            "viewer"
          ],
          "type": "string",
          "example": "admin",
          "description": "The default access for users or teams who join or are added as members to the project."
        },
        "current_status_update": {
          "allOf": [
            {
              "$ref": "#/components/schemas/StatusUpdateCompact"
            },
            {
              "type": "object",
              "nullable": true,
              "description": "The latest `status_update` posted to this project."
            }
          ]
        },
        "custom_field_settings": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CustomFieldSettingResponse"
          },
          "readOnly": true,
          "description": "Array of Custom Field Settings (in compact form)."
        },
        "minimum_access_level_for_sharing": {
          "enum": [
            "admin",
            "editor"
          ],
          "type": "string",
          "example": "admin",
          "description": "The minimum access level needed for project members to share the project and manage project memberships."
        },
        "minimum_access_level_for_customization": {
          "enum": [
            "admin",
            "editor"
          ],
          "type": "string",
          "example": "admin",
          "description": "The minimum access level needed for project members to modify this project's workflow and appearance."
        }
      }
    }
  ]
}
object ProjectBriefBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectBriefCompact"
    },
    {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "example": "Stuff to buy — Project Brief",
          "description": "The title of the project brief."
        },
        "html_text": {
          "type": "string",
          "example": "<body>This is a <strong>project brief</strong>.</body>",
          "description": "HTML formatted text for the project brief."
        }
      }
    }
  ]
}
object ProjectBriefCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "description": "A *Project Brief* allows you to explain the what and why of the project to your team.",
      "x-docs-overrides": {
        "properties.resource_type.example": "project_brief"
      }
    }
  ]
}
object ProjectBriefRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectBriefBase"
    },
    {
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "example": "This is a project brief.",
          "description": "The plain text of the project brief. When writing to a project brief, you can specify either `html_text` (preferred) or `text`, but not both."
        }
      }
    }
  ]
}
object ProjectBriefResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectBriefBase"
    },
    {
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "example": "This is a project brief.",
          "description": "[Opt In](https://raw.githubusercontent.com). The plain text of the project brief."
        },
        "project": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectCompact"
            },
            {
              "type": "object",
              "description": "The project with which this project brief is associated."
            }
          ]
        },
        "permalink_url": {
          "type": "string",
          "example": "https://app.asana.com/0/11111111/22222222",
          "readOnly": true,
          "description": "A url that points directly to the object within Asana."
        }
      }
    }
  ]
}
object ProjectBriefsCreateNewRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectBriefRequest"
    }
  }
}
object ProjectBriefsCreateNewRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectBriefResponse"
    }
  }
}
object ProjectBriefsGetFullRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectBriefResponse"
    }
  }
}
object ProjectBriefsRemoveBriefResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object ProjectBriefsUpdateBriefRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectBriefRequest"
    }
  }
}
object ProjectBriefsUpdateBriefRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectBriefResponse"
    }
  }
}
object ProjectCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Stuff to buy",
          "description": "Name of the project. This is generally a short sentence fragment that fits on a line in the UI for maximum readability. However, it can be longer."
        }
      },
      "description": "A *project* represents a prioritized list of tasks in Asana or a board with columns of tasks represented as cards. It exists in a single workspace or organization and is accessible to a subset of users in that workspace or organization, depending on its permissions.",
      "x-docs-overrides": {
        "properties.resource_type.example": "project"
      }
    }
  ]
}
object ProjectDuplicateRequest
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "example": "New Project Name",
      "description": "The name of the new project."
    },
    "team": {
      "type": "string",
      "example": "12345",
      "description": "Sets the team of the new project. If team is not defined, the new project will be in the same team as the the original project."
    },
    "include": {
      "type": "string",
      "example": [
        "allocations,members,notes,forms,task_notes,task_assignee,task_subtasks,task_attachments,task_dates,task_dependencies,task_followers,task_tags,task_projects"
      ],
      "pattern": "([allocations|members|notes|forms|task_notes|task_assignee|task_subtasks|task_attachments|task_dates|task_dependencies|task_followers|task_tags|task_projects])(,\\1)*",
      "description": "A comma-separated list of elements that will be duplicated to the new project. Tasks are always included.\n##### Fields\n- allocations\n- forms\n- members\n- notes\n- task_assignee\n- task_attachments\n- task_dates\n- task_dependencies\n- task_followers\n- task_notes\n- task_projects\n- task_subtasks\n- task_tags"
    },
    "schedule_dates": {
      "type": "object",
      "required": [
        "should_skip_weekends"
      ],
      "properties": {
        "due_on": {
          "type": "string",
          "example": "2019-05-21",
          "description": "Sets the last due date in the duplicated project to the given date. The rest of the due dates will be offset by the same amount as the due dates in the original project."
        },
        "start_on": {
          "type": "string",
          "example": "2019-05-21",
          "description": "Sets the first start date in the duplicated project to the given date. The rest of the start dates will be offset by the same amount as the start dates in the original project."
        },
        "should_skip_weekends": {
          "type": "boolean",
          "example": true,
          "description": "Determines if the auto-shifted dates should skip weekends."
        }
      },
      "description": "A dictionary of options to auto-shift dates. `task_dates` must be included to use this option. Requires either `start_on` or `due_on`, but not both."
    }
  }
}
object ProjectMembershipCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "member": {
          "$ref": "#/components/schemas/MemberCompact",
          "description": "Member can be a user or a team."
        },
        "parent": {
          "$ref": "#/components/schemas/ProjectCompact",
          "description": "[Opt In](https://raw.githubusercontent.com). The project the user is a member of."
        },
        "access_level": {
          "enum": [
            "admin",
            "editor",
            "commenter",
            "viewer"
          ],
          "type": "string",
          "example": "admin",
          "readOnly": true,
          "description": "Whether the member has admin, editor, commenter, or viewer access to the project."
        }
      },
      "description": "This object describes a team or a user's membership to a project including their level of access (Admin, Editor, Commenter, or Viewer).",
      "x-docs-overrides": {
        "properties.resource_type.example": "project_membership"
      }
    }
  ]
}
object ProjectMembershipCompactResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectMembershipCompact"
    },
    {
      "type": "object",
      "properties": {
        "resource_type": {
          "type": "string",
          "example": "membership",
          "description": "The base type of this resource."
        },
        "resource_subtype": {
          "type": "string",
          "example": "project_membership",
          "description": "Type of the membership."
        }
      }
    }
  ]
}
object ProjectMembershipNormalResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectMembershipCompact"
    },
    {
      "type": "object",
      "properties": {
        "user": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "project": {
          "$ref": "#/components/schemas/ProjectCompact",
          "description": "[Opt In](https://raw.githubusercontent.com). The project the user is a member of."
        },
        "write_access": {
          "enum": [
            "full_write",
            "comment_only"
          ],
          "type": "string",
          "example": "full_write",
          "readOnly": true,
          "description": "Whether the member has full access or comment-only access to the project."
        },
        "resource_type": {
          "type": "string",
          "example": "project_membership",
          "description": "The base type of this resource."
        }
      }
    }
  ]
}
object ProjectMembershipsGetCompactRecordsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectMembershipsGetRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectMembershipNormalResponse"
    }
  }
}
object ProjectRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectBase"
    },
    {
      "type": "object",
      "properties": {
        "team": {
          "type": "string",
          "example": "12345",
          "description": "The team that this project is shared with."
        },
        "owner": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "description": "The current owner of the project, may be null."
        },
        "followers": {
          "type": "string",
          "example": 1234523456,
          "description": "*Create-only*. Comma separated string of users. Followers are a subset of members who have opted in to receive \"tasks added\" notifications for a project."
        },
        "workspace": {
          "type": "string",
          "example": "12345",
          "description": "The `gid` of a workspace."
        },
        "custom_fields": {
          "type": "object",
          "example": {
            "4578152156": "Not Started",
            "5678904321": "On Hold"
          },
          "description": "An object where each key is the GID of a custom field and its corresponding value is either an enum GID, string, number, or object (depending on the custom field type). See the [custom fields guide](https://raw.githubusercontent.com) for details on creating and updating custom field values.",
          "additionalProperties": {
            "type": "string",
            "description": "\"{custom_field_gid}\" => Value (can be text, a number, etc.). For date, use format \"YYYY-MM-DD\" (e.g., 2019-09-15). For date-time, use ISO 8601 date string in UTC (e.g., 2019-09-15T02:06:58.147Z)."
          }
        }
      }
    }
  ]
}
object ProjectResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectBase"
    },
    {
      "type": "object",
      "properties": {
        "icon": {
          "enum": [
            "list",
            "board",
            "timeline",
            "calendar",
            "rocket",
            "people",
            "graph",
            "star",
            "bug",
            "light_bulb",
            "globe",
            "gear",
            "notebook",
            "computer",
            "check",
            "target",
            "html",
            "megaphone",
            "chat_bubbles",
            "briefcase",
            "page_layout",
            "mountain_flag",
            "puzzle",
            "presentation",
            "line_and_symbols",
            "speed_dial",
            "ribbon",
            "shoe",
            "shopping_basket",
            "map",
            "ticket",
            "coins"
          ],
          "type": "string",
          "example": "chat_bubbles",
          "nullable": true,
          "description": "The icon for a project."
        },
        "team": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TeamCompact"
            },
            {
              "type": "object",
              "description": "The team that this project is shared with."
            }
          ]
        },
        "owner": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "type": "object",
              "nullable": true
            }
          ],
          "description": "The current owner of the project, may be null."
        },
        "completed": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "True if the project is currently marked complete, false if not."
        },
        "followers": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "readOnly": true,
          "description": "Array of users following this project. Followers are a subset of members who have opted in to receive \"tasks added\" notifications for a project."
        },
        "workspace": {
          "allOf": [
            {
              "$ref": "#/components/schemas/WorkspaceCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "*Create-only*. The workspace or organization this project is associated with. Once created, projects cannot be moved to a different workspace. This attribute can only be specified at creation time. If the workspace for your project is an organization, you must also supply a `team` in the request body."
            }
          ]
        },
        "completed_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "nullable": true,
          "readOnly": true,
          "description": "The time at which this project was completed, or null if the project is not completed."
        },
        "completed_by": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "nullable": true,
              "readOnly": true,
              "description": "The user that marked this project complete, or null if the project is not completed."
            }
          ]
        },
        "custom_fields": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CustomFieldCompact"
          },
          "readOnly": true,
          "description": "Array of Custom Fields."
        },
        "permalink_url": {
          "type": "string",
          "example": "https://app.asana.com/0/resource/123456789/list",
          "readOnly": true,
          "description": "A url that points directly to the object within Asana."
        },
        "project_brief": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectBriefCompact"
            },
            {
              "type": "object",
              "nullable": true,
              "description": "[Opt In](https://raw.githubusercontent.com). The project brief associated with this project."
            }
          ]
        },
        "created_from_template": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectTemplateCompact"
            },
            {
              "type": "object",
              "nullable": true,
              "description": "[Opt In](https://raw.githubusercontent.com). The project template from which this project was created. If the project was not created from a template, this field will be null."
            }
          ]
        }
      }
    }
  ]
}
object ProjectSaveAsTemplateRequest
{
  "type": "object",
  "required": [
    "name",
    "public"
  ],
  "properties": {
    "name": {
      "type": "string",
      "example": "New Project Template",
      "description": "The name of the new project template."
    },
    "team": {
      "type": "string",
      "example": "12345",
      "description": "Sets the team of the new project template. If the project exists in an organization, specify team and not workspace."
    },
    "public": {
      "type": "boolean",
      "example": true,
      "description": "Sets the project template to public to its team."
    },
    "workspace": {
      "type": "string",
      "example": "12345",
      "description": "Sets the workspace of the new project template. Only specify workspace if the project exists in a workspace."
    }
  }
}
object ProjectSectionInsertRequest
{
  "type": "object",
  "required": [
    "section"
  ],
  "properties": {
    "section": {
      "type": "string",
      "example": "321654",
      "description": "The section to reorder."
    },
    "after_section": {
      "type": "string",
      "example": "987654",
      "description": "Insert the given section immediately after the section specified by this parameter."
    },
    "before_section": {
      "type": "string",
      "example": "86420",
      "description": "Insert the given section immediately before the section specified by this parameter."
    }
  }
}
object ProjectStatusBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectStatusCompact"
    },
    {
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "example": "The project is moving forward according to plan...",
          "description": "The text content of the status update."
        },
        "color": {
          "enum": [
            "green",
            "yellow",
            "red",
            "blue",
            "complete"
          ],
          "type": "string",
          "description": "The color associated with the status update."
        },
        "html_text": {
          "type": "string",
          "example": "<body>The project <strong>is</strong> moving forward according to plan...</body>",
          "description": "[Opt In](https://raw.githubusercontent.com). The text content of the status update with formatting as HTML."
        }
      }
    }
  ]
}
object ProjectStatusCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "example": "Status Update - Jun 15",
          "description": "The title of the project status update."
        }
      },
      "description": "*Deprecated: new integrations should prefer the `status_update` resource.*\nA *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, and \"red\" for projects that are behind.",
      "x-docs-overrides": {
        "properties.resource_type.example": "project_status"
      }
    }
  ]
}
object ProjectStatusResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectStatusBase"
    },
    {
      "type": "object",
      "properties": {
        "author": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "created_by": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "modified_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this project status was last modified.\n*Note: This does not currently reflect any changes in associations such as comments that may have been added or removed from the project status.*"
        }
      }
    }
  ]
}
object ProjectStatusesCreateNewStatusUpdateRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectStatusBase"
    }
  }
}
object ProjectStatusesCreateNewStatusUpdateRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectStatusResponse"
    }
  }
}
object ProjectStatusesDeleteSpecificStatusUpdateResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object ProjectStatusesGetProjectUpdatesResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectStatusCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectStatusesGetStatusUpdateRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectStatusResponse"
    }
  }
}
object ProjectTemplateBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectTemplateCompact"
    },
    {
      "type": "object",
      "properties": {
        "team": {
          "$ref": "#/components/schemas/TeamCompact"
        },
        "color": {
          "enum": [
            "dark-pink",
            "dark-green",
            "dark-blue",
            "dark-red",
            "dark-teal",
            "dark-brown",
            "dark-orange",
            "dark-purple",
            "dark-warm-gray",
            "light-pink",
            "light-green",
            "light-blue",
            "light-red",
            "light-teal",
            "light-brown",
            "light-orange",
            "light-purple",
            "light-warm-gray",
            null
          ],
          "type": "string",
          "example": "light-green",
          "nullable": true,
          "description": "Color of the project template."
        },
        "owner": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "type": "object",
              "nullable": true
            }
          ],
          "description": "The current owner of the project template, may be null."
        },
        "public": {
          "type": "boolean",
          "example": false,
          "description": "True if the project template is public to its team."
        },
        "description": {
          "type": "string",
          "example": "These are things we need to pack for a trip.",
          "description": "Free-form textual information associated with the project template"
        },
        "requested_dates": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/DateVariableCompact"
          },
          "readOnly": true,
          "description": "Array of date variables in this project template. Calendar dates must be provided for these variables when instantiating a project."
        },
        "requested_roles": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/TemplateRole"
          },
          "description": "Array of template roles in this project template. User Ids can be provided for these variables when instantiating a project to assign template tasks to the user."
        },
        "html_description": {
          "type": "string",
          "example": "<body>These are things we need to pack for a trip.</body>",
          "description": "The description of the project template with formatting as HTML."
        }
      },
      "x-konfig-properties": {}
    }
  ]
}
object ProjectTemplateCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Packing list",
          "description": "Name of the project template."
        }
      },
      "description": "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.",
      "x-docs-overrides": {
        "properties.resource_type.example": "project_template"
      }
    }
  ]
}
object ProjectTemplateInstantiateProjectRequest
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "example": "New Project Name",
      "description": "The name of the new project."
    },
    "team": {
      "type": "string",
      "example": "12345",
      "description": "*Optional*. Sets the team of the new project. If the project template exists in an _organization_, you may specify a value for `team`. If no value is provided then it defaults to the same team as the project template."
    },
    "public": {
      "type": "boolean",
      "example": true,
      "description": "Sets the project to public to its team."
    },
    "is_strict": {
      "type": "boolean",
      "example": true,
      "description": "*Optional*. If set to `true`, the endpoint returns an \"Unprocessable Entity\" error if you fail to provide a calendar date value for any date variable. If set to `false`, a default date is used for each unfulfilled date variable (e.g., the current date is used as the Start Date of a project)."
    },
    "requested_dates": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/DateVariableRequest"
      },
      "description": "Array of mappings of date variables to calendar dates."
    },
    "requested_roles": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/RequestedRoleRequest"
      },
      "description": "Array of mappings of template roles to user ids"
    }
  }
}
object ProjectTemplatesDeleteTemplateRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object ProjectTemplatesGetAllTemplateRecordsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectTemplateCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectTemplatesGetRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectTemplateBase"
    }
  }
}
object ProjectTemplatesInstantiateProjectJobRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectTemplateInstantiateProjectRequest"
    }
  }
}
object ProjectTemplatesInstantiateProjectJobResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/JobCompact"
    }
  }
}
object ProjectTemplatesListMultipleResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectTemplateCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectUpdateRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/ProjectBase"
    },
    {
      "type": "object",
      "properties": {
        "team": {
          "type": "string",
          "example": "12345",
          "description": "The team that this project is shared with."
        },
        "owner": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "description": "The current owner of the project, may be null."
        },
        "followers": {
          "type": "string",
          "example": 1234523456,
          "description": "*Create-only*. Comma separated string of users. Followers are a subset of members who have opted in to receive \"tasks added\" notifications for a project."
        },
        "custom_fields": {
          "type": "object",
          "example": {
            "4578152156": "Not Started",
            "5678904321": "On Hold"
          },
          "description": "An object where each key is the GID of a custom field and its corresponding value is either an enum GID, string, number, or object (depending on the custom field type). See the [custom fields guide](https://raw.githubusercontent.com) for details on creating and updating custom field values.",
          "additionalProperties": {
            "type": "string",
            "description": "\"{custom_field_gid}\" => Value (can be text, a number, etc.). For date, use format \"YYYY-MM-DD\" (e.g., 2019-09-15). For date-time, use ISO 8601 date string in UTC (e.g., 2019-09-15T02:06:58.147Z)."
          }
        }
      }
    }
  ]
}
object ProjectsAddCustomFieldSettingRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AddCustomFieldSettingRequest"
    }
  }
}
object ProjectsAddCustomFieldSettingResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CustomFieldSettingResponse"
    }
  }
}
object ProjectsAddFollowersToProjectRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AddFollowersRequest"
    }
  }
}
object ProjectsAddFollowersToProjectResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsAddMembersToProjectRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/AddMembersRequest"
    }
  }
}
object ProjectsAddMembersToProjectResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsCreateInWorkspaceRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectRequest"
    }
  }
}
object ProjectsCreateInWorkspaceResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsCreateNewProjectRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectRequest"
    }
  }
}
object ProjectsCreateNewProjectRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsCreateProjectForTeamRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectRequest"
    }
  }
}
object ProjectsCreateProjectForTeamResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsCreateProjectTemplateJobRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectSaveAsTemplateRequest"
    }
  }
}
object ProjectsCreateProjectTemplateJobResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/JobCompact"
    }
  }
}
object ProjectsDeleteProjectByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object ProjectsDuplicateProjectJobRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectDuplicateRequest"
    }
  }
}
object ProjectsDuplicateProjectJobResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/JobCompact"
    }
  }
}
object ProjectsGetAllInWorkspaceResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectsGetProjectRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsGetTaskCountsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskCountResponse"
    }
  }
}
object ProjectsGetTeamProjectsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectsListMultipleResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectsRemoveCustomFieldRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/RemoveCustomFieldSettingRequest"
    }
  }
}
object ProjectsRemoveCustomFieldResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object ProjectsRemoveMembersFromProjectRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/RemoveMembersRequest"
    }
  }
}
object ProjectsRemoveMembersFromProjectResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsRemoveProjectFollowersRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/RemoveFollowersRequest"
    }
  }
}
object ProjectsRemoveProjectFollowersResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object ProjectsTaskProjectsListResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ProjectCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object ProjectsUpdateProjectRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectUpdateRequest"
    }
  }
}
object ProjectsUpdateProjectRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectResponse"
    }
  }
}
object RemoveCustomFieldSettingRequest
{
  "type": "object",
  "required": [
    "custom_field"
  ],
  "properties": {
    "custom_field": {
      "type": "string",
      "example": "14916",
      "description": "The custom field to remove from this portfolio."
    }
  }
}
object RemoveFollowersRequest
{
  "type": "object",
  "required": [
    "followers"
  ],
  "properties": {
    "followers": {
      "type": "string",
      "example": 521621621373,
      "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
    }
  }
}
object RemoveMembersRequest
{
  "type": "object",
  "required": [
    "members"
  ],
  "properties": {
    "members": {
      "type": "string",
      "example": 521621621373,
      "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
    }
  }
}
object RequestedRoleRequest
{
  "type": "object",
  "properties": {
    "gid": {
      "type": "string",
      "example": "1",
      "description": "Globally unique identifier of the template role in the project template."
    },
    "value": {
      "type": "string",
      "example": "123",
      "description": "The user id that should be assigned to the template role."
    }
  }
}
object RuleTriggerRequest
{
  "type": "object",
  "required": [
    "resource",
    "action_data"
  ],
  "properties": {
    "resource": {
      "type": "string",
      "example": "12345",
      "description": "The ID of the resource. For the duration of the beta, this resource is always a task, and this task must exist in the project in which the rule is created."
    },
    "action_data": {
      "type": "object",
      "example": {
        "jira_ticket_id": "123",
        "jira_ticket_name": "Test"
      },
      "description": "The dynamic keys and values of the request. These fields are intended to be used in the action for the rule associated with this trigger.",
      "additionalProperties": true
    }
  }
}
object RuleTriggerResponse
{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "example": "Successfully saved the payload and ran the rule",
      "description": "Message providing more detail about the result"
    }
  }
}
object RulesTriggerRuleRequestRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/RuleTriggerRequest"
    }
  }
}
object RulesTriggerRuleRequestResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/RuleTriggerResponse"
    }
  }
}
object SectionCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Next Actions",
          "description": "The name of the section (i.e. the text displayed as the section header)."
        }
      },
      "description": "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.",
      "x-docs-overrides": {
        "properties.resource_type.example": "section"
      }
    }
  ]
}
object SectionRequest
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "example": "Next Actions",
      "description": "The text to be displayed as the section name. This cannot be an empty string."
    },
    "insert_after": {
      "type": "string",
      "example": "987654",
      "description": "An existing section within this project after which the added section should be inserted. Cannot be provided together with insert_before."
    },
    "insert_before": {
      "type": "string",
      "example": "86420",
      "description": "An existing section within this project before which the added section should be inserted. Cannot be provided together with insert_after."
    }
  }
}
object SectionResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/SectionCompact"
    },
    {
      "type": "object",
      "properties": {
        "project": {
          "$ref": "#/components/schemas/ProjectCompact"
        },
        "projects": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ProjectCompact"
          },
          "readOnly": true,
          "description": "*Deprecated - please use project instead*"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        }
      }
    }
  ]
}
object SectionTaskInsertRequest
{
  "type": "object",
  "required": [
    "task"
  ],
  "properties": {
    "task": {
      "type": "string",
      "example": "123456",
      "description": "The task to add to this section."
    },
    "insert_after": {
      "type": "string",
      "example": "987654",
      "description": "An existing task within this section after which the added task should be inserted. Cannot be provided together with insert_before."
    },
    "insert_before": {
      "type": "string",
      "example": "86420",
      "description": "An existing task within this section before which the added task should be inserted. Cannot be provided together with insert_after."
    }
  }
}
object SectionsAddTaskToSectionRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/SectionTaskInsertRequest"
    }
  }
}
object SectionsAddTaskToSectionResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object SectionsCreateNewSectionRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/SectionRequest"
    }
  }
}
object SectionsCreateNewSectionResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/SectionResponse"
    }
  }
}
object SectionsDeleteSectionResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object SectionsGetRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/SectionResponse"
    }
  }
}
object SectionsListProjectSectionsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/SectionCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object SectionsMoveOrInsertRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ProjectSectionInsertRequest"
    }
  }
}
object SectionsMoveOrInsertResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object SectionsUpdateSectionRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/SectionRequest"
    }
  }
}
object SectionsUpdateSectionRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/SectionResponse"
    }
  }
}
object StatusUpdateBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/StatusUpdateCompact"
    },
    {
      "type": "object",
      "required": [
        "text",
        "status_type"
      ],
      "properties": {
        "text": {
          "type": "string",
          "example": "The project is moving forward according to plan...",
          "description": "The text content of the status update."
        },
        "html_text": {
          "type": "string",
          "example": "<body>The project <strong>is</strong> moving forward according to plan...</body>",
          "description": "[Opt In](https://raw.githubusercontent.com). The text content of the status update with formatting as HTML."
        },
        "status_type": {
          "enum": [
            "on_track",
            "at_risk",
            "off_track",
            "on_hold",
            "complete",
            "achieved",
            "partial",
            "missed",
            "dropped"
          ],
          "type": "string",
          "description": "The type associated with the status update. This represents the current state of the object this object is on."
        }
      }
    }
  ]
}
object StatusUpdateCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "example": "Status Update - Jun 15",
          "description": "The title of the status update."
        },
        "resource_subtype": {
          "enum": [
            "project_status_update",
            "portfolio_status_update",
            "goal_status_update"
          ],
          "type": "string",
          "example": "project_status_update",
          "readOnly": true,
          "description": "The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning.\nThe `resource_subtype`s for `status` objects represent the type of their parent."
        }
      },
      "description": "A *status update* is an update on the progress of a particular project, portfolio, or goal, and is sent out to all of its parent's followers when created. These updates include both text describing the update and a `status_type` intended to represent the overall state of the project.",
      "x-docs-overrides": {
        "properties.resource_type.example": "status_update"
      }
    }
  ]
}
object StatusUpdateRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/StatusUpdateBase"
    },
    {
      "type": "object",
      "required": [
        "parent"
      ],
      "properties": {
        "parent": {
          "allOf": [
            {
              "type": "string",
              "description": "The id of parent to send this status update to. This can be a project, goal or portfolio."
            }
          ]
        }
      }
    }
  ]
}
object StatusUpdateResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/StatusUpdateBase"
    },
    {
      "type": "object",
      "properties": {
        "liked": {
          "type": "boolean",
          "example": true,
          "description": "True if the status is liked by the authorized user, false if not."
        },
        "likes": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Like"
          },
          "readOnly": true,
          "description": "Array of likes for users who have liked this status."
        },
        "author": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "hearts": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Like"
          },
          "readOnly": true,
          "description": "*Deprecated - please use likes instead* Array of likes for users who have hearted this status."
        },
        "parent": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectCompact"
            },
            {
              "type": "object",
              "description": "The parent of the status update. This can be a project, goal or portfolio, and indicates that this status was sent on that object."
            }
          ]
        },
        "hearted": {
          "type": "boolean",
          "example": true,
          "readOnly": true,
          "description": "*Deprecated - please use liked instead* True if the status is hearted by the authorized user, false if not."
        },
        "num_likes": {
          "type": "integer",
          "example": 5,
          "readOnly": true,
          "description": "The number of users who have liked this status."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "created_by": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "num_hearts": {
          "type": "integer",
          "example": 5,
          "readOnly": true,
          "description": "*Deprecated - please use likes instead* The number of users who have hearted this status."
        },
        "modified_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this project status was last modified.\n*Note: This does not currently reflect any changes in associations such as comments that may have been added or removed from the status.*"
        }
      }
    }
  ]
}
object StatusUpdatesCreateNewStatusUpdateRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StatusUpdateRequest"
    }
  }
}
object StatusUpdatesCreateNewStatusUpdateRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StatusUpdateResponse"
    }
  }
}
object StatusUpdatesDeleteSpecificStatusUpdateResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object StatusUpdatesGetCompactRecordsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/StatusUpdateCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object StatusUpdatesGetRecordByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StatusUpdateResponse"
    }
  }
}
object StoriesCreateCommentRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StoryBase"
    }
  }
}
object StoriesCreateCommentResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StoryResponse"
    }
  }
}
object StoriesDeleteStoryRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object StoriesGetFullRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StoryResponse"
    }
  }
}
object StoriesGetTaskStoriesResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/StoryCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object StoriesUpdateFullRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StoryBase"
    }
  }
}
object StoriesUpdateFullRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/StoryResponse"
    }
  }
}
object StoryBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "example": "This is a comment.",
          "description": "The plain text of the comment to add. Cannot be used with html_text."
        },
        "html_text": {
          "type": "string",
          "example": "<body>This is a comment.</body>",
          "description": "[Opt In](https://raw.githubusercontent.com). HTML formatted text for a comment. This will not include the name of the creator."
        },
        "is_pinned": {
          "type": "boolean",
          "example": false,
          "description": "*Conditional*. Whether the story should be pinned on the resource."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "sticker_name": {
          "enum": [
            "green_checkmark",
            "people_dancing",
            "dancing_unicorn",
            "heart",
            "party_popper",
            "people_waving_flags",
            "splashing_narwhal",
            "trophy",
            "yeti_riding_unicorn",
            "celebrating_people",
            "determined_climbers",
            "phoenix_spreading_love"
          ],
          "type": "string",
          "example": "dancing_unicorn",
          "description": "The name of the sticker in this story. `null` if there is no sticker."
        },
        "resource_subtype": {
          "type": "string",
          "example": "comment_added",
          "readOnly": true,
          "description": "The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning."
        }
      },
      "description": "A story represents an activity associated with an object in the Asana system.",
      "x-docs-overrides": {
        "properties.resource_type.example": "story"
      }
    }
  ]
}
object StoryCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "example": "marked today",
          "description": "*Create-only*. Human-readable text for the story or comment.\nThis will not include the name of the creator.\n*Note: This is not guaranteed to be stable for a given type of story. For example, text for a reassignment may not always say “assigned to …” as the text for a story can both be edited and change based on the language settings of the user making the request.*\nUse the `resource_subtype` property to discover the action that created the story."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "created_by": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "resource_subtype": {
          "type": "string",
          "example": "comment_added",
          "readOnly": true,
          "description": "The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning."
        }
      },
      "description": "A story represents an activity associated with an object in the Asana system.",
      "x-docs-overrides": {
        "properties.resource_type.example": "story"
      }
    }
  ]
}
object StoryResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/StoryBase"
    },
    {
      "type": "object",
      "properties": {
        "tag": {
          "$ref": "#/components/schemas/TagCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "task": {
          "$ref": "#/components/schemas/TaskCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "type": {
          "enum": [
            "comment",
            "system"
          ],
          "type": "string",
          "example": "comment",
          "readOnly": true
        },
        "liked": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "*Conditional*. True if the story is liked by the authorized user, false if not."
        },
        "likes": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Like"
          },
          "readOnly": true,
          "description": "*Conditional*. Array of likes for users who have liked this story."
        },
        "story": {
          "$ref": "#/components/schemas/StoryCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "hearts": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Like"
          },
          "readOnly": true,
          "description": "*Deprecated - please use likes instead*\n\n*Conditional*. Array of likes for users who have hearted this story."
        },
        "source": {
          "enum": [
            "web",
            "email",
            "mobile",
            "api",
            "unknown"
          ],
          "type": "string",
          "example": "web",
          "readOnly": true,
          "description": "The component of the Asana product the user used to trigger the story."
        },
        "target": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TaskCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "The object this story is associated with. Currently may only be a task."
            }
          ]
        },
        "hearted": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "*Deprecated - please use likes instead*\n*Conditional*. True if the story is hearted by the authorized user, false if not."
        },
        "project": {
          "$ref": "#/components/schemas/ProjectCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "assignee": {
          "$ref": "#/components/schemas/UserCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "follower": {
          "$ref": "#/components/schemas/UserCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "new_name": {
          "type": "string",
          "example": "This is the New Name",
          "nullable": true,
          "readOnly": true,
          "description": "*Conditional*"
        },
        "old_name": {
          "type": "string",
          "example": "This was the Old Name",
          "description": "*Conditional*'"
        },
        "previews": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Preview"
          },
          "readOnly": true,
          "description": "*Conditional*. A collection of previews to be displayed in the story.\n\n*Note: This property only exists for comment stories.*"
        },
        "is_edited": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "*Conditional*. Whether the text of the story has been edited after creation."
        },
        "new_dates": {
          "$ref": "#/components/schemas/StoryResponseDates"
        },
        "num_likes": {
          "type": "integer",
          "example": 5,
          "readOnly": true,
          "description": "*Conditional*. The number of users who have liked this story."
        },
        "old_dates": {
          "$ref": "#/components/schemas/StoryResponseDates"
        },
        "created_by": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "dependency": {
          "$ref": "#/components/schemas/TaskCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "num_hearts": {
          "type": "integer",
          "example": 5,
          "readOnly": true,
          "description": "*Deprecated - please use likes instead*\n\n*Conditional*. The number of users who have hearted this story."
        },
        "is_editable": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "*Conditional*. Whether the text of the story can be edited after creation."
        },
        "new_section": {
          "$ref": "#/components/schemas/SectionCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "old_section": {
          "$ref": "#/components/schemas/SectionCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "custom_field": {
          "$ref": "#/components/schemas/CustomFieldCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "duplicate_of": {
          "$ref": "#/components/schemas/TaskCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "new_date_value": {
          "allOf": [
            {
              "$ref": "#/components/schemas/StoryResponseDates"
            },
            {
              "description": "*Conditional* The new value of a date custom field story."
            }
          ],
          "readOnly": true
        },
        "new_enum_value": {
          "$ref": "#/components/schemas/EnumOption",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "new_text_value": {
          "type": "string",
          "example": "This is the New Text",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "old_date_value": {
          "allOf": [
            {
              "$ref": "#/components/schemas/StoryResponseDates"
            },
            {
              "description": "*Conditional*. The old value of a date custom field story."
            }
          ],
          "readOnly": true
        },
        "old_enum_value": {
          "$ref": "#/components/schemas/EnumOption",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "old_text_value": {
          "type": "string",
          "example": "This was the Old Text",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "duplicated_from": {
          "$ref": "#/components/schemas/TaskCompact",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "new_number_value": {
          "type": "integer",
          "example": 2,
          "readOnly": true,
          "description": "*Conditional*"
        },
        "new_people_value": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "readOnly": true,
          "description": "*Conditional*. The new value of a people custom field story."
        },
        "old_number_value": {
          "type": "integer",
          "example": 1,
          "nullable": true,
          "readOnly": true,
          "description": "*Conditional*"
        },
        "old_people_value": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "readOnly": true,
          "description": "*Conditional*. The old value of a people custom field story."
        },
        "new_approval_status": {
          "type": "string",
          "example": "approved",
          "readOnly": true,
          "description": "*Conditional*. The new value of approval status."
        },
        "old_approval_status": {
          "type": "string",
          "example": "pending",
          "readOnly": true,
          "description": "*Conditional*. The old value of approval status."
        },
        "new_resource_subtype": {
          "type": "string",
          "example": "milestone",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "old_resource_subtype": {
          "type": "string",
          "example": "default_task",
          "readOnly": true,
          "description": "*Conditional*"
        },
        "new_multi_enum_values": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EnumOption"
          },
          "readOnly": true,
          "description": "*Conditional*. The new value of a multi-enum custom field story."
        },
        "old_multi_enum_values": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EnumOption"
          },
          "readOnly": true,
          "description": "*Conditional*. The old value of a multi-enum custom field story."
        }
      }
    }
  ]
}
object StoryResponseDates
{
  "type": "object",
  "readOnly": true,
  "properties": {
    "due_at": {
      "type": "string",
      "format": "date-time",
      "example": "2019-09-15T02:06:58.158Z",
      "nullable": true,
      "description": "The UTC date and time on which this task is due, or null if the task has no due time. This takes an ISO 8601 date string in UTC and should not be used together with `due_on`."
    },
    "due_on": {
      "type": "string",
      "format": "date",
      "example": "2019-09-15",
      "description": "The localized day on which this goal is due. This takes a date with format `YYYY-MM-DD`."
    },
    "start_on": {
      "type": "string",
      "format": "date",
      "example": "2019-09-14",
      "nullable": true,
      "description": "The day on which work for this goal begins, or null if the goal has no start date. This takes a date with `YYYY-MM-DD` format, and cannot be set unless there is an accompanying due date."
    }
  },
  "description": "*Conditional*"
}
object TagBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TagCompact"
    },
    {
      "type": "object",
      "properties": {
        "color": {
          "enum": [
            "dark-pink",
            "dark-green",
            "dark-blue",
            "dark-red",
            "dark-teal",
            "dark-brown",
            "dark-orange",
            "dark-purple",
            "dark-warm-gray",
            "light-pink",
            "light-green",
            "light-blue",
            "light-red",
            "light-teal",
            "light-brown",
            "light-orange",
            "light-purple",
            "light-warm-gray",
            null
          ],
          "type": "string",
          "example": "light-green",
          "nullable": true,
          "description": "Color of the tag."
        },
        "notes": {
          "type": "string",
          "example": "Mittens really likes the stuff from Humboldt.",
          "description": "Free-form textual information associated with the tag (i.e. its description)."
        }
      }
    }
  ]
}
object TagCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Stuff to buy",
          "description": "Name of the tag. This is generally a short sentence fragment that fits on a line in the UI for maximum readability. However, it can be longer."
        }
      },
      "description": "A *tag* is a label that can be attached to any task in Asana. It exists in a single workspace or organization.",
      "x-docs-overrides": {
        "properties.resource_type.example": "tag"
      }
    }
  ]
}
object TagCreateTagForWorkspaceRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TagBase"
    },
    {
      "type": "object",
      "properties": {
        "followers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "12345",
            "42563"
          ],
          "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
        }
      }
    }
  ]
}
object TagRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TagBase"
    },
    {
      "type": "object",
      "properties": {
        "followers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "12345",
            "42563"
          ],
          "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
        },
        "workspace": {
          "type": "string",
          "example": "12345",
          "description": "Gid of an object.",
          "x-env-variable": true
        }
      }
    }
  ]
}
object TagResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TagBase"
    },
    {
      "type": "object",
      "properties": {
        "followers": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "readOnly": true,
          "description": "Array of users following this tag."
        },
        "workspace": {
          "$ref": "#/components/schemas/WorkspaceCompact"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "permalink_url": {
          "type": "string",
          "example": "https://app.asana.com/0/resource/123456789/list",
          "readOnly": true,
          "description": "A url that points directly to the object within Asana."
        }
      }
    }
  ]
}
object TagsCreateNewTagRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TagRequest"
    }
  }
}
object TagsCreateNewTagRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TagResponse"
    }
  }
}
object TagsCreateTagInWorkspaceRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TagCreateTagForWorkspaceRequest"
    }
  }
}
object TagsCreateTagInWorkspaceResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TagResponse"
    }
  }
}
object TagsGetFilteredTagsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TagCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TagsGetRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TagResponse"
    }
  }
}
object TagsGetTaskTagsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TagCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TagsListFilteredTagsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TagCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TagsRemoveTagResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TagsUpdateTagRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TagResponse"
    }
  }
}
object TaskAddFollowersRequest
{
  "type": "object",
  "required": [
    "followers"
  ],
  "properties": {
    "followers": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "13579",
        "321654"
      ],
      "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
    }
  }
}
object TaskAddProjectRequest
{
  "type": "object",
  "required": [
    "project"
  ],
  "properties": {
    "project": {
      "type": "string",
      "example": "13579",
      "description": "The project to add the task to."
    },
    "section": {
      "type": "string",
      "example": "987654",
      "nullable": true,
      "description": "A section in the project to insert the task into. The task will be inserted at the bottom of the section."
    },
    "insert_after": {
      "type": "string",
      "example": "124816",
      "nullable": true,
      "description": "A task in the project to insert the task after, or `null` to insert at the beginning of the list."
    },
    "insert_before": {
      "type": "string",
      "example": "432134",
      "nullable": true,
      "description": "A task in the project to insert the task before, or `null` to insert at the end of the list."
    }
  }
}
object TaskAddTagRequest
{
  "type": "object",
  "required": [
    "tag"
  ],
  "properties": {
    "tag": {
      "type": "string",
      "example": "13579",
      "description": "The tag's gid to add to the task."
    }
  }
}
object TaskBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TaskCompact"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Buy catnip",
          "description": "Name of the task. This is generally a short sentence fragment that fits on a line in the UI for maximum readability. However, it can be longer."
        },
        "liked": {
          "type": "boolean",
          "example": true,
          "description": "True if the task is liked by the authorized user, false if not."
        },
        "likes": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Like"
          },
          "readOnly": true,
          "description": "Array of likes for users who have liked this task."
        },
        "notes": {
          "type": "string",
          "example": "Mittens really likes the stuff from Humboldt.",
          "description": "Free-form textual information associated with the task (i.e. its description)."
        },
        "due_at": {
          "type": "string",
          "format": "date-time",
          "example": "2019-09-15T02:06:58.147Z",
          "nullable": true,
          "description": "The UTC date and time on which this task is due, or null if the task has no due time. This takes an ISO 8601 date string in UTC and should not be used together with `due_on`."
        },
        "due_on": {
          "type": "string",
          "format": "date",
          "example": "2019-09-15",
          "nullable": true,
          "description": "The localized date on which this task is due, or null if the task has no due date. This takes a date with `YYYY-MM-DD` format and should not be used together with `due_at`."
        },
        "hearts": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Like"
          },
          "readOnly": true,
          "description": "*Deprecated - please use likes instead* Array of likes for users who have hearted this task."
        },
        "hearted": {
          "type": "boolean",
          "example": true,
          "readOnly": true,
          "description": "*Deprecated - please use liked instead* True if the task is hearted by the authorized user, false if not."
        },
        "external": {
          "type": "object",
          "example": {
            "gid": "my_gid",
            "data": "A blob of information"
          },
          "properties": {
            "gid": {
              "type": "string",
              "example": "1234"
            },
            "data": {
              "type": "string",
              "example": "A blob of information."
            }
          },
          "description": "*OAuth Required*. *Conditional*. This field is returned only if external values are set or included by using [Opt In](https://raw.githubusercontent.com).\nThe external field allows you to store app-specific metadata on tasks, including a gid that can be used to retrieve tasks and a data blob that can store app-specific character strings. Note that you will need to authenticate with Oauth to access or modify this data. Once an external gid is set, you can use the notation `external:custom_gid` to reference your object anywhere in the API where you may use the original object gid. See the page on Custom External Data for more details."
        },
        "start_at": {
          "type": "string",
          "format": "date-time",
          "example": "2019-09-14T02:06:58.147Z",
          "nullable": true,
          "description": "Date and time on which work begins for the task, or null if the task has no start time. This takes an ISO 8601 date string in UTC and should not be used together with `start_on`.\n*Note: `due_at` must be present in the request when setting or unsetting the `start_at` parameter.*"
        },
        "start_on": {
          "type": "string",
          "format": "date",
          "example": "2019-09-14",
          "nullable": true,
          "description": "The day on which work begins for the task , or null if the task has no start date. This takes a date with `YYYY-MM-DD` format and should not be used together with `start_at`.\n*Note: `due_on` or `due_at` must be present in the request when setting or unsetting the `start_on` parameter.*"
        },
        "completed": {
          "type": "boolean",
          "example": false,
          "description": "True if the task is currently marked complete, false if not."
        },
        "num_likes": {
          "type": "integer",
          "example": 5,
          "readOnly": true,
          "description": "The number of users who have liked this task."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "dependents": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/AsanaResource"
          },
          "readOnly": true,
          "description": "[Opt In](https://raw.githubusercontent.com). Array of resources referencing tasks that depend on this task. The objects contain only the ID of the dependent."
        },
        "html_notes": {
          "type": "string",
          "example": "<body>Mittens <em>really</em> likes the stuff from Humboldt.</body>",
          "description": "[Opt In](https://raw.githubusercontent.com). The notes of the text with formatting as HTML."
        },
        "num_hearts": {
          "type": "integer",
          "example": 5,
          "readOnly": true,
          "description": "*Deprecated - please use likes instead* The number of users who have hearted this task."
        },
        "memberships": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "project": {
                "$ref": "#/components/schemas/ProjectCompact"
              },
              "section": {
                "$ref": "#/components/schemas/SectionCompact"
              }
            }
          },
          "readOnly": true,
          "description": "*Create-only*. Array of projects this task is associated with and the section it is in. At task creation time, this array can be used to add the task to specific sections. After task creation, these associations can be modified using the `addProject` and `removeProject` endpoints. Note that over time, more types of memberships may be added to this property."
        },
        "modified_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this task was last modified.\n\nThe following conditions will change `modified_at`:\n\n- story is created on a task\n- story is trashed on a task\n- attachment is trashed on a task\n- task is assigned or unassigned\n- custom field value is changed\n- the task itself is trashed\n- Or if any of the following fields are updated:\n  - completed\n  - name\n  - due_date\n  - description\n  - attachments\n  - items\n  - schedule_status\n\nThe following conditions will _not_ change `modified_at`:\n\n- moving to a new container (project, portfolio, etc)\n- comments being added to the task (but the stories they generate\n  _will_ affect `modified_at`)"
        },
        "completed_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "nullable": true,
          "readOnly": true,
          "description": "The time at which this task was completed, or null if the task is incomplete."
        },
        "completed_by": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "nullable": true,
              "readOnly": true
            }
          ]
        },
        "dependencies": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/AsanaResource"
          },
          "readOnly": true,
          "description": "[Opt In](https://raw.githubusercontent.com). Array of resources referencing tasks that this task depends on. The objects contain only the gid of the dependency."
        },
        "num_subtasks": {
          "type": "integer",
          "example": 3,
          "readOnly": true,
          "description": "[Opt In](https://raw.githubusercontent.com). The number of subtasks on this task.\n"
        },
        "approval_status": {
          "enum": [
            "pending",
            "approved",
            "rejected",
            "changes_requested"
          ],
          "type": "string",
          "example": "pending",
          "description": "*Conditional* Reflects the approval status of this task. This field is kept in sync with `completed`, meaning `pending` translates to false while `approved`, `rejected`, and `changes_requested` translate to true. If you set completed to true, this field will be set to `approved`."
        },
        "assignee_status": {
          "enum": [
            "today",
            "upcoming",
            "later",
            "new",
            "inbox"
          ],
          "type": "string",
          "example": "upcoming",
          "description": "*Deprecated* Scheduling status of this task for the user it is assigned to. This field can only be set if the assignee is non-null. Setting this field to \"inbox\" or \"upcoming\" inserts it at the top of the section, while the other options will insert at the bottom."
        },
        "actual_time_minutes": {
          "type": "number",
          "example": 200,
          "nullable": true,
          "readOnly": true,
          "description": "This value represents the sum of all the Time Tracking entries in the Actual Time field on a given Task. It is represented as a nullable long value."
        },
        "is_rendered_as_separator": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "[Opt In](https://raw.githubusercontent.com). In some contexts tasks can be rendered as a visual separator; for instance, subtasks can appear similar to [sections](https://raw.githubusercontent.com) without being true `section` objects. If a `task` object is rendered this way in any context it will have the property `is_rendered_as_separator` set to `true`."
        }
      }
    }
  ]
}
object TaskCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Bug Task",
          "description": "The name of the task."
        },
        "created_by": {
          "type": "object",
          "readOnly": true,
          "properties": {
            "gid": {
              "type": "string",
              "example": "1111",
              "description": "Globally unique identifier of the resource."
            },
            "resource_type": {
              "type": "string",
              "example": "user",
              "description": "The type of resource."
            }
          },
          "description": "[Opt In](https://raw.githubusercontent.com). A *user* object represents an account in Asana that can be given access to various workspaces, projects, and tasks."
        },
        "resource_subtype": {
          "enum": [
            "default_task",
            "milestone",
            "section",
            "approval"
          ],
          "type": "string",
          "example": "default_task",
          "description": "The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning.\nThe resource_subtype `milestone` represent a single moment in time. This means tasks with this subtype cannot have a start_date."
        }
      },
      "description": "The *task* is the basic object around which many operations in Asana are centered.",
      "x-docs-overrides": {
        "properties.resource_type.example": "task"
      }
    }
  ]
}
object TaskCountResponse
{
  "type": "object",
  "properties": {
    "num_tasks": {
      "type": "integer",
      "example": 200,
      "description": "The number of tasks in a project."
    },
    "num_milestones": {
      "type": "integer",
      "example": 10,
      "description": "The number of milestones in a project."
    },
    "num_completed_tasks": {
      "type": "integer",
      "example": 150,
      "description": "The number of completed tasks in a project."
    },
    "num_incomplete_tasks": {
      "type": "integer",
      "example": 50,
      "description": "The number of incomplete tasks in a project."
    },
    "num_completed_milestones": {
      "type": "integer",
      "example": 3,
      "description": "The number of completed milestones in a project."
    },
    "num_incomplete_milestones": {
      "type": "integer",
      "example": 7,
      "description": "The number of incomplete milestones in a project."
    }
  },
  "description": "A response object returned from the task count endpoint."
}
object TaskDuplicateRequest
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "example": "New Task Name",
      "description": "The name of the new task."
    },
    "include": {
      "type": "string",
      "example": [
        "notes,assignee,subtasks,attachments,tags,followers,projects,dates,dependencies,parent"
      ],
      "pattern": "([notes|assignee|subtasks|attachments|tags|followers|projects|dates|dependencies|parent])(,\\1)*",
      "description": "A comma-separated list of fields that will be duplicated to the new task.\n##### Fields\n- assignee\n- attachments\n- dates\n- dependencies\n- followers\n- notes\n- parent\n- projects\n- subtasks\n- tags"
    }
  }
}
object TaskRemoveFollowersRequest
{
  "type": "object",
  "required": [
    "followers"
  ],
  "properties": {
    "followers": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "13579",
        "321654"
      ],
      "description": "An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user."
    }
  }
}
object TaskRemoveProjectRequest
{
  "type": "object",
  "required": [
    "project"
  ],
  "properties": {
    "project": {
      "type": "string",
      "example": "13579",
      "description": "The project to remove the task from."
    }
  }
}
object TaskRemoveTagRequest
{
  "type": "object",
  "required": [
    "tag"
  ],
  "properties": {
    "tag": {
      "type": "string",
      "example": "13579",
      "description": "The tag's gid to remove from the task."
    }
  }
}
object TaskRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TaskBase"
    },
    {
      "type": "object",
      "properties": {
        "tags": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Gid of a tag."
          },
          "example": [
            "12345"
          ],
          "description": "*Create-Only* Array of tag gids. In order to change tags on an existing task use `addTag` and `removeTag`."
        },
        "parent": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "readOnly": false,
          "description": "Gid of a task.",
          "x-env-variable": true
        },
        "assignee": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "readOnly": false,
          "description": "Gid of a user.",
          "x-env-variable": true
        },
        "projects": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Gid of a project."
          },
          "example": [
            "12345"
          ],
          "description": "*Create-Only* Array of project gids. In order to change projects on an existing task use `addProject` and `removeProject`."
        },
        "followers": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Gid of a user."
          },
          "example": [
            "12345"
          ],
          "description": "*Create-Only* An array of strings identifying users. These can either be the string \"me\", an email, or the gid of a user. In order to change followers on an existing task use `addFollowers` and `removeFollowers`."
        },
        "workspace": {
          "type": "string",
          "example": "12345",
          "readOnly": false,
          "description": "Gid of a workspace.",
          "x-env-variable": true
        },
        "custom_fields": {
          "type": "object",
          "example": {
            "4578152156": "Not Started",
            "5678904321": "On Hold"
          },
          "description": "An object where each key is the GID of a custom field and its corresponding value is either an enum GID, string, number, object, or array (depending on the custom field type). See the [custom fields guide](https://raw.githubusercontent.com) for details on creating and updating custom field values.",
          "additionalProperties": {
            "type": "string",
            "description": "\"{custom_field_gid}\" => Value (can be text, a number, etc.). For date, use format \"YYYY-MM-DD\" (e.g., 2019-09-15). For date-time, use ISO 8601 date string in UTC (e.g., 2019-09-15T02:06:58.147Z)."
          }
        },
        "assignee_section": {
          "type": "string",
          "example": "12345",
          "nullable": true,
          "description": "The *assignee section* is a subdivision of a project that groups tasks together in the assignee's \"My Tasks\" list. It can either be a header above a list of tasks in a list view or a column in a board view of \"My Tasks.\"\nThe `assignee_section` property will be returned in the response only if the request was sent by the user who is the assignee of the task. Note that you can only write to `assignee_section` with the gid of an existing section visible in the user's \"My Tasks\" list."
        }
      }
    }
  ]
}
object TaskResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TaskBase"
    },
    {
      "type": "object",
      "properties": {
        "tags": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/TagCompact"
          },
          "example": [
            {
              "gid": "59746",
              "name": "Grade A"
            }
          ],
          "readOnly": true,
          "description": "Array of tags associated with this task. In order to change tags on an existing task use `addTag` and `removeTag`."
        },
        "parent": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TaskCompact"
            },
            {
              "type": "object",
              "nullable": true,
              "readOnly": true,
              "description": "The parent of this task, or `null` if this is not a subtask. This property cannot be modified using a PUT request but you can change it with the `setParent` endpoint. You can create subtasks by using the subtasks endpoint."
            }
          ]
        },
        "assignee": {
          "allOf": [
            {
              "$ref": "#/components/schemas/UserCompact"
            },
            {
              "nullable": true
            }
          ]
        },
        "projects": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ProjectCompact"
          },
          "readOnly": true,
          "description": "*Create-only.* Array of projects this task is associated with. At task creation time, this array can be used to add the task to many projects at once. After task creation, these associations can be modified using the addProject and removeProject endpoints."
        },
        "followers": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "readOnly": true,
          "description": "Array of users following this task."
        },
        "workspace": {
          "allOf": [
            {
              "$ref": "#/components/schemas/WorkspaceCompact"
            },
            {
              "type": "object",
              "readOnly": true,
              "description": "*Create-only*. The workspace this task is associated with. Once created, task cannot be moved to a different workspace. This attribute can only be specified at creation time."
            }
          ]
        },
        "custom_fields": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CustomFieldResponse"
          },
          "readOnly": true,
          "description": "Array of custom field values applied to the task. These represent the custom field values recorded on this project for a particular custom field. For example, these custom field values will contain an `enum_value` property for custom fields of type `enum`, a `text_value` property for custom fields of type `text`, and so on. Please note that the `gid` returned on each custom field value *is identical* to the `gid` of the custom field, which allows referencing the custom field metadata through the `/custom_fields/custom_field-gid` endpoint."
        },
        "permalink_url": {
          "type": "string",
          "example": "https://app.asana.com/0/resource/123456789/list",
          "readOnly": true,
          "description": "A url that points directly to the object within Asana."
        },
        "assignee_section": {
          "allOf": [
            {
              "$ref": "#/components/schemas/SectionCompact"
            },
            {
              "type": "object",
              "nullable": true,
              "description": "The *assignee section* is a subdivision of a project that groups tasks together in the assignee's \"My Tasks\" list. It can either be a header above a list of tasks in a list view or a column in a board view of \"My Tasks.\"\nThe `assignee_section` property will be returned in the response only if the request was sent by the user who is the assignee of the task. Note that you can only write to `assignee_section` with the gid of an existing section visible in the user's \"My Tasks\" list."
            }
          ]
        }
      }
    }
  ]
}
object TaskSetParentRequest
{
  "type": "object",
  "required": [
    "parent"
  ],
  "properties": {
    "parent": {
      "type": "string",
      "example": "987654",
      "description": "The new parent of the task, or `null` for no parent."
    },
    "insert_after": {
      "type": "string",
      "example": "null",
      "description": "A subtask of the parent to insert the task after, or `null` to insert at the beginning of the list."
    },
    "insert_before": {
      "type": "string",
      "example": "124816",
      "description": "A subtask of the parent to insert the task before, or `null` to insert at the end of the list."
    }
  }
}
object TaskTemplateCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Packing list",
          "description": "Name of the task template."
        }
      },
      "description": "A *task template* is an object that allows new tasks to be created with a predefined setup.",
      "x-docs-overrides": {
        "properties.resource_type.example": "task_template"
      }
    }
  ]
}
object TaskTemplateInstantiateTaskRequest
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "example": "New Task",
      "description": "The name of the new task. If not provided, the name of the task template will be used."
    }
  }
}
object TaskTemplateRecipe
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TaskTemplateRecipeCompact"
    },
    {
      "type": "object",
      "properties": {
        "due_time": {
          "type": "string",
          "example": "13:15:00.000Z",
          "nullable": true,
          "description": "The time of day that the task will be due"
        },
        "subtasks": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/TaskTemplateRecipeCompact"
          },
          "description": "Array of subtasks that will be added to the task created from this template"
        },
        "followers": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/UserCompact"
          },
          "description": "Array of users that will be added as followers to the task created from this template"
        },
        "dependents": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/TaskTemplateRecipeCompact"
          },
          "description": "Array of task templates that will depend on the task created from this template"
        },
        "attachments": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/AttachmentCompact"
          },
          "description": "Array of attachments that will be added to the task created from this template"
        },
        "description": {
          "type": "string",
          "example": "Please describe the bug you found and how to reproduce it.",
          "description": "Description of the task that will be created from this template."
        },
        "memberships": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ProjectCompact"
          },
          "description": "Array of projects that the task created from this template will be added to"
        },
        "dependencies": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/TaskTemplateRecipeCompact"
          },
          "description": "Array of task templates that the task created from this template will depend on"
        },
        "custom_fields": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CustomFieldCompact"
          },
          "description": "Array of custom fields that will be added to the task created from this template"
        },
        "relative_due_on": {
          "type": "integer",
          "example": 2,
          "nullable": true,
          "description": "The number of days after the task has been instantiated on which that the task will be due"
        },
        "html_description": {
          "type": "string",
          "example": "Please describe the bug you found and how to reproduce it.",
          "description": "HTML description of the task that will be created from this template."
        },
        "relative_start_on": {
          "type": "integer",
          "example": 1,
          "nullable": true,
          "description": "The number of days after the task has been instantiated on which that the task will start"
        }
      }
    }
  ]
}
object TaskTemplateRecipeCompact
{
  "allOf": [
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Bug Report",
          "description": "Name of the task that will be created from this template."
        },
        "task_resource_subtype": {
          "enum": [
            "default_task",
            "milestone_task",
            "approval_task"
          ],
          "type": "string",
          "example": "default_task",
          "description": "The subtype of the task that will be created from this template."
        }
      }
    }
  ]
}
object TaskTemplateResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TaskTemplateCompact"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Bug Report Template",
          "description": "Name of the task template."
        },
        "project": {
          "allOf": [
            {
              "$ref": "#/components/schemas/ProjectCompact"
            }
          ],
          "nullable": true,
          "description": "The project that this task template belongs to."
        },
        "template": {
          "$ref": "#/components/schemas/TaskTemplateRecipe"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2019-01-01T00:00:00.000Z",
          "description": "The time at which this task template was created."
        },
        "created_by": {
          "$ref": "#/components/schemas/UserCompact"
        }
      },
      "x-konfig-properties": {
        "template": {
          "description": "The configuration for the task that will be created from this template."
        },
        "created_by": {
          "description": "The user who created this task template."
        }
      }
    }
  ]
}
object TaskTemplatesDeleteTaskTemplateResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TaskTemplatesGetSingleTemplateResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskTemplateResponse"
    }
  }
}
object TaskTemplatesInstantiateTaskJobRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskTemplateInstantiateTaskRequest"
    }
  }
}
object TaskTemplatesInstantiateTaskJobResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/JobCompact"
    }
  }
}
object TaskTemplatesListMultipleResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskTemplateCompact"
      }
    }
  }
}
object TasksAddFollowersToTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskAddFollowersRequest"
    }
  }
}
object TasksAddFollowersToTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TasksAddProjectToTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskAddProjectRequest"
    }
  }
}
object TasksAddProjectToTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksAddTagToTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskAddTagRequest"
    }
  }
}
object TasksAddTagToTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksCreateNewTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskRequest"
    }
  }
}
object TasksCreateNewTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TasksCreateSubtaskRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskRequest"
    }
  }
}
object TasksCreateSubtaskRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TasksDeleteTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksDuplicateTaskJobRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskDuplicateRequest"
    }
  }
}
object TasksDuplicateTaskJobResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/JobCompact"
    }
  }
}
object TasksGetAllDependenciesResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksGetByCustomIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TasksGetDependentsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksGetMultipleResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksGetMultipleWithTagResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksGetSectionTasksResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksGetSubtaskListResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksGetTaskRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TasksGetTasksByProjectResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksGetUserTaskListTasksResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TasksRemoveFollowersFromTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskRemoveFollowersRequest"
    }
  }
}
object TasksRemoveFollowersFromTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TasksRemoveProjectFromTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskRemoveProjectRequest"
    }
  }
}
object TasksRemoveProjectFromTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksRemoveTagFromTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskRemoveTagRequest"
    }
  }
}
object TasksRemoveTagFromTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksSearchInWorkspaceResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TaskCompact"
      }
    }
  }
}
object TasksSetDependenciesForTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ModifyDependenciesRequest"
    }
  }
}
object TasksSetDependenciesForTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksSetParentTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskSetParentRequest"
    }
  }
}
object TasksSetParentTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TasksSetTaskDependentsRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ModifyDependentsRequest"
    }
  }
}
object TasksSetTaskDependentsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksUnlinkDependenciesFromTaskRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ModifyDependenciesRequest"
    }
  }
}
object TasksUnlinkDependenciesFromTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksUnlinkDependentsRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/ModifyDependentsRequest"
    }
  }
}
object TasksUnlinkDependentsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TasksUpdateTaskRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskRequest"
    }
  }
}
object TasksUpdateTaskRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TaskResponse"
    }
  }
}
object TeamAddUserRequest
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "example": "12345",
      "description": "A string identifying a user. This can either be the string \"me\", an email, or the gid of a user."
    }
  },
  "description": "A user identification object for specification with the addUser/removeUser endpoints."
}
object TeamCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Marketing",
          "description": "The name of the team."
        }
      },
      "description": "A *team* is used to group related projects and people together within an organization. Each project in an organization is associated with a team.",
      "x-docs-overrides": {
        "properties.resource_type.example": "team"
      }
    }
  ]
}
object TeamMembershipCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "team": {
          "$ref": "#/components/schemas/TeamCompact"
        },
        "user": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "is_admin": {
          "type": "boolean",
          "example": false,
          "description": "Describes if the user is a team admin."
        },
        "is_guest": {
          "type": "boolean",
          "example": false,
          "description": "Describes if the user is a guest in the team."
        },
        "is_limited_access": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "Describes if the user has limited access to the team."
        }
      },
      "description": "This object represents a user's connection to a team.",
      "x-docs-overrides": {
        "properties.resource_type.example": "team_membership"
      }
    }
  ]
}
object TeamMembershipsGetCompactRecordsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TeamMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TeamMembershipsGetCompactResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TeamMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TeamMembershipsGetRecordByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamMembershipCompact"
    }
  }
}
object TeamMembershipsGetUserCompactResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TeamMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TeamRemoveUserRequest
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "example": "12345",
      "description": "A string identifying a user. This can either be the string \"me\", an email, or the gid of a user."
    }
  },
  "description": "A user identification object for specification with the addUser/removeUser endpoints."
}
object TeamRequest
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TeamCompact"
    },
    {
      "type": "object",
      "properties": {
        "visibility": {
          "enum": [
            "secret",
            "request_to_join",
            "public"
          ],
          "type": "string",
          "description": "The visibility of the team to users in the same organization\n"
        },
        "description": {
          "type": "string",
          "example": "All developers should be members of this team.",
          "description": "The description of the team.\n"
        },
        "organization": {
          "type": "string",
          "example": "123456789",
          "description": "The organization/workspace the team belongs to. This must be the same organization you are in and cannot be changed once set.\n"
        },
        "html_description": {
          "type": "string",
          "example": "<body><em>All</em> developers should be members of this team.</body>",
          "description": "The description of the team with formatting as HTML.\n"
        },
        "team_member_removal_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can remove team members\n"
        },
        "guest_invite_management_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can accept or deny guest invites for a given team\n"
        },
        "join_request_management_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can accept or deny join team requests for a Membership by Request team\n"
        },
        "member_invite_management_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can accept or deny member invites for a given team\n"
        },
        "edit_team_name_or_description_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can edit team name and description\n"
        },
        "edit_team_visibility_or_trash_team_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can edit team visibility and trash teams\n"
        }
      }
    }
  ]
}
object TeamResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TeamCompact"
    },
    {
      "type": "object",
      "properties": {
        "visibility": {
          "enum": [
            "secret",
            "request_to_join",
            "public"
          ],
          "type": "string",
          "description": "The visibility of the team to users in the same organization\n"
        },
        "description": {
          "type": "string",
          "example": "All developers should be members of this team.",
          "description": "[Opt In](https://raw.githubusercontent.com). The description of the team.\n"
        },
        "organization": {
          "allOf": [
            {
              "$ref": "#/components/schemas/WorkspaceCompact"
            },
            {
              "type": "object",
              "description": "The organization/workspace the team belongs to.\n"
            }
          ]
        },
        "permalink_url": {
          "type": "string",
          "example": "https://app.asana.com/0/resource/123456789/list",
          "readOnly": true,
          "description": "A url that points directly to the object within Asana."
        },
        "html_description": {
          "type": "string",
          "example": "<body><em>All</em> developers should be members of this team.</body>",
          "description": "[Opt In](https://raw.githubusercontent.com). The description of the team with formatting as HTML.\n"
        },
        "team_member_removal_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can remove team members\n"
        },
        "guest_invite_management_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can accept or deny guest invites for a given team\n"
        },
        "join_request_management_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can accept or deny join team requests for a Membership by Request team\n"
        },
        "member_invite_management_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can accept or deny member invites for a given team\n"
        },
        "edit_team_name_or_description_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can edit team name and description\n"
        },
        "edit_team_visibility_or_trash_team_access_level": {
          "enum": [
            "all_team_members",
            "only_team_admins"
          ],
          "type": "string",
          "readOnly": true,
          "description": "Controls who can edit team visibility and trash teams\n"
        }
      }
    }
  ]
}
object TeamsAddUserToTeamRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamAddUserRequest"
    }
  }
}
object TeamsAddUserToTeamResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamMembershipCompact"
    }
  }
}
object TeamsCreateTeamRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamRequest"
    }
  }
}
object TeamsCreateTeamRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamResponse"
    }
  }
}
object TeamsGetTeamRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamResponse"
    }
  }
}
object TeamsGetUserTeamsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TeamCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TeamsListWorkspaceTeamsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TeamCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TeamsRemoveUserFromTeamRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamRemoveUserRequest"
    }
  }
}
object TeamsRemoveUserFromTeamResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TeamsUpdateTeamRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamRequest"
    }
  }
}
object TeamsUpdateTeamRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TeamResponse"
    }
  }
}
object TemplateRole
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Designer",
          "description": "Name of the template role."
        }
      }
    }
  ]
}
object TimePeriodBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TimePeriodCompact"
    },
    {
      "type": "object",
      "properties": {
        "parent": {
          "allOf": [
            {
              "$ref": "#/components/schemas/TimePeriodCompact"
            },
            {
              "nullable": true
            }
          ]
        }
      }
    }
  ]
}
object TimePeriodCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "end_on": {
          "type": "string",
          "example": "2019-09-14",
          "description": "The localized end date of the time period in `YYYY-MM-DD` format."
        },
        "period": {
          "enum": [
            "FY",
            "H1",
            "H2",
            "Q1",
            "Q2",
            "Q3",
            "Q4"
          ],
          "type": "string",
          "example": "Q1",
          "description": "The cadence and index of the time period. The value is one of: `FY`, `H1`, `H2`, `Q1`, `Q2`, `Q3`, or `Q4`."
        },
        "start_on": {
          "type": "string",
          "example": "2019-09-13",
          "description": "The localized start date of the time period in `YYYY-MM-DD` format."
        },
        "display_name": {
          "type": "string",
          "example": "Q1 FY22",
          "description": "A string representing the cadence code and the fiscal year."
        }
      },
      "x-docs-overrides": {
        "properties.resource_type.example": "time_period"
      }
    }
  ]
}
object TimePeriodsGetCompactTimePeriodsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TimePeriodCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TimePeriodsGetFullRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TimePeriodBase"
    }
  }
}
object TimeTrackingEntriesCreateNewTimeEntryRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/CreateTimeTrackingEntryRequest"
    }
  }
}
object TimeTrackingEntriesCreateNewTimeEntryRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TimeTrackingEntryBase"
    }
  }
}
object TimeTrackingEntriesDeleteTimeEntryResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object TimeTrackingEntriesGetForTaskResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TimeTrackingEntryCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object TimeTrackingEntriesGetRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TimeTrackingEntryBase"
    }
  }
}
object TimeTrackingEntriesUpdateTimeTrackingEntryRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/UpdateTimeTrackingEntryRequest"
    }
  }
}
object TimeTrackingEntriesUpdateTimeTrackingEntryResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/TimeTrackingEntryBase"
    }
  }
}
object TimeTrackingEntryBase
{
  "allOf": [
    {
      "$ref": "#/components/schemas/TimeTrackingEntryCompact"
    },
    {
      "type": "object",
      "properties": {
        "task": {
          "$ref": "#/components/schemas/TaskCompact",
          "readOnly": true
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        }
      }
    }
  ]
}
object TimeTrackingEntryCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "created_by": {
          "$ref": "#/components/schemas/UserCompact",
          "readOnly": true
        },
        "entered_on": {
          "type": "string",
          "format": "date",
          "example": "2015-03-14",
          "description": "The day that this entry is logged on."
        },
        "duration_minutes": {
          "type": "integer",
          "example": 12,
          "description": "Time in minutes tracked by the entry."
        }
      }
    }
  ]
}
object TypeaheadGetResultsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AsanaNamedResource"
      }
    }
  },
  "description": "A generic list of objects, such as those returned by the typeahead search endpoint."
}
object UpdateTimeTrackingEntryRequest
{
  "type": "object",
  "properties": {
    "entered_on": {
      "type": "string",
      "format": "date",
      "example": "2023-03-19",
      "description": "*Optional*. The day that this entry is logged on. Defaults to today if no day specified"
    },
    "duration_minutes": {
      "type": "integer",
      "example": 12,
      "description": "*Optional*. Time in minutes tracked by the entry"
    }
  }
}
object UserBaseResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/UserCompact"
    },
    {
      "type": "object",
      "properties": {
        "email": {
          "type": "string",
          "format": "email",
          "example": "gsanchez@example.com",
          "readOnly": true,
          "description": "The user's email address."
        },
        "photo": {
          "type": "object",
          "example": {
            "image_21x21": "https://...",
            "image_27x27": "https://...",
            "image_36x36": "https://...",
            "image_60x60": "https://...",
            "image_128x128": "https://...",
            "image_1024x1024": "https://..."
          },
          "nullable": true,
          "readOnly": true,
          "properties": {
            "image_21x21": {
              "type": "string",
              "format": "uri"
            },
            "image_27x27": {
              "type": "string",
              "format": "uri"
            },
            "image_36x36": {
              "type": "string",
              "format": "uri"
            },
            "image_60x60": {
              "type": "string",
              "format": "uri"
            },
            "image_128x128": {
              "type": "string",
              "format": "uri"
            },
            "image_1024x1024": {
              "type": "string",
              "format": "uri"
            }
          },
          "description": "A map of the user’s profile photo in various sizes, or null if no photo is set. Sizes provided are 21, 27, 36, 60, 128, and 1024. All images are in PNG format, except for 1024 (which is in JPEG format)."
        }
      }
    }
  ]
}
object UserCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "Greg Sanchez",
          "description": "*Read-only except when same user as requester*. The user’s name."
        }
      },
      "description": "A *user* object represents an account in Asana that can be given access to various workspaces, projects, and tasks.",
      "x-docs-overrides": {
        "properties.resource_type.example": "user"
      }
    }
  ]
}
object UserResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/UserBaseResponse"
    },
    {
      "type": "object",
      "properties": {
        "workspaces": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/WorkspaceCompact"
          },
          "readOnly": true,
          "description": "Workspaces and organizations this user may access.\nNote\\: The API will only return workspaces and organizations that also contain the authenticated user."
        }
      }
    }
  ]
}
object UserTaskListCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "My Tasks in My Workspace",
          "description": "The name of the user task list."
        },
        "owner": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "workspace": {
          "$ref": "#/components/schemas/WorkspaceCompact"
        }
      },
      "description": "A user task list represents the tasks assigned to a particular user. It provides API access to a user’s [My Tasks](https://asana.com/guide/help/fundamentals/my-tasks) view in Asana.",
      "x-docs-overrides": {
        "properties.resource_type.example": "user_task_list"
      },
      "x-konfig-properties": {
        "owner": {
          "readOnly": true,
          "description": "The owner of the user task list, i.e. the person whose My Tasks is represented by this resource."
        },
        "workspace": {
          "readOnly": true,
          "description": "The workspace in which the user task list is located."
        }
      }
    }
  ]
}
object UserTaskListsGetRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/UserTaskListCompact"
    }
  }
}
object UserTaskListsGetUserTaskListResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/UserTaskListCompact"
    }
  }
}
object UsersGetFavoritesForUserResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AsanaNamedResource"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object UsersGetUserRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/UserResponse"
    }
  }
}
object UsersListTeamUsersResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/UserCompact"
      }
    }
  }
}
object UsersListWorkspaceUsersResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/UserCompact"
      }
    }
  }
}
object WebhookCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "active": {
          "type": "boolean",
          "example": false,
          "readOnly": true,
          "description": "If true, the webhook will send events - if false it is considered inactive and will not generate events."
        },
        "target": {
          "type": "string",
          "format": "uri",
          "example": "https://example.com/receive-webhook/7654",
          "readOnly": true,
          "description": "The URL to receive the HTTP POST."
        },
        "resource": {
          "$ref": "#/components/schemas/AsanaNamedResource"
        }
      },
      "description": "Webhook objects represent the state of an active subscription for a server to be updated with information from Asana. This schema represents the subscription itself, not the objects that are sent to the server. For information on those please refer to the [event](https://raw.githubusercontent.com) schema.",
      "x-docs-overrides": {
        "properties.resource_type.example": "webhook"
      }
    }
  ]
}
object WebhookFilter
{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "example": "changed",
      "description": "The type of change on the **resource** to pass through the filter. For more information refer to `Event.action` in the [event](https://raw.githubusercontent.com) schema. This can be one of `changed`, `added`, `removed`, `deleted`, and `undeleted` depending on the nature of what has occurred on the resource."
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "due_at",
        "due_on",
        "dependencies"
      ],
      "description": "*Conditional.* A whitelist of fields for events which will pass the filter when the resource is changed. These can be any combination of the fields on the resources themselves. This field is only valid for `action` of type `changed`"
    },
    "resource_type": {
      "type": "string",
      "example": "task",
      "description": "The type of the resource which created the event when modified; for example, to filter to changes on regular tasks this field should be set to `task`."
    },
    "resource_subtype": {
      "type": "string",
      "example": "milestone",
      "description": "The resource subtype of the resource that the filter applies to. This should be set to the same value as is returned on the `resource_subtype` field on the resources themselves."
    }
  },
  "description": "A WebhookFilter can be passed on creation of a webhook in order to filter the types of actions that trigger delivery of an [event](https://raw.githubusercontent.com)"
}
object WebhookRequest
{
  "type": "object",
  "required": [
    "resource",
    "target"
  ],
  "properties": {
    "target": {
      "type": "string",
      "format": "uri",
      "example": "https://example.com/receive-webhook/7654?app_specific_param=app_specific_value",
      "description": "The URL to receive the HTTP POST. The full URL will be used to deliver events from this webhook (including parameters) which allows encoding of application-specific state when the webhook is created."
    },
    "filters": {
      "type": "array",
      "items": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookFilter"
          },
          {
            "description": "A set of filters to specify a whitelist for what types of events will be delivered."
          },
          {
            "type": "object"
          }
        ]
      },
      "description": "An array of WebhookFilter objects to specify a whitelist of filters to apply to events from this webhook. If a webhook event passes any of the filters the event will be delivered; otherwise no event will be sent to the receiving server."
    },
    "resource": {
      "type": "string",
      "example": "12345",
      "description": "A resource ID to subscribe to. Many Asana resources are valid to create webhooks on, but higher-level resources require filters."
    }
  }
}
object WebhookResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/WebhookCompact"
    },
    {
      "type": "object",
      "properties": {
        "filters": {
          "type": "array",
          "items": {
            "allOf": [
              {
                "$ref": "#/components/schemas/WebhookFilter"
              },
              {
                "description": "A set of filters to specify a whitelist for what types of events will be delivered."
              },
              {
                "type": "object"
              }
            ]
          },
          "description": "Whitelist of filters to apply to events from this webhook. If a webhook event passes any of the filters the event will be delivered; otherwise no event will be sent to the receiving server."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "last_failure_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The timestamp when the webhook last received an error when sending an event to the target."
        },
        "last_success_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The timestamp when the webhook last successfully sent an event to the target."
        },
        "last_failure_content": {
          "type": "string",
          "example": "500 Server Error\\n\\nCould not complete the request",
          "readOnly": true,
          "description": "The contents of the last error response sent to the webhook when attempting to deliver events to the target."
        }
      }
    }
  ]
}
object WebhookUpdateRequest
{
  "type": "object",
  "properties": {
    "filters": {
      "type": "array",
      "items": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookFilter"
          },
          {
            "description": "A set of filters to specify a whitelist for what types of events will be delivered."
          },
          {
            "type": "object"
          }
        ]
      },
      "description": "An array of WebhookFilter objects to specify a whitelist of filters to apply to events from this webhook. If a webhook event passes any of the filters the event will be delivered; otherwise no event will be sent to the receiving server."
    }
  }
}
object WebhooksEstablishWebhookRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WebhookRequest"
    }
  }
}
object WebhooksEstablishWebhookResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WebhookResponse"
    }
  }
}
object WebhooksGetWebhookRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WebhookResponse"
    }
  }
}
object WebhooksListMultipleWebhooksResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WebhookResponse"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object WebhooksRemoveWebhookResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object WebhooksUpdateWebhookFiltersRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WebhookUpdateRequest"
    }
  }
}
object WebhooksUpdateWebhookFiltersResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WebhookResponse"
    }
  }
}
object WorkspaceAddUserRequest
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "example": "12345",
      "description": "A string identifying a user. This can either be the string \"me\", an email, or the gid of a user."
    }
  },
  "description": "A user identification object for specification with the addUser/removeUser endpoints."
}
object WorkspaceCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "example": "My Company Workspace",
          "description": "The name of the workspace."
        }
      },
      "description": "A *workspace* is the highest-level organizational unit in Asana. All projects and tasks have an associated workspace.",
      "x-docs-overrides": {
        "properties.resource_type.example": "workspace"
      }
    }
  ]
}
object WorkspaceMembershipCompact
{
  "allOf": [
    {
      "$ref": "#/components/schemas/AsanaResource"
    },
    {
      "type": "object",
      "properties": {
        "user": {
          "$ref": "#/components/schemas/UserCompact"
        },
        "workspace": {
          "$ref": "#/components/schemas/WorkspaceCompact"
        }
      },
      "description": "This object determines if a user is a member of a workspace.",
      "x-docs-overrides": {
        "properties.resource_type.example": "workspace_membership"
      }
    }
  ]
}
object WorkspaceMembershipResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/WorkspaceMembershipCompact"
    },
    {
      "type": "object",
      "properties": {
        "is_admin": {
          "type": "boolean",
          "readOnly": true,
          "description": "Reflects if this user is an admin of the workspace."
        },
        "is_guest": {
          "type": "boolean",
          "readOnly": true,
          "description": "Reflects if this user is a guest of the workspace."
        },
        "is_active": {
          "type": "boolean",
          "readOnly": true,
          "description": "Reflects if this user still a member of the workspace."
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "example": "2012-02-22T02:06:58.147Z",
          "readOnly": true,
          "description": "The time at which this resource was created."
        },
        "user_task_list": {
          "$ref": "#/components/schemas/UserTaskListCompact",
          "readOnly": true,
          "description": "The user's \"My Tasks\" in the workspace."
        },
        "vacation_dates": {
          "type": "object",
          "nullable": true,
          "readOnly": true,
          "properties": {
            "end_on": {
              "type": "string",
              "example": "2022-11-07",
              "nullable": true,
              "description": "The day on which the user's vacation in this workspace ends, or null if there is no end date. This is a date with `YYYY-MM-DD` format."
            },
            "start_on": {
              "type": "string",
              "example": "2022-11-05",
              "description": "The day on which the user's vacation in this workspace starts. This is a date with `YYYY-MM-DD` format."
            }
          },
          "description": "Contains keys `start_on` and `end_on` for the vacation dates for the user in this workspace. If `start_on` is null, the entire `vacation_dates` object will be null. If `end_on` is before today, the entire `vacation_dates` object will be null."
        }
      }
    }
  ]
}
object WorkspaceMembershipsGetRecordByIdResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WorkspaceMembershipResponse"
    }
  }
}
object WorkspaceMembershipsGetUserMembershipsResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WorkspaceMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object WorkspaceMembershipsListForWorkspaceResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WorkspaceMembershipCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object WorkspaceRemoveUserRequest
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "example": "12345",
      "description": "A string identifying a user. This can either be the string \"me\", an email, or the gid of a user."
    }
  },
  "description": "A user identification object for specification with the addUser/removeUser endpoints."
}
object WorkspaceResponse
{
  "allOf": [
    {
      "$ref": "#/components/schemas/WorkspaceCompact"
    },
    {
      "type": "object",
      "properties": {
        "email_domains": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uri"
          },
          "example": [
            "asana.com"
          ],
          "description": "The email domains that are associated with this workspace."
        },
        "is_organization": {
          "type": "boolean",
          "example": false,
          "description": "Whether the workspace is an *organization*."
        }
      }
    }
  ]
}
object WorkspacesAddUserToWorkspaceRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WorkspaceAddUserRequest"
    }
  }
}
object WorkspacesAddUserToWorkspaceResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/UserBaseResponse"
    }
  }
}
object WorkspacesGetWorkspaceRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WorkspaceResponse"
    }
  }
}
object WorkspacesListMultipleResponse
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WorkspaceCompact"
      }
    },
    "next_page": {
      "$ref": "#/components/schemas/NextPage"
    }
  }
}
object WorkspacesRemoveUserFromWorkspaceRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WorkspaceRemoveUserRequest"
    }
  }
}
object WorkspacesRemoveUserFromWorkspaceResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/EmptyResponse"
    }
  }
}
object WorkspacesUpdateWorkspaceRecordRequest
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WorkspaceCompact"
    }
  }
}
object WorkspacesUpdateWorkspaceRecordResponse
{
  "type": "object",
  "properties": {
    "data": {
      "$ref": "#/components/schemas/WorkspaceResponse"
    }
  }
}