diff --git a/README.md b/README.md index 85ae554..b8df529 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,32 @@ Then you should be able to copy/paste any example from the docs. After pasting a curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/999999999/projects.json | json_pp ``` + +Flat routes +----------- + +Every resource in the Basecamp 4 API is uniquely identified by its own ID. You can access any resource directly without including its project (bucket) in the URL: + +``` +GET /todos/67890.json +GET /messages/12345.json +GET /todolists/456/todos.json +``` + +These **flat routes** are the canonical form for all new integrations. The project context is derived server-side from the resource itself, so you rarely need to supply a `bucket_id`. A few project-level collection endpoints (message types, webhooks index/create, tools) still require the project-scoped form — these are noted in their respective sections. + +For listing and creating resources under a parent, use the parent's ID directly: + +``` +GET /todolists/456/todos.json # list to-dos in a to-do list +POST /todolists/456/todos.json # create a to-do in a to-do list +GET /message_boards/789/messages.json # list messages on a board +POST /recordings/123/comments.json # comment on any recording +``` + +The previous project-scoped form — `/buckets/{project_id}/...` — remains available and will continue to work in perpetuity, but is considered legacy. All endpoint documentation in this guide uses flat routes as the primary form, with legacy equivalents noted at the bottom of each section. + + Authentication -------------- @@ -93,7 +119,7 @@ Most collection APIs paginate their results. The number of requests that'll appe Here's an example response header from requesting the third page of [messages](sections/messages.md#messages): ``` -Link: ; rel="next" +Link: ; rel="next" ``` If the `Link` header is blank, that's the last page. The Basecamp 4 API also provides the `X-Total-Count` header, which displays the total number of resources in the collection you are fetching. @@ -145,15 +171,24 @@ Understanding Basecamp's domain model helps you navigate the API effectively. ### The bucket/project relationship -Every project has exactly one **bucket**—its storage container for all content. In API URLs, `bucket_id` and project ID are the same value: +Every project has exactly one **bucket**—its storage container for all content. The `bucket_id` and project ID are the same value. + +With flat routes, you don't need to know the bucket ID to access a resource — just use the resource's own ID: + +``` +GET /todos/67890.json # access a to-do directly +GET /todolists/456/todos.json # list to-dos in a to-do list +``` + +The legacy project-scoped form includes the bucket explicitly: ``` -/buckets/12345/todolists/67890.json - ↑ - This is the project ID +GET /buckets/12345/todos/67890.json + ↑ + This is the project ID ``` -When you see `/buckets/{id}/...` in the API, think "project." (Templates also have buckets internally, but they use `/templates/...` endpoints.) +Both forms return identical responses. Flat routes are preferred for all new integrations. ### Recordings: bucket contents @@ -196,8 +231,8 @@ Project └── To-do item ``` -To create a to-do list, POST to the **to-do set**, not the project: -`POST /buckets/{project_id}/todosets/{todoset_id}/todolists.json` +To create a to-do list, POST to the **to-do set**: +`POST /todosets/{todoset_id}/todolists.json` ### Similar patterns for other tools diff --git a/sections/campfires.md b/sections/campfires.md index b87a3f8..a9c3d1c 100644 --- a/sections/campfires.md +++ b/sections/campfires.md @@ -24,14 +24,14 @@ Get Campfires "status": "active", "visible_to_clients": false, "created_at": "2026-01-31T08:29:58.785Z", - "updated_at": "2026-01-31T08:30:23.083Z", + "updated_at": "2026-02-07T01:42:53.738Z", "title": "Chat", "inherits_status": true, "type": "Chat::Transcript", "url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/chats/1069478985", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3ODk4NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--f745f0a5dc8108b7f361e578d47b72ff974ed50e.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069478985/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069478985/subscription.json", "position": 4, "bucket": { "id": 2085958502, @@ -66,7 +66,7 @@ Get Campfires "can_access_hill_charts": true }, "topic": "Chat", - "lines_url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985/lines.json" + "lines_url": "https://3.basecampapi.com/195539477/chats/1069478985/lines.json" } ] ``` @@ -80,24 +80,24 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCO Get a Campfire -------------- -* `GET /buckets/1/chats/2.json` will return the Campfire with ID `2` in the project with ID `1`. +* `GET /chats/2.json` will return the Campfire with ID `2`. ###### Example JSON Response - + ```json { "id": 1069478985, "status": "active", "visible_to_clients": false, "created_at": "2026-01-31T08:29:58.785Z", - "updated_at": "2026-01-31T08:30:23.083Z", + "updated_at": "2026-02-07T01:42:53.738Z", "title": "Chat", "inherits_status": true, "type": "Chat::Transcript", "url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/chats/1069478985", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3ODk4NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--f745f0a5dc8108b7f361e578d47b72ff974ed50e.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069478985/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069478985/subscription.json", "position": 4, "bucket": { "id": 2085958502, @@ -132,23 +132,23 @@ Get a Campfire "can_access_hill_charts": true }, "topic": "Chat", - "lines_url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985/lines.json" + "lines_url": "https://3.basecampapi.com/195539477/chats/1069478985/lines.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/chats/2.json ``` Get Campfire lines ------------------ -* `GET /buckets/1/chats/2/lines.json` will return a [paginated list][pagination] of Campfire lines of the Campfire with ID `2` in the project with ID `1`. +* `GET /chats/2/lines.json` will return a [paginated list][pagination] of Campfire lines of the Campfire with ID `2`. ###### Example JSON Response - + ```json [ { @@ -163,6 +163,8 @@ Get Campfire lines "url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985/lines/1069479068.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/chats/1069478985@1069479068", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTA2OD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--ed75de023587361ebed66cce122997d56faeaa2e.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479068/boosts.json", "parent": { "id": 1069478985, "title": "Chat", @@ -202,20 +204,20 @@ Get Campfire lines } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/2/lines.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/chats/2/lines.json ``` Get a Campfire line ------------------- -* `GET /buckets/1/chats/2/lines/3.json` will return the Campfire line with ID `3` in the Campfire with ID `2` in the project with ID `1`. +* `GET /chats/2/lines/3.json` will return the Campfire line with ID `3` in the Campfire with ID `2`. ###### Example JSON Response - + ```json { "id": 1069479054, @@ -229,6 +231,8 @@ Get a Campfire line "url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985/lines/1069479054.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/chats/1069478985@1069479054", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTA1ND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--bf7b55e226a9c3111e0a8639faa1012b4db18bb1.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479054/boosts.json", "parent": { "id": 1069478985, "title": "Chat", @@ -267,17 +271,17 @@ Get a Campfire line "content": "👏 🎉" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/2/lines/3.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/chats/2/lines/3.json ``` Create a Campfire line ---------------------- -* `POST /buckets/1/chats/2/lines.json` creates a line in the Campfire with ID `2` in the project with ID `1`. +* `POST /chats/2/lines.json` creates a line in the Campfire with ID `2`. **Required parameters**: `content` as the plain text body for the Campfire line. @@ -296,20 +300,31 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"content":"Good morning"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/2/lines.json + https://3.basecampapi.com/$ACCOUNT_ID/chats/2/lines.json ``` Delete a Campfire line ---------------------- -* `DELETE /buckets/1/chats/2/lines/3.json` will delete the Campfire line with ID `3` in the Campfire with ID `2` in the project with ID `1`. +* `DELETE /chats/2/lines/3.json` will delete the Campfire line with ID `3` in the Campfire with ID `2`. Returns `204 No Content` if successful. ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/2/lines/3.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/chats/2/lines/3.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/chats/2.json` → [Get a Campfire](#get-a-campfire) +* `GET /buckets/1/chats/2/lines.json` → [Get Campfire lines](#get-campfire-lines) +* `GET /buckets/1/chats/2/lines/3.json` → [Get a Campfire line](#get-a-campfire-line) +* `POST /buckets/1/chats/2/lines.json` → [Create a Campfire line](#create-a-campfire-line) +* `DELETE /buckets/1/chats/2/lines/3.json` → [Delete a Campfire line](#delete-a-campfire-line) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/card_table_cards.md b/sections/card_table_cards.md index 2c75d8a..15932a8 100644 --- a/sections/card_table_cards.md +++ b/sections/card_table_cards.md @@ -12,10 +12,10 @@ Endpoints: Get cards in a column -------------------- -* `GET /buckets/1/card_tables/lists/3/cards.json` will return a [paginated list][pagination] of cards in the project with an ID of `1` and the column with ID of `3`. +* `GET /card_tables/lists/3/cards.json` will return a [paginated list][pagination] of cards in the column with ID of `3`. ###### Example JSON Response - + ```json [ { @@ -85,20 +85,20 @@ Get cards in a column } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/lists/3/cards.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/card_tables/lists/3/cards.json ``` Get a card -------------------- -* `GET /buckets/1/card_tables/cards/2.json` will return the card with an ID of `2` in the project with an ID of `1`. +* `GET /card_tables/cards/2.json` will return the card with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479602, @@ -248,17 +248,17 @@ Get a card ] } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/cards/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/card_tables/cards/2.json ``` Create a card ------------------------- -* `POST /buckets/1/card_tables/lists/2/cards.json` creates a card within the column with ID `2` in the project with id `1`. +* `POST /card_tables/lists/2/cards.json` creates a card within the column with ID `2`. **Required parameters**: `title` of the card. @@ -285,13 +285,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"Investigation", "content": "Investigate on an issue in our todo list.", "due_on": "2021-01-01"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/lists/2/cards.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/lists/2/cards.json ``` Update a card ----------------------- -* `PUT /buckets/1/card_tables/cards/2.json` allows changing of the card with an ID of `2` in the project with ID `1`. +* `PUT /card_tables/cards/2.json` allows changing of the card with an ID of `2`. _Optional parameters_: @@ -315,13 +315,13 @@ This endpoint will return `200 OK` with the current JSON representation of the c ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"Updated investigation"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/cards/2.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/cards/2.json ``` Move a card ----------------------- -* `POST /buckets/1/card_tables/cards/2/moves.json` allows moving of a card with id `2` in the project with ID `1`. +* `POST /card_tables/cards/2/moves.json` allows moving of a card with id `2`. **Required parameters**: `column_id` of the column destination @@ -339,9 +339,21 @@ This endpoint will return `204 No Content` if the update was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"column_id": 3}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/cards/2/moves.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/cards/2/moves.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/card_tables/lists/3/cards.json` → [Get cards in a column](#get-cards-in-a-column) +* `GET /buckets/1/card_tables/cards/2.json` → [Get a card](#get-a-card) +* `POST /buckets/1/card_tables/lists/2/cards.json` → [Create a card](#create-a-card) +* `PUT /buckets/1/card_tables/cards/2.json` → [Update a card](#update-a-card) +* `POST /buckets/1/card_tables/cards/2/moves.json` → [Move a card](#move-a-card) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [rich]: https://github.com/basecamp/bc3-api/blob/master/sections/rich_text.md [people]: https://github.com/basecamp/bc3-api/blob/master/sections/people.md#get-all-people diff --git a/sections/card_table_columns.md b/sections/card_table_columns.md index 0c69c14..fbea443 100644 --- a/sections/card_table_columns.md +++ b/sections/card_table_columns.md @@ -14,10 +14,10 @@ Endpoints: Get a column ------------- -* `GET /buckets/1/card_tables/columns/2.json` will return the column with an ID of `2` in the project with an ID of `1`. +* `GET /card_tables/columns/2.json` will return the column with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479400, @@ -51,7 +51,7 @@ Get a column "email_address": "victor@honchodesign.com", "personable_type": "User", "title": "Chief Strategist", - "bio": "Don’t let your dreams be dreams", + "bio": "Don't let your dreams be dreams", "location": "Chicago, IL", "created_at": "2026-01-31T08:29:28.365Z", "updated_at": "2026-01-31T08:29:32.599Z", @@ -80,7 +80,7 @@ Get a column "email_address": "victor@honchodesign.com", "personable_type": "User", "title": "Chief Strategist", - "bio": "Don’t let your dreams be dreams", + "bio": "Don't let your dreams be dreams", "location": "Chicago, IL", "created_at": "2026-01-31T08:29:28.365Z", "updated_at": "2026-01-31T08:29:32.599Z", @@ -107,17 +107,17 @@ Get a column "cards_url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/lists/1069479400/cards.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/columns/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/card_tables/columns/2.json ``` Create a column ------------------------- -* `POST /buckets/1/card_tables/2/columns.json` creates a column within the card table with ID `2` in the project with id `1`. +* `POST /card_tables/2/columns.json` creates a column within the card table with ID `2`. **Required parameters**: `title` of the column. @@ -141,13 +141,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"In progress"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/2/columns.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/2/columns.json ``` Update a column ----------------------- -* `PUT /buckets/1/card_tables/columns/2.json` allows changing of the column with an ID of `2` in the project with ID `1`. +* `PUT /card_tables/columns/2.json` allows changing of the column with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the column if the update was a success. See the [Get a column](#get-a-column) endpoint for more info on the payload. @@ -165,13 +165,13 @@ This endpoint will return `200 OK` with the current JSON representation of the c ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"On it", "description":"Stuff we are doing right now"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/columns/2.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/columns/2.json ``` Move a column ----------------------- -* `POST /buckets/1/card_tables/2/moves.json` allows moving of a column in the card table with id `2` in the project with ID `1`. +* `POST /card_tables/2/moves.json` allows moving of a column in the card table with id `2`. **Required parameters**: @@ -198,13 +198,13 @@ This endpoint will return `204 No Content` if the update was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"source_id": 3, "target_id":4, "position": 2}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/2/moves.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/2/moves.json ``` Watch a column ----------------------- -* `POST /buckets/1/card_tables/lists/2/subscription.json` starts watching the column with id `2` in the project with ID `1`. -* `DELETE /buckets/1/card_tables/lists/2/subscription.json` stops watching the column with id `2` in the project with ID `1`. +* `POST /card_tables/lists/2/subscription.json` starts watching the column with id `2`. +* `DELETE /card_tables/lists/2/subscription.json` stops watching the column with id `2`. This endpoint will return `204 No Content` if the update was a success. @@ -212,19 +212,19 @@ This endpoint will return `204 No Content` if the update was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -X POST \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/lists/2/subscription.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/lists/2/subscription.json ``` ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/lists/2/subscription.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/lists/2/subscription.json ``` Change on hold on a column ----------------------- -* `POST /buckets/1/card_tables/columns/2/on_hold.json` creates an on_hold section in the column with ID `2` in the project with id `1`. -* `DELETE /buckets/1/card_tables/columns/2/on_hold.json` removes an on_hold section in the column with ID `2` in the project with id `1`. +* `POST /card_tables/columns/2/on_hold.json` creates an on_hold section in the column with ID `2`. +* `DELETE /card_tables/columns/2/on_hold.json` removes an on_hold section in the column with ID `2`. This endpoint will return `200 OK` with the current JSON representation of the column if the operation was a success. See the [Get a column](#get-a-column) endpoint for more info on the payload. @@ -233,18 +233,18 @@ This endpoint will return `200 OK` with the current JSON representation of the c ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -X POST \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/columns/2/on_hold.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/columns/2/on_hold.json ``` ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/columns/2/on_hold.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/columns/2/on_hold.json ``` Change color of a column ----------------------- -* `PUT /buckets/1/card_tables/columns/2/color.json` allows changing the color of the column with an ID of `2` in the project with ID `1`. +* `PUT /card_tables/columns/2/color.json` allows changing the color of the column with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the column if the update was a success. See the [Get a column](#get-a-column) endpoint for more info on the payload. @@ -266,6 +266,20 @@ This endpoint will return `200 OK` with the current JSON representation of the c ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"color":"orange"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/columns/2/color.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/columns/2/color.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/card_tables/columns/2.json` → [Get a column](#get-a-column) +* `POST /buckets/1/card_tables/2/columns.json` → [Create a column](#create-a-column) +* `PUT /buckets/1/card_tables/columns/2.json` → [Update a column](#update-a-column) +* `POST /buckets/1/card_tables/2/moves.json` → [Move a column](#move-a-column) +* `POST /buckets/1/card_tables/lists/2/subscription.json` → [Watch a column](#watch-a-column) +* `DELETE /buckets/1/card_tables/lists/2/subscription.json` → [Watch a column](#watch-a-column) +* `POST /buckets/1/card_tables/columns/2/on_hold.json` → [Change on hold on a column](#change-on-hold-on-a-column) +* `DELETE /buckets/1/card_tables/columns/2/on_hold.json` → [Change on hold on a column](#change-on-hold-on-a-column) +* `PUT /buckets/1/card_tables/columns/2/color.json` → [Change color of a column](#change-color-of-a-column) diff --git a/sections/card_table_steps.md b/sections/card_table_steps.md index e9e6ba3..d66f9bb 100644 --- a/sections/card_table_steps.md +++ b/sections/card_table_steps.md @@ -17,7 +17,7 @@ Steps are returned unpaginated as part of the [Get a card][card] endpoint payloa Create a step ------------------------- -* `POST /buckets/1/card_tables/cards/2/steps.json` creates a step within the card with ID `2` in the project with id `1`. +* `POST /card_tables/cards/2/steps.json` creates a step within the card with ID `2`. **Required parameters**: `title` of the step. @@ -43,13 +43,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title": "Inspiration", "due_on": "2021-01-01", "assignees": "30068628,270913789"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/cards/2/steps.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/cards/2/steps.json ``` Update a step ----------------------- -* `PUT /buckets/1/card_tables/steps/2.json` allows changing of the step with an ID of `2` in the project with ID `1`. +* `PUT /card_tables/steps/2.json` allows changing of the step with an ID of `2`. _Optional parameters_: @@ -72,13 +72,13 @@ This endpoint will return `200 OK` with the current JSON representation of the s ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title": "Updated inspiration"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/steps/2.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/steps/2.json ``` Change step completion status ----------------------------- -* `PUT /buckets/1/card_tables/steps/2/completions.json` will mark the step with an ID of `2` in the project with ID `1` as completed or uncompleted depending on the completion parameter. +* `PUT /card_tables/steps/2/completions.json` will mark the step with an ID of `2` as completed or uncompleted depending on the completion parameter. **Required parameters**: @@ -99,13 +99,13 @@ This endpoint will return `200 OK` with the current JSON representation of the s ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"completion": "on"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/steps/2/completions.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/steps/2/completions.json ``` Reposition a step ----------------------------- -* `POST /buckets/1/card_tables/cards/2/positions.json` allows changing the position of the step with an ID of `source_id` in the card with id `2`. +* `POST /card_tables/cards/2/positions.json` allows changing the position of the step with an ID of `source_id` in the card with id `2`. **Required parameters**: @@ -126,8 +126,18 @@ This endpoint will return `204 No Content` if successful. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"source_id": 3, "position": 4}' -X POST \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/cards/2/positions.json + https://3.basecampapi.com/$ACCOUNT_ID/card_tables/cards/2/positions.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `POST /buckets/1/card_tables/cards/2/steps.json` → [Create a step](#create-a-step) +* `PUT /buckets/1/card_tables/steps/2.json` → [Update a step](#update-a-step) +* `PUT /buckets/1/card_tables/steps/2/completions.json` → [Change step completion status](#change-step-completion-status) +* `POST /buckets/1/card_tables/cards/2/positions.json` → [Reposition a step](#reposition-a-step) + [card]: https://github.com/basecamp/bc3-api/blob/master/sections/card_table_cards.md#get-a-card [people]: https://github.com/basecamp/bc3-api/blob/master/sections/people.md#get-all-people diff --git a/sections/card_tables.md b/sections/card_tables.md index 212a925..bea8ae8 100644 --- a/sections/card_tables.md +++ b/sections/card_tables.md @@ -10,10 +10,10 @@ Endpoints: Get a card table -------------------- -* `GET /buckets/1/card_tables/2.json` will return the card_table with an ID of `2` in the project with an ID of `1`. +* `GET /card_tables/2.json` will return the card table with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479399, @@ -27,7 +27,7 @@ Get a card table "url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/1069479399.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/card_tables/1069479399", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTM5OT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--4c62f9ab0364fa8feecc3d38b70fc066bfa6bdb9.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479399/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479399/subscription.json", "bucket": { "id": 2085958504, "name": "The Leto Laptop", @@ -103,7 +103,7 @@ Get a card table "url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/columns/1069479400.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/card_tables/columns/1069479400", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--76b2dfcd8a8eea46097d4f1ce80acf09d339e6d2.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479400/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479400/subscription.json", "parent": { "id": 1069479399, "title": "Card Table", @@ -190,7 +190,7 @@ Get a card table "url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/columns/1069479401.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/card_tables/columns/1069479401", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwMT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--c38ff652825662db3002123f804f6ff4d4ba010d.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479401/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479401/subscription.json", "parent": { "id": 1069479399, "title": "Card Table", @@ -277,7 +277,7 @@ Get a card table "url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/columns/1069479402.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/card_tables/columns/1069479402", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwMj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--ccb1881249e7c3823899fb63807fdf71e67a68ab.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479402/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479402/subscription.json", "position": 1, "parent": { "id": 1069479399, @@ -365,7 +365,7 @@ Get a card table "url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/columns/1069479403.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/card_tables/columns/1069479403", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--3f35474fda2b034850dd6f71da9aaf6e737fdfbf.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479403/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479403/subscription.json", "position": 2, "parent": { "id": 1069479399, @@ -453,7 +453,7 @@ Get a card table "url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/columns/1069479404.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/card_tables/columns/1069479404", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--999257f5e2a3be18e6cd145f0eb7b91e5f417d5e.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479404/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479404/subscription.json", "parent": { "id": 1069479399, "title": "Card Table", @@ -531,9 +531,16 @@ Get a card table ] } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/card_tables/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/card_tables/2.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/card_tables/2.json` → [Get a card table](#get-a-card-table) diff --git a/sections/chatbots.md b/sections/chatbots.md index 6d026a6..b91a48c 100644 --- a/sections/chatbots.md +++ b/sections/chatbots.md @@ -121,10 +121,10 @@ Endpoints: Get chatbots ------------ -* `GET /buckets/1/chats/1/integrations.json` will return all the chatbots from the account with the line URL for the campfire on the basecamp with an ID of `1`. +* `GET /chats/1/integrations.json` will return all the chatbots from the account with the line URL for the campfire. ###### Example JSON Response - + ```json [ { @@ -139,46 +139,46 @@ Get chatbots } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/1/integrations.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/chats/1/integrations.json ``` Get a chatbot ------------- -* `GET /buckets/1/chats/1/integrations/3.json` will return the chatbot with an ID of `3` with the line URL from the project with ID `1`. +* `GET /chats/1/integrations/3.json` will return the chatbot with an ID of `3`, including its line URL. ###### Example JSON Response - + ```json [ { - "id": 1007299181, - "created_at": "2016-09-23T00:04:47.833Z", - "updated_at": "2016-09-23T00:04:47.833Z", - "service_name": "dash", - "command_url": "https://example.com/command", - "url": "https://3.basecampapi.com/195539477/buckets/2085958496/chats/9007199254741045/integrations/1007299181.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958496/chats/9007199254741045/integrations/1007299181", - "lines_url": "https://3.basecampapi.com/195539477/integrations/yFU7K9oKrcZyvYLDw4GfLU89/buckets/2085958496/chats/9007199254741045/lines" + "id": 1049715954, + "created_at": "2026-01-31T08:36:22.772Z", + "updated_at": "2026-01-31T08:36:22.772Z", + "service_name": "Capistrano", + "command_url": null, + "url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985/integrations/1049715954.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/chats/1069478985/integrations/1049715954", + "lines_url": "https://3.basecampapi.com/195539477/integrations/HF51iGR8Mz8xzb7MmCz7PryX/buckets/2085958502/chats/1069478985/lines" } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/1/integrations/3.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/chats/1/integrations/3.json ``` Create a chatbot ---------------- -* `POST /buckets/1/chats/1/integrations.json` creates a chatbot on the account and returns the new chatbot with the lines URL from the project with ID `1`. +* `POST /chats/1/integrations.json` creates a chatbot on the account and returns the new chatbot with its lines URL. **Required parameters**: `service_name` for the chatbot name, which will be used to invoke queries and commands on interactive bots. No spaces, emoji or non-word characters are allowed, as you need to be able to call it like `!tally myCommand` @@ -200,13 +200,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"service_name":"tally","command_url":"https://example.com/endpoint"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/1/integrations.json + https://3.basecampapi.com/$ACCOUNT_ID/chats/1/integrations.json ``` Update a chatbot ---------------- -* `PUT /buckets/1/chats/1/integrations/3.json` allows changing the service name and commandURL of the chatbot with an ID of `3` in the project with ID `1`. +* `PUT /chats/1/integrations/3.json` allows changing the service name and commandURL of the chatbot with an ID of `3`. **Required parameters**: `service_name` for the chatbot name, which will be used to invoke queries and commands on interactive bots. No spaces, emoji or non-word characters are allowed, as you need to be able to call it like `!tally myCommand` @@ -228,13 +228,13 @@ This endpoint will return `200 OK` with the current JSON representation of the c ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"service_name":"uptime","command_url":"https://example.com/endpoint"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chats/1/integrations/3.json + https://3.basecampapi.com/$ACCOUNT_ID/chats/1/integrations/3.json ``` Destroy a chatbot ----------------- -* `DELETE /buckets/1/chats/1/integrations/3.json` will delete the chatbot with an ID of `3` across the account. +* `DELETE /chats/1/integrations/3.json` will delete the chatbot with an ID of `3` across the account. This endpoint will return `204 No Content` if the destroy was a success. @@ -242,12 +242,14 @@ This endpoint will return `204 No Content` if the destroy was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/chatbots/3.json + https://3.basecampapi.com/$ACCOUNT_ID/chatbots/3.json ``` Create a line ------------- +**Note:** This endpoint uses the full project-scoped URL because it authenticates via the chatbot's access key, not via OAuth. The `/buckets/{project_id}/` prefix is required. + * `POST /integrations/$CHATBOT_KEY/buckets/1/chats/2/lines.json` creates a line in the Campfire with ID `2` in the project with ID `1`. **Required parameters**: `content` as the body for the Campfire line. See our [Rich text guide][1] for what HTML tags are allowed. @@ -282,4 +284,16 @@ curl -s -H "Content-Type: application/json" -d '{"text":"Good morning"}' \ https://3.basecampapi.com/$ACCOUNT_ID/integrations/$CHATBOT_KEY/buckets/1/chats/2/lines.json?content_param=text ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/chats/1/integrations.json` → [Get chatbots](#get-chatbots) +* `GET /buckets/1/chats/1/integrations/3.json` → [Get a chatbot](#get-a-chatbot) +* `POST /buckets/1/chats/1/integrations.json` → [Create a chatbot](#create-a-chatbot) +* `PUT /buckets/1/chats/1/integrations/3.json` → [Update a chatbot](#update-a-chatbot) +* `DELETE /buckets/1/chats/1/integrations/3.json` → [Destroy a chatbot](#destroy-a-chatbot) + [1]: https://github.com/basecamp/bc3-api/blob/master/sections/rich_text.md diff --git a/sections/client_approvals.md b/sections/client_approvals.md index 59d2729..9269e9e 100644 --- a/sections/client_approvals.md +++ b/sections/client_approvals.md @@ -27,7 +27,7 @@ Get client approvals "url": "https://3.basecampapi.com/195539477/buckets/2085958505/client/approvals/1069479710.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958505/client/approvals/1069479710", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTcxMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--c829d12a1ba1abe280f06a0f79bcbc38c7c189cb.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958505/recordings/1069479710/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479710/subscription.json", "parent": { "id": 1069479620, "title": "The Clientside", @@ -113,10 +113,10 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCO Get a client approval --------------------- -* `GET /buckets/1/client/approvals/2.json` will return the client approval with an ID of `2` in the project with an ID of `1`. +* `GET /client/approvals/2.json` will return the client approval with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479708, @@ -130,7 +130,7 @@ Get a client approval "url": "https://3.basecampapi.com/195539477/buckets/2085958505/client/approvals/1069479708.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958505/client/approvals/1069479708", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTcwOD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--04b696f4ae155bb3e5af2626c7e368f092038285.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958505/recordings/1069479708/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479708/subscription.json", "parent": { "id": 1069479620, "title": "The Clientside", @@ -260,11 +260,19 @@ Get a client approval ] } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/client/approvals/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/client/approvals/2.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/client/approvals/2.json` → [Get a client approval](#get-a-client-approval) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/client_correspondences.md b/sections/client_correspondences.md index b1f1045..577677c 100644 --- a/sections/client_correspondences.md +++ b/sections/client_correspondences.md @@ -27,7 +27,7 @@ Get client correspondences "url": "https://3.basecampapi.com/195539477/buckets/2085958505/client/correspondences/1069479702.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958505/client/correspondences/1069479702", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTcwMj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--549ac000e6e0eac9d8df54b89a1c0a473ab78e57.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958505/recordings/1069479702/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479702/subscription.json", "parent": { "id": 1069479620, "title": "The Clientside", @@ -84,10 +84,10 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCO Get a client correspondence --------------------------- -* `GET /buckets/1/client/correspondences/2.json` will return the client correspondence with an ID of `2` in the project with an ID of `1`. +* `GET /client/correspondences/2.json` will return the client correspondence with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479622, @@ -101,7 +101,7 @@ Get a client correspondence "url": "https://3.basecampapi.com/195539477/buckets/2085958505/client/correspondences/1069479622.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958505/client/correspondences/1069479622", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTYyMj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--05a942db8b0024e8a6f293a19b83d795cf079601.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958505/recordings/1069479622/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479622/subscription.json", "parent": { "id": 1069479620, "title": "The Clientside", @@ -143,11 +143,19 @@ Get a client correspondence "replies_url": "https://3.basecampapi.com/195539477/buckets/2085958505/client/recordings/1069479622/replies.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/client/correspondences/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/client/correspondences/2.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/client/correspondences/2.json` → [Get a client correspondence](#get-a-client-correspondence) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/client_replies.md b/sections/client_replies.md index d0c8027..f16f027 100644 --- a/sections/client_replies.md +++ b/sections/client_replies.md @@ -11,10 +11,10 @@ Endpoints: Get client replies ------------------ -* `GET /buckets/1/client/recordings/2/replies.json` will return a [paginated list][pagination] of client replies in the project with an ID of `1` and the recording with ID of `2`. +* `GET /client/recordings/2/replies.json` will return a [paginated list][pagination] of client replies for the recording with ID `2`. ###### Example JSON Response - + ```json [ { @@ -72,20 +72,20 @@ Get client replies } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/client/recordings/2/replies.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/client/recordings/2/replies.json ``` Get a client reply ------------------ -* `GET /buckets/1/client/recordings/2/replies/3.json` will return the client reply with an ID of `3` for the recording with an ID of `2` in the project with an ID of `1`. +* `GET /client/recordings/2/replies/3.json` will return the client reply with an ID of `3` for the recording with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479628, @@ -141,13 +141,22 @@ Get a client reply "content": "Hi Leto team, this it's Annie. I'll be your day to day contact for the project, so keep me on your speed dial (or speed email, perhaps more accurately!) Feel free to reach out to me with any questions at all, and I'll be posting up some outlines, timelines, etc. very shortly." } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/client/recordings/2/replies/3.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/client/recordings/2/replies/3.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/client/recordings/2/replies.json` → [Get client replies](#get-client-replies) +* `GET /buckets/1/client/recordings/2/replies/3.json` → [Get a client reply](#get-a-client-reply) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [correspondences]: https://github.com/basecamp/bc3-api/blob/master/sections/client_correspondences.md#client-correspondences [approvals]: https://github.com/basecamp/bc3-api/blob/master/sections/client_approvals.md#client-approvals diff --git a/sections/client_visibility.md b/sections/client_visibility.md index c4959b3..f542d0e 100644 --- a/sections/client_visibility.md +++ b/sections/client_visibility.md @@ -10,7 +10,7 @@ Endpoints: Toggle client visibility ------------------------ -* `PUT /buckets/1/recordings/2/client_visibility.json` allows changing the client visibility for the recording with an ID of `2` in the project with ID `1`. +* `PUT /recordings/2/client_visibility.json` allows changing the client visibility for the recording with an ID of `2`. **Required parameter**: `visible_to_clients` with value `true` or `false`. @@ -29,9 +29,16 @@ This endpoint will return `200 OK` with the current JSON representation of the r ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"visible_to_clients":true}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/client_visibility.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/client_visibility.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `PUT /buckets/1/recordings/2/client_visibility.json` → [Toggle client visibility](#toggle-client-visibility) + [1]: https://m.signalvnoise.com/launch-a-brand-new-way-to-work-with-clients-in-basecamp-3-6a78b1175c5d [2]: https://github.com/basecamp/bc3-api/blob/master/sections/client_approvals.md [3]: https://github.com/basecamp/bc3-api/blob/master/sections/client_correspondences.md diff --git a/sections/comments.md b/sections/comments.md index 13071da..de644fa 100644 --- a/sections/comments.md +++ b/sections/comments.md @@ -14,10 +14,10 @@ Endpoints: Get comments ------------ -* `GET /buckets/1/recordings/3/comments.json` will return a [paginated list][pagination] of active comments in the project with an ID of `1` and the recording with ID of `3`. +* `GET /recordings/3/comments.json` will return a [paginated list][pagination] of active comments for the recording with ID of `3`. ###### Example JSON Response - + ```json [ { @@ -32,6 +32,8 @@ Get comments "url": "https://3.basecampapi.com/195539477/buckets/2085958504/comments/1069479407.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/messages/1069479406#__recording_1069479407", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwNz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--2d87c12332eb478cb125670282e0540a56500c87.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479407/boosts.json", "parent": { "id": 1069479406, "title": "We won Leto!", @@ -71,21 +73,21 @@ Get comments } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/3/comments.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/recordings/3/comments.json ``` Get a comment ------------- -* `GET /buckets/1/comments/2.json` will return the comment with an ID of `2` in the project with an ID of `1`. +* `GET /comments/2.json` will return the comment with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479416, @@ -99,6 +101,8 @@ Get a comment "url": "https://3.basecampapi.com/195539477/buckets/2085958504/comments/1069479416.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/messages/1069479406#__recording_1069479416", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQxNj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--cdd017a73b856e57fbc03bcaf209b104e458a3c9.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479416/boosts.json", "parent": { "id": 1069479406, "title": "We won Leto!", @@ -141,18 +145,18 @@ Get a comment "content": "I just want to echo what just about everyone already said. This is a big one for us, and I can't wait to get going. I'll be spinning up the project shortly!" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/comment/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/comments/2.json ``` Create a comment ---------------- -* `POST /buckets/1/recordings/3/comments.json` publishes a comment in the project with ID `1` and under the recording with an ID of `3`. +* `POST /recordings/3/comments.json` publishes a comment under the recording with an ID of `3`. **Required parameters**: `content` as the body of the message. See our [Rich text guide][rich] for what HTML tags are allowed. @@ -173,14 +177,14 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"content":"
Wow! That is cool.
"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/3/comments.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/3/comments.json ``` Update a comment ---------------- -* `PUT /buckets/1/comments/2.json` allows changing content of the message with an ID of `2` in the project with ID `1`. +* `PUT /comments/2.json` allows changing content of the comment with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the message if the update was a success. See the [Get a comment](#get-a-comment) endpoint for more info on the payload. The `Location` header will contain a URL to the HTML version of the updated comment. @@ -197,10 +201,20 @@ This endpoint will return `200 OK` with the current JSON representation of the m ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"content":"
No way! That isn't cool at all.
"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/messages/2.json + https://3.basecampapi.com/$ACCOUNT_ID/comments/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/recordings/3/comments.json` → [Get comments](#get-comments) +* `GET /buckets/1/comments/2.json` → [Get a comment](#get-a-comment) +* `POST /buckets/1/recordings/3/comments.json` → [Create a comment](#create-a-comment) +* `PUT /buckets/1/comments/2.json` → [Update a comment](#update-a-comment) + [recordings]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#recordings [messages]: https://github.com/basecamp/bc3-api/blob/master/sections/messages.md#messages [todolists]: https://github.com/basecamp/bc3-api/blob/master/sections/todolists.md#todolists diff --git a/sections/documents.md b/sections/documents.md index 445360e..afc1fa3 100644 --- a/sections/documents.md +++ b/sections/documents.md @@ -12,10 +12,10 @@ Endpoints: Get documents ------------- -* `GET /buckets/1/vaults/2/documents.json` will return a [paginated list][pagination] of active documents in the project with an ID of `1` and the [vault][vaults] with ID of `2`. +* `GET /vaults/2/documents.json` will return a [paginated list][pagination] of active documents in the [vault][vaults] with ID of `2`. ###### Example JSON Response - + ```json [ { @@ -30,9 +30,11 @@ Get documents "url": "https://3.basecampapi.com/195539477/buckets/2085958502/documents/1069479147.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/documents/1069479147", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTE0Nz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--7d1a4e571d9352315554d871bda4d46313701285.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479147/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479147/subscription.json", "comments_count": 1, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479147/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479147/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479147/boosts.json", "position": 1, "parent": { "id": 1069479146, @@ -77,20 +79,20 @@ Get documents } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/2/documents.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/vaults/2/documents.json ``` Get a document -------------- -* `GET /buckets/1/documents/2.json` will return the document with an ID of `2` in the project with an ID of `1`. +* `GET /documents/2.json` will return the document with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479860, @@ -104,9 +106,11 @@ Get a document "url": "https://3.basecampapi.com/195539477/buckets/2085958508/documents/1069479860.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958508/documents/1069479860", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTg2MD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--6e3c21a333aa7ca5da3b9a9372022b4b19083f73.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958508/recordings/1069479860/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479860/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958508/recordings/1069479860/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479860/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958508/recordings/1069479860/boosts.json", "position": 1, "parent": { "id": 1069479845, @@ -146,18 +150,18 @@ Get a document "content": "This overview of the available project tools will help you know when and how to use them.

