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.
| Classification | Sampled findings |
|---|---|
| Breaking | 6 |
| Non-breaking | 37 |
| Needs review | 25 |
| Deprecation | 0 |
| Pending classification | 0 |
| Operation | Field and rule | Capture |
|---|---|---|
POST /tasks/{task_gid}/time_tracking_entries | Operation-level changeschema.request_acceptance_narrowed | |
POST /goals/{goal_gid}/addFollowers | allOfresponse.removed | |
GET /workspaces/{workspace_gid}/ai_studio/runs | data/items/allOf[subschema #2]/ruleresponse.now_optional_or_nullable | |
GET /time_tracking_entries/{time_tracking_entry_gid} | data/allOf[subschema #1]/created_by/resource_typeresponse.removed | |
GET /time_tracking_entries/{time_tracking_entry_gid} | data/allOf[subschema #1]/created_by/gidresponse.removed | |
POST /tasks/{task_gid}/time_tracking_entries | data/allOf[subschema #1]/created_by/nameresponse.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
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
GET /tasks/{task_gid}/time_tracking_entries46 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
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.
Asana API specification changes · Revision e418c0c7 · POST /projects/{project_gid}/removeMembers
POST /projects/{project_gid}/removeMembers131 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
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.
Asana API specification changes · Revision 1cdf3360 · GET /workspaces/{workspace_gid}/projects/search
GET /workspaces/{workspace_gid}/projects/search4 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
Asana API specification changes · Revision 33ddc08c · GET /workspaces/{workspace_gid}/ai_studio/runs
GET /workspaces/{workspace_gid}/ai_studio/runs4 recorded findings · classified · Previous revision 2cc9d7bc
Breaking: GET /workspaces/{workspace_gid}/ai_studio/runs
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
Asana API specification changes · Revision 2cc9d7bc
0 recorded findings · no changes · Previous revision 9b6d3a18
No classified endpoint findings recorded for this release.
Asana API specification changes · Revision 9b6d3a18
0 recorded findings · no changes · Previous revision 0bdb9f31
No classified endpoint findings recorded for this release.
Asana API specification changes · Revision 0bdb9f31 · PUT /time_tracking_entries/{time_tracking_entry_gid}
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}
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}
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
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.
Asana API specification changes · Revision 71527e3c · PUT /tasks/{task_gid}
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.
Asana API specification changes · Revision 818e18b5 · POST /tasks
POST /tasks33 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.
Asana API specification changes · Revision 71527e3c · POST /projects/{project_gid}/duplicate
POST /projects/{project_gid}/duplicate108 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.