Available since Basecamp 5: folders group projects together on a person's home screen. Folders are per-user — each person arranges their own home into folders, and filing a project into a folder for yourself doesn't change how anyone else sees it. Membership, ordering, and appearance all belong to the authenticated user.
For historical reasons the path and the wire type say stack(s) rather than
folder(s); they are the same thing.
Endpoints:
GET /stacks.jsonreturns the authenticated user's folders, in the order they appear on the home screen.
[
{
"id": 2085958513,
"name": "Client work",
"type": "Stack",
"created_at": "2026-07-27T10:16:49.312Z",
"updated_at": "2026-07-27T10:16:49.325Z",
"bucket_ids": [],
"is_emoji_only_name": false,
"star_url": "https://3.basecampapi.com/195539477/buckets/2085958513/stars.json",
"gauges_url": null,
"color": null,
"image_url": null,
"url": "https://3.basecampapi.com/195539477/stacks/2085958513.json"
}
]curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/stacks.jsonGET /stacks/2.jsonreturns the folder with an ID of2, including the projects grouped inside it underprojects.
{
"id": 2085958513,
"name": "Client work",
"type": "Stack",
"created_at": "2026-07-27T10:16:49.312Z",
"updated_at": "2026-07-27T10:16:49.325Z",
"bucket_ids": [],
"is_emoji_only_name": false,
"star_url": "https://3.basecampapi.com/195539477/buckets/2085958513/stars.json",
"gauges_url": null,
"color": null,
"image_url": null,
"url": "https://3.basecampapi.com/195539477/stacks/2085958513.json",
"projects": []
}curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/stacks/2.jsonPOST /stacks.jsoncreates a new folder for the authenticated user and files the given projects into it. The folder is placed at the top of the home screen.
| Param | Type | Description |
|---|---|---|
name |
String | The folder's name. Defaults to New folder when blank or omitted. |
project_ids |
Array | IDs of the projects to file into the folder — the same ids the folder reports back as bucket_ids. Each must be a project the user can access, or an all-access project they're eligible to join — filing an all-access project the user isn't yet a member of also grants them access to it. Archived, trashed, or invitation-only projects the user isn't on are rejected: the whole request returns 404 Not Found and nothing is created. Omit it, or send null or an empty array, for an empty folder. |
{
"name": "Client work",
"project_ids": []
}A successful create returns 201 Created with the new folder's JSON shape,
including its grouped projects:
{
"id": 2085958513,
"name": "Client work",
"type": "Stack",
"created_at": "2026-07-27T10:16:49.312Z",
"updated_at": "2026-07-27T10:16:49.325Z",
"bucket_ids": [],
"is_emoji_only_name": false,
"star_url": "https://3.basecampapi.com/195539477/buckets/2085958513/stars.json",
"gauges_url": null,
"color": null,
"image_url": null,
"url": "https://3.basecampapi.com/195539477/stacks/2085958513.json",
"projects": []
}curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \
-d '{"name":"Client work","project_ids":[]}' \
https://3.basecampapi.com/$ACCOUNT_ID/stacks.jsonPUT /stacks/2.jsonrenames the folder with an ID of2. Onlynamecan be changed; a folder's projects, ordering, and image are managed elsewhere.
| Param | Type | Description |
|---|---|---|
name |
String | The folder's new name. |
{
"name": "Active client work"
}Returns 200 OK with the updated folder's JSON shape:
{
"id": 2085958513,
"name": "Active client work",
"type": "Stack",
"created_at": "2026-07-27T10:16:49.312Z",
"updated_at": "2026-07-27T10:16:50.464Z",
"bucket_ids": [],
"is_emoji_only_name": false,
"star_url": "https://3.basecampapi.com/195539477/buckets/2085958513/stars.json",
"gauges_url": null,
"color": null,
"image_url": null,
"url": "https://3.basecampapi.com/195539477/stacks/2085958513.json",
"projects": []
}curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \
-d '{"name":"Active client work"}' -X PUT \
https://3.basecampapi.com/$ACCOUNT_ID/stacks/2.jsonDELETE /stacks/2.jsondeletes the folder with an ID of2and returns204 No Content. Deleting a folder unpins its projects from the person's home screen — the projects themselves are not deleted, and they are not moved back out onto the home screen; they simply stop appearing there until pinned again.
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -X DELETE \
https://3.basecampapi.com/$ACCOUNT_ID/stacks/2.json