To-dos
To-dos keep everyone on a project in the loop about the work that needs to be done and who’s responsible. Let’s dig into to-dos. Learn more about To-dos

Docs & Files
Docs and Files are great for how-tos, best practices, shared files, photos, brand assets, and much more. Here are a few helpful details. Learn more about Docs & Files

Message Board
When you want to make an announcement, start a discussion, or share progress, Messages are the answer. At Basecamp, messages have replaced email internally. Everyone gets notified and can comment, boost, or ask questions in one place without a long email thread. Learn more about Messages

Schedule
The Schedule keeps you on track for each project. In one place, you can see the meetings, milestones, and upcoming due dates. Let’s get into more tips: Learn more about the Schedule

Card Table
Card tables are Basecamp’s way to manage process-driven and reactive work, similar to Kanban boards in other tools. A support team that needs to triage customer requests? Card table. A creative team that needs to move an item from ideation through to completion? Card table. From event planning to real estate, cards help you manage all kinds of work. Learn more about Card Tables

Chat
Chat is where real-time group conversation happens in a project. Sometimes getting on the same page requires live conversation and Chat is a great solution.

It’s also a fun place to say good morning and share a bit about your day, the water cooler conversations that keeps people connected. If the chatter is ever too much, you can turn off notifications from within the chat itself.

