All monitored APIs

Asana API breaking changes & specification history.

Tasks, projects, portfolios, and workspaces.

20 recorded releases · Last captured 8 Oct 2026.

Which Asana API endpoints have captured breaking changes?

20 recorded releases; last specification capture . This dated snapshot contains 68 sampled findings from 10 recent releases, including 6 breaking findings. Up to ten findings are retained per release; these counts are not totals for the complete API history.

Snapshot retrieved . A capture date is not a provider deployment date. Missing or unmatched repository usage is not proof of safety.

Classifications in this bounded snapshot
ClassificationSampled findings
Breaking6
Non-breaking37
Needs review25
Deprecation0
Pending classification0
Breaking endpoint and field evidence
OperationField and ruleCapture
POST /tasks/{task_gid}/time_tracking_entriesOperation-level change
schema.request_acceptance_narrowed
POST /goals/{goal_gid}/addFollowersallOf
response.removed
GET /workspaces/{workspace_gid}/ai_studio/runsdata/items/allOf[subschema #2]/rule
response.now_optional_or_nullable
GET /time_tracking_entries/{time_tracking_entry_gid}data/allOf[subschema #1]/created_by/resource_type
response.removed
GET /time_tracking_entries/{time_tracking_entry_gid}data/allOf[subschema #1]/created_by/gid
response.removed
POST /tasks/{task_gid}/time_tracking_entriesdata/allOf[subschema #1]/created_by/name
response.removed

Where does this evidence come from?

Publisher specification
Official specification source
Configured SDK matching
No SDK package listed in this snapshot
API authentication
none
Publisher version
1.0

How to check affected code in GitHub

Snapshot captured 3 Nov 2026. Breaking describes contract evidence; repository impact is a separate analysis.

Asana captured release evidence

Dated snapshot: . Latest 10 captured releases, with up to ten findings per release. Contract findings describe specification changes; repository impact is a separate analysis.

Asana API specification changes · Revision fa07aa82 · GET /tasks/{task_gid}/time_tracking_entries

46 recorded findings · classified · Previous revision e418c0c7

Non-breaking: GET /tasks/{task_gid}/time_tracking_entries

added the enum value `assignee.name` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Breaking: POST /tasks/{task_gid}/time_tracking_entries

Permanent link to this change

Validated schema comparison changed the request accepted instance set.

Rule: schema.request_acceptance_narrowed

Non-breaking: GET /time_tracking_entries

added the optional property `data/items/assignee` to the response with the `200` status

Field: data/items/assignee

Rule: response.added

Non-breaking: GET /time_tracking_entries/{time_tracking_entry_gid}

added the optional property `data/allOf[subschema #1]/assignee` to the response with the `200` status

Field: data/allOf[subschema #1]/assignee

Rule: response.added

Non-breaking: GET /tasks/{task_gid}/time_tracking_entries

added the optional property `data/items/assignee` to the response with the `200` status

Field: data/items/assignee

Rule: response.added

Non-breaking: PUT /time_tracking_entries/{time_tracking_entry_gid}

added the enum value `assignee.name` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: PUT /time_tracking_entries/{time_tracking_entry_gid}

added the enum value `assignee` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: GET /time_tracking_entries

added the new optional `query` request parameter `assignee`

Field: assignee

Rule: level.info

Non-breaking: POST /tasks/{task_gid}/time_tracking_entries

added the enum value `assignee.name` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: GET /time_tracking_categories/{time_tracking_category_gid}/time_tracking_entries

added the enum value `assignee` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Showing the first ten findings. Open the release for the remaining changes.

Inspect the release and evidence · Public source data

Asana API specification changes · Revision e418c0c7 · POST /projects/{project_gid}/removeMembers

131 recorded findings · classified · Previous revision 1cdf3360

Needs review: POST /projects/{project_gid}/removeMembers

Schema acceptance comparison is unavailable; compatibility requires review.

Rule: coverage.incomplete

Needs review: GET /projects/{project_gid}

Schema acceptance comparison is unavailable; compatibility requires review.

Rule: coverage.incomplete

Non-breaking: GET /workspaces/{workspace_gid}/tasks/custom_id/{custom_id}

added `subschema #1, subschema #2` to the `data` response property `allOf` list for the response status `200`

Field: allOf

Rule: response.added

Needs review: POST /portfolios/{portfolio_gid}/removeMembers

Schema acceptance comparison is unavailable; compatibility requires review.

Rule: coverage.incomplete

Non-breaking: POST /goals/{goal_gid}/setMetric

added `subschema #1, subschema #2` to the `data` response property `allOf` list for the response status `200`

Field: allOf

Rule: response.added

Needs review: POST /goals/{goal_gid}/stories

Schema acceptance comparison is unavailable; compatibility requires review.

Rule: coverage.incomplete

Needs review: POST /projects

Schema acceptance comparison is unavailable; compatibility requires review.

Rule: coverage.incomplete

Non-breaking: POST /goals/{goal_gid}/addFollowers

added `subschema #1, subschema #2` to the `data` response property `allOf` list for the response status `200`

Field: allOf

Rule: response.added

Needs review: GET /project_briefs/{project_brief_gid}

Schema acceptance comparison is unavailable; compatibility requires review.

Rule: coverage.incomplete

Breaking: POST /goals/{goal_gid}/addFollowers

Permanent link to this change

removed `subschema #1, subschema #2` from the `data` response property `allOf` list for the response status `200`

Field: allOf

Rule: response.removed

Showing the first ten findings. Open the release for the remaining changes.

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 1cdf3360 · GET /workspaces/{workspace_gid}/projects/search

4 recorded findings · classified · Previous revision 33ddc08c

Non-breaking: GET /workspaces/{workspace_gid}/projects/search

added the new optional `query` request parameter `limit` to all path's operations

Field: limit

Rule: level.info

Non-breaking: GET /workspaces/{workspace_gid}/tasks/search

added the new optional `query` request parameter `limit` to all path's operations

Field: limit

Rule: level.info

Non-breaking: GET /workspaces/{workspace_gid}/tasks/search

added the new optional `query` request parameter `limit` to all path's operations

Rule: level.info

Non-breaking: GET /workspaces/{workspace_gid}/projects/search

added the new optional `query` request parameter `limit` to all path's operations

Rule: level.info

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 33ddc08c · GET /workspaces/{workspace_gid}/ai_studio/runs

4 recorded findings · classified · Previous revision 2cc9d7bc

Breaking: GET /workspaces/{workspace_gid}/ai_studio/runs

Permanent link to this change

the response property `data/items/allOf[subschema #2]/rule` became nullable for the status `200`

Field: data/items/allOf[subschema #2]/rule

Rule: response.now_optional_or_nullable

Non-breaking: GET /workspaces/{workspace_gid}/ai_studio/runs

added the optional property `data/items/allOf[subschema #2]/automation` to the response with the `200` status

Field: data/items/allOf[subschema #2]/automation

Rule: response.added

Non-breaking: GET /workspaces/{workspace_gid}/ai_studio/runs

added the optional property `data/items/allOf[subschema #2]/automation` to the response with the `200` status

Rule: response.added

Needs review: GET /workspaces/{workspace_gid}/ai_studio/runs

the response property `data/items/allOf[subschema #2]/rule` became nullable for the status `200`

Rule: override.spec_only_downgrade

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 2cc9d7bc

0 recorded findings · no changes · Previous revision 9b6d3a18

No classified endpoint findings recorded for this release.

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 9b6d3a18

0 recorded findings · no changes · Previous revision 0bdb9f31

No classified endpoint findings recorded for this release.

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 0bdb9f31 · PUT /time_tracking_entries/{time_tracking_entry_gid}

60 recorded findings · classified · Previous revision 818e18b5

Non-breaking: PUT /time_tracking_entries/{time_tracking_entry_gid}

added `subschema #1, subschema #2` to the `data/allOf[subschema #1]/created_by` response property `allOf` list for the response status `200`

Field: allOf

Rule: response.added

Non-breaking: GET /tasks/{task_gid}/time_tracking_entries

added `subschema #1, subschema #2` to the `data/items/created_by` response property `allOf` list for the response status `200`

Field: allOf

Rule: response.added

Needs review: GET /time_tracking_categories/{time_tracking_category_gid}/time_tracking_entries

the `data/items/created_by` response's property `type` changed from `object` to `any` for status `200`

Field: type

Rule: response.type_changed

Needs review: GET /time_tracking_entries

the `data/items/created_by` response's property `type` changed from `object` to `any` for status `200`

Field: type

Rule: response.type_changed

Non-breaking: POST /tasks/{task_gid}/time_tracking_entries

added `subschema #1, subschema #2` to the `data/allOf[subschema #1]/created_by` response property `allOf` list for the response status `201`

Field: allOf

Rule: response.added

Breaking: GET /time_tracking_entries/{time_tracking_entry_gid}

Permanent link to this change

removed the optional property `data/allOf[subschema #1]/created_by/resource_type` from the response with the `200` status

Field: data/allOf[subschema #1]/created_by/resource_type

Rule: response.removed

Needs review: PUT /time_tracking_entries/{time_tracking_entry_gid}

the `data/allOf[subschema #1]/created_by` response's property `type` changed from `object` to `any` for status `200`

Field: type

Rule: response.type_changed

Non-breaking: GET /time_tracking_entries/{time_tracking_entry_gid}

added `subschema #1, subschema #2` to the `data/allOf[subschema #1]/created_by` response property `allOf` list for the response status `200`

Field: allOf

Rule: response.added

Breaking: GET /time_tracking_entries/{time_tracking_entry_gid}

Permanent link to this change

removed the optional property `data/allOf[subschema #1]/created_by/gid` from the response with the `200` status

Field: data/allOf[subschema #1]/created_by/gid

Rule: response.removed

Breaking: POST /tasks/{task_gid}/time_tracking_entries

Permanent link to this change

removed the optional property `data/allOf[subschema #1]/created_by/name` from the response with the `201` status

Field: data/allOf[subschema #1]/created_by/name

Rule: response.removed

Showing the first ten findings. Open the release for the remaining changes.

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 71527e3c · PUT /tasks/{task_gid}

33 recorded findings · classified · Previous revision 818e18b5

Needs review: PUT /tasks/{task_gid}

removed the request property `data/allOf[subschema #1]/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #1]/allOf[subschema #2]/html_custom_fields

Rule: request.removed_unknown_strictness

Needs review: POST /tasks/{task_gid}/subtasks

removed the request property `data/allOf[subschema #1]/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #1]/allOf[subschema #2]/html_custom_fields

Rule: request.removed_unknown_strictness

Needs review: PUT /workspaces/{workspace_gid}/users/{user_gid}

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"} -> undefined

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Needs review: PUT /projects/{project_gid}

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"} -> undefined

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Needs review: POST /workspaces/{workspace_gid}/projects

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"} -> undefined

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Needs review: PUT /portfolios/{portfolio_gid}

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"} -> undefined

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Needs review: PUT /workspaces/{workspace_gid}/users/{user_gid}

removed the request property `data/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #2]/html_custom_fields

Rule: request.removed_unknown_strictness

Needs review: PUT /projects/{project_gid}

removed the request property `data/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #2]/html_custom_fields

Rule: request.removed_unknown_strictness

Needs review: PUT /users/{user_gid}

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"} -> undefined

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Needs review: POST /tasks

/requestBody/content/application~1json/schema/properties/data/allOf/0/allOf/1/properties/html_custom_fields/additionalProperties: {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"} -> undefined

Field: /requestBody/content/application~1json/schema/properties/data/allOf/0/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Showing the first ten findings. Open the release for the remaining changes.

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 818e18b5 · POST /tasks

33 recorded findings · classified · Previous revision 71527e3c

Needs review: POST /tasks

/requestBody/content/application~1json/schema/properties/data/allOf/0/allOf/1/properties/html_custom_fields/additionalProperties: undefined -> {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"}

Field: /requestBody/content/application~1json/schema/properties/data/allOf/0/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Non-breaking: PUT /users/{user_gid}

added the new optional request property `data/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #2]/html_custom_fields

Rule: level.info

Non-breaking: POST /tasks/{task_gid}/subtasks

added the new optional request property `data/allOf[subschema #1]/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #1]/allOf[subschema #2]/html_custom_fields

Rule: level.info

Needs review: PUT /portfolios/{portfolio_gid}

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: undefined -> {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"}

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Needs review: POST /teams/{team_gid}/projects

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: undefined -> {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"}

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Non-breaking: POST /projects

added the new optional request property `data/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #2]/html_custom_fields

Rule: level.info

Non-breaking: PUT /portfolios/{portfolio_gid}

added the new optional request property `data/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #2]/html_custom_fields

Rule: level.info

Needs review: POST /tasks/{task_gid}/subtasks

/requestBody/content/application~1json/schema/properties/data/allOf/0/allOf/1/properties/html_custom_fields/additionalProperties: undefined -> {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"}

Field: /requestBody/content/application~1json/schema/properties/data/allOf/0/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Needs review: POST /projects

/requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties: undefined -> {"description":"\"{custom_field_gid}\" => HTML string (e.g., \"<body>Text content</body>\")","type":"string"}

Field: /requestBody/content/application~1json/schema/properties/data/allOf/1/properties/html_custom_fields/additionalProperties

Rule: coverage.incomplete

Non-breaking: PUT /projects/{project_gid}

added the new optional request property `data/allOf[subschema #2]/html_custom_fields`

Field: data/allOf[subschema #2]/html_custom_fields

Rule: level.info

Showing the first ten findings. Open the release for the remaining changes.

Inspect the release and evidence · Public source data

Asana API specification changes · Revision 71527e3c · POST /projects/{project_gid}/duplicate

108 recorded findings · classified · Previous revision 87288c59

Non-breaking: POST /projects/{project_gid}/duplicate

added the enum value `dates_rollup_progress` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: POST /projects/{project_gid}/duplicate

added the optional property `data/dates_rollup_progress` to the response with the `201` status

Field: data/dates_rollup_progress

Rule: response.added

Non-breaking: POST /projects/{project_gid}/saveAsTemplate

added the optional property `data/dates_rollup_progress` to the response with the `201` status

Field: data/dates_rollup_progress

Rule: response.added

Non-breaking: POST /tasks/{task_gid}/removeFollowers

added the optional property `data/allOf[subschema #1]/allOf[subschema #2]/has_subtasks_date_mismatch` to the response with the `200` status

Field: data/allOf[subschema #1]/allOf[subschema #2]/has_subtasks_date_mismatch

Rule: response.added

Non-breaking: GET /tasks

added the enum value `has_subtasks_date_mismatch` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: POST /portfolios/{portfolio_gid}/duplicate

added the enum value `dates_rollup_progress.updated_tasks` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: POST /tasks/{task_gid}/duplicate

added the enum value `dates_rollup_progress.updated_tasks` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: POST /project_templates/{project_template_gid}/instantiateProject

added the optional property `data/dates_rollup_progress` to the response with the `201` status

Field: data/dates_rollup_progress

Rule: response.added

Non-breaking: POST /projects/{project_gid}/saveAsTemplate

added the enum value `dates_rollup_progress.total_tasks` to the property `items/` of the `query` request parameter `opt_fields`

Field: items/

Rule: request.enum_added

Non-breaking: POST /tasks/{task_gid}/subtasks

added the optional property `data/allOf[subschema #1]/allOf[subschema #2]/has_subtasks_date_mismatch` to the response with the `201` status

Field: data/allOf[subschema #1]/allOf[subschema #2]/has_subtasks_date_mismatch

Rule: response.added

Showing the first ten findings. Open the release for the remaining changes.

Inspect the release and evidence · Public source data