From ce4fb614165586a6290722ea5c37738d8d0f22cf Mon Sep 17 00:00:00 2001 From: Jeremy Daer Date: Thu, 12 Feb 2026 10:46:30 -0800 Subject: [PATCH] Regenerate API docs for flat canonical routes Flat routes are recognized on input but all generated URLs in API responses remain bucket-scoped. --- README.md | 51 ++- sections/campfires.md | 225 +++---------- sections/card_table_cards.md | 40 ++- sections/card_table_columns.md | 58 ++-- sections/card_table_steps.md | 26 +- sections/card_tables.md | 111 ++++--- sections/chatbots.md | 64 ++-- sections/client_approvals.md | 52 +-- sections/client_correspondences.md | 36 +- sections/client_replies.md | 43 ++- sections/client_visibility.md | 11 +- sections/comments.md | 54 +-- sections/documents.md | 52 +-- sections/events.md | 472 +++++++++----------------- sections/forwards.md | 43 ++- sections/inbox_replies.md | 42 ++- sections/inboxes.md | 25 +- sections/message_boards.md | 26 +- sections/message_types.md | 20 +- sections/messages.md | 67 ++-- sections/people.md | 36 +- sections/projects.md | 12 +- sections/question_answers.md | 69 ++-- sections/questionnaires.md | 28 +- sections/questions.md | 80 +++-- sections/recordings.md | 21 +- sections/reports.md | 75 +++-- sections/schedule_entries.md | 104 +++--- sections/schedules.md | 31 +- sections/search.md | 73 ++-- sections/subscriptions.md | 62 ++-- sections/templates.md | 76 ++--- sections/timeline.md | 518 ++++++++++------------------- sections/timesheets.md | 71 ++-- sections/todolist_groups.md | 68 ++-- sections/todolists.md | 55 +-- sections/todos.md | 96 +++--- sections/todosets.md | 25 +- sections/tools.md | 10 +- sections/uploads.md | 46 ++- sections/vaults.md | 66 ++-- sections/webhooks.md | 105 +++--- 42 files changed, 1586 insertions(+), 1659 deletions(-) diff --git a/README.md b/README.md index 76a7d1e..9034890 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 2269d7b..321c489 100644 --- a/sections/campfires.md +++ b/sections/campfires.md @@ -23,8 +23,8 @@ Get Campfires "id": 1069478985, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:29:58.785Z", - "updated_at": "2026-02-06T21:38:59.101Z", + "created_at": "2026-02-12T06:09:02.404Z", + "updated_at": "2026-02-12T06:12:09.251Z", "title": "Chat", "inherits_status": true, "type": "Chat::Transcript", @@ -47,8 +47,8 @@ Get Campfires "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -62,7 +62,7 @@ Get Campfires "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "topic": "Chat", @@ -80,17 +80,17 @@ 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-02-06T21:38:59.101Z", + "created_at": "2026-02-12T06:09:02.404Z", + "updated_at": "2026-02-12T06:12:09.251Z", "title": "Chat", "inherits_status": true, "type": "Chat::Transcript", @@ -113,8 +113,8 @@ Get a Campfire "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -128,35 +128,35 @@ Get a Campfire "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "topic": "Chat", "lines_url": "https://3.basecampapi.com/195539477/buckets/2085958502/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 [ { "id": 1069479068, "status": "active", "visible_to_clients": false, - "created_at": "2025-11-07T10:15:00.000Z", - "updated_at": "2025-11-07T10:15:00.000Z", + "created_at": "2025-11-19T09:27:00.000Z", + "updated_at": "2025-11-19T09:27:00.000Z", "title": "I'm hungry", "inherits_status": true, "type": "Chat::Lines::RichText", @@ -186,8 +186,8 @@ Get Campfire lines "title": "Global Data Strategist", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.358Z", - "updated_at": "2026-01-31T08:29:40.358Z", + "created_at": "2026-02-12T06:08:55.898Z", + "updated_at": "2026-02-12T06:08:55.898Z", "admin": false, "owner": false, "client": false, @@ -197,34 +197,34 @@ Get Campfire lines "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "I'm hungry" } ] ``` - + ###### 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, "status": "active", "visible_to_clients": false, - "created_at": "2025-11-07T03:12:00.000Z", - "updated_at": "2025-11-07T03:12:00.000Z", + "created_at": "2025-11-19T01:03:00.000Z", + "updated_at": "2025-11-19T01:03:00.000Z", "title": "👏 🎉", "inherits_status": true, "type": "Chat::Lines::RichText", @@ -254,8 +254,8 @@ Get a Campfire line "title": "Central Web Coordinator", "bio": "I never said most of the things I said", "location": null, - "created_at": "2026-01-31T08:29:32.987Z", - "updated_at": "2026-01-31T08:29:32.987Z", + "created_at": "2026-02-12T06:08:51.167Z", + "updated_at": "2026-02-12T06:08:51.167Z", "admin": false, "owner": false, "client": false, @@ -265,29 +265,25 @@ Get a Campfire line "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "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 body of the Campfire line. - -_Optional parameters_: - -* `content_type` set to `text/html` to create a rich text line. When omitted, a plain text line is created. See our [Rich text guide][rich_text] for what HTML tags are allowed. +**Required parameters**: `content` as the plain text body for the Campfire line. This endpoint will return `201 Created` with the current JSON representation of the line if the creation was a success. See the [Get a Campfire line](#get-a-campfire-line) endpoint for more info on the payload. @@ -299,161 +295,36 @@ This endpoint will return `201 Created` with the current JSON representation of } ``` -###### Example JSON Response - -```json -{ - "id": 1069480007, - "status": "active", - "visible_to_clients": false, - "created_at": "2026-02-06T21:38:57.555Z", - "updated_at": "2026-02-06T21:38:57.555Z", - "title": "Good morning", - "inherits_status": true, - "type": "Chat::Lines::Text", - "url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985/lines/1069480007.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/chats/1069478985@1069480007", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDAwNz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0b2fce7d5cb7b7aeafd95960a30be109dca416bc.json", - "parent": { - "id": 1069478985, - "title": "Chat", - "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" - }, - "bucket": { - "id": 2085958502, - "name": "Honcho Design Newsroom", - "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 - }, - "content": "Good morning" -} -``` - - ###### Copy as cURL ```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 -``` - -###### Example Rich Text JSON Request - -```json -{ - "content": "Hello from the API", - "content_type": "text/html" -} -``` - -###### Example Rich Text JSON Response - -```json -{ - "id": 1069480008, - "status": "active", - "visible_to_clients": false, - "created_at": "2026-02-06T21:38:58.342Z", - "updated_at": "2026-02-06T21:38:58.342Z", - "title": "Hello from the API", - "inherits_status": true, - "type": "Chat::Lines::RichText", - "url": "https://3.basecampapi.com/195539477/buckets/2085958502/chats/1069478985/lines/1069480008.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958502/chats/1069478985@1069480008", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDAwOD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--63c88a017556486cbb71bde82b1ad62ba59d65f1.json", - "parent": { - "id": 1069478985, - "title": "Chat", - "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" - }, - "bucket": { - "id": 2085958502, - "name": "Honcho Design Newsroom", - "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 - }, - "content": "Hello from the API" -} -``` - - -###### Copy as cURL - -```shell -curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ - -d '{"content":"Hello from the API","content_type":"text/html"}' \ - 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 -[rich_text]: https://github.com/basecamp/bc3-api/blob/master/sections/rich_text.md diff --git a/sections/card_table_cards.md b/sections/card_table_cards.md index fcf72e5..7bbcded 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, @@ -250,17 +250,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. @@ -287,13 +287,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_: @@ -317,13 +317,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 @@ -341,9 +341,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..ccf2809 100644 --- a/sections/card_tables.md +++ b/sections/card_tables.md @@ -10,17 +10,17 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.723Z", - "updated_at": "2026-01-31T08:33:00.714Z", + "created_at": "2026-02-12T06:09:34.724Z", + "updated_at": "2026-02-12T06:09:49.749Z", "title": "Card Table", "inherits_status": true, "type": "Kanban::Board", @@ -42,8 +42,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -57,7 +57,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "subscribers": [ @@ -70,8 +70,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -85,7 +85,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -95,8 +95,8 @@ Get a card table "id": 1069479400, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.760Z", - "updated_at": "2026-01-31T08:33:00.710Z", + "created_at": "2026-02-12T06:09:34.735Z", + "updated_at": "2026-02-12T06:09:49.748Z", "title": "Triage", "inherits_status": true, "type": "Kanban::Triage", @@ -125,8 +125,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -140,7 +140,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": null, @@ -154,8 +154,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -169,7 +169,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -182,8 +182,8 @@ Get a card table "id": 1069479401, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.829Z", - "updated_at": "2026-01-31T08:32:04.853Z", + "created_at": "2026-02-12T06:09:34.754Z", + "updated_at": "2026-02-12T06:09:34.763Z", "title": "Not now", "inherits_status": true, "type": "Kanban::NotNowColumn", @@ -212,8 +212,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -227,7 +227,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": null, @@ -241,8 +241,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -256,7 +256,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -269,8 +269,8 @@ Get a card table "id": 1069479402, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.899Z", - "updated_at": "2026-01-31T08:32:04.920Z", + "created_at": "2026-02-12T06:09:34.773Z", + "updated_at": "2026-02-12T06:09:34.779Z", "title": "Figuring it out", "inherits_status": true, "type": "Kanban::Column", @@ -300,8 +300,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -315,7 +315,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": null, @@ -329,8 +329,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -344,7 +344,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -357,8 +357,8 @@ Get a card table "id": 1069479403, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.976Z", - "updated_at": "2026-01-31T08:32:04.997Z", + "created_at": "2026-02-12T06:09:34.801Z", + "updated_at": "2026-02-12T06:09:34.811Z", "title": "In progress", "inherits_status": true, "type": "Kanban::Column", @@ -388,8 +388,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -403,7 +403,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": null, @@ -417,8 +417,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -432,7 +432,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -445,8 +445,8 @@ Get a card table "id": 1069479404, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:05.051Z", - "updated_at": "2026-01-31T08:32:05.073Z", + "created_at": "2026-02-12T06:09:34.828Z", + "updated_at": "2026-02-12T06:09:34.834Z", "title": "Done", "inherits_status": true, "type": "Kanban::DoneColumn", @@ -475,8 +475,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -490,7 +490,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": null, @@ -504,8 +504,8 @@ Get a card table "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -519,7 +519,7 @@ Get a card table "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -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..31be88a 100644 --- a/sections/chatbots.md +++ b/sections/chatbots.md @@ -121,64 +121,64 @@ 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 [ { "id": 1049715954, - "created_at": "2026-01-31T08:36:22.772Z", - "updated_at": "2026-01-31T08:36:22.772Z", + "created_at": "2026-02-12T06:10:28.807Z", + "updated_at": "2026-02-12T06:10:28.807Z", "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" + "lines_url": "https://3.basecampapi.com/195539477/integrations/qKcdQdSYteGQzPYpatt334zK/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.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-02-12T06:10:28.807Z", + "updated_at": "2026-02-12T06:10:28.807Z", + "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/qKcdQdSYteGQzPYpatt334zK/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..138c710 100644 --- a/sections/client_approvals.md +++ b/sections/client_approvals.md @@ -19,8 +19,8 @@ Get client approvals "id": 1069479710, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-30T19:58:00.000Z", - "updated_at": "2026-01-30T19:58:00.000Z", + "created_at": "2026-02-11T23:28:00.000Z", + "updated_at": "2026-02-11T23:28:00.000Z", "title": "Business card", "inherits_status": true, "type": "Client::Approval", @@ -49,8 +49,8 @@ Get client approvals "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -64,7 +64,7 @@ Get client approvals "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "", @@ -82,8 +82,8 @@ Get client approvals "title": "Dynamic Markets Analyst", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:42.724Z", - "updated_at": "2026-01-31T08:29:42.724Z", + "created_at": "2026-02-12T06:08:57.324Z", + "updated_at": "2026-02-12T06:08:57.324Z", "admin": false, "owner": false, "client": false, @@ -113,17 +113,17 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-27T18:09:00.000Z", - "updated_at": "2026-01-31T08:33:25.094Z", + "created_at": "2026-02-08T15:07:00.000Z", + "updated_at": "2026-02-12T06:09:55.980Z", "title": "New logo for the website", "inherits_status": true, "type": "Client::Approval", @@ -152,8 +152,8 @@ Get a client approval "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -167,7 +167,7 @@ Get a client approval "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "", @@ -185,8 +185,8 @@ Get a client approval "title": "National Directives Director", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:42.692Z", - "updated_at": "2026-01-31T08:29:42.692Z", + "created_at": "2026-02-12T06:08:57.319Z", + "updated_at": "2026-02-12T06:08:57.319Z", "admin": false, "owner": false, "client": false, @@ -208,8 +208,8 @@ Get a client approval "id": 1069479709, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-27T18:49:00.000Z", - "updated_at": "2026-01-27T18:49:00.000Z", + "created_at": "2026-02-08T15:19:00.000Z", + "updated_at": "2026-02-08T15:19:00.000Z", "title": "Answer Re: New logo for the website", "inherits_status": true, "type": "Client::Approval::Response", @@ -236,8 +236,8 @@ Get a client approval "title": "Product Tactics Architect", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:42.744Z", - "updated_at": "2026-01-31T08:29:42.744Z", + "created_at": "2026-02-12T06:08:57.329Z", + "updated_at": "2026-02-12T06:08:57.329Z", "admin": false, "owner": false, "client": false, @@ -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..e584fc8 100644 --- a/sections/client_correspondences.md +++ b/sections/client_correspondences.md @@ -19,8 +19,8 @@ Get client correspondences "id": 1069479702, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-26T18:32:00.000Z", - "updated_at": "2026-01-31T08:33:24.732Z", + "created_at": "2026-02-07T15:52:00.000Z", + "updated_at": "2026-02-12T06:09:55.894Z", "title": "Final deliverables and launch are right around the corner", "inherits_status": true, "type": "Client::Correspondence", @@ -49,8 +49,8 @@ Get client correspondences "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -64,7 +64,7 @@ Get client correspondences "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "", @@ -84,17 +84,17 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-18T23:05:00.000Z", - "updated_at": "2026-01-31T08:33:03.644Z", + "created_at": "2025-12-30T16:17:00.000Z", + "updated_at": "2026-02-12T06:09:50.717Z", "title": "Project kickoff!", "inherits_status": true, "type": "Client::Correspondence", @@ -123,8 +123,8 @@ Get a client correspondence "title": "Internal Marketing Assistant", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:36.692Z", - "updated_at": "2026-01-31T08:29:36.692Z", + "created_at": "2026-02-12T06:08:53.455Z", + "updated_at": "2026-02-12T06:08:53.455Z", "admin": false, "owner": false, "client": false, @@ -134,7 +134,7 @@ Get a client correspondence "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "", @@ -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..aa9124a 100644 --- a/sections/client_replies.md +++ b/sections/client_replies.md @@ -11,18 +11,18 @@ 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 [ { "id": 1069479623, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-18T23:12:00.000Z", - "updated_at": "2025-12-18T23:12:00.000Z", + "created_at": "2025-12-30T17:01:00.000Z", + "updated_at": "2025-12-30T17:01:00.000Z", "title": "Re: Project kickoff!", "inherits_status": true, "type": "Client::Reply", @@ -50,8 +50,8 @@ Get client replies "title": "National Directives Director", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:42.692Z", - "updated_at": "2026-01-31T08:29:42.692Z", + "created_at": "2026-02-12T06:08:57.319Z", + "updated_at": "2026-02-12T06:08:57.319Z", "admin": false, "owner": false, "client": false, @@ -72,27 +72,27 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-19T00:15:00.000Z", - "updated_at": "2025-12-19T00:15:00.000Z", + "created_at": "2025-12-30T20:23:00.000Z", + "updated_at": "2025-12-30T20:23:00.000Z", "title": "Re: Project kickoff!", "inherits_status": true, "type": "Client::Reply", @@ -120,8 +120,8 @@ Get a client reply "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -135,19 +135,28 @@ Get a client reply "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "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 c8d1e0f..1a2d1ed 100644 --- a/sections/comments.md +++ b/sections/comments.md @@ -14,18 +14,18 @@ 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 [ { "id": 1069479407, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-18T23:40:00.000Z", - "updated_at": "2025-12-18T23:40:00.000Z", + "created_at": "2025-12-30T19:39:00.000Z", + "updated_at": "2025-12-30T19:39:00.000Z", "title": "Re: We won Leto!", "inherits_status": true, "type": "Comment", @@ -55,8 +55,8 @@ Get comments "title": "Senior Branding Strategist", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:33.483Z", - "updated_at": "2026-01-31T08:29:33.483Z", + "created_at": "2026-02-12T06:08:51.481Z", + "updated_at": "2026-02-12T06:08:51.481Z", "admin": false, "owner": false, "client": false, @@ -66,35 +66,35 @@ Get comments "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "Yeah! Great job everyone! Super excited to get going!" } ] ``` - + ###### 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, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-19T02:25:00.000Z", - "updated_at": "2025-12-19T02:25:00.000Z", + "created_at": "2025-12-31T01:20:00.000Z", + "updated_at": "2025-12-31T01:20:00.000Z", "title": "Re: We won Leto!", "inherits_status": true, "type": "Comment", @@ -124,8 +124,8 @@ Get a comment "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -139,24 +139,24 @@ Get a comment "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "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. @@ -177,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. @@ -201,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 316508f..2f28b00 100644 --- a/sections/documents.md +++ b/sections/documents.md @@ -12,18 +12,18 @@ 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 [ { "id": 1069479147, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-23T10:43:00.000Z", - "updated_at": "2026-01-31T08:34:25.618Z", + "created_at": "2026-01-04T04:36:00.000Z", + "updated_at": "2026-02-12T06:09:14.202Z", "title": "New Hire Info, Benefits Summary, and Forms", "inherits_status": true, "type": "Document", @@ -57,8 +57,8 @@ Get documents "title": "Corporate Integration Director", "bio": "A joke is a very serious thing", "location": null, - "created_at": "2026-01-31T08:29:43.313Z", - "updated_at": "2026-01-31T08:29:43.313Z", + "created_at": "2026-02-12T06:08:57.659Z", + "updated_at": "2026-02-12T06:08:57.659Z", "admin": false, "owner": false, "client": false, @@ -72,34 +72,34 @@ Get documents "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "Health Insurance\nWe have just one health insurance policy. The company pays most of the premium, and you cover the rest. Domestic partnerships are covered, as well as marriages. Open enrollment starts in January.

\n\n401K Retirement Plan\nWe match dollar-for-dollar up to 10% of your salary that you contribute to the plan. You are eligible to enroll in the 401K plan after your first paycheck.

\n\nFlexible Spending Account (FSA)\nThe FSA is an account where you can set aside pre-tax money for out-of-pocket medical expenses, such as prescriptions, OTC medicine, vision care, etc. You have to decide up front how much money you want to put in the account, and the max is $2500/year.

\n\nContinuing Education Allowance\nWe provide you with $500 a year to take classes that help you professionally. Really, anything that helps you with your job.

\n\nMatching Charitable Gifts\nWhen you donate money to a qualified charity, we will make a matching gift to that charity on your behalf. The maximum for the year is $500 per employee.

\n\nPaid Time Off\nPaid time off doesn't really exist here - if you need a day (or week!) off, you just need to clear it with your team or others who would be affected by your absence. You should try to take at least 3 weeks off a year." } ] ``` - + ###### 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T22:32:00.000Z", - "updated_at": "2026-01-31T22:32:00.000Z", + "created_at": "2026-02-12T19:38:00.000Z", + "updated_at": "2026-02-12T19:38:00.000Z", "title": "Project Tool Tips", "inherits_status": true, "type": "Document", @@ -133,8 +133,8 @@ Get a document "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:34:03.075Z", - "updated_at": "2026-01-31T08:34:03.075Z", + "created_at": "2026-02-12T06:10:09.265Z", + "updated_at": "2026-02-12T06:10:09.265Z", "admin": false, "owner": false, "client": false, @@ -150,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.
  • \nAssignments let you divvy up the work and manage accountability.
  • \nGroups are a great way to organize and color-code related tasks.
  • \nBulk actions let you make multiple changes at once.
  • \nTo-do templates makes it possible to use the same list without recreating it every time.
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.
  • Files can be uploaded, linked from the cloud, or you can drag and drop them into Basecamp.
  • Documents can be edited by multiple people, but not at once.
  • Every version of a document is stored so you can see the history of changes. Click the three dot menu ••• on the doc, then View changes.
  • Folders let you group stuff together and can be color-coded to organize things visually.
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.
  • \nPin a message to keep the important stuff at the top, whether a welcome message or the project overview.
  • \nUse categories to organize your posts and gives the people context about the information they’re going to read. You can customize those categories for your organization, too. You’ll find the option in Adminland.
  • \nSchedule a post to publish it at the optimal time, perfect if you’re in another time zone from your team or are working after hours.
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:
  • Click My Stuff > My Schedule to see events from across all of your projects.
  • Go to the specific project to add events.
  • \nCreate recurring events for meetings that happen on a regular schedule.
  • Want your Basecamp schedule in your calendar app? Here’s how to sync it.
  • By default, the Schedule includes assignments with due dates. If you only want to see meetings and events, you can change what’s shown.
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.
  • \nAdd a card, then assign it to someone, give it a due date, and include any needed notes or attachments. All of the conversation about the card will happen right there.
  • \nAdd steps to cards to break down the work into a checklist. You can assign each step and give it a due date, which is great for when multiple people are working together.
  • \nWatch a column to be notified about new cards added or moved to that space.
  • \nOrganize the columns so that each stage is relevant to the 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. @@ -184,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. @@ -208,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 f439826..9ce20aa 100644 --- a/sections/events.md +++ b/sections/events.md @@ -3,8 +3,6 @@ Events An event is created any time a [recording][recordings] changes. -Some events are **boostable**: events with an action of `completed`, `adopted`, or `column_changed`. Boostable events include `boosts_count` and `boosts_url` attributes in their JSON responses. See the [Boosts][boosts] section for details on boosting events. - Endpoints: - [Get events](#get-events) @@ -12,431 +10,273 @@ 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`. - -Boostable events (`completed`, `adopted`, `column_changed`) include additional attributes: - -- `boosts_count` - the number of boosts on this event -- `boosts_url` - the URL to list or create boosts on this event (see [Boosts][boosts]) +* `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": 1071915906, - "recording_id": 1069479576, - "action": "uncompleted", - "details": {}, - "created_at": "2026-02-06T22:56:33.502Z", - "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": 1071915905, - "recording_id": 1069479576, - "action": "completed", + "id": 1071915468, + "recording_id": 1069479766, + "action": "adopted", "details": { - "notified_recipient_ids": [ - 1049715938 - ] + "new_parent_id": 1069479743, + "parent_id_was": 1069479745, + "notified_recipient_ids": [] }, - "created_at": "2026-02-06T22:56:33.043Z", + "created_at": "2026-02-12T06:10:00.159Z", "creator": { - "id": 1049715930, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", - "name": "Sharon Bradford", - "email_address": "sharon@honchodesign.com", - "personable_type": "User", - "title": "Principal Branding Administrator", + "id": 1049715945, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", + "name": "Victor Cooper", + "email_address": null, + "personable_type": "DummyUser", + "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:09:57.025Z", + "updated_at": "2026-02-12T06:09:57.025Z", "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", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false }, "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 - } + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958507/recordings/1069479766/events/1071915468/boosts.json" }, { - "id": 1071915864, - "recording_id": 1069479576, + "id": 1071915469, + "recording_id": 1069479766, "action": "completed", "details": { - "notified_recipient_ids": [ - 1049715938 - ] + "notified_recipient_ids": [] }, - "created_at": "2026-02-06T22:45:49.427Z", + "created_at": "2026-02-07T17:43:00.000Z", "creator": { - "id": 1049715930, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", - "name": "Sharon Bradford", - "email_address": "sharon@honchodesign.com", - "personable_type": "User", - "title": "Principal Branding Administrator", + "id": 1049715945, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", + "name": "Victor Cooper", + "email_address": null, + "personable_type": "DummyUser", + "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:09:57.025Z", + "updated_at": "2026-02-12T06:09:57.025Z", "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", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false }, "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": 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 - } + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958507/recordings/1069479766/events/1071915469/boosts.json" }, { - "id": 1071915792, - "recording_id": 1069479576, - "action": "completed", + "id": 1071915467, + "recording_id": 1069479766, + "action": "adopted", "details": { - "notified_recipient_ids": [ - 1049715938 - ] + "new_parent_id": 1069479745, + "parent_id_was": 1069479742, + "notified_recipient_ids": [] }, - "created_at": "2026-02-06T22:19:46.349Z", + "created_at": "2026-02-06T17:43:00.000Z", "creator": { - "id": 1049715930, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", - "name": "Sharon Bradford", - "email_address": "sharon@honchodesign.com", - "personable_type": "User", - "title": "Principal Branding Administrator", + "id": 1049715945, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", + "name": "Victor Cooper", + "email_address": null, + "personable_type": "DummyUser", + "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:09:57.025Z", + "updated_at": "2026-02-12T06:09:57.025Z", "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", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false }, "boosts_count": 0, - "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915792/boosts.json" + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958507/recordings/1069479766/events/1071915467/boosts.json" }, { - "id": 1071915753, - "recording_id": 1069479576, - "action": "uncompleted", - "details": {}, - "created_at": "2026-02-06T21:44:49.092Z", - "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": 1071915752, - "recording_id": 1069479576, - "action": "completed", + "id": 1071915466, + "recording_id": 1069479766, + "action": "adopted", "details": { - "notified_recipient_ids": [ - 1049715938 - ] + "new_parent_id": 1069479742, + "parent_id_was": 1069479744, + "notified_recipient_ids": [] }, - "created_at": "2026-02-06T21:44:48.563Z", + "created_at": "2026-02-04T17:43:00.000Z", "creator": { - "id": 1049715930, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", - "name": "Sharon Bradford", - "email_address": "sharon@honchodesign.com", - "personable_type": "User", - "title": "Principal Branding Administrator", + "id": 1049715945, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", + "name": "Victor Cooper", + "email_address": null, + "personable_type": "DummyUser", + "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:09:57.025Z", + "updated_at": "2026-02-12T06:09:57.025Z", "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", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false }, "boosts_count": 0, - "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915752/boosts.json" + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958507/recordings/1069479766/events/1071915466/boosts.json" }, { - "id": 1071915662, - "recording_id": 1069479576, - "action": "uncompleted", - "details": {}, - "created_at": "2026-02-01T02:53:47.037Z", - "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": 1071915661, - "recording_id": 1069479576, - "action": "completed", + "id": 1071915465, + "recording_id": 1069479766, + "action": "adopted", "details": { - "notified_recipient_ids": [ - 1049715938 - ] + "new_parent_id": 1069479744, + "parent_id_was": 1069479741, + "notified_recipient_ids": [] }, - "created_at": "2026-02-01T02:53:46.588Z", + "created_at": "2026-02-02T17:43:00.000Z", "creator": { - "id": 1049715930, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", - "name": "Sharon Bradford", - "email_address": "sharon@honchodesign.com", - "personable_type": "User", - "title": "Principal Branding Administrator", + "id": 1049715945, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", + "name": "Victor Cooper", + "email_address": null, + "personable_type": "DummyUser", + "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:09:57.025Z", + "updated_at": "2026-02-12T06:09:57.025Z", "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", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false }, "boosts_count": 0, - "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479576/events/1071915661/boosts.json" + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958507/recordings/1069479766/events/1071915465/boosts.json" }, { - "id": 1071915233, - "recording_id": 1069479576, - "action": "assignment_changed", + "id": 1071915464, + "recording_id": 1069479766, + "action": "adopted", "details": { - "added_person_ids": [ - 1049715930 - ], - "removed_person_ids": [] + "new_parent_id": 1069479741, + "parent_id_was": 1069479739, + "notified_recipient_ids": [] }, - "created_at": "2026-01-15T07:20:00.000Z", + "created_at": "2026-02-02T17:43:00.000Z", "creator": { - "id": 1049715938, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzOD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--4ccc567a0a3b10e354bca909b704637b601f0b16", - "name": "Annie Bryan", - "email_address": "annie@honchodesign.com", - "personable_type": "User", - "title": "Central Markets Manager", - "bio": "To open a store is easy, to keep it open is an art", + "id": 1049715945, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", + "name": "Victor Cooper", + "email_address": null, + "personable_type": "DummyUser", + "title": null, + "bio": null, "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:09:57.025Z", + "updated_at": "2026-02-12T06:09:57.025Z", "admin": false, "owner": false, "client": false, - "employee": true, + "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOJkkT4=--732a71fbd28ec10d9bf4466abd3588a8bea40bdb/avatar?v=1", - "company": { - "id": 1033447817, - "name": "Honcho Design" - }, + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true - } + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false + }, + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958507/recordings/1069479766/events/1071915464/boosts.json" }, { - "id": 1071915232, - "recording_id": 1069479576, + "id": 1071915463, + "recording_id": 1069479766, "action": "created", "details": { "notified_recipient_ids": [] }, - "created_at": "2026-01-15T07:20:00.000Z", + "created_at": "2026-01-23T17:43:00.000Z", "creator": { - "id": 1049715938, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzOD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--4ccc567a0a3b10e354bca909b704637b601f0b16", - "name": "Annie Bryan", - "email_address": "annie@honchodesign.com", - "personable_type": "User", - "title": "Central Markets Manager", - "bio": "To open a store is easy, to keep it open is an art", + "id": 1049715945, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk0NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--573c6935f53af21625ccfd45e28af57c2bbeff49", + "name": "Victor Cooper", + "email_address": null, + "personable_type": "DummyUser", + "title": null, + "bio": null, "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:09:57.025Z", + "updated_at": "2026-02-12T06:09:57.025Z", "admin": false, "owner": false, "client": false, - "employee": true, + "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOJkkT4=--732a71fbd28ec10d9bf4466abd3588a8bea40bdb/avatar?v=1", - "company": { - "id": 1033447817, - "name": "Honcho Design" - }, + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBOlkkT4=--eebbe1ab1b28f5fcf32a1c0ff3644e06931fbcfa/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false } } ] ``` - + ###### 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 ``` -[boosts]: https://github.com/basecamp/bc3-api/blob/master/sections/boosts.md#boosts +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..2d6a7d6 100644 --- a/sections/forwards.md +++ b/sections/forwards.md @@ -11,20 +11,20 @@ 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 [ { "id": 1069479085, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:30:27.890Z", - "updated_at": "2026-01-31T08:30:28.904Z", + "created_at": "2026-02-12T06:09:08.844Z", + "updated_at": "2026-02-12T06:09:09.061Z", "title": "Can we make the logo pop?", "inherits_status": true, "type": "Inbox::Forward", @@ -53,8 +53,8 @@ To get the inbox ID for a project, see the [Get inbox][3] endpoint. "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -68,7 +68,7 @@ To get the inbox ID for a project, see the [Get inbox][3] endpoint. "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "---------- Forwarded message ---------- From: \"Henry Bowman\" Date: Oct 15, 2013 1:13 AM Subject: Can we make the logo pop? To: \"Victor Cooper\" Hey Victor, I know it's late at night, but I had a quick thought about the logo. It feels, I dunno, flat. Is there anything you could do to make it pop? I'm thinking it needs more sizzle. More... SOMETHING. Maybe we could try adding a rainbow? Let's take a look mid-day tomorrow and re-group with the rest of the team. Cheers, Henry", @@ -79,29 +79,29 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:30:27.536Z", - "updated_at": "2026-01-31T08:30:27.564Z", + "created_at": "2026-02-12T06:09:08.729Z", + "updated_at": "2026-02-12T06:09:08.736Z", "title": "Some technical details", "inherits_status": true, "type": "Inbox::Forward", @@ -130,8 +130,8 @@ Get a forward "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -145,7 +145,7 @@ Get a forward "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "---------- Forwarded message ---------- From: \"Beth Allen\" Date: Oct 13, 2013 1:38 PM Subject: Some technical details To: \"Annie Bryan\" Hey Team Honcho, Just wanted to let you know I'm a big fan of your blog. Your writing is so inspiring. Thanks for sharing!", @@ -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 2f04cdc..7de1526 100644 --- a/sections/inbox_replies.md +++ b/sections/inbox_replies.md @@ -11,18 +11,18 @@ 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 [ { "id": 1069479086, "status": "active", "visible_to_clients": false, - "created_at": "2025-11-13T01:32:00.000Z", - "updated_at": "2025-11-13T01:32:00.000Z", + "created_at": "2025-11-24T23:29:00.000Z", + "updated_at": "2025-11-24T23:29:00.000Z", "title": "Re: Can we make the logo pop?", "inherits_status": true, "type": "Inbox::Reply", @@ -52,8 +52,8 @@ Get inbox replies "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -67,34 +67,34 @@ Get inbox replies "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "Hey Henry!

Thanks for the quick feedback re: the logo. I know what you mean about feeling \"flat,\" but I'm not quite sure a rainbow is the way to go. I'll ping the design team and see what they can come up with later today. We'll post designs here in Basecamp when they're ready!


--VC" } ] ``` - + ###### 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, "status": "active", "visible_to_clients": false, - "created_at": "2025-11-13T03:12:00.000Z", - "updated_at": "2025-11-13T03:12:00.000Z", + "created_at": "2025-11-25T00:36:00.000Z", + "updated_at": "2025-11-25T00:36:00.000Z", "title": "Re: Can we make the logo pop?", "inherits_status": true, "type": "Inbox::Reply", @@ -124,8 +124,8 @@ Get an inbox reply "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:29:42.654Z", - "updated_at": "2026-01-31T08:29:42.654Z", + "created_at": "2026-02-12T06:08:57.310Z", + "updated_at": "2026-02-12T06:08:57.310Z", "admin": false, "owner": false, "client": false, @@ -141,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..f8fd742 100644 --- a/sections/inboxes.md +++ b/sections/inboxes.md @@ -11,19 +11,19 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:29:58.961Z", - "updated_at": "2026-01-31T08:30:28.950Z", + "created_at": "2026-02-12T06:09:02.464Z", + "updated_at": "2026-02-12T06:09:09.085Z", "title": "Email Forwards", "inherits_status": true, "type": "Inbox", @@ -45,8 +45,8 @@ To get the inbox ID for a project, see the [Get a project][1] endpoint's `dock` "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -60,21 +60,28 @@ To get the inbox ID for a project, see the [Get a project][1] endpoint's `dock` "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "forwards_count": 2, "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 57e9fb6..12e0de1 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-02-06T22:55:55.960Z", + "created_at": "2026-02-12T06:09:34.613Z", + "updated_at": "2026-02-12T06:12:10.674Z", "title": "Message Board", "inherits_status": true, "type": "Message::Board", @@ -45,8 +45,8 @@ To get the message board ID for a project, see the [Get a project][1] endpoint's "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -60,7 +60,7 @@ To get the message board ID for a project, see the [Get a project][1] endpoint's "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "messages_count": 9, @@ -68,14 +68,22 @@ To get the message board ID for a project, see the [Get a project][1] endpoint's "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..ad082c9 100644 --- a/sections/message_types.md +++ b/sections/message_types.md @@ -22,15 +22,15 @@ Get message types "id": 823758568, "name": "Announcement", "icon": "📢", - "created_at": "2026-01-31T08:32:04.256Z", - "updated_at": "2026-01-31T08:32:04.256Z" + "created_at": "2026-02-12T06:09:34.617Z", + "updated_at": "2026-02-12T06:09:34.617Z" }, { "id": 823758569, "name": "FYI", "icon": "✨", - "created_at": "2026-01-31T08:32:04.271Z", - "updated_at": "2026-01-31T08:32:04.271Z" + "created_at": "2026-02-12T06:09:34.619Z", + "updated_at": "2026-02-12T06:09:34.619Z" } ] ``` @@ -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 @@ -54,8 +54,8 @@ Get a message type "id": 823758568, "name": "Announcement", "icon": "📢", - "created_at": "2026-01-31T08:32:04.256Z", - "updated_at": "2026-01-31T08:32:04.256Z" + "created_at": "2026-02-12T06:09:34.617Z", + "updated_at": "2026-02-12T06:09:34.617Z" } ``` @@ -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 4add476..63d0f32 100644 --- a/sections/messages.md +++ b/sections/messages.md @@ -13,20 +13,20 @@ 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 [ { "id": 1069479583, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-17T15:33:00.000Z", - "updated_at": "2026-02-01T02:53:38.551Z", + "created_at": "2026-01-29T23:40:00.000Z", + "updated_at": "2026-02-12T06:09:49.436Z", "title": "Laptop high res glamour shots", "inherits_status": true, "type": "Message", @@ -59,8 +59,8 @@ To get the message board ID for a project, see the [Get message board][3] endpoi "title": "Global Data Strategist", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.358Z", - "updated_at": "2026-01-31T08:29:40.358Z", + "created_at": "2026-02-12T06:08:55.898Z", + "updated_at": "2026-02-12T06:08:55.898Z", "admin": false, "owner": false, "client": false, @@ -70,36 +70,36 @@ To get the message board ID for a project, see the [Get message board][3] endpoi "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, - "content": "Hey all, here are some high res shots of the laptop hardware that we can use. These are not public yet, so be careful with how you share them. We don't want any leaks at all with these images.

\n \n
\n laptop_1\n
\n
\n \n
\n laptop_2\n
\n
\n \n
\n laptop_3\n
\n
\n \n
\n laptop_4\n
\n
\n \n
\n laptop_5\n
\n
\n \n
\n laptop_6\n
\n
\n \n
\n laptop_7\n
\n
\n \n
\n laptop_8\n
\n
\n \n
\n laptop_9\n
\n
\n \n
\n laptop_10\n
\n
\n \n
\n laptop_11\n
\n
\n \n
\n laptop_12\n
\n
\n \n
\n laptop_13\n
\n
\n \n
\n laptop_14\n
\n
", + "content": "Hey all, here are some high res shots of the laptop hardware that we can use. These are not public yet, so be careful with how you share them. We don't want any leaks at all with these images.

\n \n
\n laptop_1\n
\n
\n \n
\n laptop_2\n
\n
\n \n
\n laptop_3\n
\n
\n \n
\n laptop_4\n
\n
\n \n
\n laptop_5\n
\n
\n \n
\n laptop_6\n
\n
\n \n
\n laptop_7\n
\n
\n \n
\n laptop_8\n
\n
\n \n
\n laptop_9\n
\n
\n \n
\n laptop_10\n
\n
\n \n
\n laptop_11\n
\n
\n \n
\n laptop_12\n
\n
\n \n
\n laptop_13\n
\n
\n \n
\n laptop_14\n
\n
", "subject": "Laptop high res glamour shots" } ] ``` - + ###### 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-02-05T17:52:19.252Z", + "created_at": "2025-12-30T18:58:00.000Z", + "updated_at": "2026-02-12T06:12:10.673Z", "title": "We won Leto!", "inherits_status": true, "type": "Message", @@ -132,8 +132,8 @@ Get a message "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -147,26 +147,26 @@ Get a message "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "Hey guys,

We won the Leto account! This is huge for us, it really marks a turning point for the company.

As you know we've been pursuing bigger clients in the consumer space, but we've done so carefully. We've never been about getting the biggest clients - those are easy to get. We've been trying to get the best clients for us - ones that will challenge us, grow us, make us better, and ultimately giving us a platform to show how awesome you guys all are. And now we have that!

A big congrats to everyone who worked so hard to make this happen, and now the fun really begins. Most of the pitch team will stay on as leading members of the first project, the Leto Microsite.

Again, great job everyone, and let's go kick some more butt!

-Victor", "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. @@ -193,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. @@ -218,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. @@ -234,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 7af2265..9b7c1fd 100644 --- a/sections/people.md +++ b/sections/people.md @@ -28,8 +28,8 @@ Get all people "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -43,7 +43,7 @@ Get all people "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ] @@ -123,8 +123,8 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "title": "Central Web Coordinator", "bio": "I never said most of the things I said", "location": null, - "created_at": "2026-01-31T08:29:32.987Z", - "updated_at": "2026-01-31T08:29:32.987Z", + "created_at": "2026-02-12T00:08:51.167-06:00", + "updated_at": "2026-02-12T00:08:51.167-06:00", "admin": false, "owner": false, "client": false, @@ -134,26 +134,26 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, { - "id": 1049715958, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk1OD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--0faf1b608c4b8dea212de1c3a530e5332c413296", + "id": 1049715955, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk1NT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--6a8affd82c540e7c1f7e846b2b02fedb01bcd3f0", "name": "Victor Copper", "email_address": "victor@hanchodesign.com", "personable_type": "User", "title": "Prankster", "bio": null, "location": null, - "created_at": "2026-02-06T22:56:22.154Z", - "updated_at": "2026-02-06T22:56:22.154Z", + "created_at": "2026-02-12T00:13:54.748-06:00", + "updated_at": "2026-02-12T00:13:54.748-06:00", "admin": false, "owner": false, "client": false, "employee": false, "time_zone": "America/Chicago", - "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBPZkkT4=--1cb255ae7eb8be518396c3a2d9fa86e1472b367c/avatar?v=1", + "avatar_url": "https://3.basecampapi.com/195539477/people/BAhpBPNkkT4=--5049939da9ea89df60ade5a1c42d324c1651c66c/avatar?v=1", "company": { "id": 1033447819, "name": "Hancho Design" @@ -161,7 +161,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -175,8 +175,8 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "title": "Legacy Directives Strategist", "bio": "You can do it!", "location": null, - "created_at": "2026-01-31T08:29:46.012Z", - "updated_at": "2026-01-31T08:29:46.012Z", + "created_at": "2026-02-12T00:08:59.344-06:00", + "updated_at": "2026-02-12T00:08:59.344-06:00", "admin": false, "owner": false, "client": false, @@ -190,7 +190,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ] @@ -231,8 +231,8 @@ Get person "title": "Principal Markets Supervisor", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:39.861Z", - "updated_at": "2026-01-31T08:29:39.861Z", + "created_at": "2026-02-12T06:08:55.513Z", + "updated_at": "2026-02-12T06:08:55.513Z", "admin": false, "owner": false, "client": false, @@ -242,7 +242,7 @@ Get person "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ``` diff --git a/sections/projects.md b/sections/projects.md index 464299b..a409dd0 100644 --- a/sections/projects.md +++ b/sections/projects.md @@ -25,8 +25,8 @@ _Optional parameters_: { "id": 2085958504, "status": "active", - "created_at": "2025-12-17T17:13:00.000Z", - "updated_at": "2026-02-06T22:56:26.238Z", + "created_at": "2025-12-29T18:52:00.000Z", + "updated_at": "2026-02-12T06:13:58.036Z", "name": "The Leto Laptop", "description": "Laptop product launch.", "purpose": "topic", @@ -118,8 +118,8 @@ _Optional parameters_: { "id": 2085958505, "status": "active", - "created_at": "2025-12-17T20:02:00.000Z", - "updated_at": "2026-01-31T08:35:13.898Z", + "created_at": "2025-12-29T18:09:00.000Z", + "updated_at": "2026-02-12T06:09:56.030Z", "name": "The Leto Locator", "description": "New software and hardware built for locating and securing Leto products.", "purpose": "topic", @@ -239,8 +239,8 @@ 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-06T22:56:26.238Z", + "created_at": "2025-12-29T18:52:00.000Z", + "updated_at": "2026-02-12T06:14:00.831Z", "name": "The Leto Laptop", "description": "Laptop product launch.", "purpose": "topic", diff --git a/sections/question_answers.md b/sections/question_answers.md index b643c66..758e27b 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,15 +22,15 @@ _Optional query parameters_: * `creator_id` - a person ID to filter answers by author. ###### Example JSON Response - + ```json [ { "id": 1069479545, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-26T22:11:00.000Z", - "updated_at": "2026-01-26T22:11:00.000Z", + "created_at": "2026-02-07T18:07:00.000-06:00", + "updated_at": "2026-02-07T18:07:00.000-06:00", "title": "Answer to “What did you work on today?”", "inherits_status": true, "type": "Question::Answer", @@ -63,8 +63,8 @@ _Optional query parameters_: "title": "International Tactics Facilitator", "bio": "Oh, so they have internet on computers now!", "location": null, - "created_at": "2026-01-31T08:29:43.792Z", - "updated_at": "2026-01-31T08:29:43.792Z", + "created_at": "2026-02-12T00:08:58.046-06:00", + "updated_at": "2026-02-12T00:08:58.046-06:00", "admin": false, "owner": false, "client": false, @@ -78,25 +78,25 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "Prototype is done, components in really good shape. I think we're going to split for now and come back when design is more settled.", - "group_on": "2026-01-26" + "group_on": "2026-02-07" } ] ``` - + ###### 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. @@ -105,34 +105,34 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-26T22:11:00.000Z", - "updated_at": "2026-01-26T22:11:00.000Z", + "created_at": "2026-02-08T00:07:00.000Z", + "updated_at": "2026-02-08T00:07:00.000Z", "title": "Answer to “What did you work on today?”", "inherits_status": true, "type": "Question::Answer", @@ -165,8 +165,8 @@ Get a question answer "title": "International Tactics Facilitator", "bio": "Oh, so they have internet on computers now!", "location": null, - "created_at": "2026-01-31T08:29:43.792Z", - "updated_at": "2026-01-31T08:29:43.792Z", + "created_at": "2026-02-12T06:08:58.046Z", + "updated_at": "2026-02-12T06:08:58.046Z", "admin": false, "owner": false, "client": false, @@ -180,25 +180,25 @@ Get a question answer "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "content": "Prototype is done, components in really good shape. I think we're going to split for now and come back when design is more settled.", - "group_on": "2026-01-26" + "group_on": "2026-02-07" } ``` - + ###### 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. @@ -223,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. @@ -249,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/questionnaires.md b/sections/questionnaires.md index 09df842..750ae79 100644 --- a/sections/questionnaires.md +++ b/sections/questionnaires.md @@ -10,19 +10,19 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.661Z", - "updated_at": "2026-01-31T08:33:00.032Z", + "created_at": "2026-02-12T06:09:34.701Z", + "updated_at": "2026-02-12T06:09:49.569Z", "title": "Automatic Check-ins", "inherits_status": true, "type": "Questionnaire", @@ -43,8 +43,8 @@ To get the questionnaire ID for a project, see the [Get a Project][project] endp "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -58,21 +58,29 @@ To get the questionnaire ID for a project, see the [Get a Project][project] endp "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "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..e64a0f3 100644 --- a/sections/questions.md +++ b/sections/questions.md @@ -15,18 +15,18 @@ 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 [ { "id": 1069479417, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-19T02:37:00.000Z", - "updated_at": "2026-01-31T08:32:59.995Z", + "created_at": "2025-12-31T02:10:00.000Z", + "updated_at": "2026-02-12T06:09:49.545Z", "title": "What did you work on today?", "inherits_status": true, "type": "Question", @@ -55,8 +55,8 @@ Get questions "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -70,7 +70,7 @@ Get questions "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "paused": false, @@ -85,39 +85,39 @@ Get questions ], "hour": 9, "minute": 0, - "week_instance": 1, + "week_instance": null, "week_interval": null, "month_interval": null, - "start_date": "2026-01-31", + "start_date": "2026-02-12", "duration": null, "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, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-19T02:37:00.000Z", - "updated_at": "2026-01-31T08:32:59.995Z", + "created_at": "2025-12-31T02:10:00.000Z", + "updated_at": "2026-02-12T06:09:49.545Z", "title": "What did you work on today?", "inherits_status": true, "type": "Question", @@ -146,8 +146,8 @@ Get a question "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -161,7 +161,7 @@ Get a question "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "paused": false, @@ -176,29 +176,29 @@ Get a question ], "hour": 9, "minute": 0, - "week_instance": 1, + "week_instance": null, "week_interval": null, "month_interval": null, - "start_date": "2026-01-31", + "start_date": "2026-02-12", "duration": null, "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 6ce3449..9ac903f 100644 --- a/sections/reports.md +++ b/sections/reports.md @@ -28,8 +28,8 @@ This endpoint is useful for building a list of people to then retrieve their ind "title": "Central Web Coordinator", "bio": "I never said most of the things I said", "location": null, - "created_at": "2026-01-31T08:29:32.987Z", - "updated_at": "2026-01-31T08:29:32.987Z", + "created_at": "2026-02-12T06:08:51.167Z", + "updated_at": "2026-02-12T06:08:51.167Z", "admin": false, "owner": false, "client": false, @@ -39,7 +39,7 @@ This endpoint is useful for building a list of people to then retrieve their ind "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ] @@ -73,8 +73,8 @@ _Optional query parameters_: "title": "Central Web Coordinator", "bio": "I never said most of the things I said", "location": null, - "created_at": "2026-01-31T08:29:32.987Z", - "updated_at": "2026-01-31T08:29:32.987Z", + "created_at": "2026-02-12T06:08:51.167Z", + "updated_at": "2026-02-12T06:08:51.167Z", "admin": false, "owner": false, "client": false, @@ -84,7 +84,7 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "grouped_by": "bucket", @@ -93,8 +93,8 @@ _Optional query parameters_: "id": 1069479164, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-02T02:59:00.000Z", - "updated_at": "2026-01-02T02:59:00.000Z", + "created_at": "2026-01-14T04:18:00.000Z", + "updated_at": "2026-01-14T04:18:00.000Z", "title": "Amy vs. Sharon", "inherits_status": true, "type": "Todo", @@ -104,6 +104,8 @@ _Optional query parameters_: "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479164/subscription.json", "comments_count": 0, "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/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, @@ -126,8 +128,8 @@ _Optional query parameters_: "title": "International Branding Liason", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:34.525Z", - "updated_at": "2026-01-31T08:29:34.525Z", + "created_at": "2026-02-12T06:08:52.123Z", + "updated_at": "2026-02-12T06:08:52.123Z", "admin": false, "owner": false, "client": false, @@ -137,7 +139,7 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", @@ -155,8 +157,8 @@ _Optional query parameters_: "title": "Central Web Coordinator", "bio": "I never said most of the things I said", "location": null, - "created_at": "2026-01-31T08:29:32.987Z", - "updated_at": "2026-01-31T08:29:32.987Z", + "created_at": "2026-02-12T06:08:51.167Z", + "updated_at": "2026-02-12T06:08:51.167Z", "admin": false, "owner": false, "client": false, @@ -166,12 +168,12 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], "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" } ] } @@ -232,17 +234,17 @@ The response includes: { "schedule_entries": [ { - "id": 1069479912, + "id": 1069479914, "status": "active", "visible_to_clients": false, - "url": "https://3.basecampapi.com/195539477/buckets/2085958504/schedule_entries/1069479912.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/schedule_entries/1069479912", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/schedule_entries/1069479914.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/schedule_entries/1069479914", "type": "ScheduleEntry", "summary": "Team Meeting", "all_day": false, "recurring": false, - "starts_at": "2026-02-08T00:48:58.572Z", - "ends_at": "2026-02-08T04:48:58.572Z", + "starts_at": "2026-02-13T08:10:28.050Z", + "ends_at": "2026-02-13T12:10:28.050Z", "creator": { "id": 1049715913, "name": "Victor Cooper", @@ -263,7 +265,38 @@ The response includes: } ], "recurring_schedule_entry_occurrences": [], - "assignables": [] + "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-16", + "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 + } + ] } ``` diff --git a/sections/schedule_entries.md b/sections/schedule_entries.md index dd951a5..566b388 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,26 +21,26 @@ _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 [ { - "id": 1069479912, + "id": 1069479914, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:36:21.028Z", - "updated_at": "2026-01-31T08:36:21.903Z", + "created_at": "2026-02-12T06:10:28.094Z", + "updated_at": "2026-02-12T06:10:28.415Z", "title": "Team Meeting", "inherits_status": true, "type": "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", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/schedule_entries/1069479914.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/schedule_entries/1069479914", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTkxND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--1616343b17ee8ece05fd271474b85fe06a864667.json", + "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479914/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/buckets/2085958504/recordings/1069479914/comments.json", "boosts_count": 0, - "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/boosts.json", + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479914/boosts.json", "parent": { "id": 1069479396, "title": "Schedule", @@ -62,8 +62,8 @@ _Optional query parameters_: "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -77,14 +77,14 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "
Time to synergize!
", "summary": "Team Meeting", "all_day": false, - "starts_at": "2026-02-08T00:48:58.572Z", - "ends_at": "2026-02-08T04:48:58.572Z", + "starts_at": "2026-02-13T08:10:28.050Z", + "ends_at": "2026-02-13T12:10:28.050Z", "participants": [ { "id": 1049715944, @@ -95,8 +95,8 @@ _Optional query parameters_: "title": "Legacy Directives Strategist", "bio": "You can do it!", "location": null, - "created_at": "2026-01-31T08:29:46.012Z", - "updated_at": "2026-01-31T08:29:46.012Z", + "created_at": "2026-02-12T06:08:59.344Z", + "updated_at": "2026-02-12T06:08:59.344Z", "admin": false, "owner": false, "client": false, @@ -110,48 +110,48 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ] } ] ``` - + ###### 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, + "id": 1069479914, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:36:21.028Z", - "updated_at": "2026-01-31T08:36:21.903Z", + "created_at": "2026-02-12T06:10:28.094Z", + "updated_at": "2026-02-12T06:10:28.415Z", "title": "Team Meeting", "inherits_status": true, "type": "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", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/schedule_entries/1069479914.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/schedule_entries/1069479914", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTkxND9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--1616343b17ee8ece05fd271474b85fe06a864667.json", + "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479914/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/buckets/2085958504/recordings/1069479914/comments.json", "boosts_count": 0, - "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479912/boosts.json", + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479914/boosts.json", "parent": { "id": 1069479396, "title": "Schedule", @@ -173,8 +173,8 @@ Get a schedule entry "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -188,14 +188,14 @@ Get a schedule entry "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "
Time to synergize!
", "summary": "Team Meeting", "all_day": false, - "starts_at": "2026-02-08T00:48:58.572Z", - "ends_at": "2026-02-08T04:48:58.572Z", + "starts_at": "2026-02-13T08:10:28.050Z", + "ends_at": "2026-02-13T12:10:28.050Z", "participants": [ { "id": 1049715944, @@ -206,8 +206,8 @@ Get a schedule entry "title": "Legacy Directives Strategist", "bio": "You can do it!", "location": null, - "created_at": "2026-01-31T08:29:46.012Z", - "updated_at": "2026-01-31T08:29:46.012Z", + "created_at": "2026-02-12T06:08:59.344Z", + "updated_at": "2026-02-12T06:08:59.344Z", "admin": false, "owner": false, "client": false, @@ -221,13 +221,13 @@ Get a schedule entry "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ] } ``` - + Recurring schedule entries will include an additional `recurrence_schedule` attribute. For example: @@ -248,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**: @@ -287,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. @@ -316,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..a9e06f5 100644 --- a/sections/schedules.md +++ b/sections/schedules.md @@ -12,19 +12,19 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.600Z", - "updated_at": "2026-01-31T08:36:21.949Z", + "created_at": "2026-02-12T06:09:34.690Z", + "updated_at": "2026-02-12T06:10:28.425Z", "title": "Schedule", "inherits_status": true, "type": "Schedule", @@ -46,8 +46,8 @@ To get the schedule ID for a project, see the [Get a project][1] endpoint's `doc "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -61,25 +61,25 @@ To get the schedule ID for a project, see the [Get a project][1] endpoint's `doc "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "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..41dd7e6 100644 --- a/sections/search.md +++ b/sections/search.md @@ -148,55 +148,68 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -A 'MyApp (yourname@example.com ```json [ { - "id": 1069479707, + "id": 1069479871, "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-12T23:54:00.000Z", + "updated_at": "2026-02-12T23:54:00.000Z", + "title": "Collaborate externally", "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": "Todolist", + "url": "https://3.basecampapi.com/195539477/buckets/2085958508/todolists/1069479871.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958508/todolists/1069479871", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTg3MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--6e993200a23ac5db499786e2584914a158da4439.json", + "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958508/recordings/1069479871/subscription.json", + "comments_count": 0, + "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958508/recordings/1069479871/comments.json", + "boosts_count": 0, + "boosts_url": "https://3.basecampapi.com/195539477/buckets/2085958508/recordings/1069479871/boosts.json", + "position": 6, "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": 1069479861, + "title": "The next level", + "type": "Todolist", + "url": "https://3.basecampapi.com/195539477/buckets/2085958508/todolists/1069479861.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958508/todolists/1069479861" }, "bucket": { - "id": 2085958505, - "name": "The Leto Locator", + "id": 2085958508, + "name": "Getting Started", "type": "Project" }, "creator": { - "id": 1049715922, - "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkyMj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--ed42dd1af36c4756554ffb2a20de4e019f0c28d3", - "name": "Jay Edmonds", - "email_address": "jay@honchodesign.com", - "personable_type": "User", - "title": "Internal Marketing Assistant", + "id": 1049715953, + "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTk1Mz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--d8a46d8065dbf49cd0c5a9c75aabdcf58c1ef9f6", + "name": "Basecamp", + "email_address": null, + "personable_type": "DummyUser", + "title": null, "bio": null, "location": null, - "created_at": "2026-01-31T08:29:36.692Z", - "updated_at": "2026-01-31T08:29:36.692Z", + "created_at": "2026-02-12T06:10:09.265Z", + "updated_at": "2026-02-12T06:10:09.265Z", "admin": false, "owner": false, "client": false, "employee": false, "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/BAhpBPFkkT4=--684a9fd741b7edab076c407cfcc729da47aadbbf/avatar?v=1", "can_ping": true, - "can_manage_projects": true, - "can_manage_people": true, - "can_access_timesheet": true, - "can_access_hill_charts": true + "can_manage_projects": false, + "can_manage_people": false, + "can_access_timesheet": false, + "can_access_hill_charts": false }, - "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." + "completed": false, + "completed_ratio": "0/3", + "name": "Collaborate externally", + "color": "blue", + "group_position_url": "https://3.basecampapi.com/195539477/buckets/2085958508/todolists/groups/1069479871/position.json", + "todos_url": "https://3.basecampapi.com/195539477/buckets/2085958508/todolists/1069479871/todos.json", + "app_todos_url": "https://3.basecamp.com/195539477/buckets/2085958508/todolists/1069479871/todos", + "comments_app_url": "https://3.basecamp.com/195539477/buckets/2085958508/recordings/1069479871/comments", + "content": null } ] ``` diff --git a/sections/subscriptions.md b/sections/subscriptions.md index d0ed5d5..6329d3d 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, @@ -33,8 +33,8 @@ Get subscription "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -48,7 +48,7 @@ Get subscription "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, { @@ -60,8 +60,8 @@ Get subscription "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -75,48 +75,48 @@ Get subscription "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "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/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, @@ -163,8 +163,8 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -178,7 +178,7 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, { @@ -190,8 +190,8 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "title": "Corporate Integration Director", "bio": "A joke is a very serious thing", "location": null, - "created_at": "2026-01-31T08:29:43.313Z", - "updated_at": "2026-01-31T08:29:43.313Z", + "created_at": "2026-02-12T06:08:57.659Z", + "updated_at": "2026-02-12T06:08:57.659Z", "admin": false, "owner": false, "client": false, @@ -205,10 +205,20 @@ curl -s -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/j "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ] } ``` - + + +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 b058586..9ca9663 100644 --- a/sections/templates.md +++ b/sections/templates.md @@ -27,8 +27,8 @@ _Optional parameters_: { "id": 2085958506, "status": "active", - "created_at": "2026-01-31T09:28:25.505Z", - "updated_at": "2026-02-06T22:45:38.387Z", + "created_at": "2026-02-12T06:55:56.041Z", + "updated_at": "2026-02-12T06:09:56.641Z", "name": "Honcho Onboarding", "description": "Getting started on the right foot", "url": "https://3.basecampapi.com/195539477/templates/2085958506.json", @@ -128,8 +128,8 @@ Get a Template { "id": 2085958506, "status": "active", - "created_at": "2026-01-31T09:28:25.505Z", - "updated_at": "2026-02-06T22:45:38.387Z", + "created_at": "2026-02-12T06:55:56.041Z", + "updated_at": "2026-02-12T06:09:56.641Z", "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": 598194963, + "id": 598194960, "status": "pending", - "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194963.json" + "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194960.json" } ``` @@ -338,14 +338,14 @@ This endpoint can be polled at regular intervals (no more than once a second) to ```json { - "id": 598194963, + "id": 598194960, "status": "completed", - "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194963.json", + "url": "https://3.basecampapi.com/195539477/templates/2085958506/project_constructions/598194960.json", "project": { - "id": 2085958516, + "id": 2085958510, "status": "active", - "created_at": "2026-02-06T22:56:11.354Z", - "updated_at": "2026-02-06T22:56:16.008Z", + "created_at": "2026-02-12T06:13:48.617Z", + "updated_at": "2026-02-12T06:13:49.378Z", "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/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9CdWNrZXQvMjA4NTk1ODUxNj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0c2362fb2e1e5488f5e668ceb2fe67eaf19fc10e.json", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9CdWNrZXQvMjA4NTk1ODUxMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--991b5863f305d318b91ac4d140ad485d97583e93.json", + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510", "dock": [ { - "id": 1069480095, + "id": 1069479948, "title": "Message Board", "name": "message_board", "enabled": true, "position": 1, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/message_boards/1069480095.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/message_boards/1069480095" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/message_boards/1069479948.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/message_boards/1069479948" }, { - "id": 1069480096, + "id": 1069479949, "title": "To-dos", "name": "todoset", "enabled": true, "position": 2, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/todosets/1069480096.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/todosets/1069480096" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/todosets/1069479949.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/todosets/1069479949" }, { - "id": 1069480102, + "id": 1069479954, "title": "Docs & Files", "name": "vault", "enabled": true, "position": 3, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/vaults/1069480102.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/vaults/1069480102" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/vaults/1069479954.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/vaults/1069479954" }, { - "id": 1069480103, + "id": 1069479955, "title": "Chat", "name": "chat", "enabled": true, "position": 4, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/chats/1069480103.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/chats/1069480103" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/chats/1069479955.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/chats/1069479955" }, { - "id": 1069480104, + "id": 1069479956, "title": "Schedule", "name": "schedule", "enabled": true, "position": 5, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/schedules/1069480104.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/schedules/1069480104" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/schedules/1069479956.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/schedules/1069479956" }, { - "id": 1069480105, + "id": 1069479957, "title": "Automatic Check-ins", "name": "questionnaire", "enabled": false, "position": null, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/questionnaires/1069480105.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/questionnaires/1069480105" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/questionnaires/1069479957.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/questionnaires/1069479957" }, { - "id": 1069480106, + "id": 1069479958, "title": "Email Forwards", "name": "inbox", "enabled": false, "position": null, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/inboxes/1069480106.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/inboxes/1069480106" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/inboxes/1069479958.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/inboxes/1069479958" }, { - "id": 1069480107, + "id": 1069479959, "title": "Card Table", "name": "kanban_board", "enabled": false, "position": null, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/card_tables/1069480107.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/card_tables/1069480107" + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/card_tables/1069479959.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/card_tables/1069479959" } ] } diff --git a/sections/timeline.md b/sections/timeline.md index 4512b2f..7200fe8 100644 --- a/sections/timeline.md +++ b/sections/timeline.md @@ -19,8 +19,8 @@ Get timeline ```json [ { - "id": 1071915901, - "created_at": "2026-02-06T22:56:23.125Z", + "id": 1071915692, + "created_at": "2026-02-12T06:13:55.569Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -31,8 +31,8 @@ Get timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -46,7 +46,7 @@ Get timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. changed who can access this project", @@ -62,8 +62,8 @@ Get timeline } }, { - "id": 1071915899, - "created_at": "2026-02-06T22:56:22.481Z", + "id": 1071915690, + "created_at": "2026-02-12T06:13:54.966Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -74,8 +74,8 @@ Get timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -89,7 +89,7 @@ Get timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. changed who can access this project", @@ -105,12 +105,12 @@ Get timeline } }, { - "id": 1071915883, - "created_at": "2026-02-06T22:56:14.308Z", + "id": 1071915673, + "created_at": "2026-02-12T06:13:49.017Z", "kind": "todo_created", - "parent_recording_id": 1069480097, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/todos/1069480101.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/todos/1069480101", + "parent_recording_id": 1069479950, + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/todos/1069479953.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/todos/1069479953", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -120,8 +120,8 @@ Get timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -135,7 +135,7 @@ Get timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -144,20 +144,20 @@ Get timeline "summary_excerpt": "Install ShipShape", "avatars_sample": [], "bucket": { - "id": 2085958516, + "id": 2085958510, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516" + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510" }, "attachments": [] }, { - "id": 1071915882, - "created_at": "2026-02-06T22:56:14.192Z", + "id": 1071915672, + "created_at": "2026-02-12T06:13:48.958Z", "kind": "todo_created", - "parent_recording_id": 1069480097, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/todos/1069480100.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/todos/1069480100", + "parent_recording_id": 1069479950, + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/todos/1069479952.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/todos/1069479952", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -167,8 +167,8 @@ Get timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -182,7 +182,7 @@ Get timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -191,20 +191,20 @@ Get timeline "summary_excerpt": "Talk to Jerry about holidays", "avatars_sample": [], "bucket": { - "id": 2085958516, + "id": 2085958510, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516" + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510" }, "attachments": [] }, { - "id": 1071915880, - "created_at": "2026-02-06T22:56:13.958Z", + "id": 1071915671, + "created_at": "2026-02-12T06:13:48.910Z", "kind": "todo_created", - "parent_recording_id": 1069480097, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/todos/1069480098.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/todos/1069480098", + "parent_recording_id": 1069479950, + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/todos/1069479951.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/todos/1069479951", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -214,8 +214,8 @@ Get timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -229,7 +229,7 @@ Get timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -238,10 +238,10 @@ Get timeline "summary_excerpt": "Talk to Cheryl about benefits", "avatars_sample": [], "bucket": { - "id": 2085958516, + "id": 2085958510, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516" + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510" }, "attachments": [] } @@ -265,8 +265,8 @@ Get project timeline ```json [ { - "id": 1071915901, - "created_at": "2026-02-06T22:56:23.125Z", + "id": 1071915692, + "created_at": "2026-02-12T06:13:55.569Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -277,8 +277,8 @@ Get project timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -292,7 +292,7 @@ Get project timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. changed who can access this project", @@ -308,8 +308,8 @@ Get project timeline } }, { - "id": 1071915899, - "created_at": "2026-02-06T22:56:22.481Z", + "id": 1071915690, + "created_at": "2026-02-12T06:13:54.966Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -320,8 +320,8 @@ Get project timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -335,7 +335,7 @@ Get project timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. changed who can access this project", @@ -378,8 +378,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -393,13 +393,13 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "events": [ { - "id": 1071915901, - "created_at": "2026-02-06T22:56:23.125Z", + "id": 1071915692, + "created_at": "2026-02-12T06:13:55.569Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -410,8 +410,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -425,7 +425,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. changed who can access this project", @@ -441,8 +441,8 @@ Get person's timeline } }, { - "id": 1071915899, - "created_at": "2026-02-06T22:56:22.481Z", + "id": 1071915690, + "created_at": "2026-02-12T06:13:54.966Z", "kind": "project_access_changed", "creator": { "id": 1049715913, @@ -453,8 +453,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -468,7 +468,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. changed who can access this project", @@ -484,12 +484,12 @@ Get person's timeline } }, { - "id": 1071915883, - "created_at": "2026-02-06T22:56:14.308Z", + "id": 1071915673, + "created_at": "2026-02-12T06:13:49.017Z", "kind": "todo_created", - "parent_recording_id": 1069480097, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/todos/1069480101.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/todos/1069480101", + "parent_recording_id": 1069479950, + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/todos/1069479953.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/todos/1069479953", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -499,8 +499,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -514,7 +514,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -523,20 +523,20 @@ Get person's timeline "summary_excerpt": "Install ShipShape", "avatars_sample": [], "bucket": { - "id": 2085958516, + "id": 2085958510, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516" + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510" }, "attachments": [] }, { - "id": 1071915882, - "created_at": "2026-02-06T22:56:14.192Z", + "id": 1071915672, + "created_at": "2026-02-12T06:13:48.958Z", "kind": "todo_created", - "parent_recording_id": 1069480097, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/todos/1069480100.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/todos/1069480100", + "parent_recording_id": 1069479950, + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/todos/1069479952.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/todos/1069479952", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -546,8 +546,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -561,7 +561,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -570,20 +570,20 @@ Get person's timeline "summary_excerpt": "Talk to Jerry about holidays", "avatars_sample": [], "bucket": { - "id": 2085958516, + "id": 2085958510, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516" + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510" }, "attachments": [] }, { - "id": 1071915880, - "created_at": "2026-02-06T22:56:13.958Z", + "id": 1071915671, + "created_at": "2026-02-12T06:13:48.910Z", "kind": "todo_created", - "parent_recording_id": 1069480097, - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/todos/1069480098.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958516/todos/1069480098", + "parent_recording_id": 1069479950, + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/todos/1069479951.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958510/todos/1069479951", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -593,8 +593,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -608,7 +608,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -617,19 +617,19 @@ Get person's timeline "summary_excerpt": "Talk to Cheryl about benefits", "avatars_sample": [], "bucket": { - "id": 2085958516, + "id": 2085958510, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516" + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510" }, "attachments": [] }, { - "id": 1071915874, - "created_at": "2026-02-06T22:56:11.891Z", + "id": 1071915665, + "created_at": "2026-02-12T06:13:48.702Z", "kind": "dock_created", - "url": "https://3.basecampapi.com/195539477/buckets/2085958516/dock.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516", + "url": "https://3.basecampapi.com/195539477/buckets/2085958510/dock.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -639,8 +639,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -654,7 +654,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. started a new project called New project from template", @@ -663,106 +663,20 @@ Get person's timeline "summary_excerpt": null, "avatars_sample": [], "bucket": { - "id": 2085958516, + "id": 2085958510, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958516.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958516" + "url": "https://3.basecampapi.com/195539477/projects/2085958510.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958510" }, "attachments": [] }, { - "id": 1071915860, - "created_at": "2026-02-06T22:45:38.643Z", - "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": 1071915858, - "created_at": "2026-02-06T22:45:37.863Z", - "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": 1071915841, - "created_at": "2026-02-06T22:45:32.261Z", + "id": 1071915646, + "created_at": "2026-02-12T06:13:12.912Z", "kind": "todo_created", - "parent_recording_id": 1069480069, - "url": "https://3.basecampapi.com/195539477/buckets/2085958515/todos/1069480072.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958515/todos/1069480072", + "parent_recording_id": 1069479926, + "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479929.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479929", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -772,8 +686,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -787,7 +701,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -796,20 +710,20 @@ Get person's timeline "summary_excerpt": "Install ShipShape", "avatars_sample": [], "bucket": { - "id": 2085958515, + "id": 2085958509, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958515.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958515" + "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958509" }, "attachments": [] }, { - "id": 1071915840, - "created_at": "2026-02-06T22:45:32.213Z", + "id": 1071915645, + "created_at": "2026-02-12T06:13:12.885Z", "kind": "todo_created", - "parent_recording_id": 1069480069, - "url": "https://3.basecampapi.com/195539477/buckets/2085958515/todos/1069480071.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958515/todos/1069480071", + "parent_recording_id": 1069479926, + "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479928.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479928", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -819,8 +733,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -834,7 +748,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -843,20 +757,20 @@ Get person's timeline "summary_excerpt": "Talk to Jerry about holidays", "avatars_sample": [], "bucket": { - "id": 2085958515, + "id": 2085958509, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958515.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958515" + "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958509" }, "attachments": [] }, { - "id": 1071915839, - "created_at": "2026-02-06T22:45:32.146Z", + "id": 1071915644, + "created_at": "2026-02-12T06:13:12.854Z", "kind": "todo_created", - "parent_recording_id": 1069480069, - "url": "https://3.basecampapi.com/195539477/buckets/2085958515/todos/1069480070.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958515/todos/1069480070", + "parent_recording_id": 1069479926, + "url": "https://3.basecampapi.com/195539477/buckets/2085958509/todos/1069479927.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958509/todos/1069479927", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -866,8 +780,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -881,7 +795,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. added a to-do", @@ -890,19 +804,19 @@ Get person's timeline "summary_excerpt": "Talk to Cheryl about benefits", "avatars_sample": [], "bucket": { - "id": 2085958515, + "id": 2085958509, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958515.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958515" + "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958509" }, "attachments": [] }, { - "id": 1071915833, - "created_at": "2026-02-06T22:45:31.892Z", + "id": 1071915638, + "created_at": "2026-02-12T06:13:12.685Z", "kind": "dock_created", - "url": "https://3.basecampapi.com/195539477/buckets/2085958515/dock.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958515", + "url": "https://3.basecampapi.com/195539477/buckets/2085958509/dock.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958509", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -912,8 +826,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -927,7 +841,7 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "action": "Victor C. started a new project called New project from template", @@ -936,67 +850,17 @@ Get person's timeline "summary_excerpt": null, "avatars_sample": [], "bucket": { - "id": 2085958515, - "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958515.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958515" - }, - "attachments": [] - }, - { - "id": 1071915810, - "created_at": "2026-02-06T22:44:52.980Z", - "kind": "todo_created", - "parent_recording_id": 1069480044, - "url": "https://3.basecampapi.com/195539477/buckets/2085958514/todos/1069480047.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958514/todos/1069480047", - "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": 2085958514, + "id": 2085958509, "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958514.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958514" + "url": "https://3.basecampapi.com/195539477/projects/2085958509.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958509" }, "attachments": [] }, { - "id": 1071915809, - "created_at": "2026-02-06T22:44:52.919Z", - "kind": "todo_created", - "parent_recording_id": 1069480044, - "url": "https://3.basecampapi.com/195539477/buckets/2085958514/todos/1069480046.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958514/todos/1069480046", + "id": 1071915629, + "created_at": "2026-02-12T06:11:41.619Z", + "kind": "project_webhook_created", "creator": { "id": 1049715913, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkxMz9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--e627c45e6b34e08862da23906862412620e4d5d9", @@ -1006,8 +870,8 @@ Get person's timeline "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -1021,68 +885,20 @@ Get person's timeline "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "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": 2085958514, - "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958514.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958514" - }, - "attachments": [] - }, - { - "id": 1071915808, - "created_at": "2026-02-06T22:44:52.863Z", - "kind": "todo_created", - "parent_recording_id": 1069480044, - "url": "https://3.basecampapi.com/195539477/buckets/2085958514/todos/1069480045.json", - "app_url": "https://3.basecamp.com/195539477/buckets/2085958514/todos/1069480045", - "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", + "action": "Victor C. added a webhook to this project", + "target": null, + "title": "Victor C. added a webhook to this project", + "summary_excerpt": "Some information will now be sent to https://example.com/endpoint", "avatars_sample": [], "bucket": { - "id": 2085958514, - "name": "New project from template", - "url": "https://3.basecampapi.com/195539477/projects/2085958514.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958514" - }, - "attachments": [] + "id": 2085958504, + "name": "The Leto Laptop", + "url": "https://3.basecampapi.com/195539477/projects/2085958504.json", + "app_url": "https://3.basecamp.com/195539477/projects/2085958504" + } } ] } diff --git a/sections/timesheets.md b/sections/timesheets.md index 4aa073f..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": 1069480091, + "id": 1069480181, "status": "active", "visible_to_clients": false, - "created_at": "2026-02-06T22:55:54.662Z", - "updated_at": "2026-02-06T22:55:54.662Z", + "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/1069480091.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480091", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDA5MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0b7abbaa49e554506a83edc6934173ebe077c1f0.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!", @@ -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": 1069480091, + "id": 1069480181, "status": "active", "visible_to_clients": false, - "created_at": "2026-02-06T22:55:54.662Z", - "updated_at": "2026-02-06T22:55:54.662Z", + "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/1069480091.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480091", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDA5MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0b7abbaa49e554506a83edc6934173ebe077c1f0.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!", @@ -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": 1069480091, + "id": 1069480181, "status": "active", "visible_to_clients": false, - "created_at": "2026-02-06T22:55:54.662Z", - "updated_at": "2026-02-06T22:55:55.514Z", + "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/1069480091.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480091", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDA5MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0b7abbaa49e554506a83edc6934173ebe077c1f0.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!", @@ -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..22ddf27 100644 --- a/sections/todolist_groups.md +++ b/sections/todolist_groups.md @@ -11,22 +11,22 @@ 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 [ { "id": 1069479153, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-01T22:32:00.000Z", - "updated_at": "2026-01-31T08:30:50.887Z", + "created_at": "2026-01-13T22:28:00.000Z", + "updated_at": "2026-02-12T06:09:14.559Z", "title": "Group A", "inherits_status": true, "type": "Todolist", @@ -36,6 +36,8 @@ _Optional query parameters_: "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/subscription.json", "comments_count": 0, "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/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, @@ -58,8 +60,8 @@ _Optional query parameters_: "title": "International Branding Liason", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:34.525Z", - "updated_at": "2026-01-31T08:29:34.525Z", + "created_at": "2026-02-12T06:08:52.123Z", + "updated_at": "2026-02-12T06:08:52.123Z", "admin": false, "owner": false, "client": false, @@ -69,7 +71,7 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", @@ -86,8 +88,8 @@ _Optional query parameters_: "id": 1069479156, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-01T22:58:00.000Z", - "updated_at": "2026-01-31T08:30:51.823Z", + "created_at": "2026-01-14T00:19:00.000Z", + "updated_at": "2026-02-12T06:09:14.938Z", "title": "Group B", "inherits_status": true, "type": "Todolist", @@ -97,6 +99,8 @@ _Optional query parameters_: "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479156/subscription.json", "comments_count": 0, "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/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, @@ -119,8 +123,8 @@ _Optional query parameters_: "title": "International Branding Liason", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:34.525Z", - "updated_at": "2026-01-31T08:29:34.525Z", + "created_at": "2026-02-12T06:08:52.123Z", + "updated_at": "2026-02-12T06:08:52.123Z", "admin": false, "owner": false, "client": false, @@ -130,7 +134,7 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", @@ -145,11 +149,11 @@ _Optional query parameters_: } ] ``` - + ###### 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,17 +162,17 @@ 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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-01T22:32:00.000Z", - "updated_at": "2026-01-31T08:30:50.887Z", + "created_at": "2026-01-13T22:28:00.000Z", + "updated_at": "2026-02-12T06:09:14.559Z", "title": "Group A", "inherits_status": true, "type": "Todolist", @@ -178,6 +182,8 @@ include a groups_url in its response, while a group will have a group_position_u "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958502/recordings/1069479153/subscription.json", "comments_count": 0, "comments_url": "https://3.basecampapi.com/195539477/buckets/2085958502/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, @@ -200,8 +206,8 @@ include a groups_url in its response, while a group will have a group_position_u "title": "International Branding Liason", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:34.525Z", - "updated_at": "2026-01-31T08:29:34.525Z", + "created_at": "2026-02-12T06:08:52.123Z", + "updated_at": "2026-02-12T06:08:52.123Z", "admin": false, "owner": false, "client": false, @@ -211,7 +217,7 @@ include a groups_url in its response, while a group will have a group_position_u "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", @@ -225,12 +231,12 @@ include a groups_url in its response, while a group will have a group_position_u "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 95634cb..0ab67d3 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,15 +21,15 @@ _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 [ { "id": 1069479573, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-15T05:50:00.000Z", - "updated_at": "2026-02-01T02:53:47.036Z", + "created_at": "2026-01-27T05:02:00.000Z", + "updated_at": "2026-02-12T06:09:48.024Z", "title": "Strategy ideas", "inherits_status": true, "type": "Todolist", @@ -63,8 +63,8 @@ _Optional query parameters_: "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -78,7 +78,7 @@ _Optional query parameters_: "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", @@ -93,28 +93,28 @@ _Optional query parameters_: } ] ``` - + ###### 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, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-20T18:09:00.000Z", - "updated_at": "2026-01-31T08:32:13.249Z", + "created_at": "2026-01-01T16:50:00.000Z", + "updated_at": "2026-02-12T06:09:36.862Z", "title": "Background and research", "inherits_status": true, "type": "Todolist", @@ -148,8 +148,8 @@ Get a to-do list "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -163,7 +163,7 @@ Get a to-do list "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", @@ -177,18 +177,18 @@ Get a to-do list "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. @@ -210,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. @@ -241,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 1114504..e108076 100644 --- a/sections/todos.md +++ b/sections/todos.md @@ -15,25 +15,25 @@ 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 [ { "id": 1069479574, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-15T06:18:00.000Z", - "updated_at": "2026-01-15T06:18:00.000Z", + "created_at": "2026-01-27T05:40:00.000Z", + "updated_at": "2026-01-27T05:40:00.000Z", "title": "Go cutting edge: iOS8 and Android 4.5 only", "inherits_status": true, "type": "Todo", @@ -67,8 +67,8 @@ This endpoint without any parameters returns only active, pending (i.e. not comp "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -82,7 +82,7 @@ This endpoint without any parameters returns only active, pending (i.e. not comp "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", @@ -92,32 +92,32 @@ 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-06T21:44:48.539Z", + "created_at": "2026-01-27T06:40:00.000Z", + "updated_at": "2026-02-12T06:14:05.061Z", "title": "Clear and simple UI", "inherits_status": true, "type": "Todo", @@ -150,8 +150,8 @@ Get a to-do "title": "Central Markets Manager", "bio": "To open a store is easy, to keep it open is an art", "location": null, - "created_at": "2026-01-31T08:29:42.795Z", - "updated_at": "2026-01-31T08:29:42.795Z", + "created_at": "2026-02-12T06:08:57.340Z", + "updated_at": "2026-02-12T06:08:57.340Z", "admin": false, "owner": false, "client": false, @@ -165,13 +165,13 @@ Get a to-do "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "description": "", "completed": true, "completion": { - "created_at": "2026-02-06T21:44:48.399Z", + "created_at": "2026-02-12T06:14:04.989Z", "creator": { "id": 1049715930, "attachable_sgid": "BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiK2dpZDovL2JjMy9QZXJzb24vMTA0OTcxNTkzMD9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg9hdHRhY2hhYmxlBjsAVA==--322099b137f9e0b6bc944b5b9fe7a2692da94814", @@ -181,8 +181,8 @@ Get a to-do "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:08:56.240Z", + "updated_at": "2026-02-12T06:08:56.240Z", "admin": false, "owner": false, "client": false, @@ -192,7 +192,7 @@ Get a to-do "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } }, @@ -209,8 +209,8 @@ Get a to-do "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:08:56.240Z", + "updated_at": "2026-02-12T06:08:56.240Z", "admin": false, "owner": false, "client": false, @@ -220,7 +220,7 @@ Get a to-do "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } ], @@ -234,8 +234,8 @@ Get a to-do "title": "Principal Branding Administrator", "bio": null, "location": null, - "created_at": "2026-01-31T08:29:40.859Z", - "updated_at": "2026-01-31T08:29:40.859Z", + "created_at": "2026-02-12T06:08:56.240Z", + "updated_at": "2026-02-12T06:08:56.240Z", "admin": false, "owner": false, "client": false, @@ -245,25 +245,25 @@ Get a to-do "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "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. @@ -293,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. @@ -308,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. @@ -330,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. @@ -345,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. @@ -360,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. @@ -399,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 2647001..b9e061a 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-02-06T22:45:49.916Z", + "created_at": "2026-02-12T06:09:34.637Z", + "updated_at": "2026-02-12T06:09:48.026Z", "title": "To-dos", "inherits_status": true, "type": "Todoset", @@ -45,8 +45,8 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -60,7 +60,7 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, "completed": false, @@ -163,14 +163,21 @@ To get the to-do set ID for a project, see the [Get a project][1] endpoint's `do "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..3db50e9 100644 --- a/sections/tools.md +++ b/sections/tools.md @@ -27,8 +27,8 @@ Get a tool "id": 1069479395, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:32:04.505Z", - "updated_at": "2026-02-01T02:53:38.342Z", + "created_at": "2026-02-12T06:09:34.667Z", + "updated_at": "2026-02-12T06:13:57.731Z", "title": "Chat", "inherits_status": true, "type": "Chat::Transcript", @@ -51,8 +51,8 @@ Get a tool "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -66,7 +66,7 @@ Get a tool "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } } diff --git a/sections/uploads.md b/sections/uploads.md index 2ab00b5..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,9 @@ 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, @@ -80,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://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, @@ -113,9 +113,9 @@ 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, @@ -163,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://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. @@ -204,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. @@ -228,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..0bc0a1d 100644 --- a/sections/vaults.md +++ b/sections/vaults.md @@ -13,18 +13,18 @@ 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 [ { "id": 1069479146, "status": "active", "visible_to_clients": false, - "created_at": "2025-12-23T10:12:00.000Z", - "updated_at": "2026-01-31T08:34:25.622Z", + "created_at": "2026-01-04T04:22:00.000Z", + "updated_at": "2026-02-12T06:09:14.204Z", "title": "HR Stuff", "inherits_status": true, "type": "Vault", @@ -53,8 +53,8 @@ Get vaults "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -68,39 +68,39 @@ Get vaults "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "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, "status": "active", "visible_to_clients": false, - "created_at": "2026-01-31T08:29:58.735Z", - "updated_at": "2026-01-31T08:34:25.627Z", + "created_at": "2026-02-12T06:09:02.382Z", + "updated_at": "2026-02-12T06:09:14.205Z", "title": "Docs & Files", "inherits_status": true, "type": "Vault", @@ -122,8 +122,8 @@ Get a vault "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", + "created_at": "2026-02-12T06:08:49.342Z", + "updated_at": "2026-02-12T06:08:50.871Z", "admin": true, "owner": true, "client": false, @@ -137,28 +137,28 @@ Get a vault "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "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 ad11d2c..45a08a6 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 @@ -247,8 +247,8 @@ Get webhooks { "id": 1051369971, "active": true, - "created_at": "2026-01-31T08:38:45.916Z", - "updated_at": "2026-01-31T08:38:45.916Z", + "created_at": "2026-02-12T06:11:41.608Z", + "updated_at": "2026-02-12T06:11:41.608Z", "payload_url": "https://example.com/endpoint", "types": [ "all" @@ -268,18 +268,18 @@ 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, "active": true, - "created_at": "2026-01-31T08:38:45.916Z", - "updated_at": "2026-01-31T08:38:45.916Z", + "created_at": "2026-02-12T06:11:41.608Z", + "updated_at": "2026-02-12T06:11:41.608Z", "payload_url": "https://example.com/endpoint", "types": [ "all" @@ -288,39 +288,45 @@ The recent deliveries array will contain the 25 most recent delivery exchanges, "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/webhooks/1051369971", "recent_deliveries": [ { - "id": 627138755, - "created_at": "2026-02-06T22:55:58.243Z", + "id": 627138715, + "created_at": "2026-02-12T06:12:11.774Z", "request": { "headers": { "Content-Type": "application/json", "User-Agent": "Basecamp3 Webhook", - "X-Request-Id": "18fe80cd-df90-442f-be87-f223a2cd69b7" + "X-Request-Id": "9728e569-4c4c-4ea0-9284-838fcac3c979" }, "body": { - "id": 1071915871, - "kind": "timesheet_entry_deleted", + "id": 1071915635, + "kind": "message_subscribers_changed", "details": { - "status_was": "active" + "added_person_ids": [ + 1049715939 + ], + "removed_person_ids": [ + 1049715913 + ] }, - "created_at": "2026-02-06T16:55:56.001-06:00", + "created_at": "2026-02-12T00:12:10.676-06:00", "recording": { - "id": 1069480091, - "status": "deleted", + "id": 1069479406, + "status": "active", "visible_to_clients": false, - "created_at": "2026-02-06T16:55:54.662-06:00", - "updated_at": "2026-02-06T16:55:55.924-06:00", - "title": "Timesheet entry", - "inherits_status": false, - "type": "Timesheet::Entry", - "url": "https://3.basecampapi.com/195539477/projects/2085958504/timesheet/entries/1069480091.json", - "app_url": "https://3.basecamp.com/195539477/projects/2085958504/timesheet/entries/1069480091", - "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ4MDA5MT9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--0b7abbaa49e554506a83edc6934173ebe077c1f0.json", + "created_at": "2025-12-30T12:58:00.000-06:00", + "updated_at": "2026-02-12T00:12:10.673-06:00", + "title": "We won Leto!", + "inherits_status": true, + "type": "Message", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/messages/1069479406.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/messages/1069479406", + "bookmark_url": "https://3.basecampapi.com/195539477/my/bookmarks/BAh7BkkiC19yYWlscwY6BkVUewdJIglkYXRhBjsAVEkiLmdpZDovL2JjMy9SZWNvcmRpbmcvMTA2OTQ3OTQwNj9leHBpcmVzX2luBjsAVEkiCHB1cgY7AFRJIg1yZWFkYWJsZQY7AFQ=--309e0fbab86893aaaf279f01f2a0795c56716aeb.json", + "subscription_url": "https://3.basecampapi.com/195539477/buckets/2085958504/recordings/1069479406/subscription.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" + "id": 1069479392, + "title": "Message Board", + "type": "Message::Board", + "url": "https://3.basecampapi.com/195539477/buckets/2085958504/message_boards/1069479392.json", + "app_url": "https://3.basecamp.com/195539477/buckets/2085958504/message_boards/1069479392" }, "bucket": { "id": 2085958504, @@ -336,8 +342,8 @@ The recent deliveries array will contain the 25 most recent delivery exchanges, "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", + "created_at": "2026-02-12T00:08:49.342-06:00", + "updated_at": "2026-02-12T00:08:50.871-06:00", "admin": true, "owner": true, "client": false, @@ -351,10 +357,10 @@ The recent deliveries array will contain the 25 most recent delivery exchanges, "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true }, - "content": null + "content": "Hey guys,

