[Change] Custom Types Support in Memberships Endpoints
Summary
The /memberships endpoints now support Custom Task Types. You can use Custom Task Type GIDs as the parent parameter when creating, retrieving, updating, and deleting memberships. Responses for memberships belonging to a Custom Task Type include a new resource_subtype value: custom_type_membership.
Custom Task Types are reusable task configurations (e.g., “Bug ticket”, “Feature request”) that standardize how work is tracked in Asana. With this change, you can now programmatically control which teams and users have access to specific Custom Task Types in your workspace.
This is an additive, non-breaking change. Existing integrations are not affected.
Who is affected
This change is relevant to developers who:
- Build integrations that manage Custom Task Types and need to control team or user access to them via the API.
- Manage team-based sharing and permissions for Custom Task Types programmatically.
- Parse membership responses and switch on
resource_subtype— you should add a case forcustom_type_membershipto handle this new type gracefully.
Usage
Changed Endpoints
The following endpoints now accept Custom Task Type GIDs and return custom_type_membership as a resource_subtype:
| Endpoint | What changed |
|---|---|
GET /memberships/{membership_gid} |
Returns "resource_subtype": "custom_type_membership" when the membership belongs to a Custom Task Type. |
GET /memberships?parent={parent_gid} |
Accepts a Custom Task Type GID as the parent parameter. |
POST /memberships |
Accepts a Custom Task Type GID as parent. Supported access_level values: admin, editor, user. |
PUT /memberships/{membership_gid} |
Supports updating access_level for custom type memberships. |
DELETE /memberships/{membership_gid} |
Supports deleting custom type memberships. |
No new error codes have been introduced. Existing error handling applies.
Response Shape
When you retrieve a membership for a Custom Task Type, the response includes the custom_type_membership subtype. Here is an example response for a GET request:
// GET /memberships?parent=1234567890
{
"data": [
{
"gid": "1122334455",
"resource_type": "membership",
"resource_subtype": "custom_type_membership",
"parent": {
"gid": "1234567890",
"resource_type": "custom_type",
"name": "Bug Ticket"
},
"member": {
"gid": "987654321",
"resource_type": "team",
"name": "Engineering"
},
"access_level": "editor"
}
]
}
This response shape applies to all GET, POST, and PUT responses involving a Custom Task Type parent.
Code examples
Add a team to a Custom Task Type
The member field accepts either a team GID or a user GID.
// POST /memberships
{
"data": {
"parent": "1234567890",
"member": "987654321",
"access_level": "editor"
}
}
In this example, the team identified by GID 987654321 is granted editor access to the Custom Task Type identified by GID 1234567890.
Retrieve memberships for a Custom Task Type
// GET /memberships?parent=1234567890
Returns all memberships for the given Custom Task Type, each with "resource_subtype": "custom_type_membership".
Update a membership’s access level
// PUT /memberships/1122334455
{
"data": {
"access_level": "user"
}
}
Delete a membership
// DELETE /memberships/1122334455
Removes the membership, revoking the member’s access to the Custom Task Type.
Timeline
These endpoints are now live for all organizations.