Curious when to use Chat, Pings, or Messages? This short video will walk you through it.

Learn more about Chat

Automatic Check-ins
Automatic check-ins allow everyone on the project to share responses to the same prompt, collected in one place. You can set up questions for just about anything, on any cadence. These questions can be project related, goal specific, or just for fun.

Watch this quick video to learn more and see how we use check-ins at Basecamp." } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/documents/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/documents/2.json ``` Create a document ----------------- -* `POST /buckets/1/vaults/2/documents.json` publishes a document in the project with ID `1` and under the vault with an ID of `2`. +* `POST /vaults/2/documents.json` publishes a document under the vault with an ID of `2`. **Required parameters**: `title` as the title of the document, and `content` as the body of the document. See our [Rich text guide][rich] for what HTML tags are allowed. @@ -180,13 +184,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"New Hire Info","content":"
Getting started
","status":"active"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/2/documents.json + https://3.basecampapi.com/$ACCOUNT_ID/vaults/2/documents.json ``` Update a document ----------------- -* `PUT /buckets/1/documents/2.json` allows changing the title and content of the document with an ID of `2` in the project with ID `1`. +* `PUT /documents/2.json` allows changing the title and content of the document with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the document if the update was a success. See the [Get a document](#get-a-document) endpoint for more info on the payload. @@ -204,9 +208,19 @@ This endpoint will return `200 OK` with the current JSON representation of the d ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"New Hire Information","content":"
Let's get started
"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/documents/2.json + https://3.basecampapi.com/$ACCOUNT_ID/documents/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/vaults/2/documents.json` → [Get documents](#get-documents) +* `GET /buckets/1/documents/2.json` → [Get a document](#get-a-document) +* `POST /buckets/1/vaults/2/documents.json` → [Create a document](#create-a-document) +* `PUT /buckets/1/documents/2.json` → [Update a document](#update-a-document) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [trash]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording [vaults]: https://github.com/basecamp/bc3-api/blob/master/sections/vaults.md#vaults diff --git a/sections/events.md b/sections/events.md index 4aceaa9..5308911 100644 --- a/sections/events.md +++ b/sections/events.md @@ -10,254 +10,519 @@ Endpoints: Get events ---------- -* `GET /buckets/1/recordings/2/events.json` will return a [paginated list][pagination] of events for the recording with an ID of `2` in the project with an ID of `1`. +* `GET /recordings/2/events.json` will return a [paginated list][pagination] of events for the recording with an ID of `2`. ###### Example JSON Response - + ```json [ { - "id": 1071915468, - "recording_id": 1069479766, - "action": "adopted", + "id": 1071916042, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-07T01:45:28.747Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + } + }, + { + "id": 1071916041, + "recording_id": 1069479576, + "action": "completed", "details": { - "new_parent_id": 1069479743, - "parent_id_was": 1069479745, - "notified_recipient_ids": [] + "notified_recipient_ids": [ + 1049715938 + ] }, - "created_at": "2026-01-31T08:33:38.190Z", + "created_at": "2026-02-07T01:45:28.281Z", "creator": { - "id": 1049715945, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", - "name": "Victor Cooper", - "email_address": null, - "personable_type": "DummyUser", - "title": null, + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:33:28.806Z", - "updated_at": "2026-01-31T08:33:28.806Z", + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", "can_ping": true, - "can_manage_projects": false, - "can_manage_people": false, - "can_access_timesheet": false, - "can_access_hill_charts": false + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071916041/boosts.json" + }, + { + "id": 1071915997, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-07T01:42:48.748Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true } }, { - "id": 1071915469, - "recording_id": 1069479766, + "id": 1071915996, + "recording_id": 1069479576, "action": "completed", "details": { - "notified_recipient_ids": [] + "notified_recipient_ids": [ + 1049715938 + ] }, - "created_at": "2026-01-26T17:43:00.000Z", + "created_at": "2026-02-07T01:42:48.262Z", "creator": { - "id": 1049715945, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", - "name": "Victor Cooper", - "email_address": null, - "personable_type": "DummyUser", - "title": null, + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:33:28.806Z", - "updated_at": "2026-01-31T08:33:28.806Z", + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", "can_ping": true, - "can_manage_projects": false, - "can_manage_people": false, - "can_access_timesheet": false, - "can_access_hill_charts": false + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915996/boosts.json" + }, + { + "id": 1071915952, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-07T01:40:17.310Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true } }, { - "id": 1071915467, - "recording_id": 1069479766, - "action": "adopted", + "id": 1071915951, + "recording_id": 1069479576, + "action": "completed", "details": { - "new_parent_id": 1069479745, - "parent_id_was": 1069479742, - "notified_recipient_ids": [] + "notified_recipient_ids": [ + 1049715938 + ] + }, + "created_at": "2026-02-07T01:40:16.777Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true }, - "created_at": "2026-01-25T17:43:00.000Z", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915951/boosts.json" + }, + { + "id": 1071915906, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-06T22:56:33.502Z", "creator": { - "id": 1049715945, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", - "name": "Victor Cooper", - "email_address": null, - "personable_type": "DummyUser", - "title": null, + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:33:28.806Z", - "updated_at": "2026-01-31T08:33:28.806Z", + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", "can_ping": true, - "can_manage_projects": false, - "can_manage_people": false, - "can_access_timesheet": false, - "can_access_hill_charts": false + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true } }, { - "id": 1071915466, - "recording_id": 1069479766, - "action": "adopted", + "id": 1071915905, + "recording_id": 1069479576, + "action": "completed", "details": { - "new_parent_id": 1069479742, - "parent_id_was": 1069479744, - "notified_recipient_ids": [] + "notified_recipient_ids": [ + 1049715938 + ] }, - "created_at": "2026-01-23T17:43:00.000Z", + "created_at": "2026-02-06T22:56:33.043Z", "creator": { - "id": 1049715945, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", - "name": "Victor Cooper", - "email_address": null, - "personable_type": "DummyUser", - "title": null, + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:33:28.806Z", - "updated_at": "2026-01-31T08:33:28.806Z", + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", "can_ping": true, - "can_manage_projects": false, - "can_manage_people": false, - "can_access_timesheet": false, - "can_access_hill_charts": false + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915905/boosts.json" + }, + { + "id": 1071915865, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-06T22:45:49.905Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true } }, { - "id": 1071915465, - "recording_id": 1069479766, - "action": "adopted", + "id": 1071915864, + "recording_id": 1069479576, + "action": "completed", "details": { - "new_parent_id": 1069479744, - "parent_id_was": 1069479741, - "notified_recipient_ids": [] + "notified_recipient_ids": [ + 1049715938 + ] + }, + "created_at": "2026-02-06T22:45:49.427Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true }, - "created_at": "2026-01-21T17:43:00.000Z", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915864/boosts.json" + }, + { + "id": 1071915793, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-06T22:19:46.800Z", "creator": { - "id": 1049715945, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", - "name": "Victor Cooper", - "email_address": null, - "personable_type": "DummyUser", - "title": null, + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:33:28.806Z", - "updated_at": "2026-01-31T08:33:28.806Z", + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", "can_ping": true, - "can_manage_projects": false, - "can_manage_people": false, - "can_access_timesheet": false, - "can_access_hill_charts": false + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true } }, { - "id": 1071915464, - "recording_id": 1069479766, - "action": "adopted", + "id": 1071915792, + "recording_id": 1069479576, + "action": "completed", "details": { - "new_parent_id": 1069479741, - "parent_id_was": 1069479739, - "notified_recipient_ids": [] + "notified_recipient_ids": [ + 1049715938 + ] + }, + "created_at": "2026-02-06T22:19:46.349Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true }, - "created_at": "2026-01-21T17:43:00.000Z", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915792/boosts.json" + }, + { + "id": 1071915753, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-06T21:44:49.092Z", "creator": { - "id": 1049715945, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", - "name": "Victor Cooper", - "email_address": null, - "personable_type": "DummyUser", - "title": null, + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:33:28.806Z", - "updated_at": "2026-01-31T08:33:28.806Z", + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", "can_ping": true, - "can_manage_projects": false, - "can_manage_people": false, - "can_access_timesheet": false, - "can_access_hill_charts": false + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true } }, { - "id": 1071915463, - "recording_id": 1069479766, - "action": "created", + "id": 1071915752, + "recording_id": 1069479576, + "action": "completed", "details": { - "notified_recipient_ids": [] + "notified_recipient_ids": [ + 1049715938 + ] + }, + "created_at": "2026-02-06T21:44:48.563Z", + "creator": { + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", + "bio": null, + "location": null, + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", + "admin": false, + "owner": false, + "client": false, + "employee": false, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true }, - "created_at": "2026-01-11T17:43:00.000Z", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915752/boosts.json" + }, + { + "id": 1071915662, + "recording_id": 1069479576, + "action": "uncompleted", + "details": {}, + "created_at": "2026-02-01T02:53:47.037Z", "creator": { - "id": 1049715945, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", - "name": "Victor Cooper", - "email_address": null, - "personable_type": "DummyUser", - "title": null, + "id": 1049715930, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", + "name": "Sharon Bradford", + "email_address": "sharon@honchodesign.com", + "personable_type": "User", + "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:33:28.806Z", - "updated_at": "2026-01-31T08:33:28.806Z", + "created_at": "2026-01-31T08:29:40.859Z", + "updated_at": "2026-01-31T08:29:40.859Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNpkkT4=--789594e5e542ab99e467a51c9dec0a9035abc0e0/avatar?v=1", "can_ping": true, - "can_manage_projects": false, - "can_manage_people": false, - "can_access_timesheet": false, - "can_access_hill_charts": false + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true } } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/events.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/events.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/recordings/2/events.json` → [Get events](#get-events) + [recordings]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#recordings [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/forwards.md b/sections/forwards.md index bee56b2..31de4cb 100644 --- a/sections/forwards.md +++ b/sections/forwards.md @@ -11,12 +11,12 @@ Endpoints: Get forwards ------------ -* `GET /buckets/1/inboxes/3/forwards.json` will return a [paginated list][2] of active forwards in the project with an ID of `1` and the inbox with an ID of `3`. +* `GET /inboxes/3/forwards.json` will return a [paginated list][2] of active forwards in the inbox with an ID of `3`. To get the inbox ID for a project, see the [Get inbox][3] endpoint. ###### Example JSON Response - + ```json [ { @@ -31,7 +31,7 @@ To get the inbox ID for a project, see the [Get inbox][3] endpoint. "url": "https://3.basecampapi.com/195539477/buckets/2085958502/inbox_forwards/1069479085.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/inbox_forwards/1069479085", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTA4NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--5dbe6f761324a7399d519608a8b79f9a518b791d.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479085/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479085/subscription.json", "parent": { "id": 1069478988, "title": "Email Forwards", @@ -79,22 +79,22 @@ To get the inbox ID for a project, see the [Get inbox][3] endpoint. } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/inboxes/3/forwards.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/inboxes/3/forwards.json ``` Get a forward ------------- -* `GET /buckets/1/inbox_forwards/2.json` will return the forward with an ID of `2` in the project with an ID of `1`. +* `GET /inbox_forwards/2.json` will return the forward with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479084, @@ -108,7 +108,7 @@ Get a forward "url": "https://3.basecampapi.com/195539477/buckets/2085958502/inbox_forwards/1069479084.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/inbox_forwards/1069479084", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTA4ND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--e82f515d3ab363490c1fe06e0d733db9d6f623e9.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479084/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479084/subscription.json", "parent": { "id": 1069478988, "title": "Email Forwards", @@ -155,14 +155,21 @@ Get a forward "replies_url": "https://3.basecampapi.com/195539477/buckets/2085958502/inbox_forwards/1069479084/replies.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/inbox_forwards/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/inbox_forwards/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/inboxes/3/forwards.json` → [Get forwards](#get-forwards) +* `GET /buckets/1/inbox_forwards/2.json` → [Get a forward](#get-a-forward) [1]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording [2]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/inbox_replies.md b/sections/inbox_replies.md index 2b09c4d..ebbdc3c 100644 --- a/sections/inbox_replies.md +++ b/sections/inbox_replies.md @@ -11,10 +11,10 @@ Endpoints: Get inbox replies ------------------- -* `GET /buckets/1/inbox_forwards/2/replies.json` will return a [paginated list][pagination] of inbox replies in the project with an ID of `1` and the forward with ID of `2`. +* `GET /inbox_forwards/2/replies.json` will return a [paginated list][pagination] of inbox replies for the forward with ID of `2`. ###### Example JSON Response - + ```json [ { @@ -29,6 +29,8 @@ Get inbox replies "url": "https://3.basecampapi.com/195539477/buckets/2085958502/inbox_replies/1069479086.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/inbox_forwards/1069479085#__recording_1069479086", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTA4Nj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--549cad1a70fa7d9365abbbd3b7e1bf5100c2b0fe.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479086/boosts.json", "parent": { "id": 1069479085, "title": "Can we make the logo pop?", @@ -72,20 +74,20 @@ Get inbox replies } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/inbox_forwards/2/replies.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/inbox_forwards/2/replies.json ``` Get an inbox reply ------------------- -* `GET /buckets/1/inbox_forwards/2/replies/3.json` will return the inbox reply with an ID of `3` for the forward with an ID of `2` in the project with an ID of `1`. +* `GET /inbox_forwards/2/replies/3.json` will return the inbox reply with an ID of `3` for the forward with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479089, @@ -99,6 +101,8 @@ Get an inbox reply "url": "https://3.basecampapi.com/195539477/buckets/2085958502/inbox_replies/1069479089.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/inbox_forwards/1069479085#__recording_1069479089", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTA4OT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--980876c579f6871de55c47d306bb5507f01e537d.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479089/boosts.json", "parent": { "id": 1069479085, "title": "Can we make the logo pop?", @@ -137,12 +141,20 @@ Get an inbox reply "content": "Awesome, sounds good Victor!

Thanks again,
Henry" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/inbox_forwards/2/replies/3.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/inbox_forwards/2/replies/3.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/inbox_forwards/2/replies.json` → [Get inbox replies](#get-inbox-replies) +* `GET /buckets/1/inbox_forwards/2/replies/3.json` → [Get an inbox reply](#get-an-inbox-reply) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [forwards]: https://github.com/basecamp/bc3-api/blob/master/sections/forwards.md#forwards diff --git a/sections/inboxes.md b/sections/inboxes.md index 4a9b05b..e487e83 100644 --- a/sections/inboxes.md +++ b/sections/inboxes.md @@ -11,12 +11,12 @@ Endpoints: Get inbox --------- -* `GET /buckets/1/inboxes/2.json` will return the inbox with an ID of `2` for the project with an ID of `1`. +* `GET /inboxes/2.json` will return the inbox with an ID of `2`. To get the inbox ID for a project, see the [Get a project][1] endpoint's `dock` payload. To retrieve its forwards, see the [Get forwards][2] endpoint. ###### Example JSON Response - + ```json { "id": 1069478988, @@ -67,14 +67,21 @@ To get the inbox ID for a project, see the [Get a project][1] endpoint's `dock` "forwards_url": "https://3.basecampapi.com/195539477/buckets/2085958502/inboxes/1069478988/forwards.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/inboxes/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/inboxes/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/inboxes/2.json` → [Get inbox](#get-inbox) + [1]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-a-project [2]: https://github.com/basecamp/bc3-api/blob/master/sections/forwards.md#get-forwards diff --git a/sections/message_boards.md b/sections/message_boards.md index 515e08f..db57a8f 100644 --- a/sections/message_boards.md +++ b/sections/message_boards.md @@ -11,19 +11,19 @@ Endpoints: Get message board ----------------- -* `GET /buckets/1/message_boards/2.json` will return the message board for the project with an ID of `1` and the message board ID of `2`. +* `GET /message_boards/2.json` will return the message board with an ID of `2`. To get the message board ID for a project, see the [Get a project][1] endpoint's `dock` payload. To retrieve its messages, see the [Get messages][2] endpoint. ###### Example JSON Response - + ```json { "id": 1069479392, "status": "active", "visible_to_clients": false, "created_at": "2026-01-31T08:32:04.229Z", - "updated_at": "2026-01-31T08:37:37.895Z", + "updated_at": "2026-02-07T01:45:01.296Z", "title": "Message Board", "inherits_status": true, "type": "Message::Board", @@ -64,18 +64,26 @@ To get the message board ID for a project, see the [Get a project][1] endpoint's "can_access_hill_charts": true }, "messages_count": 9, - "messages_url": "https://3.basecampapi.com/195539477/buckets/2085958504/message_boards/1069479392/messages.json", + "messages_url": "https://3.basecampapi.com/195539477/message_boards/1069479392/messages.json", "app_messages_url": "https://3.basecamp.com/195539477/buckets/2085958504/message_boards/1069479392/messages" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/message_boards/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/message_boards/2.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/message_boards/2.json` → [Get message board](#get-message-board) + [1]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-a-project [2]: https://github.com/basecamp/bc3-api/blob/master/sections/messages.md#get-messages [3]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording diff --git a/sections/message_types.md b/sections/message_types.md index c67c73c..6b79231 100644 --- a/sections/message_types.md +++ b/sections/message_types.md @@ -45,7 +45,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCO Get a message type ------------------ -* `GET /buckets/1/categories/2.json` will return the message type with ID `2` in the project with ID `1`. +* `GET /buckets/1/categories/2.json` will return the message type with ID `2` in the project with an ID of `1`. ###### Example JSON Response @@ -69,7 +69,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCO Create a message type --------------------- -* `POST /buckets/1/categories.json` creates a new message type in the project with ID `1`. +* `POST /buckets/1/categories.json` creates a new message type in the project with an ID of `1`. **Required parameters**: `name` and `icon` for the new message type. @@ -95,7 +95,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j Update a message type --------------------- -* `PUT /buckets/1/categories/2.json` allows changing the message type with an ID of `2` in the project with ID `1`. +* `PUT /buckets/1/categories/2.json` allows changing the message type with an ID of `2` in the project with an ID of `1`. This endpoint will return `200 OK` with the current JSON representation of the message type if the update was a success. See the [Get a message type](#get-a-message-type) endpoint for more info on the payload. @@ -119,7 +119,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j Destroy a message type ---------------------- -* `DELETE /buckets/1/categories/2.json` will delete the message type with an ID of `2`in the project with ID `1`. +* `DELETE /buckets/1/categories/2.json` will delete the message type with an ID of `2` in the project with an ID of `1`. No parameters required. Returns `204 No Content` if successful. diff --git a/sections/messages.md b/sections/messages.md index 11a010f..101574e 100644 --- a/sections/messages.md +++ b/sections/messages.md @@ -13,12 +13,12 @@ Endpoints: Get messages ------------ -* `GET /buckets/1/message_boards/3/messages.json` will return a [paginated list][2] of active messages in the project with an ID of `1` and the message board with ID of `3`. +* `GET /message_boards/3/messages.json` will return a [paginated list][2] of active messages in the message board with ID of `3`. To get the message board ID for a project, see the [Get message board][3] endpoint. ###### Example JSON Response - + ```json [ { @@ -26,16 +26,18 @@ To get the message board ID for a project, see the [Get message board][3] endpoi "status": "active", "visible_to_clients": false, "created_at": "2026-01-17T15:33:00.000Z", - "updated_at": "2026-01-31T08:35:10.718Z", + "updated_at": "2026-02-01T02:53:38.551Z", "title": "Laptop high res glamour shots", "inherits_status": true, "type": "Message", "url": "https://3.basecampapi.com/195539477/buckets/2085958504/messages/1069479583.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/messages/1069479583", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTU4Mz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--ac8884ce8febf69d7dedba2bdbd479cec94880e7.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479583/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479583/subscription.json", "comments_count": 1, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479583/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479583/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479583/boosts.json", "parent": { "id": 1069479392, "title": "Message Board", @@ -76,28 +78,28 @@ To get the message board ID for a project, see the [Get message board][3] endpoi } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/message_boards/3/messages.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/message_boards/3/messages.json ``` Get a message ------------- -* `GET /buckets/1/messages/2.json` will return the message with an ID of `2` in the project with an ID of `1`. +* `GET /messages/2.json` will return the message with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479406, "status": "active", "visible_to_clients": false, "created_at": "2025-12-18T23:30:00.000Z", - "updated_at": "2026-01-31T08:37:37.818Z", + "updated_at": "2026-02-07T01:45:01.296Z", "title": "We won Leto!", "inherits_status": true, "type": "Message", @@ -106,7 +108,9 @@ Get a message "bookmark_url": "https://3.basecamp.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwNj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--309e0fbab86893aaaf279f01f2a0795c56716aeb", "subscription_url": "https://3.basecamp.com/195539477/buckets/2085958504/recordings/1069479406/subscription", "comments_count": 10, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479406/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479406/comments.json", + "boosts_count": 5, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479406/boosts.json", "parent": { "id": 1069479392, "title": "Message Board", @@ -150,19 +154,19 @@ Get a message "subject": "We won Leto!" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/messages/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/messages/2.json ``` Create a message ---------------- -* `POST /buckets/1/message_boards/3/messages.json` publishes a message in the project with ID `1` and under the message board with an ID of `3`. +* `POST /message_boards/3/messages.json` publishes a message under the message board with an ID of `3`. **Required parameters**: `subject` as the title of the message, and `status`, set to `active` to publish immediately. @@ -189,14 +193,14 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"subject":"Kickoff","content":"
Welcome to Basecamp, everyone.
","status":"active"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/message_boards/3/messages.json + https://3.basecampapi.com/$ACCOUNT_ID/message_boards/3/messages.json ``` Update a message ---------------- -* `PUT /buckets/1/messages/2.json` allows changing the `subject`, `content` and `category_id` of the message with an ID of `2` in the project with ID `1`. +* `PUT /messages/2.json` allows changing the `subject`, `content` and `category_id` of the message with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the message if the update was a success. See the [Get a message](#get-a-message) endpoint for more info on the payload. @@ -214,14 +218,14 @@ This endpoint will return `200 OK` with the current JSON representation of the m ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"subject":"Spin-down","content":"
Oops, we lost that client.
"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/messages/2.json + https://3.basecampapi.com/$ACCOUNT_ID/messages/2.json ``` Pin a message ---------------- -* `POST /buckets/1/recordings/2/pin.json` pins the message with ID `2` in the project with id `1`. -* `DELETE /buckets/1/recordings/2/pin.json` unpins the message with ID `2` in the project with id `1`. +* `POST /recordings/2/pin.json` pins the message with ID `2`. +* `DELETE /recordings/2/pin.json` unpins the message with ID `2`. This endpoint will return `204 No Content` if the operation was a success. @@ -230,14 +234,27 @@ This endpoint will return `204 No Content` if the operation was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -X POST \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/pin.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/pin.json ``` ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/pin.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/pin.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/message_boards/3/messages.json` → [Get messages](#get-messages) +* `GET /buckets/1/messages/2.json` → [Get a message](#get-a-message) +* `POST /buckets/1/message_boards/3/messages.json` → [Create a message](#create-a-message) +* `PUT /buckets/1/messages/2.json` → [Update a message](#update-a-message) +* `POST /buckets/1/recordings/2/pin.json` → [Pin a message](#pin-a-message) +* `DELETE /buckets/1/recordings/2/pin.json` → [Pin a message](#pin-a-message) + [1]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording [2]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [3]: https://github.com/basecamp/bc3-api/blob/master/sections/message_boards.md#message-boards diff --git a/sections/people.md b/sections/people.md index 34bf1e3..b9acad8 100644 --- a/sections/people.md +++ b/sections/people.md @@ -138,22 +138,22 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "can_access_hill_charts": true }, { - "id": 1049715955, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk1NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--6a8affd82c540e7c1f7e846b2b02fedb01bcd3f0", + "id": 1049715961, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk2MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--2810c58b0cd0e5d2faaeae277dc521750fea97bd", "name": "Victor Copper", "email_address": "victor@hanchodesign.com", "personable_type": "User", "title": "Prankster", "bio": null, "location": null, - "created_at": "2026-02-01T02:53:35.423Z", - "updated_at": "2026-02-01T02:53:35.423Z", + "created_at": "2026-02-07T01:45:15.400Z", + "updated_at": "2026-02-07T01:45:15.400Z", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBPNkkT4=--5049939da9ea89df60ade5a1c42d324c1651c66c/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBPlkkT4=--90b4d55769b70df2e0ee1aa1a115f3416d5ecac3/avatar?v=1", "company": { "id": 1033447819, "name": "Hancho Design" diff --git a/sections/projects.md b/sections/projects.md index a797409..ccfcab2 100644 --- a/sections/projects.md +++ b/sections/projects.md @@ -26,7 +26,7 @@ _Optional parameters_: "id": 2085958504, "status": "active", "created_at": "2025-12-17T17:13:00.000Z", - "updated_at": "2026-02-01T02:53:40.197Z", + "updated_at": "2026-02-07T01:45:21.904Z", "name": "The Leto Laptop", "description": "Laptop product launch.", "purpose": "topic", @@ -240,7 +240,7 @@ The `dock` key contains an array of the current tools for this project. The `ena "id": 2085958504, "status": "active", "created_at": "2025-12-17T17:13:00.000Z", - "updated_at": "2026-02-01T02:53:40.197Z", + "updated_at": "2026-02-07T01:45:21.904Z", "name": "The Leto Laptop", "description": "Laptop product launch.", "purpose": "topic", diff --git a/sections/question_answers.md b/sections/question_answers.md index 97076ac..5c1b785 100644 --- a/sections/question_answers.md +++ b/sections/question_answers.md @@ -14,7 +14,7 @@ Endpoints: Get question answers -------------------- -* `GET /buckets/1/questions/2/answers.json` will return a [paginated list][pagination] of answers in the project with an ID of `1` and the question with ID of `2`. +* `GET /questions/2/answers.json` will return a [paginated list][pagination] of answers to the question with ID of `2`. _Optional query parameters_: @@ -22,7 +22,7 @@ _Optional query parameters_: * `creator_id` - a person ID to filter answers by author. ###### Example JSON Response - + ```json [ { @@ -37,9 +37,11 @@ _Optional query parameters_: "url": "https://3.basecampapi.com/195539477/buckets/2085958504/question_answers/1069479545.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/question_answers/1069479545", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTU0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--4ecc639365c1b1091bba2cebaad8b5d8bd1be402.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479545/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479545/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479545/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479545/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479545/boosts.json", "parent": { "id": 1069479417, "title": "What did you work on today?", @@ -84,17 +86,17 @@ _Optional query parameters_: } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2/answers.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/questions/2/answers.json ``` List answerers -------------- -* `GET /buckets/1/questions/2/answers/by.json` will return a [paginated list][pagination] of people who have answered the question with ID `2` in the project with an ID of `1`. +* `GET /questions/2/answers/by.json` will return a [paginated list][pagination] of people who have answered the question with ID `2`. By default, long-deceased people are filtered out. Pass `?deceased=true` to include them. @@ -103,27 +105,27 @@ Each entry is a person object. ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2/answers/by.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/questions/2/answers/by.json ``` Get answers by person --------------------- -* `GET /buckets/1/questions/2/answers/by/3.json` will return a [paginated list][pagination] of answers to the question with ID `2` in the project with an ID of `1`, filtered to only answers by the person with ID `3`. +* `GET /questions/2/answers/by/3.json` will return a [paginated list][pagination] of answers to the question with ID `2`, filtered to only answers by the person with ID `3`. ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2/answers/by/3.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/questions/2/answers/by/3.json ``` Get a question answer --------------------- -* `GET /buckets/1/question_answers/2.json` will return the answer with an ID of `2` in the project with an ID of `1`. +* `GET /question_answers/2.json` will return the answer with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479545, @@ -137,9 +139,11 @@ Get a question answer "url": "https://3.basecampapi.com/195539477/buckets/2085958504/question_answers/1069479545.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/question_answers/1069479545", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTU0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--4ecc639365c1b1091bba2cebaad8b5d8bd1be402.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479545/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479545/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479545/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479545/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479545/boosts.json", "parent": { "id": 1069479417, "title": "What did you work on today?", @@ -183,18 +187,18 @@ Get a question answer "group_on": "2026-01-26" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/question_answers/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/question_answers/2.json ``` Create a question answer ------------------------ -* `POST /buckets/1/questions/2/answers.json` creates an answer to the question with ID `2` in the project with ID `1`. +* `POST /questions/2/answers.json` creates an answer to the question with ID `2`. **Required parameters**: `content` containing the answer text. See our [Rich text guide][rich_text] for what HTML tags are allowed. @@ -219,14 +223,14 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"question_answer":{"content":"
Today I worked on the API documentation.
","group_on":"2024-01-22"}}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2/answers.json + https://3.basecampapi.com/$ACCOUNT_ID/questions/2/answers.json ``` Update a question answer ------------------------ -* `PUT /buckets/1/question_answers/2.json` allows changing the answer with an ID of `2` in the project with ID `1`. +* `PUT /question_answers/2.json` allows changing the answer with an ID of `2`. This endpoint will return `204 No Content` if the update was a success. @@ -245,10 +249,23 @@ This endpoint will return `204 No Content` if the update was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"question_answer":{"content":"
Updated: Today I finished the API documentation.
"}}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/question_answers/2.json + https://3.basecampapi.com/$ACCOUNT_ID/question_answers/2.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/questions/2/answers.json` → [Get question answers](#get-question-answers) +* `GET /buckets/1/questions/2/answers/by.json` → [List answerers](#list-answerers) +* `GET /buckets/1/questions/2/answers/by/3.json` → [Get answers by person](#get-answers-by-person) +* `GET /buckets/1/question_answers/2.json` → [Get a question answer](#get-a-question-answer) +* `POST /buckets/1/questions/2/answers.json` → [Create a question answer](#create-a-question-answer) +* `PUT /buckets/1/question_answers/2.json` → [Update a question answer](#update-a-question-answer) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [rich_text]: https://github.com/basecamp/bc3-api/blob/master/sections/rich_text.md [trash]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording diff --git a/sections/question_reminders.md b/sections/question_reminders.md index 6dabe1b..748a85b 100644 --- a/sections/question_reminders.md +++ b/sections/question_reminders.md @@ -15,7 +15,87 @@ Each reminder includes the question it belongs to, along with the question's pro ###### Example JSON Response ```json -[] +[ + { + "reminder_id": 1004522375, + "remind_at": "2026-02-02T15:00:00.000Z", + "group_on": "2026-02-02", + "question": { + "id": 1069479417, + "status": "active", + "visible_to_clients": false, + "created_at": "2025-12-19T02:37:00.000Z", + "updated_at": "2026-01-31T08:32:59.995Z", + "title": "What did you work on today?", + "inherits_status": true, + "type": "Question", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/questions/1069479417.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/questions/1069479417", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQxNz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--17f918a3dc2d23e366010e5ff9f46d2d5208c9bf.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479417/subscription.json", + "parent": { + "id": 1069479397, + "title": "Automatic Check-ins", + "type": "Questionnaire", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/questionnaires/1069479397.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/questionnaires/1069479397" + }, + "bucket": { + "id": 2085958504, + "name": "The Leto Laptop", + "type": "Project" + }, + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "paused": false, + "schedule": { + "frequency": "every_day", + "days": [ + 1, + 2, + 3, + 4, + 5 + ], + "hour": 9, + "minute": 0, + "week_instance": 1, + "week_interval": null, + "month_interval": null, + "start_date": "2026-01-31", + "duration": null, + "end_date": null + }, + "answers_count": 32, + "answers_url": "https://3.basecampapi.com/195539477/questions/1069479417/question_answers.json" + } + } +] ``` diff --git a/sections/questionnaires.md b/sections/questionnaires.md index 09df842..d102a75 100644 --- a/sections/questionnaires.md +++ b/sections/questionnaires.md @@ -10,12 +10,12 @@ Endpoints: Get questionnaire ----------------- -* `GET /buckets/1/questionnaires/2.json` will return the questionnaire for the project with an ID of `1`. +* `GET /questionnaires/2.json` will return the questionnaire with an ID of `2`. To get the questionnaire ID for a project, see the [Get a Project][project] endpoint's `dock` payload. To retrieve its questions, see the [Get questions][questions] endpoint. ###### Example JSON Response - + ```json { "id": 1069479397, @@ -63,16 +63,24 @@ To get the questionnaire ID for a project, see the [Get a Project][project] endp }, "name": "Automatic Check-ins", "questions_count": 1, - "questions_url": "https://3.basecampapi.com/195539477/buckets/2085958504/questionnaires/1069479397/questions.json" + "questions_url": "https://3.basecampapi.com/195539477/questionnaires/1069479397/questions.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questionnaires/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/questionnaires/2.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/questionnaires/2.json` → [Get questionnaire](#get-questionnaire) + [project]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-a-project [questions]: https://github.com/basecamp/bc3-api/blob/master/sections/questions.md#get-questions diff --git a/sections/questions.md b/sections/questions.md index 31c2182..dcbdb77 100644 --- a/sections/questions.md +++ b/sections/questions.md @@ -15,10 +15,10 @@ Endpoints: Get questions ------------- -* `GET /buckets/1/questionnaires/2/questions.json` will return a [paginated list][pagination] of questions in the project with an ID of `1` and the questionnaire with ID of `2`. +* `GET /questionnaires/2/questions.json` will return a [paginated list][pagination] of questions in the questionnaire with ID of `2`. ###### Example JSON Response - + ```json [ { @@ -33,7 +33,7 @@ Get questions "url": "https://3.basecampapi.com/195539477/buckets/2085958504/questions/1069479417.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/questions/1069479417", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQxNz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--17f918a3dc2d23e366010e5ff9f46d2d5208c9bf.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479417/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479417/subscription.json", "parent": { "id": 1069479397, "title": "Automatic Check-ins", @@ -93,24 +93,24 @@ Get questions "end_date": null }, "answers_count": 32, - "answers_url": "https://3.basecampapi.com/195539477/buckets/2085958504/questions/1069479417/answers.json" + "answers_url": "https://3.basecampapi.com/195539477/questions/1069479417/question_answers.json" } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questionnaires/2/questions.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/questionnaires/2/questions.json ``` Get a question -------------- -* `GET /buckets/1/questions/2.json` will return the question with an ID of `2` in the project with an ID of `1`. +* `GET /questions/2.json` will return the question with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479417, @@ -124,7 +124,7 @@ Get a question "url": "https://3.basecampapi.com/195539477/buckets/2085958504/questions/1069479417.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/questions/1069479417", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQxNz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--17f918a3dc2d23e366010e5ff9f46d2d5208c9bf.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479417/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479417/subscription.json", "parent": { "id": 1069479397, "title": "Automatic Check-ins", @@ -184,21 +184,21 @@ Get a question "end_date": null }, "answers_count": 32, - "answers_url": "https://3.basecampapi.com/195539477/buckets/2085958504/questions/1069479417/answers.json" + "answers_url": "https://3.basecampapi.com/195539477/questions/1069479417/question_answers.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/questions/2.json ``` Create a question ----------------- -* `POST /buckets/1/questionnaires/2/questions.json` creates a question in the project with ID `1` and under the questionnaire with ID `2`. +* `POST /questionnaires/2/questions.json` creates a question under the questionnaire with ID `2`. **Required parameters**: * `question[title]` - the question to ask. @@ -229,14 +229,14 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"question":{"title":"What did you work on today?","schedule":{"frequency":"every_day","time_of_day":"5:00pm","days":["1","2","3","4","5"]}}}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questionnaires/2/questions.json + https://3.basecampapi.com/$ACCOUNT_ID/questionnaires/2/questions.json ``` Update a question ----------------- -* `PUT /buckets/1/questions/2.json` allows changing the question with an ID of `2` in the project with ID `1`. +* `PUT /questions/2.json` allows changing the question with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the question if the update was a success. See the [Get a question](#get-a-question) endpoint for more info on the payload. @@ -260,14 +260,14 @@ This endpoint will return `200 OK` with the current JSON representation of the q ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"question":{"title":"What are you working on this week?","schedule":{"frequency":"every_week","time_of_day":"9:00am","days":["1"]}}}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2.json + https://3.basecampapi.com/$ACCOUNT_ID/questions/2.json ``` Pause a question ---------------- -* `POST /buckets/1/questions/2/pause.json` pauses the question with an ID of `2` in the project with ID `1`. +* `POST /questions/2/pause.json` pauses the question with an ID of `2`. Returns `200 OK` with `{"paused": true}`. @@ -275,14 +275,14 @@ Returns `200 OK` with `{"paused": true}`. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -X POST \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2/pause.json + https://3.basecampapi.com/$ACCOUNT_ID/questions/2/pause.json ``` Resume a question ----------------- -* `DELETE /buckets/1/questions/2/pause.json` resumes the question with an ID of `2` in the project with ID `1`. +* `DELETE /questions/2/pause.json` resumes the question with an ID of `2`. Returns `200 OK` with `{"paused": false}`. @@ -290,14 +290,14 @@ Returns `200 OK` with `{"paused": false}`. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2/pause.json + https://3.basecampapi.com/$ACCOUNT_ID/questions/2/pause.json ``` Update notification settings ---------------------------- -* `PUT /buckets/1/questions/2/notification_settings.json` toggles notification settings for the question with an ID of `2` in the project with ID `1`. +* `PUT /questions/2/notification_settings.json` toggles notification settings for the question with an ID of `2`. _Optional parameters_: @@ -320,9 +320,21 @@ Returns `200 OK` with `{"responding": true/false, "subscribed": true/false}`. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"responding":true,"subscribed":false}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/questions/2/notification_settings.json + https://3.basecampapi.com/$ACCOUNT_ID/questions/2/notification_settings.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/questionnaires/2/questions.json` → [Get questions](#get-questions) +* `GET /buckets/1/questions/2.json` → [Get a question](#get-a-question) +* `POST /buckets/1/questionnaires/2/questions.json` → [Create a question](#create-a-question) +* `PUT /buckets/1/questions/2.json` → [Update a question](#update-a-question) +* `POST /buckets/1/questions/2/pause.json` → [Pause a question](#pause-a-question) +* `DELETE /buckets/1/questions/2/pause.json` → [Resume a question](#resume-a-question) +* `PUT /buckets/1/questions/2/notification_settings.json` → [Update notification settings](#update-notification-settings) [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [trash]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording diff --git a/sections/recordings.md b/sections/recordings.md index 98fa400..632e601 100644 --- a/sections/recordings.md +++ b/sections/recordings.md @@ -30,7 +30,7 @@ Examples: `/projects/recordings.json?type=Todo`, `/projects/recordings.json?type Trash a recording ----------------- -* `PUT /buckets/1/recordings/2/status/trashed.json` will mark the recording with an ID of `2`in the project with ID `1` as trashed. +* `PUT /recordings/2/status/trashed.json` will mark the recording with an ID of `2` as trashed. No parameters required. Returns `204 No Content` if successful. @@ -38,14 +38,14 @@ No parameters required. Returns `204 No Content` if successful. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/status/trashed.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/status/trashed.json ``` Archive a recording ------------------- -* `PUT /buckets/1/recordings/2/status/archived.json` will mark the recording with an ID of `2`in the project with ID `1` as archived. +* `PUT /recordings/2/status/archived.json` will mark the recording with an ID of `2` as archived. No parameters required. Returns `204 No Content` if successful. @@ -53,14 +53,14 @@ No parameters required. Returns `204 No Content` if successful. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/status/archived.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/status/archived.json ``` Unarchive a recording --------------------- -* `PUT /buckets/1/recordings/2/status/active.json` will mark the recording with an ID of `2`in the project with ID `1` as active. +* `PUT /recordings/2/status/active.json` will mark the recording with an ID of `2` as active. No parameters required. Returns `204 No Content` if successful. @@ -68,8 +68,17 @@ No parameters required. Returns `204 No Content` if successful. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/status/active.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/status/active.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `PUT /buckets/1/recordings/2/status/trashed.json` → [Trash a recording](#trash-a-recording) +* `PUT /buckets/1/recordings/2/status/archived.json` → [Archive a recording](#archive-a-recording) +* `PUT /buckets/1/recordings/2/status/active.json` → [Unarchive a recording](#unarchive-a-recording) + [1]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [2]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#projects diff --git a/sections/reports.md b/sections/reports.md index 3c91f17..f70af8a 100644 --- a/sections/reports.md +++ b/sections/reports.md @@ -101,9 +101,11 @@ _Optional query parameters_: "url": "https://3.basecampapi.com/195539477/buckets/2085958502/todos/1069479164.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/todos/1069479164", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTE2ND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--8af0e81cbcfd171784f476df4fcd8a0defb0d525.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479164/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479164/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479164/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479164/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479164/boosts.json", "position": 2, "parent": { "id": 1069479162, @@ -171,7 +173,7 @@ _Optional query parameters_: } ], "completion_subscribers": [], - "completion_url": "https://3.basecampapi.com/195539477/buckets/2085958502/todos/1069479164/completion.json" + "completion_url": "https://3.basecampapi.com/195539477/todos/1069479164/completion.json" } ] } @@ -241,8 +243,8 @@ The response includes: "summary": "Team Meeting", "all_day": false, "recurring": false, - "starts_at": "2026-02-01T10:36:20.949Z", - "ends_at": "2026-02-01T14:36:20.950Z", + "starts_at": "2026-02-08T00:48:58.572Z", + "ends_at": "2026-02-08T04:48:58.572Z", "creator": { "id": 1049715913, "name": "Victor Cooper", @@ -263,38 +265,7 @@ The response includes: } ], "recurring_schedule_entry_occurrences": [], - "assignables": [ - { - "id": 1069479603, - "status": "active", - "visible_to_clients": false, - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/card_tables/steps/1069479603.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/card_tables/cards/1069479602#__recording_1069479603", - "starts_on": null, - "due_on": "2026-02-04", - "type": "step", - "content": "Find inspiration", - "assignees": [ - { - "id": 1049715931, - "name": "Tashia Hughes", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNtkkT4=--b72a5df90f237e00570273b726a82176287186e4/avatar?v=1" - } - ], - "bucket": { - "id": 2085958504, - "name": "The Leto Laptop" - }, - "parent": { - "id": 1069479602, - "title": "New and fancy UI" - }, - "completion_url": "/195539477/buckets/2085958504/card_tables/steps/1069479603/completions.json", - "completed": false, - "repeating": false, - "comments_count": 0 - } - ] + "assignables": [] } ``` diff --git a/sections/schedule_entries.md b/sections/schedule_entries.md index c35fccf..3314cd8 100644 --- a/sections/schedule_entries.md +++ b/sections/schedule_entries.md @@ -12,7 +12,7 @@ Endpoints: Get schedule entries -------------------- -* `GET /buckets/1/schedules/3/entries.json` will return a [paginated list][pagination] of active schedule entries in the project with an ID of `1` and the schedule with ID of `3`. +* `GET /schedules/3/entries.json` will return a [paginated list][pagination] of active schedule entries in the schedule with ID of `3`. To get the schedule ID for a project, see the [Get schedule][schedule] endpoint. @@ -21,7 +21,7 @@ _Optional query parameters_: * `status` - when set to `archived` or `trashed`, will return archived or trashed schedule entries that are in this schedule. ###### Example JSON Response - + ```json [ { @@ -36,9 +36,11 @@ _Optional query parameters_: "url": "https://3.basecampapi.com/195539477/buckets/2085958504/schedule_entries/1069479912.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/schedule_entries/1069479912", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTkxMj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--1c88dffbb88f2382add4122242aca5e1bd46ba40.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479912/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479912/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/boosts.json", "parent": { "id": 1069479396, "title": "Schedule", @@ -81,8 +83,8 @@ _Optional query parameters_: "description": "
Time to synergize!
", "summary": "Team Meeting", "all_day": false, - "starts_at": "2026-02-01T10:36:20.949Z", - "ends_at": "2026-02-01T14:36:20.950Z", + "starts_at": "2026-02-08T00:48:58.572Z", + "ends_at": "2026-02-08T04:48:58.572Z", "participants": [ { "id": 1049715944, @@ -115,23 +117,23 @@ _Optional query parameters_: } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/schedules/3/entries.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/schedules/3/entries.json ``` Get a schedule entry -------------------- -* `GET /buckets/1/schedule_entries/2.json` will return the schedule entry with an ID of `2` in the project with an ID of `1`. +* `GET /schedule_entries/2.json` will return the schedule entry with an ID of `2`. -**Note:** this endpoint redirects to the first individual occurrence of the entry, for **recurring schedule entries**. It's also possible to access a recurring schedule entry via any of the individual occurrences: `GET /buckets/1/schedule_entries/2/occurrences/20190218.json` will return the occurrence for a recurring schedule entry with an ID of `2`, happening on `2019-02-18`, in the project with an ID of `1`. It'll return 404 for invalid occurrences. +**Note:** this endpoint redirects to the first individual occurrence of the entry, for **recurring schedule entries**. It's also possible to access a recurring schedule entry via any of the individual occurrences: `GET /schedule_entries/2/occurrences/20190218.json` will return the occurrence for a recurring schedule entry with an ID of `2`, happening on `2019-02-18`. It'll return 404 for invalid occurrences. ###### Example JSON Response - + ```json { "id": 1069479912, @@ -145,9 +147,11 @@ Get a schedule entry "url": "https://3.basecampapi.com/195539477/buckets/2085958504/schedule_entries/1069479912.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/schedule_entries/1069479912", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTkxMj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--1c88dffbb88f2382add4122242aca5e1bd46ba40.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479912/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479912/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/boosts.json", "parent": { "id": 1069479396, "title": "Schedule", @@ -190,8 +194,8 @@ Get a schedule entry "description": "
Time to synergize!
", "summary": "Team Meeting", "all_day": false, - "starts_at": "2026-02-01T10:36:20.949Z", - "ends_at": "2026-02-01T14:36:20.950Z", + "starts_at": "2026-02-08T00:48:58.572Z", + "ends_at": "2026-02-08T04:48:58.572Z", "participants": [ { "id": 1049715944, @@ -223,7 +227,7 @@ Get a schedule entry ] } ``` - + Recurring schedule entries will include an additional `recurrence_schedule` attribute. For example: @@ -244,14 +248,14 @@ Recurring schedule entries will include an additional `recurrence_schedule` attr ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/schedule_entries/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/schedule_entries/2.json ``` Create a schedule entry ----------------------- -* `POST /buckets/1/schedules/3/entries.json` creates a schedule entry in the project with ID `1` and under the schedule with an ID of `3`. +* `POST /schedules/3/entries.json` creates a schedule entry under the schedule with an ID of `3`. **Required parameters**: @@ -283,14 +287,14 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"summary":"Important Meeting","starts_at":"2015-06-04T00:00:00Z","ends_at":"2015-06-04T00:00:00Z"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/schedules/3/entries.json + https://3.basecampapi.com/$ACCOUNT_ID/schedules/3/entries.json ``` Update a schedule entry ----------------------- -* `PUT /buckets/1/schedule_entries/2.json` allows changing of the schedule entry with an ID of `2` in the project with ID `1`. +* `PUT /schedule_entries/2.json` allows changing of the schedule entry with an ID of `2`. Clients may change any of the required or optional parameters as listed in the [Create a schedule entry](#create-a-schedule-entry) endpoint. @@ -312,10 +316,20 @@ This endpoint will return `200 OK` with the current JSON representation of the s ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"summary":"All Day Meeting","starts_at":"2015-06-04","ends_at":"2015-06-04","all_day":true}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/schedule_entries/2.json + https://3.basecampapi.com/$ACCOUNT_ID/schedule_entries/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/schedules/3/entries.json` → [Get schedule entries](#get-schedule-entries) +* `GET /buckets/1/schedule_entries/2.json` → [Get a schedule entry](#get-a-schedule-entry) +* `POST /buckets/1/schedules/3/entries.json` → [Create a schedule entry](#create-a-schedule-entry) +* `PUT /buckets/1/schedule_entries/2.json` → [Update a schedule entry](#update-a-schedule-entry) + [trash]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [schedule]: https://github.com/basecamp/bc3-api/blob/master/sections/schedules.md#get-schedule diff --git a/sections/schedules.md b/sections/schedules.md index 5c62daf..7b94b3f 100644 --- a/sections/schedules.md +++ b/sections/schedules.md @@ -12,12 +12,12 @@ Endpoints: Get schedule ------------ -* `GET /buckets/1/schedules/2.json` will return the schedule for the project with an ID of `1`. +* `GET /schedules/2.json` will return the schedule with an ID of `2`. To get the schedule ID for a project, see the [Get a project][1] endpoint's `dock` payload. To retrieve its schedule entries lists, see the [Get schedule entries][2] endpoint. ###### Example JSON Response - + ```json { "id": 1069479396, @@ -66,20 +66,20 @@ To get the schedule ID for a project, see the [Get a project][1] endpoint's `doc }, "include_due_assignments": true, "entries_count": 1, - "entries_url": "https://3.basecampapi.com/195539477/buckets/2085958504/schedules/1069479396/entries.json" + "entries_url": "https://3.basecampapi.com/195539477/schedules/1069479396/schedule_entries.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/schedules/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/schedules/2.json ``` Update a schedule ----------------------- -* `PUT /buckets/1/schedules/2.json` allows changing of the schedule with an ID of `2` in the project with ID `1`. +* `PUT /schedules/2.json` allows changing of the schedule with an ID of `2`. **Required parameters**: @@ -100,9 +100,16 @@ This endpoint will return `200 OK` with the current JSON representation of the s ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"schedule": {"include_due_assignments": "false"}}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/schedules/2.json + https://3.basecampapi.com/$ACCOUNT_ID/schedules/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/schedules/2.json` → [Get schedule](#get-schedule) +* `PUT /buckets/1/schedules/2.json` → [Update a schedule](#update-a-schedule) [1]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-a-project [2]: https://github.com/basecamp/bc3-api/blob/master/sections/schedule_entries.md#get-schedule-entries diff --git a/sections/search.md b/sections/search.md index d181b83..a9611c9 100644 --- a/sections/search.md +++ b/sections/search.md @@ -148,55 +148,92 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -A 'MyApp (yourname@example.com ```json [ { - "id": 1069479707, + "id": 1069480167, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-26T20:17:00.000Z", - "updated_at": "2026-01-26T20:17:00.000Z", - "title": "Re: Final deliverables and launch are right around the corner", + "created_at": "2026-02-07T01:42:30.427Z", + "updated_at": "2026-02-07T01:42:30.446Z", + "title": "Triage", "inherits_status": true, - "type": "Client::Reply", - "url": "https://3.basecampapi.com/195539477/buckets/2085958505/client/replies/1069479707.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958505/client/correspondences/1069479702#__recording_1069479707", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTcwNz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--d3c4971ef90e14058095d73bcde20afe9cdf922b.json", + "type": "Kanban::Triage", + "url": "https://3.basecampapi.com/195539477/buckets/2085958518/card_tables/columns/1069480167.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958518/card_tables/columns/1069480167", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDE2Nz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--fa6c69d588a42ee8088bfb8ab5ccaf8038eca3ac.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069480167/subscription.json", "parent": { - "id": 1069479702, - "title": "Final deliverables and launch are right around the corner", - "type": "Client::Correspondence", - "url": "https://3.basecampapi.com/195539477/buckets/2085958505/client/correspondences/1069479702.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958505/client/correspondences/1069479702" + "id": 1069480166, + "title": "Card Table", + "type": "Kanban::Board", + "url": "https://3.basecampapi.com/195539477/buckets/2085958518/card_tables/1069480166.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958518/card_tables/1069480166" }, "bucket": { - "id": 2085958505, - "name": "The Leto Locator", + "id": 2085958518, + "name": "New project from template", "type": "Project" }, "creator": { - "id": 1049715922, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkyMj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--ed42dd1af36c4756554ffb2a20de4e019f0c28d3", - "name": "Jay Edmonds", - "email_address": "jay@honchodesign.com", + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", "personable_type": "User", - "title": "Internal Marketing Assistant", - "bio": null, - "location": null, - "created_at": "2026-01-31T08:29:36.692Z", - "updated_at": "2026-01-31T08:29:36.692Z", - "admin": false, - "owner": false, + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, "client": false, - "employee": false, + "employee": true, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBNJkkT4=--6ef93d58440c2ed1fec4457e3eb5f09572e866a4/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, "can_ping": true, "can_manage_projects": true, "can_manage_people": true, "can_access_timesheet": true, "can_access_hill_charts": true }, - "content": null, "description": null, - "plain_text_content": "Leto team, let me just say it has been tremendous working with you. The success of this project is a reflection of your spirit and attitude throughout. Thank *you* guys." + "subscribers": [ + { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + } + ], + "color": null, + "cards_count": 0, + "comment_count": 0, + "cards_url": "https://3.basecampapi.com/195539477/buckets/2085958518/card_tables/lists/1069480167/cards.json", + "content": null } ] ``` diff --git a/sections/subscriptions.md b/sections/subscriptions.md index d0ed5d5..9034e1b 100644 --- a/sections/subscriptions.md +++ b/sections/subscriptions.md @@ -14,10 +14,10 @@ Endpoints: Get subscription ---------------- -* `GET /buckets/1/recordings/2/subscription.json` will return subscription information for a recording with an ID of `2` in the bucket with ID `1`. +* `GET /recordings/2/subscription.json` will return subscription information for a recording with an ID of `2`. ###### Example JSON Response - + ```json { "subscribed": true, @@ -81,42 +81,42 @@ Get subscription ] } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/subscription.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/subscription.json ``` Subscribe current user ---------------------- -* `POST /buckets/1/recordings/2/subscription.json` will subscribe the current user to the recording with an ID of `2` in the bucket with ID `1`. It returns `200 OK` with the current JSON representation of the recording subscriptions if the creation was a success. See the [Get subscription](#get-subscription) endpoint for an example of such response. +* `POST /recordings/2/subscription.json` will subscribe the current user to the recording with an ID of `2`. It returns `200 OK` with the current JSON representation of the recording subscriptions if the creation was a success. See the [Get subscription](#get-subscription) endpoint for an example of such response. ###### Copy as cURL ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" -X POST \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/subscription.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/subscription.json ``` Unsubscribe current user ----------------------- -* `DELETE /buckets/1/recordings/2/subscription.json` will unsubscribe the current user from the recording with an ID of `2` in the bucket with ID `1`. It returns `204 No Content` in any case, even if the current user wasn't previously subscribed. +* `DELETE /recordings/2/subscription.json` will unsubscribe the current user from the recording with an ID of `2`. It returns `204 No Content` in any case, even if the current user wasn't previously subscribed. ###### Copy as cURL ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/subscription.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/subscription.json ``` Update subscription ------------------- -* `PUT /buckets/1/recordings/2/subscription.json` will add and remove the people given from the list of subscribers for the recording with an ID of `2` in the bucket with ID `1`. It returns `200 OK` with the current JSON representation of the recording subscriptions if the creation was a success. +* `PUT /recordings/2/subscription.json` will add and remove the people given from the list of subscribers for the recording with an ID of `2`. It returns `200 OK` with the current JSON representation of the recording subscriptions if the creation was a success. **Parameters**: Requests should include at least one of the following parameters. @@ -124,7 +124,7 @@ Update subscription * `unsubscriptions` - an array of people IDs. ###### Example JSON Request - + ```json { "subscriptions": [ @@ -135,7 +135,7 @@ Update subscription ] } ``` - + ###### Copy as cURL @@ -143,11 +143,11 @@ Update subscription ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"subscriptions":[1049715916], "unsubscriptions":[1049715914]}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/recordings/2/subscription.json + https://3.basecampapi.com/$ACCOUNT_ID/recordings/2/subscription.json ``` ###### Example JSON Response - + ```json { "subscribed": false, @@ -211,4 +211,14 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j ] } ``` - + + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/recordings/2/subscription.json` → [Get subscription](#get-subscription) +* `POST /buckets/1/recordings/2/subscription.json` → [Subscribe current user](#subscribe-current-user) +* `DELETE /buckets/1/recordings/2/subscription.json` → [Unsubscribe current user](#unsubscribe-current-user) +* `PUT /buckets/1/recordings/2/subscription.json` → [Update subscription](#update-subscription) diff --git a/sections/templates.md b/sections/templates.md index 580115b..84b40aa 100644 --- a/sections/templates.md +++ b/sections/templates.md @@ -28,7 +28,7 @@ _Optional parameters_: "id": 2085958506, "status": "active", "created_at": "2026-01-31T09:28:25.505Z", - "updated_at": "2026-01-31T08:33:27.996Z", + "updated_at": "2026-02-07T01:42:36.509Z", "name": "Honcho Onboarding", "description": "Getting started on the right foot", "url": "https://3.basecampapi.com/195539477/templates/2085958506.json", @@ -129,7 +129,7 @@ Get a Template "id": 2085958506, "status": "active", "created_at": "2026-01-31T09:28:25.505Z", - "updated_at": "2026-01-31T08:33:27.996Z", + "updated_at": "2026-02-07T01:42:36.509Z", "name": "Honcho Onboarding", "description": "Getting started on the right foot", "url": "https://3.basecampapi.com/195539477/templates/2085958506.json", @@ -321,9 +321,9 @@ If creation was successful, this returns `201 Created` along with the current JS ```json { - "id": 598194959, + "id": 598194966, "status": "pending", - "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194959.json" + "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194966.json" } ``` @@ -338,14 +338,14 @@ This endpoint can be polled at regular intervals (no more than once a second) to ```json { - "id": 598194959, + "id": 598194966, "status": "completed", - "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194959.json", + "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194966.json", "project": { - "id": 2085958509, + "id": 2085958519, "status": "active", - "created_at": "2026-02-01T02:53:28.819Z", - "updated_at": "2026-02-01T02:53:29.751Z", + "created_at": "2026-02-07T01:45:09.509Z", + "updated_at": "2026-02-07T01:45:10.638Z", "name": "New project from template", "description": null, "purpose": "topic", @@ -355,81 +355,81 @@ This endpoint can be polled at regular intervals (no more than once a second) to "last_needle_color": "green", "last_needle_position": null, "previous_needle_position": null, - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9CdWNrZXQvMjA4NTk1ODUwOT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--91136c7757b8825fbf10b5d62db1ccbdd9fce343.json", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9CdWNrZXQvMjA4NTk1ODUxOT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--1779193e59945110ee1f1e1d56cd42997e3a75e1.json", + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519", "dock": [ { - "id": 1069479919, + "id": 1069480185, "title": "Message Board", "name": "message_board", "enabled": true, "position": 1, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/message_boards/1069479919.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/message_boards/1069479919" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/message_boards/1069480185.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/message_boards/1069480185" }, { - "id": 1069479920, + "id": 1069480186, "title": "To-dos", "name": "todoset", "enabled": true, "position": 2, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todosets/1069479920.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todosets/1069479920" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/todosets/1069480186.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/todosets/1069480186" }, { - "id": 1069479925, + "id": 1069480191, "title": "Docs & Files", "name": "vault", "enabled": true, "position": 3, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/vaults/1069479925.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/vaults/1069479925" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/vaults/1069480191.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/vaults/1069480191" }, { - "id": 1069479926, + "id": 1069480192, "title": "Chat", "name": "chat", "enabled": true, "position": 4, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/chats/1069479926.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/chats/1069479926" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/chats/1069480192.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/chats/1069480192" }, { - "id": 1069479927, + "id": 1069480193, "title": "Schedule", "name": "schedule", "enabled": true, "position": 5, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/schedules/1069479927.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/schedules/1069479927" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/schedules/1069480193.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/schedules/1069480193" }, { - "id": 1069479928, + "id": 1069480194, "title": "Automatic Check-ins", "name": "questionnaire", "enabled": false, "position": null, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/questionnaires/1069479928.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/questionnaires/1069479928" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/questionnaires/1069480194.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/questionnaires/1069480194" }, { - "id": 1069479929, + "id": 1069480195, "title": "Email Forwards", "name": "inbox", "enabled": false, "position": null, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/inboxes/1069479929.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/inboxes/1069479929" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/inboxes/1069480195.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/inboxes/1069480195" }, { - "id": 1069479930, + "id": 1069480196, "title": "Card Table", "name": "kanban_board", "enabled": false, "position": null, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/card_tables/1069479930.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/card_tables/1069479930" + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/card_tables/1069480196.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/card_tables/1069480196" } ] } diff --git a/sections/timeline.md b/sections/timeline.md index 81d9d25..46ce3a9 100644 --- a/sections/timeline.md +++ b/sections/timeline.md @@ -19,8 +19,8 @@ Get timeline ```json [ { - "id": 1071915657, - "created_at": "2026-02-01T02:53:36.156Z", + "id": 1071916037, + "created_at": "2026-02-07T01:45:16.293Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -62,8 +62,8 @@ Get timeline } }, { - "id": 1071915655, - "created_at": "2026-02-01T02:53:35.530Z", + "id": 1071916035, + "created_at": "2026-02-07T01:45:15.552Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -105,12 +105,12 @@ Get timeline } }, { - "id": 1071915638, - "created_at": "2026-02-01T02:53:29.296Z", + "id": 1071916018, + "created_at": "2026-02-07T01:45:09.954Z", "kind": "todo_created", - "parent_recording_id": 1069479921, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479924.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479924", + "parent_recording_id": 1069480187, + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/todos/1069480190.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/todos/1069480190", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -144,20 +144,20 @@ Get timeline "summary_excerpt": "Install ShipShape", "avatars_sample": [], "bucket": { - "id": 2085958509, + "id": 2085958519, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509" + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519" }, "attachments": [] }, { - "id": 1071915637, - "created_at": "2026-02-01T02:53:29.237Z", + "id": 1071916017, + "created_at": "2026-02-07T01:45:09.909Z", "kind": "todo_created", - "parent_recording_id": 1069479921, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479923.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479923", + "parent_recording_id": 1069480187, + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/todos/1069480189.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/todos/1069480189", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -191,20 +191,20 @@ Get timeline "summary_excerpt": "Talk to Jerry about holidays", "avatars_sample": [], "bucket": { - "id": 2085958509, + "id": 2085958519, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509" + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519" }, "attachments": [] }, { - "id": 1071915636, - "created_at": "2026-02-01T02:53:29.190Z", + "id": 1071916016, + "created_at": "2026-02-07T01:45:09.853Z", "kind": "todo_created", - "parent_recording_id": 1069479921, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479922.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479922", + "parent_recording_id": 1069480187, + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/todos/1069480188.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/todos/1069480188", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -238,10 +238,10 @@ Get timeline "summary_excerpt": "Talk to Cheryl about benefits", "avatars_sample": [], "bucket": { - "id": 2085958509, + "id": 2085958519, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509" + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519" }, "attachments": [] } @@ -265,8 +265,8 @@ Get project timeline ```json [ { - "id": 1071915657, - "created_at": "2026-02-01T02:53:36.156Z", + "id": 1071916037, + "created_at": "2026-02-07T01:45:16.293Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -308,8 +308,8 @@ Get project timeline } }, { - "id": 1071915655, - "created_at": "2026-02-01T02:53:35.530Z", + "id": 1071916035, + "created_at": "2026-02-07T01:45:15.552Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -398,8 +398,8 @@ Get person's timeline }, "events": [ { - "id": 1071915657, - "created_at": "2026-02-01T02:53:36.156Z", + "id": 1071916037, + "created_at": "2026-02-07T01:45:16.293Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -441,8 +441,8 @@ Get person's timeline } }, { - "id": 1071915655, - "created_at": "2026-02-01T02:53:35.530Z", + "id": 1071916035, + "created_at": "2026-02-07T01:45:15.552Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -484,12 +484,12 @@ Get person's timeline } }, { - "id": 1071915638, - "created_at": "2026-02-01T02:53:29.296Z", + "id": 1071916018, + "created_at": "2026-02-07T01:45:09.954Z", "kind": "todo_created", - "parent_recording_id": 1069479921, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479924.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479924", + "parent_recording_id": 1069480187, + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/todos/1069480190.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/todos/1069480190", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -523,20 +523,20 @@ Get person's timeline "summary_excerpt": "Install ShipShape", "avatars_sample": [], "bucket": { - "id": 2085958509, + "id": 2085958519, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509" + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519" }, "attachments": [] }, { - "id": 1071915637, - "created_at": "2026-02-01T02:53:29.237Z", + "id": 1071916017, + "created_at": "2026-02-07T01:45:09.909Z", "kind": "todo_created", - "parent_recording_id": 1069479921, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479923.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479923", + "parent_recording_id": 1069480187, + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/todos/1069480189.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/todos/1069480189", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -570,20 +570,20 @@ Get person's timeline "summary_excerpt": "Talk to Jerry about holidays", "avatars_sample": [], "bucket": { - "id": 2085958509, + "id": 2085958519, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509" + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519" }, "attachments": [] }, { - "id": 1071915636, - "created_at": "2026-02-01T02:53:29.190Z", + "id": 1071916016, + "created_at": "2026-02-07T01:45:09.853Z", "kind": "todo_created", - "parent_recording_id": 1069479921, - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479922.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479922", + "parent_recording_id": 1069480187, + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/todos/1069480188.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958519/todos/1069480188", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -617,19 +617,19 @@ Get person's timeline "summary_excerpt": "Talk to Cheryl about benefits", "avatars_sample": [], "bucket": { - "id": 2085958509, + "id": 2085958519, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509" + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519" }, "attachments": [] }, { - "id": 1071915630, - "created_at": "2026-02-01T02:53:28.937Z", + "id": 1071916010, + "created_at": "2026-02-07T01:45:09.592Z", "kind": "dock_created", - "url": "https://3.basecampapi.com/195539477/buckets/2085958509/dock.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509", + "url": "https://3.basecampapi.com/195539477/buckets/2085958519/dock.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -663,10 +663,416 @@ Get person's timeline "summary_excerpt": null, "avatars_sample": [], "bucket": { - "id": 2085958509, + "id": 2085958519, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958509" + "url": "https://3.basecampapi.com/195539477/projects/2085958519.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958519" + }, + "attachments": [] + }, + { + "id": 1071915992, + "created_at": "2026-02-07T01:42:36.787Z", + "kind": "project_access_changed", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. changed who can access this project", + "target": null, + "title": "Victor C. changed who can access this project", + "summary_excerpt": "Steve Marsh was granted access.", + "avatars_sample": [], + "bucket": { + "id": 2085958504, + "name": "The Leto Laptop", + "url": "https://3.basecampapi.com/195539477/projects/2085958504.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504" + } + }, + { + "id": 1071915990, + "created_at": "2026-02-07T01:42:36.000Z", + "kind": "project_access_changed", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. changed who can access this project", + "target": null, + "title": "Victor C. changed who can access this project", + "summary_excerpt": "Amy Rivera was granted access.", + "avatars_sample": [], + "bucket": { + "id": 2085958504, + "name": "The Leto Laptop", + "url": "https://3.basecampapi.com/195539477/projects/2085958504.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504" + } + }, + { + "id": 1071915973, + "created_at": "2026-02-07T01:42:30.165Z", + "kind": "todo_created", + "parent_recording_id": 1069480157, + "url": "https://3.basecampapi.com/195539477/buckets/2085958518/todos/1069480160.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958518/todos/1069480160", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. added a to-do", + "target": "First things first", + "title": "On “First things first”, Victor C. added", + "summary_excerpt": "Install ShipShape", + "avatars_sample": [], + "bucket": { + "id": 2085958518, + "name": "New project from template", + "url": "https://3.basecampapi.com/195539477/projects/2085958518.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958518" + }, + "attachments": [] + }, + { + "id": 1071915972, + "created_at": "2026-02-07T01:42:30.133Z", + "kind": "todo_created", + "parent_recording_id": 1069480157, + "url": "https://3.basecampapi.com/195539477/buckets/2085958518/todos/1069480159.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958518/todos/1069480159", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. added a to-do", + "target": "First things first", + "title": "On “First things first”, Victor C. added", + "summary_excerpt": "Talk to Jerry about holidays", + "avatars_sample": [], + "bucket": { + "id": 2085958518, + "name": "New project from template", + "url": "https://3.basecampapi.com/195539477/projects/2085958518.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958518" + }, + "attachments": [] + }, + { + "id": 1071915971, + "created_at": "2026-02-07T01:42:30.089Z", + "kind": "todo_created", + "parent_recording_id": 1069480157, + "url": "https://3.basecampapi.com/195539477/buckets/2085958518/todos/1069480158.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958518/todos/1069480158", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. added a to-do", + "target": "First things first", + "title": "On “First things first”, Victor C. added", + "summary_excerpt": "Talk to Cheryl about benefits", + "avatars_sample": [], + "bucket": { + "id": 2085958518, + "name": "New project from template", + "url": "https://3.basecampapi.com/195539477/projects/2085958518.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958518" + }, + "attachments": [] + }, + { + "id": 1071915965, + "created_at": "2026-02-07T01:42:29.872Z", + "kind": "dock_created", + "url": "https://3.basecampapi.com/195539477/buckets/2085958518/dock.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958518", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. started a new project called New project from template", + "target": "New project from template", + "title": "Victor C. started a new project called “New project from template”", + "summary_excerpt": null, + "avatars_sample": [], + "bucket": { + "id": 2085958518, + "name": "New project from template", + "url": "https://3.basecampapi.com/195539477/projects/2085958518.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958518" + }, + "attachments": [] + }, + { + "id": 1071915947, + "created_at": "2026-02-07T01:40:06.400Z", + "kind": "project_access_changed", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. changed who can access this project", + "target": null, + "title": "Victor C. changed who can access this project", + "summary_excerpt": "Steve Marsh was granted access.", + "avatars_sample": [], + "bucket": { + "id": 2085958504, + "name": "The Leto Laptop", + "url": "https://3.basecampapi.com/195539477/projects/2085958504.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504" + } + }, + { + "id": 1071915945, + "created_at": "2026-02-07T01:40:05.701Z", + "kind": "project_access_changed", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. changed who can access this project", + "target": null, + "title": "Victor C. changed who can access this project", + "summary_excerpt": "Amy Rivera was granted access.", + "avatars_sample": [], + "bucket": { + "id": 2085958504, + "name": "The Leto Laptop", + "url": "https://3.basecampapi.com/195539477/projects/2085958504.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504" + } + }, + { + "id": 1071915928, + "created_at": "2026-02-07T01:39:59.890Z", + "kind": "todo_created", + "parent_recording_id": 1069480127, + "url": "https://3.basecampapi.com/195539477/buckets/2085958517/todos/1069480130.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958517/todos/1069480130", + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T08:29:28.365Z", + "updated_at": "2026-01-31T08:29:32.599Z", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "action": "Victor C. added a to-do", + "target": "First things first", + "title": "On “First things first”, Victor C. added", + "summary_excerpt": "Install ShipShape", + "avatars_sample": [], + "bucket": { + "id": 2085958517, + "name": "New project from template", + "url": "https://3.basecampapi.com/195539477/projects/2085958517.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958517" }, "attachments": [] } diff --git a/sections/timesheets.md b/sections/timesheets.md index 3b43185..a542b70 100644 --- a/sections/timesheets.md +++ b/sections/timesheets.md @@ -9,7 +9,7 @@ Endpoints: - [Get a timesheet entry](#get-a-timesheet-entry) - [Create a timesheet entry](#create-a-timesheet-entry) - [Update a timesheet entry](#update-a-timesheet-entry) -- [Trash a timesheet entry][3] +- [Delete a timesheet entry](#delete-a-timesheet-entry) Get timesheet report -------------------- @@ -327,23 +327,23 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCO Get a timesheet entry --------------------- -* `GET /projects/1/timesheet/entries/2.json` will return the timesheet entry with an ID of `2` in the project with an ID of `1`. +* `GET /timesheet_entries/2.json` will return the timesheet entry with an ID of `2`. ###### Example JSON Response - + ```json { - "id": 1069480003, + "id": 1069480181, "status": "active", "visible_to_clients": false, - "created_at": "2026-02-05T07:32:20.768Z", - "updated_at": "2026-02-05T07:32:20.768Z", + "created_at": "2026-02-07T01:44:59.972Z", + "updated_at": "2026-02-07T01:44:59.972Z", "title": "Timesheet entry", "inherits_status": true, "type": "Timesheet::Entry", - "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480003.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480003", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDAwMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--ccfe246f63ad947294e26409f3067b394d3ab04b.json", + "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480181.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480181", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDE4MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0adad083d350837fcc7f9b1b0dfd8ab1b9797c0c.json", "parent": { "id": 1069479406, "title": "We won Leto!", @@ -383,7 +383,7 @@ Get a timesheet entry "can_access_timesheet": true, "can_access_hill_charts": true }, - "date": "2026-02-04", + "date": "2026-02-06", "description": "API docs example", "hours": "1.5", "person": { @@ -415,11 +415,11 @@ Get a timesheet entry } } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/projects/1/timesheet/entries/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/timesheet_entries/2.json ``` Create a timesheet entry @@ -455,17 +455,17 @@ This endpoint will return `201 Created` with the current JSON representation of ```json { - "id": 1069480003, + "id": 1069480181, "status": "active", "visible_to_clients": false, - "created_at": "2026-02-05T07:32:20.768Z", - "updated_at": "2026-02-05T07:32:20.768Z", + "created_at": "2026-02-07T01:44:59.972Z", + "updated_at": "2026-02-07T01:44:59.972Z", "title": "Timesheet entry", "inherits_status": true, "type": "Timesheet::Entry", - "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480003.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480003", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDAwMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--ccfe246f63ad947294e26409f3067b394d3ab04b.json", + "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480181.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480181", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDE4MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0adad083d350837fcc7f9b1b0dfd8ab1b9797c0c.json", "parent": { "id": 1069479406, "title": "We won Leto!", @@ -505,7 +505,7 @@ This endpoint will return `201 Created` with the current JSON representation of "can_access_timesheet": true, "can_access_hill_charts": true }, - "date": "2026-02-04", + "date": "2026-02-06", "description": "API docs example", "hours": "1.5", "person": { @@ -550,7 +550,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j Update a timesheet entry ------------------------ -* `PUT /buckets/1/timesheet/entries/2.json` allows changing the timesheet entry with an ID of `2` in the project with ID `1`. +* `PUT /timesheet_entries/2.json` allows changing the timesheet entry with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the timesheet entry if the update was a success. See the [Get timesheet for a project](#get-timesheet-for-a-project) endpoint for more info on the payload. @@ -571,20 +571,20 @@ _Optional parameters_: Only pass the parameters you want to change. ``` ###### Example JSON Response - + ```json { - "id": 1069480003, + "id": 1069480181, "status": "active", "visible_to_clients": false, - "created_at": "2026-02-05T07:32:20.768Z", - "updated_at": "2026-02-05T07:32:21.757Z", + "created_at": "2026-02-07T01:44:59.972Z", + "updated_at": "2026-02-07T01:45:00.878Z", "title": "Timesheet entry", "inherits_status": true, "type": "Timesheet::Entry", - "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480003.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480003", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDAwMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--ccfe246f63ad947294e26409f3067b394d3ab04b.json", + "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480181.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480181", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDE4MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0adad083d350837fcc7f9b1b0dfd8ab1b9797c0c.json", "parent": { "id": 1069479406, "title": "We won Leto!", @@ -624,7 +624,7 @@ _Optional parameters_: Only pass the parameters you want to change. "can_access_timesheet": true, "can_access_hill_charts": true }, - "date": "2026-02-04", + "date": "2026-02-06", "description": "Updated via API", "hours": "2.5", "person": { @@ -656,16 +656,31 @@ _Optional parameters_: Only pass the parameters you want to change. } } ``` - + ###### Copy as cURL ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -X PUT -d '{"hours":"2.5","description":"Updated description"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/timesheet/entries/2.json + https://3.basecampapi.com/$ACCOUNT_ID/timesheet_entries/2.json +``` + +Delete a timesheet entry +------------------------ + +* `DELETE /timesheet_entries/2.json` will delete the timesheet entry with an ID of `2`. + +This endpoint will return `204 No Content` if the delete was successful. No parameters are required. + +The entry is permanently deleted and cannot be recovered. + +###### Copy as cURL + +```shell +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -X DELETE \ + https://3.basecampapi.com/$ACCOUNT_ID/timesheet_entries/2.json ``` [1]: https://github.com/basecamp/bc3-api/blob/master/sections/people.md#people [2]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#projects -[3]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording diff --git a/sections/todolist_groups.md b/sections/todolist_groups.md index 422d012..493d63d 100644 --- a/sections/todolist_groups.md +++ b/sections/todolist_groups.md @@ -11,14 +11,14 @@ Endpoints: List to-do list groups ---------------------- -* `GET /buckets/1/todolists/2/groups.json` will return a [paginated list][pagination] of active groups in the project with an ID of `1` and the to-do list with ID of `2`. +* `GET /todolists/2/groups.json` will return a [paginated list][pagination] of active groups in the to-do list with ID of `2`. _Optional query parameters_: * `status` - when set to `archived` or `trashed`, returns only archived or trashed to-do list groups within this to-do list. ###### Example JSON Response - + ```json [ { @@ -33,9 +33,11 @@ _Optional query parameters_: "url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/1069479153.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/todolists/1069479153", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTE1Mz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--a26b7fc6739381648d87196eaefbe0cfbf2746ef.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479153/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479153/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/boosts.json", "position": 1, "parent": { "id": 1069479152, @@ -77,8 +79,8 @@ _Optional query parameters_: "completed_ratio": "0/2", "name": "Group A", "color": null, - "group_position_url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/groups/1069479153/position.json", - "todos_url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/1069479153/todos.json", + "group_position_url": "https://3.basecampapi.com/195539477/todolists/groups/1069479153/position.json", + "todos_url": "https://3.basecampapi.com/195539477/todolists/1069479153/todos.json", "app_todos_url": "https://3.basecamp.com/195539477/buckets/2085958502/todolists/1069479153/todos", "comments_app_url": "https://3.basecamp.com/195539477/buckets/2085958502/recordings/1069479153/comments" }, @@ -94,9 +96,11 @@ _Optional query parameters_: "url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/1069479156.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/todolists/1069479156", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTE1Nj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--e0947e0fc5ec107b039a998e2f52ce75e86fdc32.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479156/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479156/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479156/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479156/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479156/boosts.json", "position": 2, "parent": { "id": 1069479152, @@ -138,18 +142,18 @@ _Optional query parameters_: "completed_ratio": "0/2", "name": "Group B", "color": null, - "group_position_url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/groups/1069479156/position.json", - "todos_url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/1069479156/todos.json", + "group_position_url": "https://3.basecampapi.com/195539477/todolists/groups/1069479156/position.json", + "todos_url": "https://3.basecampapi.com/195539477/todolists/1069479156/todos.json", "app_todos_url": "https://3.basecamp.com/195539477/buckets/2085958502/todolists/1069479156/todos", "comments_app_url": "https://3.basecamp.com/195539477/buckets/2085958502/recordings/1069479156/comments" } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todolists/2/groups.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/todolists/2/groups.json ``` Get a to-do list group @@ -158,10 +162,10 @@ Get a to-do list group To-do list groups can be read in exactly the same way as to-do lists. The only difference is a top-level to-do list will include a groups_url in its response, while a group will have a group_position_url -* `GET /buckets/1/todolists/3.json` will return the to-do list group with an ID of `3` in the project with an ID of `1`. +* `GET /todolists/3.json` will return the to-do list group with an ID of `3`. ###### Example JSON Response - + ```json { "id": 1069479153, @@ -175,9 +179,11 @@ include a groups_url in its response, while a group will have a group_position_u "url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/1069479153.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/todolists/1069479153", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTE1Mz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--a26b7fc6739381648d87196eaefbe0cfbf2746ef.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479153/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479153/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/boosts.json", "position": 1, "parent": { "id": 1069479152, @@ -219,18 +225,18 @@ include a groups_url in its response, while a group will have a group_position_u "completed_ratio": "0/2", "name": "Group A", "color": null, - "group_position_url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/groups/1069479153/position.json", - "todos_url": "https://3.basecampapi.com/195539477/buckets/2085958502/todolists/1069479153/todos.json", + "group_position_url": "https://3.basecampapi.com/195539477/todolists/groups/1069479153/position.json", + "todos_url": "https://3.basecampapi.com/195539477/todolists/1069479153/todos.json", "app_todos_url": "https://3.basecamp.com/195539477/buckets/2085958502/todolists/1069479153/todos", "comments_app_url": "https://3.basecamp.com/195539477/buckets/2085958502/recordings/1069479153/comments" } ``` - + Create a to-do list group ------------------------- -* `POST /buckets/1/todolists/2/groups.json` creates a to-do group within the todolist with ID `2` in the project with id `1`. +* `POST /todolists/2/groups.json` creates a to-do group within the todolist with ID `2`. **Required parameters**: `name` of the to-do list group. @@ -253,13 +259,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"name":"The Spencer Davis Group"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todolists/2/groups.json + https://3.basecampapi.com/$ACCOUNT_ID/todolists/2/groups.json ``` Reposition a to-do list group ----------------------------- -* `PUT /buckets/1/todolists/groups/3/position.json` allows changing the position of the to-do list group with an ID of `3` in the project with ID `1`. +* `PUT /todolists/groups/3/position.json` allows changing the position of the to-do list group with an ID of `3`. **Required parameters**: `position` greater than or equal to one. @@ -278,7 +284,17 @@ This endpoint will return `204 No Content` if the update was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"position":3}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todolists/groups/3/position.json + https://3.basecampapi.com/$ACCOUNT_ID/todolists/groups/3/position.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/todolists/2/groups.json` → [List to-do list groups](#list-to-do-list-groups) +* `GET /buckets/1/todolists/3.json` → [Get a to-do list group](#get-to-do-list-group) +* `POST /buckets/1/todolists/2/groups.json` → [Create a to-do list group](#create-a-to-do-list-group) +* `PUT /buckets/1/todolists/groups/3/position.json` → [Reposition a to-do list group](#reposition-a-to-do-list-group) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/todolists.md b/sections/todolists.md index 1f6336d..1d0a694 100644 --- a/sections/todolists.md +++ b/sections/todolists.md @@ -12,7 +12,7 @@ Endpoints: Get to-do lists --------------- -* `GET /buckets/1/todosets/3/todolists.json` will return a [paginated list][pagination] of active to-do lists in the project with an ID of `1` and the to-do set with ID of `3`. +* `GET /todosets/3/todolists.json` will return a [paginated list][pagination] of active to-do lists in the to-do set with ID of `3`. To get the to-do set ID for a project, see the [Get to-do set][todoset] endpoint. @@ -21,7 +21,7 @@ _Optional query parameters_: * `status` - when set to `archived` or `trashed`, will return archived or trashed to-do lists that are in this to-do set. ###### Example JSON Response - + ```json [ { @@ -29,16 +29,18 @@ _Optional query parameters_: "status": "active", "visible_to_clients": false, "created_at": "2026-01-15T05:50:00.000Z", - "updated_at": "2026-01-31T08:32:56.540Z", + "updated_at": "2026-02-07T01:45:28.746Z", "title": "Strategy ideas", "inherits_status": true, "type": "Todolist", "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479573.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479573", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTU3Mz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--3edc00987d9016d2ac5115dabef3d1f0f1dacb64.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479573/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479573/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479573/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479573/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479573/boosts.json", "position": 1, "parent": { "id": 1069479393, @@ -84,28 +86,28 @@ _Optional query parameters_: "completed_ratio": "2/5", "name": "Strategy ideas", "color": null, - "groups_url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479573/groups.json", - "todos_url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479573/todos.json", + "groups_url": "https://3.basecampapi.com/195539477/todolists/1069479573/groups.json", + "todos_url": "https://3.basecampapi.com/195539477/todolists/1069479573/todos.json", "app_todos_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479573/todos", "comments_app_url": "https://3.basecamp.com/195539477/buckets/2085958504/recordings/1069479573/comments" } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todosets/3/todolists.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/todosets/3/todolists.json ``` Get a to-do list ---------------- -* `GET /buckets/1/todolists/2.json` will return the to-do list with an ID of `2` in the project with an ID of `1`. +* `GET /todolists/2.json` will return the to-do list with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479424, @@ -119,9 +121,11 @@ Get a to-do list "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479424.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479424", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQyND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--4fe2ce4602873b2bea4e9189685d5fa0ebf1c8da.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479424/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479424/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479424/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479424/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479424/boosts.json", "position": 10, "parent": { "id": 1069479393, @@ -167,24 +171,24 @@ Get a to-do list "completed_ratio": "0/4", "name": "Background and research", "color": null, - "groups_url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479424/groups.json", - "todos_url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479424/todos.json", + "groups_url": "https://3.basecampapi.com/195539477/todolists/1069479424/groups.json", + "todos_url": "https://3.basecampapi.com/195539477/todolists/1069479424/todos.json", "app_todos_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479424/todos", "comments_app_url": "https://3.basecamp.com/195539477/buckets/2085958504/recordings/1069479424/comments" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todolists/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/todolists/2.json ``` Create a to-do list ------------------- -* `POST /buckets/1/todosets/3/todolists.json` creates a to-do list in the project with ID `1` and under the to-do set with an ID of `3`. +* `POST /todosets/3/todolists.json` creates a to-do list under the to-do set with an ID of `3`. **Required parameters**: `name` of the to-do list. @@ -206,14 +210,14 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"name":"Launch","description":"
Finish it!
"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todosets/3/todolists.json + https://3.basecampapi.com/$ACCOUNT_ID/todosets/3/todolists.json ``` Update a to-do list ------------------- -* `PUT /buckets/1/todolists/2.json` allows changing the name and description of the to-do list with an ID of `2` in the project with ID `1`. +* `PUT /todolists/2.json` allows changing the name and description of the to-do list with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the to-do list if the update was a success. See the [Get a to-do list](#get-a-to-do-list) endpoint for more info on the payload. @@ -237,10 +241,21 @@ This endpoint will return `200 OK` with the current JSON representation of the t ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"name":"Relaunch","description":"
Try this again.
"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todolists/2.json + https://3.basecampapi.com/$ACCOUNT_ID/todolists/2.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/todosets/3/todolists.json` → [Get to-do lists](#get-to-do-lists) +* `GET /buckets/1/todolists/2.json` → [Get a to-do list](#get-a-to-do-list) +* `POST /buckets/1/todosets/3/todolists.json` → [Create a to-do list](#create-a-to-do-list) +* `PUT /buckets/1/todolists/2.json` → [Update a to-do list](#update-a-to-do-list) + [trash]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [todoset]: https://github.com/basecamp/bc3-api/blob/master/sections/todosets.md#get-to-do-set diff --git a/sections/todos.md b/sections/todos.md index 0c58c51..c73a167 100644 --- a/sections/todos.md +++ b/sections/todos.md @@ -15,17 +15,17 @@ Endpoints: Get to-dos ---------- -* `GET /buckets/1/todolists/3/todos.json` will return a [paginated list][2] of active to-dos in the project with an ID of `1` and the to-do list with ID of `3`. +* `GET /todolists/3/todos.json` will return a [paginated list][2] of active to-dos in the to-do list with ID of `3`. _Optional query parameters_: -This endpoint without any parameters returns only active, pending (i.e. not completed) to-dos. +This endpoint without any parameters returns only active, pending (i.e. not completed) to-dos. * `status` - when set to `archived` or `trashed`, will return archived or trashed to-dos that are in this list, including both pending and completed. * `completed` - when set to `true`, will only return to-dos that are completed. Can be combined with the `status` parameter. ###### Example JSON Response - + ```json [ { @@ -40,9 +40,11 @@ This endpoint without any parameters returns only active, pending (i.e. not comp "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todos/1069479574.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todos/1069479574", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTU3ND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--902c7ca4798684fca5b9fe7621a760f4a0d432cd.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479574/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479574/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479574/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479574/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479574/boosts.json", "position": 1, "parent": { "id": 1069479573, @@ -90,41 +92,43 @@ This endpoint without any parameters returns only active, pending (i.e. not comp "due_on": null, "assignees": [], "completion_subscribers": [], - "completion_url": "https://3.basecampapi.com/195539477/buckets/2085958504/todos/1069479574/completion.json" + "completion_url": "https://3.basecampapi.com/195539477/todos/1069479574/completion.json" } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todolists/3/todos.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/todolists/3/todos.json ``` Get a to-do ----------- -* `GET /buckets/1/todos/2.json` will return the to-do with an ID of `2` in the project with an ID of `1`. +* `GET /todos/2.json` will return the to-do with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479576, "status": "active", "visible_to_clients": false, "created_at": "2026-01-15T07:20:00.000Z", - "updated_at": "2026-02-01T02:53:46.582Z", + "updated_at": "2026-02-07T01:45:28.277Z", "title": "Clear and simple UI", "inherits_status": true, "type": "Todo", "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todos/1069479576.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todos/1069479576", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTU3Nj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--11a40c121978ed499b97e8c9ed0d3bfc8632df41.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479576/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479576/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/boosts.json", "parent": { "id": 1069479573, "title": "Strategy ideas", @@ -167,7 +171,7 @@ Get a to-do "description": "", "completed": true, "completion": { - "created_at": "2026-02-01T02:53:46.523Z", + "created_at": "2026-02-07T01:45:28.131Z", "creator": { "id": 1049715930, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", @@ -245,21 +249,21 @@ Get a to-do "can_access_hill_charts": true } ], - "completion_url": "https://3.basecampapi.com/195539477/buckets/2085958504/todos/1069479576/completion.json" + "completion_url": "https://3.basecampapi.com/195539477/todos/1069479576/completion.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todos/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/todos/2.json ``` Create a to-do -------------- -* `POST /buckets/1/todolists/3/todos.json` creates a to-do in the project with ID `1` and under the to-do list with an ID of `3`. +* `POST /todolists/3/todos.json` creates a to-do under the to-do list with an ID of `3`. **Required parameters**: `content` for what the to-do is for. @@ -289,14 +293,14 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"content":"Program it","description":"
Try that new language!
","due_on":"2016-05-01"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todolists/3/todos.json + https://3.basecampapi.com/$ACCOUNT_ID/todolists/3/todos.json ``` Update a to-do -------------- -* `PUT /buckets/1/todos/2.json` allows changing the to-do with an ID of `2` in the project with ID `1`. +* `PUT /todos/2.json` allows changing the to-do with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the to-do if the update was a success. See the [Get a to-do](#get-a-to-do) endpoint for more info on the payload. @@ -304,7 +308,7 @@ This endpoint will return `200 OK` with the current JSON representation of the t * `content` for what the to-do is for. This one is always required, it can't be omitted as it can't be blank. * `description` - containing information about the to-do. See our [Rich text guide][3] for what HTML tags allowed. * `assignee_ids` - an array of people that will be assigned to this to-do. Please see the [Get people][4] endpoints to retrieve them. -* `completion_subscriber_ids` - an array of people that will be notified on to-do completion. Please see the [Get people][4] endpoints to retrieve them. +* `completion_subscriber_ids` - an array of people that will be notified on to-do completion. Please see the [Get people][4] endpoints to retrieve them. * `notify` - when set to `true`, will notify the assignees about being assigned. * `due_on` - a date when the to-do should be completed. * `starts_on` - allows the to-do to run from this date to the `due_on` date. @@ -326,14 +330,14 @@ For example, to update the to-do's `content` from [Create a to-do](#create-a-tod ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"content":"Only changing content! Passing the rest to preserve them.","description":"
Try that new language!
","due_on":"2016-05-01"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todos/2.json + https://3.basecampapi.com/$ACCOUNT_ID/todos/2.json ``` Complete a to-do ---------------- -* `POST /buckets/1/todos/2/completion.json` will mark the to-do with an ID of `2` in the project with ID `1` as completed. +* `POST /todos/2/completion.json` will mark the to-do with an ID of `2` as completed. This endpoint will return `204 No Content` if successful. No parameters are required. @@ -341,14 +345,14 @@ This endpoint will return `204 No Content` if successful. No parameters are requ ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" -X POST \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todos/2/completion.json + https://3.basecampapi.com/$ACCOUNT_ID/todos/2/completion.json ``` Uncomplete a to-do ------------------ -* `DELETE /buckets/1/todos/2/completion.json` will mark the to-do with an ID of `2` in the project with ID `1` as uncompleted. +* `DELETE /todos/2/completion.json` will mark the to-do with an ID of `2` as uncompleted. This endpoint will return `204 No Content` if successful. No parameters are required. @@ -356,14 +360,14 @@ This endpoint will return `204 No Content` if successful. No parameters are requ ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todos/2/completion.json + https://3.basecampapi.com/$ACCOUNT_ID/todos/2/completion.json ``` Reposition a to-do ------------------ -* `PUT /buckets/1/todos/2/position.json` allows changing the position of the to-do with an ID of `2` in the project with ID `1`. +* `PUT /todos/2/position.json` allows changing the position of the to-do with an ID of `2`. **Required parameters**: `position` greater than or equal to one. @@ -395,9 +399,21 @@ To move a to-do to a different to-do list and set its position: ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"position":3}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todos/2/position.json + https://3.basecampapi.com/$ACCOUNT_ID/todos/2/position.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/todolists/3/todos.json` → [Get to-dos](#get-to-dos) +* `GET /buckets/1/todos/2.json` → [Get a to-do](#get-a-to-do) +* `POST /buckets/1/todolists/3/todos.json` → [Create a to-do](#create-a-to-do) +* `PUT /buckets/1/todos/2.json` → [Update a to-do](#update-a-to-do) +* `POST /buckets/1/todos/2/completion.json` → [Complete a to-do](#complete-a-to-do) +* `DELETE /buckets/1/todos/2/completion.json` → [Uncomplete a to-do](#uncomplete-a-to-do) +* `PUT /buckets/1/todos/2/position.json` → [Reposition a to-do](#reposition-a-to-do) [1]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording [2]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/todosets.md b/sections/todosets.md index 0a5eaa2..a6c54a3 100644 --- a/sections/todosets.md +++ b/sections/todosets.md @@ -11,19 +11,19 @@ Endpoints: Get to-do set ------------- -* `GET /buckets/1/todosets/2.json` will return the to-do set for the project with an ID of `1` and a to-do set ID of `2`. +* `GET /todosets/2.json` will return the to-do set with an ID of `2`. To get the to-do set ID for a project, see the [Get a project][1] endpoint's `dock` payload. To retrieve its to-do lists, see the [Get to-do lists][2] endpoint. ###### Example JSON Response - + ```json { "id": 1069479393, "status": "active", "visible_to_clients": false, "created_at": "2026-01-31T08:32:04.373Z", - "updated_at": "2026-01-31T08:32:56.590Z", + "updated_at": "2026-02-07T01:42:48.760Z", "title": "To-dos", "inherits_status": true, "type": "Todoset", @@ -74,7 +74,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "2/5", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479573.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479573.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479573" }, { @@ -83,7 +83,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "8/17", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479511.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479511.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479511" }, { @@ -92,7 +92,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "0/3", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479496.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479496.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479496" }, { @@ -101,7 +101,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "1/5", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479487.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479487.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479487" }, { @@ -110,7 +110,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "1/6", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479480.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479480.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479480" }, { @@ -119,7 +119,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "1/4", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479475.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479475.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479475" }, { @@ -128,7 +128,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "0/5", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479465.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479465.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479465" }, { @@ -137,7 +137,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "1/6", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479458.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479458.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479458" }, { @@ -146,7 +146,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "0/5", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479436.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479436.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479436" }, { @@ -155,22 +155,29 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "description": null, "completed": false, "completed_ratio": "0/4", - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/todolists/1069479424.json", + "url": "https://3.basecampapi.com/195539477/todolists/1069479424.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/todolists/1069479424" } ], - "todolists_url": "https://3.basecampapi.com/195539477/buckets/2085958504/todosets/1069479393/todolists.json", + "todolists_url": "https://3.basecampapi.com/195539477/todosets/1069479393/todolists.json", "app_todoslists_url": "https://3.basecamp.com/195539477/buckets/2085958504/todosets/1069479393/todolists" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/todosets/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/todosets/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/todosets/2.json` → [Get to-do set](#get-to-do-set) + [1]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-a-project [2]: https://github.com/basecamp/bc3-api/blob/master/sections/todolists.md#get-to-do-lists [3]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording diff --git a/sections/tools.md b/sections/tools.md index e5cc7ee..7227802 100644 --- a/sections/tools.md +++ b/sections/tools.md @@ -35,7 +35,7 @@ Get a tool "url": "https://3.basecampapi.com/195539477/buckets/2085958504/chats/1069479395.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/chats/1069479395", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTM5NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--8737d118a3b0bb00e4fc9ddfea9e3a421b2b8bf5.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479395/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479395/subscription.json", "position": 4, "bucket": { "id": 2085958504, diff --git a/sections/uploads.md b/sections/uploads.md index 39133a0..84645f1 100644 --- a/sections/uploads.md +++ b/sections/uploads.md @@ -12,10 +12,10 @@ Endpoints: Get uploads ----------- -* `GET /buckets/1/vaults/2/uploads.json` will return a [paginated list][pagination] of active uploads in the project with an ID of `1` and the [vault][vaults] with ID of `2`. +* `GET /vaults/2/uploads.json` will return a [paginated list][pagination] of active uploads in the [vault][vaults] with ID of `2`. ###### Example JSON Response - + ```json [ { @@ -30,9 +30,11 @@ Get uploads "url": "https://3.basecampapi.com/195539477/buckets/2085958504/uploads/1069479913.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/uploads/1069479913", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--b796a37ac3f19f619e8150d87b4a6a39882fdfd5.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479913/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479913/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479913/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479913/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479913/boosts.json", "position": 1, "parent": { "id": 1069479394, @@ -78,26 +80,26 @@ Get uploads "byte_size": 1281, "filename": "company-logo.png", "download_url": "https://3.basecampapi.com/195539477/buckets/2085958504/uploads/1069479913/download/company-logo.png", - "app_download_url": "http://storage.3.basecamp.localhost:4001/195539477/buckets/2085958504/uploads/1069479913/download/company-logo.png", + "app_download_url": "https://3.basecamp-static.com/195539477/buckets/2085958504/uploads/1069479913/download/company-logo.png", "width": 164, "height": 39 } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/2/uploads.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/vaults/2/uploads.json ``` Get an upload ------------- -* `GET /buckets/1/uploads/2.json` will return the upload with an ID of `2` in the project with an ID of `1`. +* `GET /uploads/2.json` will return the upload with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069479913, @@ -111,9 +113,11 @@ Get an upload "url": "https://3.basecampapi.com/195539477/buckets/2085958504/uploads/1069479913.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/uploads/1069479913", "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--b796a37ac3f19f619e8150d87b4a6a39882fdfd5.json", - "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479913/subscription.json", + "subscription_url": "https://3.basecampapi.com/195539477/recordings/1069479913/subscription.json", "comments_count": 0, - "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479913/comments.json", + "comments_url": "https://3.basecampapi.com/195539477/recordings/1069479913/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479913/boosts.json", "position": 1, "parent": { "id": 1069479394, @@ -159,23 +163,23 @@ Get an upload "byte_size": 1281, "filename": "company-logo.png", "download_url": "https://3.basecampapi.com/195539477/buckets/2085958504/uploads/1069479913/download/company-logo.png", - "app_download_url": "http://storage.3.basecamp.localhost:4001/195539477/buckets/2085958504/uploads/1069479913/download/company-logo.png", + "app_download_url": "https://3.basecamp-static.com/195539477/buckets/2085958504/uploads/1069479913/download/company-logo.png", "width": 164, "height": 39 } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/uploads/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/uploads/2.json ``` Create an upload ---------------- -* `POST /buckets/1/vaults/2/uploads.json` creates an upload in the project with ID `1` and under the vault with an ID of `2`. +* `POST /vaults/2/uploads.json` creates an upload under the vault with an ID of `2`. **Required parameters**: `attachable_sgid` for an uploaded attachment. See the [Create an attachment][attachments] endpoint for more info on uploading attachments. @@ -200,13 +204,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"attachable_sgid":"BAh…9c1","description":"
Yum
","base_name":"yummy_pizza"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/2/uploads.json + https://3.basecampapi.com/$ACCOUNT_ID/vaults/2/uploads.json ``` Update an upload ---------------- -* `PUT /buckets/1/uploads/2.json` allows changing the `description` and `base_name` of the upload with an ID of `2` in the project with ID `1`. +* `PUT /uploads/2.json` allows changing the `description` and `base_name` of the upload with an ID of `2`. This endpoint will return `200 OK` with the current JSON representation of the upload if the update was a success. See the [Get an upload](#get-an-upload) endpoint for more info on the payload. @@ -224,9 +228,19 @@ This endpoint will return `200 OK` with the current JSON representation of the u ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"description":"
Meh
","base_name":"old_pizza"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/uploads/2.json + https://3.basecampapi.com/$ACCOUNT_ID/uploads/2.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/vaults/2/uploads.json` → [Get uploads](#get-uploads) +* `GET /buckets/1/uploads/2.json` → [Get an upload](#get-an-upload) +* `POST /buckets/1/vaults/2/uploads.json` → [Create an upload](#create-an-upload) +* `PUT /buckets/1/uploads/2.json` → [Update an upload](#update-an-upload) + [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination [attachments]: https://github.com/basecamp/bc3-api/blob/master/sections/attachments.md#create-an-attachment [trash]: https://github.com/basecamp/bc3-api/blob/master/sections/recordings.md#trash-a-recording diff --git a/sections/vaults.md b/sections/vaults.md index 4ba2990..1d2aa15 100644 --- a/sections/vaults.md +++ b/sections/vaults.md @@ -13,10 +13,10 @@ Endpoints: Get vaults ---------- -* `GET /buckets/1/vaults/2/vaults.json` will return a [paginated list][pagination] of vaults in the project with an ID of `1` and the vault with ID of `2`. +* `GET /vaults/2/vaults.json` will return a [paginated list][pagination] of vaults under the vault with ID of `2`. ###### Example JSON Response - + ```json [ { @@ -72,28 +72,28 @@ Get vaults "can_access_hill_charts": true }, "documents_count": 1, - "documents_url": "https://3.basecampapi.com/195539477/buckets/2085958502/vaults/1069479146/documents.json", + "documents_url": "https://3.basecampapi.com/195539477/vaults/1069479146/documents.json", "uploads_count": 0, - "uploads_url": "https://3.basecampapi.com/195539477/buckets/2085958502/vaults/1069479146/uploads.json", + "uploads_url": "https://3.basecampapi.com/195539477/vaults/1069479146/uploads.json", "vaults_count": 0, - "vaults_url": "https://3.basecampapi.com/195539477/buckets/2085958502/vaults/1069479146/vaults.json" + "vaults_url": "https://3.basecampapi.com/195539477/vaults/1069479146/vaults.json" } ] ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/2/vaults.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/vaults/2/vaults.json ``` Get a vault ----------- -* `GET /buckets/1/vaults/2.json` will return the vault with an ID of `2` in the project with an ID of `1`. +* `GET /vaults/2.json` will return the vault with an ID of `2`. ###### Example JSON Response - + ```json { "id": 1069478984, @@ -141,24 +141,24 @@ Get a vault "can_access_hill_charts": true }, "documents_count": 0, - "documents_url": "https://3.basecampapi.com/195539477/buckets/2085958502/vaults/1069478984/documents.json", + "documents_url": "https://3.basecampapi.com/195539477/vaults/1069478984/documents.json", "uploads_count": 0, - "uploads_url": "https://3.basecampapi.com/195539477/buckets/2085958502/vaults/1069478984/uploads.json", + "uploads_url": "https://3.basecampapi.com/195539477/vaults/1069478984/uploads.json", "vaults_count": 1, - "vaults_url": "https://3.basecampapi.com/195539477/buckets/2085958502/vaults/1069478984/vaults.json" + "vaults_url": "https://3.basecampapi.com/195539477/vaults/1069478984/vaults.json" } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/2.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/vaults/2.json ``` Create a vault -------------- -* `POST /buckets/1/vaults/2/vaults.json` creates a vault in the project with ID `1` and under the vault with an ID of `2`. +* `POST /vaults/2/vaults.json` creates a vault under the vault with an ID of `2`. **Required parameters**: `title` for the name of the vault. @@ -177,13 +177,13 @@ This endpoint will return `201 Created` with the current JSON representation of ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"Materials"}' \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/2/vaults.json + https://3.basecampapi.com/$ACCOUNT_ID/vaults/2/vaults.json ``` Update a vault -------------- -* `PUT /buckets/1/vaults/3.json` allows changing the title of the vault with an ID of `3` in the project with ID `1`. +* `PUT /vaults/3.json` allows changing the title of the vault with an ID of `3`. This endpoint will return `200 OK` with the current JSON representation of the to-do if the update was a success. See the [Get a vault](#get-a-vault) endpoint for more info on the payload. @@ -200,8 +200,18 @@ This endpoint will return `200 OK` with the current JSON representation of the t ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"title":"Important Materials"}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/vaults/3.json + https://3.basecampapi.com/$ACCOUNT_ID/vaults/3.json ``` +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/vaults/2/vaults.json` → [Get vaults](#get-vaults) +* `GET /buckets/1/vaults/2.json` → [Get a vault](#get-a-vault) +* `POST /buckets/1/vaults/2/vaults.json` → [Create a vault](#create-a-vault) +* `PUT /buckets/1/vaults/3.json` → [Update a vault](#update-a-vault) + [project]: https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-a-project [pagination]: https://github.com/basecamp/bc3-api/blob/master/README.md#pagination diff --git a/sections/webhooks.md b/sections/webhooks.md index 036a907..e154956 100644 --- a/sections/webhooks.md +++ b/sections/webhooks.md @@ -238,7 +238,7 @@ Starting the 1st of July 2024, Basecamp won't notify of changes that are automat Get webhooks ------------ -* `GET /buckets/1/webhooks.json` will return all the webhooks from the basecamp with an ID of `1`. +* `GET /buckets/1/webhooks.json` will return all the webhooks for the project with an ID of `1`. ###### Example JSON Response @@ -268,12 +268,12 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCO Get a webhook ------------- -* `GET /buckets/1/webhooks/3.json` will return the webhook with an ID of `3` in the project with ID `1`. +* `GET /webhooks/3.json` will return the webhook with an ID of `3`. The recent deliveries array will contain the 25 most recent delivery exchanges, sorted with the most recent first. ###### Example JSON Response - + ```json { "id": 1051369971, @@ -286,20 +286,128 @@ The recent deliveries array will contain the 25 most recent delivery exchanges, ], "url": "https://3.basecampapi.com/195539477/buckets/2085958504/webhooks/1051369971.json", "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/webhooks/1051369971", - "recent_deliveries": [] + "recent_deliveries": [ + { + "id": 627138776, + "created_at": "2026-02-07T01:45:02.423Z", + "request": { + "headers": { + "Content-Type": "application/json", + "User-Agent": "Basecamp3 Webhook", + "X-Request-Id": "465386a1-91cf-4f3a-b536-a2fcff82eee4" + }, + "body": { + "id": 1071916007, + "kind": "timesheet_entry_deleted", + "details": { + "status_was": "active" + }, + "created_at": "2026-02-06T19:45:01.306-06:00", + "recording": { + "id": 1069480181, + "status": "deleted", + "visible_to_clients": false, + "created_at": "2026-02-06T19:44:59.972-06:00", + "updated_at": "2026-02-06T19:45:01.292-06:00", + "title": "Timesheet entry", + "inherits_status": false, + "type": "Timesheet::Entry", + "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480181.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480181", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDE4MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0adad083d350837fcc7f9b1b0dfd8ab1b9797c0c.json", + "parent": { + "id": 1069479406, + "title": "We won Leto!", + "type": "Message", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/messages/1069479406.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/messages/1069479406" + }, + "bucket": { + "id": 2085958504, + "name": "The Leto Laptop", + "type": "Project" + }, + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T02:29:28.365-06:00", + "updated_at": "2026-01-31T02:29:32.599-06:00", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecamp-static.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + }, + "content": null + }, + "creator": { + "id": 1049715913, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", + "name": "Victor Cooper", + "email_address": "victor@honchodesign.com", + "personable_type": "User", + "title": "Chief Strategist", + "bio": "Don’t let your dreams be dreams", + "location": "Chicago, IL", + "created_at": "2026-01-31T02:29:28.365-06:00", + "updated_at": "2026-01-31T02:29:32.599-06:00", + "admin": true, + "owner": true, + "client": false, + "employee": true, + "time_zone": "America/Chicago", + "avatar_url": "https://3.basecamp-static.com/195539477/people/BAhpBMlkkT4=--5fe7b70fbee7a7f0e2e1e19df7579e5d880c753d/avatar?v=1", + "company": { + "id": 1033447817, + "name": "Honcho Design" + }, + "can_ping": true, + "can_manage_projects": true, + "can_manage_people": true, + "can_access_timesheet": true, + "can_access_hill_charts": true + } + } + }, + "response": { + "headers": { + "Content-Type": "application/json" + }, + "code": 200, + "message": "OK", + "body": "{}" + } + } + ] } ``` - + ###### Copy as cURL ```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/webhooks/3.json +curl -s -H "Authorization: Bearer $ACCESS_TOKEN" https://3.basecampapi.com/$ACCOUNT_ID/webhooks/3.json ``` Create a webhook ---------------- -* `POST /buckets/1/webhooks.json` creates a webhook in the project with ID `1`. +* `POST /buckets/1/webhooks.json` creates a webhook in the project with an ID of `1`. **Required parameters**: `payload_url` for the HTTPS url that Basecamp should call. _Optional parameters_: `types` as an array of types, options given in the introduction. @@ -328,7 +436,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j Update a webhook ---------------- -* `PUT /buckets/1/webhooks/3.json` allows changing the payload url and types of the webhook with an ID of `3` in the project with ID `1`. +* `PUT /webhooks/3.json` allows changing the payload url and types of the webhook with an ID of `3`. **Required parameters**: `payload_url` for the HTTPS url that Basecamp will call. _Optional parameters_: `types` as an array of types, options given in the introduction. `active` as a boolean whether this webhook should be matching. @@ -352,13 +460,13 @@ This endpoint will return `400 Bad Request` if the payload URL is not a valid HT ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"payload_url":"https://example.com/endpoint","types":["Todo","Todolist"],"active":true}' -X PUT \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/webhooks/3.json + https://3.basecampapi.com/$ACCOUNT_ID/webhooks/3.json ``` Destroy a webhook ----------------- -* `DELETE /buckets/1/webhooks/3.json` will delete the webhook with an ID of `3` in the project with ID `1`. +* `DELETE /webhooks/3.json` will delete the webhook with an ID of `3`. This endpoint will return `204 No Content` if the destroy was a success. @@ -366,8 +474,18 @@ This endpoint will return `204 No Content` if the destroy was a success. ```shell curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -X DELETE \ - https://3.basecampapi.com/$ACCOUNT_ID/buckets/1/webhooks/3.json + https://3.basecampapi.com/$ACCOUNT_ID/webhooks/3.json ``` + +Legacy project-scoped routes +----------------------------- + +The following project-scoped routes are still supported and will remain available, but flat routes above are the canonical form for new integrations. + +* `GET /buckets/1/webhooks/3.json` → [Get a webhook](#get-a-webhook) +* `PUT /buckets/1/webhooks/3.json` → [Update a webhook](#update-a-webhook) +* `DELETE /buckets/1/webhooks/3.json` → [Destroy a webhook](#destroy-a-webhook) + [1]: https://github.com/basecamp/bc3-api/blob/master/sections/chatbots.md [2]: https://github.com/basecamp/bc3-api/blob/master/sections/todos.md#get-a-to-do