We won the Leto account! This is huge for us, it really marks a turning point for the company.

As you know we've been pursuing bigger clients in the consumer space, but we've done so carefully. We've never been about getting the biggest clients - those are easy to get. We've been trying to get the best clients for us - ones that will challenge us, grow us, make us better, and ultimately giving us a platform to show how awesome you guys all are. And now we have that!

A big congrats to everyone who worked so hard to make this happen, and now the fun really begins. Most of the pitch team will stay on as leading members of the first project, the Leto Microsite.

Again, great job everyone, and let's go kick some more butt!

-Victor
" }, "creator": { "id": 1049715913, @@ -365,8 +371,8 @@ The recent deliveries array will contain the 25 most recent delivery exchanges, "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", + "created_at": "2026-02-12T00:08:49.342-06:00", + "updated_at": "2026-02-12T00:08:50.871-06:00", "admin": true, "owner": true, "client": false, @@ -380,7 +386,7 @@ The recent deliveries array will contain the 25 most recent delivery exchanges, "can_ping": true, "can_manage_projects": true, "can_manage_people": true, - "can_access_timesheet": true, + "can_access_timesheet": false, "can_access_hill_charts": true } } @@ -390,23 +396,24 @@ The recent deliveries array will contain the 25 most recent delivery exchanges, "Content-Type": "application/json" }, "code": 200, - "message": "OK" + "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. @@ -435,7 +442,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. @@ -459,13 +466,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. @@ -473,8 +480,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