basecamp-sdk 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2b13ea2c32e1d4bf22a04af06e8c94d039e7698643a7aa7d9e0813f1526db2d
4
- data.tar.gz: 942a8f09b4950764aa132ebd52a195d9d0eebb27b93656fb542e7e52b20ae1af
3
+ metadata.gz: 99e64617bcf9bcf031f03ea1ae0311f37f46c5da4ac4fba9caeca9a768e44a22
4
+ data.tar.gz: 83dd4b5a6d15ffc7909121dc742e2ccbaf9d1159d2b743a8482bb5a1cd17241f
5
5
  SHA512:
6
- metadata.gz: '081775bc028c20205c904d026ab9f79bf077e7cde1d1bf5dd074b0e641fedf2ac47ebe3ca3cd6860f5bed05ad92d672abcaaf0332ec0f9aa94327ebc4cfcb130'
7
- data.tar.gz: ffee6cf6e25a9ad523628b5d5f9da23f15460c3b01cd03dd8ab5df472942826e05d1a40afc09fc6cec9acaf9a3b2329c468f94b69a3ee4f95e2a784d94eb2775
6
+ metadata.gz: 1e5ce39f93f07dad1c1b79b2da9ac39db5ac70e8871eba73af86a92eb986d56f5b4002af55c40eb16a8f4bed14d2407ead7c1be3b5c817664dcf5033397db7eb
7
+ data.tar.gz: 5263d6241a9de95303c8a546efe7f412db59def57207a0e0f8c22c45ab06d0b40b4d2c05e7b4d7ab05e02d7cb451246a5ccb5c4992afb52127541b464dbeeb3e
@@ -481,6 +481,26 @@ module Basecamp
481
481
  service(:tools) { Services::ToolsService.new(self) }
482
482
  end
483
483
 
484
+ # @return [Services::BookmarksService]
485
+ def bookmarks
486
+ service(:bookmarks) { Services::BookmarksService.new(self) }
487
+ end
488
+
489
+ # @return [Services::DraftsService]
490
+ def drafts
491
+ service(:drafts) { Services::DraftsService.new(self) }
492
+ end
493
+
494
+ # @return [Services::CalendarsService]
495
+ def calendars
496
+ service(:calendars) { Services::CalendarsService.new(self) }
497
+ end
498
+
499
+ # @return [Services::MyNotesService]
500
+ def my_notes
501
+ service(:my_notes) { Services::MyNotesService.new(self) }
502
+ end
503
+
484
504
  # @return [Services::SubscriptionsService]
485
505
  def subscriptions
486
506
  service(:subscriptions) { Services::SubscriptionsService.new(self) }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://basecamp.com/schemas/sdk-metadata.json",
3
3
  "version": "1.0.0",
4
- "generated": "2026-07-31T06:58:29Z",
4
+ "generated": "2026-07-31T15:59:31Z",
5
5
  "operations": {
6
6
  "GetAccount": {
7
7
  "retry": {
@@ -250,6 +250,17 @@
250
250
  ]
251
251
  }
252
252
  },
253
+ "CreateTodosetTodo": {
254
+ "retry": {
255
+ "maxAttempts": 3,
256
+ "baseDelayMs": 1000,
257
+ "backoff": "exponential",
258
+ "retryOn": [
259
+ 429,
260
+ 503
261
+ ]
262
+ }
263
+ },
253
264
  "ListWebhooks": {
254
265
  "retry": {
255
266
  "maxAttempts": 3,
@@ -277,6 +288,31 @@
277
288
  ]
278
289
  }
279
290
  },
291
+ "GetCalendar": {
292
+ "retry": {
293
+ "maxAttempts": 3,
294
+ "baseDelayMs": 1000,
295
+ "backoff": "exponential",
296
+ "retryOn": [
297
+ 429,
298
+ 503
299
+ ]
300
+ }
301
+ },
302
+ "UpdateCalendar": {
303
+ "retry": {
304
+ "maxAttempts": 3,
305
+ "baseDelayMs": 1000,
306
+ "backoff": "exponential",
307
+ "retryOn": [
308
+ 429,
309
+ 503
310
+ ]
311
+ },
312
+ "idempotent": {
313
+ "natural": true
314
+ }
315
+ },
280
316
  "GetCard": {
281
317
  "retry": {
282
318
  "maxAttempts": 3,
@@ -1291,6 +1327,63 @@
1291
1327
  ]
1292
1328
  }
1293
1329
  },
1330
+ "ListMyBookmarks": {
1331
+ "retry": {
1332
+ "maxAttempts": 3,
1333
+ "baseDelayMs": 1000,
1334
+ "backoff": "exponential",
1335
+ "retryOn": [
1336
+ 429,
1337
+ 503
1338
+ ]
1339
+ },
1340
+ "pagination": {
1341
+ "style": "link",
1342
+ "totalCountHeader": "X-Total-Count",
1343
+ "maxPageSize": 50
1344
+ }
1345
+ },
1346
+ "ListMyDrafts": {
1347
+ "retry": {
1348
+ "maxAttempts": 3,
1349
+ "baseDelayMs": 1000,
1350
+ "backoff": "exponential",
1351
+ "retryOn": [
1352
+ 429,
1353
+ 503
1354
+ ]
1355
+ },
1356
+ "pagination": {
1357
+ "style": "link",
1358
+ "totalCountHeader": "X-Total-Count",
1359
+ "maxPageSize": 50
1360
+ }
1361
+ },
1362
+ "GetMyNote": {
1363
+ "retry": {
1364
+ "maxAttempts": 3,
1365
+ "baseDelayMs": 1000,
1366
+ "backoff": "exponential",
1367
+ "retryOn": [
1368
+ 429,
1369
+ 503
1370
+ ]
1371
+ }
1372
+ },
1373
+ "UpdateMyNote": {
1374
+ "retry": {
1375
+ "maxAttempts": 3,
1376
+ "baseDelayMs": 1000,
1377
+ "backoff": "exponential",
1378
+ "retryOn": [
1379
+ 429,
1380
+ 503
1381
+ ]
1382
+ },
1383
+ "idempotent": {
1384
+ "natural": true
1385
+ }
1386
+ },
1294
1387
  "GetMyPreferences": {
1295
1388
  "retry": {
1296
1389
  "maxAttempts": 3,
@@ -1316,6 +1409,45 @@
1316
1409
  "natural": true
1317
1410
  }
1318
1411
  },
1412
+ "PrioritizeAssignment": {
1413
+ "retry": {
1414
+ "maxAttempts": 3,
1415
+ "baseDelayMs": 1000,
1416
+ "backoff": "exponential",
1417
+ "retryOn": [
1418
+ 429,
1419
+ 503
1420
+ ]
1421
+ },
1422
+ "idempotent": {
1423
+ "natural": true
1424
+ }
1425
+ },
1426
+ "DeprioritizeAssignment": {
1427
+ "retry": {
1428
+ "maxAttempts": 3,
1429
+ "baseDelayMs": 1000,
1430
+ "backoff": "exponential",
1431
+ "retryOn": [
1432
+ 429,
1433
+ 503
1434
+ ]
1435
+ },
1436
+ "idempotent": {
1437
+ "natural": true
1438
+ }
1439
+ },
1440
+ "ReorderUpNext": {
1441
+ "retry": {
1442
+ "maxAttempts": 3,
1443
+ "baseDelayMs": 1000,
1444
+ "backoff": "exponential",
1445
+ "retryOn": [
1446
+ 429,
1447
+ 503
1448
+ ]
1449
+ }
1450
+ },
1319
1451
  "GetMyProfile": {
1320
1452
  "retry": {
1321
1453
  "maxAttempts": 3,
@@ -1868,6 +2000,45 @@
1868
2000
  ]
1869
2001
  }
1870
2002
  },
2003
+ "GetBookmark": {
2004
+ "retry": {
2005
+ "maxAttempts": 3,
2006
+ "baseDelayMs": 1000,
2007
+ "backoff": "exponential",
2008
+ "retryOn": [
2009
+ 429,
2010
+ 503
2011
+ ]
2012
+ }
2013
+ },
2014
+ "CreateBookmark": {
2015
+ "retry": {
2016
+ "maxAttempts": 3,
2017
+ "baseDelayMs": 1000,
2018
+ "backoff": "exponential",
2019
+ "retryOn": [
2020
+ 429,
2021
+ 503
2022
+ ]
2023
+ },
2024
+ "idempotent": {
2025
+ "natural": true
2026
+ }
2027
+ },
2028
+ "DeleteBookmark": {
2029
+ "retry": {
2030
+ "maxAttempts": 3,
2031
+ "baseDelayMs": 1000,
2032
+ "backoff": "exponential",
2033
+ "retryOn": [
2034
+ 429,
2035
+ 503
2036
+ ]
2037
+ },
2038
+ "idempotent": {
2039
+ "natural": true
2040
+ }
2041
+ },
1871
2042
  "ListRecordingBoosts": {
1872
2043
  "retry": {
1873
2044
  "maxAttempts": 3,
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Basecamp
4
+ module Services
5
+ # Service for Bookmarks operations
6
+ #
7
+ # @generated from OpenAPI spec
8
+ class BookmarksService < BaseService
9
+
10
+ # List the current user's bookmarks, most recently bookmarked first (paginated).
11
+ # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
12
+ # @return [Enumerator<Hash>] paginated results
13
+ def list_my_bookmarks(page: nil)
14
+ wrap_paginated(service: "bookmarks", operation: "list_my_bookmarks", is_mutation: false) do
15
+ params = compact_query_params(page: page)
16
+ paginate("/my/bookmarks.json", params: params, operation: "ListMyBookmarks")
17
+ end
18
+ end
19
+
20
+ # Report whether the current user has bookmarked the recording.
21
+ # @param recording_id [Integer] recording id ID
22
+ # @return [Hash] response data
23
+ def get_bookmark(recording_id:)
24
+ with_operation(service: "bookmarks", operation: "get_bookmark", is_mutation: false, resource_id: recording_id) do
25
+ http_get("/recordings/#{recording_id}/bookmark.json", operation: "GetBookmark").json
26
+ end
27
+ end
28
+
29
+ # Bookmark a recording for the current user.
30
+ # @param recording_id [Integer] recording id ID
31
+ # @return [Hash] response data
32
+ def create_bookmark(recording_id:)
33
+ with_operation(service: "bookmarks", operation: "create_bookmark", is_mutation: true, resource_id: recording_id) do
34
+ http_post("/recordings/#{recording_id}/bookmark.json").json
35
+ end
36
+ end
37
+
38
+ # Remove the current user's bookmark from a recording (returns 204 No Content).
39
+ # @param recording_id [Integer] recording id ID
40
+ # @return [void]
41
+ def delete_bookmark(recording_id:)
42
+ with_operation(service: "bookmarks", operation: "delete_bookmark", is_mutation: true, resource_id: recording_id) do
43
+ http_delete("/recordings/#{recording_id}/bookmark.json")
44
+ nil
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Basecamp
4
+ module Services
5
+ # Service for Calendars operations
6
+ #
7
+ # @generated from OpenAPI spec
8
+ class CalendarsService < BaseService
9
+
10
+ # Get a calendar by its bucket id. A Calendar is a top-level BC5 bucketable
11
+ # @param calendar_id [Integer] calendar id ID
12
+ # @return [Hash] response data
13
+ def get_calendar(calendar_id:)
14
+ with_operation(service: "calendars", operation: "get_calendar", is_mutation: false, resource_id: calendar_id) do
15
+ http_get("/calendars/#{calendar_id}", operation: "GetCalendar").json
16
+ end
17
+ end
18
+
19
+ # Update a calendar's display color. An unknown color returns 422 with a JSON
20
+ # @param calendar_id [Integer] calendar id ID
21
+ # @param calendar [Hash] calendar
22
+ # @return [Hash] response data
23
+ def update_calendar(calendar_id:, calendar:)
24
+ with_operation(service: "calendars", operation: "update_calendar", is_mutation: true, resource_id: calendar_id) do
25
+ http_put("/calendars/#{calendar_id}", body: compact_params(calendar: calendar)).json
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Basecamp
4
+ module Services
5
+ # Service for Drafts operations
6
+ #
7
+ # @generated from OpenAPI spec
8
+ class DraftsService < BaseService
9
+
10
+ # List the current user's drafts across their active projects, most recently
11
+ # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
12
+ # @return [Enumerator<Hash>] paginated results
13
+ def list_my_drafts(page: nil)
14
+ wrap_paginated(service: "drafts", operation: "list_my_drafts", is_mutation: false) do
15
+ params = compact_query_params(page: page)
16
+ paginate("/my/drafts.json", params: params, operation: "ListMyDrafts")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -8,59 +8,77 @@ module Basecamp
8
8
  class EverythingService < BaseService
9
9
 
10
10
  # Completed cards across all accessible projects, grouped by project (paginated).
11
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
12
+ # Assignees on nested steps are not considered.
13
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
11
14
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
12
15
  # @return [Enumerator<Hash>] paginated results
13
- def get_everything_completed_cards(page: nil)
16
+ def get_everything_completed_cards(assignee_ids: nil, due: nil, page: nil)
14
17
  wrap_paginated(service: "everything", operation: "get_everything_completed_cards", is_mutation: false) do
15
- params = compact_query_params(page: page)
18
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
16
19
  paginate("/cards/completed.json", params: params, operation: "GetEverythingCompletedCards")
17
20
  end
18
21
  end
19
22
 
20
23
  # Open cards with no due date across all accessible projects, grouped by project (paginated).
24
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
25
+ # Assignees on nested steps are not considered.
26
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
21
27
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
22
28
  # @return [Enumerator<Hash>] paginated results
23
- def get_everything_no_due_date_cards(page: nil)
29
+ def get_everything_no_due_date_cards(assignee_ids: nil, due: nil, page: nil)
24
30
  wrap_paginated(service: "everything", operation: "get_everything_no_due_date_cards", is_mutation: false) do
25
- params = compact_query_params(page: page)
31
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
26
32
  paginate("/cards/no_due_date.json", params: params, operation: "GetEverythingNoDueDateCards")
27
33
  end
28
34
  end
29
35
 
30
36
  # Cards parked in a project's "Not now" column across all accessible projects, grouped by project (paginated).
37
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
38
+ # Assignees on nested steps are not considered.
39
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
31
40
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
32
41
  # @return [Enumerator<Hash>] paginated results
33
- def get_everything_not_now_cards(page: nil)
42
+ def get_everything_not_now_cards(assignee_ids: nil, due: nil, page: nil)
34
43
  wrap_paginated(service: "everything", operation: "get_everything_not_now_cards", is_mutation: false) do
35
- params = compact_query_params(page: page)
44
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
36
45
  paginate("/cards/not_now.json", params: params, operation: "GetEverythingNotNowCards")
37
46
  end
38
47
  end
39
48
 
40
49
  # Incomplete cards in active columns across all accessible projects, grouped by project (paginated).
50
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
51
+ # Assignees on nested steps are not considered.
52
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
41
53
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
42
54
  # @return [Enumerator<Hash>] paginated results
43
- def get_everything_open_cards(page: nil)
55
+ def get_everything_open_cards(assignee_ids: nil, due: nil, page: nil)
44
56
  wrap_paginated(service: "everything", operation: "get_everything_open_cards", is_mutation: false) do
45
- params = compact_query_params(page: page)
57
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
46
58
  paginate("/cards/open.json", params: params, operation: "GetEverythingOpenCards")
47
59
  end
48
60
  end
49
61
 
50
62
  # Get every overdue card across all accessible projects, oldest-due-date-first.
63
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
64
+ # Assignees on nested steps are not considered.
65
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
51
66
  # @return [Array<Hash>] response data
52
- def get_everything_overdue_cards()
67
+ def get_everything_overdue_cards(assignee_ids: nil, due: nil)
53
68
  with_operation(service: "everything", operation: "get_everything_overdue_cards", is_mutation: false) do
54
- http_get("/cards/overdue.json", operation: "GetEverythingOverdueCards").json
69
+ http_get("/cards/overdue.json", params: compact_query_params(assignee_ids: assignee_ids, due: due), operation: "GetEverythingOverdueCards").json
55
70
  end
56
71
  end
57
72
 
58
73
  # Open, unassigned cards across all accessible projects, grouped by project (paginated).
74
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
75
+ # Assignees on nested steps are not considered.
76
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
59
77
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
60
78
  # @return [Enumerator<Hash>] paginated results
61
- def get_everything_unassigned_cards(page: nil)
79
+ def get_everything_unassigned_cards(assignee_ids: nil, due: nil, page: nil)
62
80
  wrap_paginated(service: "everything", operation: "get_everything_unassigned_cards", is_mutation: false) do
63
- params = compact_query_params(page: page)
81
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
64
82
  paginate("/cards/unassigned.json", params: params, operation: "GetEverythingUnassignedCards")
65
83
  end
66
84
  end
@@ -118,49 +136,64 @@ module Basecamp
118
136
  end
119
137
 
120
138
  # Completed to-dos across all accessible projects, grouped by project (paginated).
139
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
140
+ # Assignees on nested steps are not considered.
141
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
121
142
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
122
143
  # @return [Enumerator<Hash>] paginated results
123
- def get_everything_completed_todos(page: nil)
144
+ def get_everything_completed_todos(assignee_ids: nil, due: nil, page: nil)
124
145
  wrap_paginated(service: "everything", operation: "get_everything_completed_todos", is_mutation: false) do
125
- params = compact_query_params(page: page)
146
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
126
147
  paginate("/todos/completed.json", params: params, operation: "GetEverythingCompletedTodos")
127
148
  end
128
149
  end
129
150
 
130
151
  # Open to-dos with no due date across all accessible projects, grouped by project (paginated).
152
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
153
+ # Assignees on nested steps are not considered.
154
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
131
155
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
132
156
  # @return [Enumerator<Hash>] paginated results
133
- def get_everything_no_due_date_todos(page: nil)
157
+ def get_everything_no_due_date_todos(assignee_ids: nil, due: nil, page: nil)
134
158
  wrap_paginated(service: "everything", operation: "get_everything_no_due_date_todos", is_mutation: false) do
135
- params = compact_query_params(page: page)
159
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
136
160
  paginate("/todos/no_due_date.json", params: params, operation: "GetEverythingNoDueDateTodos")
137
161
  end
138
162
  end
139
163
 
140
164
  # Active, incomplete to-dos across all accessible projects, grouped by project (paginated).
165
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
166
+ # Assignees on nested steps are not considered.
167
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
141
168
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
142
169
  # @return [Enumerator<Hash>] paginated results
143
- def get_everything_open_todos(page: nil)
170
+ def get_everything_open_todos(assignee_ids: nil, due: nil, page: nil)
144
171
  wrap_paginated(service: "everything", operation: "get_everything_open_todos", is_mutation: false) do
145
- params = compact_query_params(page: page)
172
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
146
173
  paginate("/todos/open.json", params: params, operation: "GetEverythingOpenTodos")
147
174
  end
148
175
  end
149
176
 
150
177
  # Get every overdue to-do across all accessible projects, oldest-due-date-first.
178
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
179
+ # Assignees on nested steps are not considered.
180
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
151
181
  # @return [Array<Hash>] response data
152
- def get_everything_overdue_todos()
182
+ def get_everything_overdue_todos(assignee_ids: nil, due: nil)
153
183
  with_operation(service: "everything", operation: "get_everything_overdue_todos", is_mutation: false) do
154
- http_get("/todos/overdue.json", operation: "GetEverythingOverdueTodos").json
184
+ http_get("/todos/overdue.json", params: compact_query_params(assignee_ids: assignee_ids, due: due), operation: "GetEverythingOverdueTodos").json
155
185
  end
156
186
  end
157
187
 
158
188
  # Open, unassigned to-dos across all accessible projects, grouped by project (paginated).
189
+ # @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
190
+ # Assignees on nested steps are not considered.
191
+ # @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
159
192
  # @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
160
193
  # @return [Enumerator<Hash>] paginated results
161
- def get_everything_unassigned_todos(page: nil)
194
+ def get_everything_unassigned_todos(assignee_ids: nil, due: nil, page: nil)
162
195
  wrap_paginated(service: "everything", operation: "get_everything_unassigned_todos", is_mutation: false) do
163
- params = compact_query_params(page: page)
196
+ params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
164
197
  paginate("/todos/unassigned.json", params: params, operation: "GetEverythingUnassignedTodos")
165
198
  end
166
199
  end
@@ -32,6 +32,37 @@ module Basecamp
32
32
  http_get("/my/assignments/due.json", params: compact_query_params(scope: scope), operation: "GetMyDueAssignments").json
33
33
  end
34
34
  end
35
+
36
+ # Add a recording to Up Next — the current user's ordered list of prioritized
37
+ # @param id [Integer] The recording id to prioritize.
38
+ # @return [void]
39
+ def prioritize_assignment(id:)
40
+ with_operation(service: "myassignments", operation: "prioritize_assignment", is_mutation: true) do
41
+ http_post("/my/priorities.json", body: compact_params(id: id))
42
+ nil
43
+ end
44
+ end
45
+
46
+ # Remove a recording from Up Next (returns 204 No Content). Exact-target:
47
+ # @param recording_id [Integer] recording id ID
48
+ # @return [void]
49
+ def deprioritize_assignment(recording_id:)
50
+ with_operation(service: "myassignments", operation: "deprioritize_assignment", is_mutation: true, resource_id: recording_id) do
51
+ http_delete("/my/priorities/#{recording_id}")
52
+ nil
53
+ end
54
+ end
55
+
56
+ # Move an already-prioritized recording to a new 1-based position in Up Next
57
+ # @param source_id [Integer] The recording id to move, chosen the same way as when prioritizing.
58
+ # @param position [Integer] The 1-based position to move it to.
59
+ # @return [void]
60
+ def reorder_up_next(source_id:, position:)
61
+ with_operation(service: "myassignments", operation: "reorder_up_next", is_mutation: true) do
62
+ http_post("/my/priority_moves.json", body: compact_params(source_id: source_id, position: position))
63
+ nil
64
+ end
65
+ end
35
66
  end
36
67
  end
37
68
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Basecamp
4
+ module Services
5
+ # Service for MyNotes operations
6
+ #
7
+ # @generated from OpenAPI spec
8
+ class MyNotesService < BaseService
9
+
10
+ # Get the authenticated user's note — a per-person notebook singleton at
11
+ # @return [Hash] response data
12
+ def get_my_note()
13
+ with_operation(service: "mynotes", operation: "get_my_note", is_mutation: false) do
14
+ http_get("/my/notes.json", operation: "GetMyNote").json
15
+ end
16
+ end
17
+
18
+ # Replace the note's content, recording a new revision server-side. The first
19
+ # @param note [Hash] note
20
+ # @return [Hash] response data
21
+ def update_my_note(note:)
22
+ with_operation(service: "mynotes", operation: "update_my_note", is_mutation: true) do
23
+ http_put("/my/notes.json", body: compact_params(note: note)).json
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -7,6 +7,23 @@ module Basecamp
7
7
  # @generated from OpenAPI spec
8
8
  class TodosService < BaseService
9
9
 
10
+ # Create a to-do directly under a project's to-do set, outside any to-do list.
11
+ # @param bucket_id [Integer] bucket id ID
12
+ # @param todoset_id [Integer] todoset id ID
13
+ # @param content [String] content
14
+ # @param description [String, nil] description
15
+ # @param assignee_ids [Array, nil] assignee ids
16
+ # @param completion_subscriber_ids [Array, nil] completion subscriber ids
17
+ # @param notify [Boolean, nil] notify
18
+ # @param due_on [String, nil] due on (YYYY-MM-DD)
19
+ # @param starts_on [String, nil] starts on (YYYY-MM-DD)
20
+ # @return [Hash] response data
21
+ def create_todoset_todo(bucket_id:, todoset_id:, content:, description: nil, assignee_ids: nil, completion_subscriber_ids: nil, notify: nil, due_on: nil, starts_on: nil)
22
+ with_operation(service: "todos", operation: "create_todoset_todo", is_mutation: true, project_id: bucket_id, resource_id: todoset_id) do
23
+ http_post("/buckets/#{bucket_id}/todosets/#{todoset_id}/todos.json", body: compact_params(content: content, description: description, assignee_ids: assignee_ids, completion_subscriber_ids: completion_subscriber_ids, notify: notify, due_on: due_on, starts_on: starts_on)).json
24
+ end
25
+ end
26
+
10
27
  # List todos in a todolist
11
28
  # @param todolist_id [Integer] todolist id ID
12
29
  # @param status [String, nil] active|archived|trashed
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Auto-generated from OpenAPI spec. Do not edit manually.
4
- # Generated: 2026-07-30T23:14:00Z
4
+ # Generated: 2026-07-31T15:59:31Z
5
5
 
6
6
  require "json"
7
7
  require "time"
@@ -255,6 +255,62 @@ module Basecamp
255
255
  end
256
256
  end
257
257
 
258
+ # Bookmark
259
+ class Bookmark
260
+ include TypeHelpers
261
+ attr_accessor :created_at, :id, :recording, :updated_at
262
+
263
+ # @return [Array<Symbol>]
264
+ def self.required_fields
265
+ %i[created_at id recording updated_at].freeze
266
+ end
267
+
268
+ def initialize(data = {})
269
+ @created_at = parse_datetime(data["created_at"])
270
+ @id = parse_integer(data["id"])
271
+ @recording = parse_type(data["recording"], "Recording")
272
+ @updated_at = parse_datetime(data["updated_at"])
273
+ end
274
+
275
+ def to_h
276
+ {
277
+ "created_at" => @created_at,
278
+ "id" => @id,
279
+ "recording" => @recording,
280
+ "updated_at" => @updated_at,
281
+ }.compact
282
+ end
283
+
284
+ def to_json(*args)
285
+ to_h.to_json(*args)
286
+ end
287
+ end
288
+
289
+ # BookmarkStatus
290
+ class BookmarkStatus
291
+ include TypeHelpers
292
+ attr_accessor :bookmarked
293
+
294
+ # @return [Array<Symbol>]
295
+ def self.required_fields
296
+ %i[bookmarked].freeze
297
+ end
298
+
299
+ def initialize(data = {})
300
+ @bookmarked = parse_boolean(data["bookmarked"])
301
+ end
302
+
303
+ def to_h
304
+ {
305
+ "bookmarked" => @bookmarked,
306
+ }.compact
307
+ end
308
+
309
+ def to_json(*args)
310
+ to_h.to_json(*args)
311
+ end
312
+ end
313
+
258
314
  # Boost
259
315
  class Boost
260
316
  include TypeHelpers
@@ -342,6 +398,72 @@ module Basecamp
342
398
  end
343
399
  end
344
400
 
401
+ # Calendar
402
+ class Calendar
403
+ include TypeHelpers
404
+ attr_accessor :app_url, :color, :created_at, :id, :name, :schedule_url, :type, :updated_at, :url
405
+
406
+ # @return [Array<Symbol>]
407
+ def self.required_fields
408
+ %i[app_url color created_at id name schedule_url type updated_at url].freeze
409
+ end
410
+
411
+ def initialize(data = {})
412
+ @app_url = data["app_url"]
413
+ @color = data["color"]
414
+ @created_at = parse_datetime(data["created_at"])
415
+ @id = parse_integer(data["id"])
416
+ @name = data["name"]
417
+ @schedule_url = data["schedule_url"]
418
+ @type = data["type"]
419
+ @updated_at = parse_datetime(data["updated_at"])
420
+ @url = data["url"]
421
+ end
422
+
423
+ def to_h
424
+ {
425
+ "app_url" => @app_url,
426
+ "color" => @color,
427
+ "created_at" => @created_at,
428
+ "id" => @id,
429
+ "name" => @name,
430
+ "schedule_url" => @schedule_url,
431
+ "type" => @type,
432
+ "updated_at" => @updated_at,
433
+ "url" => @url,
434
+ }.compact
435
+ end
436
+
437
+ def to_json(*args)
438
+ to_h.to_json(*args)
439
+ end
440
+ end
441
+
442
+ # CalendarAttributes
443
+ class CalendarAttributes
444
+ include TypeHelpers
445
+ attr_accessor :color
446
+
447
+ # @return [Array<Symbol>]
448
+ def self.required_fields
449
+ %i[color].freeze
450
+ end
451
+
452
+ def initialize(data = {})
453
+ @color = data["color"]
454
+ end
455
+
456
+ def to_h
457
+ {
458
+ "color" => @color,
459
+ }.compact
460
+ end
461
+
462
+ def to_json(*args)
463
+ to_h.to_json(*args)
464
+ end
465
+ end
466
+
345
467
  # Campfire
346
468
  class Campfire
347
469
  include TypeHelpers
@@ -1351,6 +1473,107 @@ module Basecamp
1351
1473
  end
1352
1474
  end
1353
1475
 
1476
+ # Draft
1477
+ class Draft
1478
+ include TypeHelpers
1479
+ attr_accessor :app_url, :bucket, :created_at, :excerpt, :id, :parent, :scheduled_posting_at, :title, :type, :updated_at
1480
+
1481
+ # @return [Array<Symbol>]
1482
+ def self.required_fields
1483
+ %i[app_url bucket created_at excerpt id parent scheduled_posting_at title type updated_at].freeze
1484
+ end
1485
+
1486
+ def initialize(data = {})
1487
+ @app_url = data["app_url"]
1488
+ @bucket = parse_type(data["bucket"], "DraftBucket")
1489
+ @created_at = parse_datetime(data["created_at"])
1490
+ @excerpt = data["excerpt"]
1491
+ @id = parse_integer(data["id"])
1492
+ @parent = data["parent"]
1493
+ @scheduled_posting_at = data["scheduled_posting_at"]
1494
+ @title = data["title"]
1495
+ @type = data["type"]
1496
+ @updated_at = parse_datetime(data["updated_at"])
1497
+ end
1498
+
1499
+ def to_h
1500
+ {
1501
+ "app_url" => @app_url,
1502
+ "bucket" => @bucket,
1503
+ "created_at" => @created_at,
1504
+ "excerpt" => @excerpt,
1505
+ "id" => @id,
1506
+ "parent" => @parent,
1507
+ "scheduled_posting_at" => @scheduled_posting_at,
1508
+ "title" => @title,
1509
+ "type" => @type,
1510
+ "updated_at" => @updated_at,
1511
+ }.reject { |k, v| v.nil? && !["scheduled_posting_at"].include?(k) }
1512
+ end
1513
+
1514
+ def to_json(*args)
1515
+ to_h.to_json(*args)
1516
+ end
1517
+ end
1518
+
1519
+ # DraftBucket
1520
+ class DraftBucket
1521
+ include TypeHelpers
1522
+ attr_accessor :app_url, :id, :name
1523
+
1524
+ # @return [Array<Symbol>]
1525
+ def self.required_fields
1526
+ %i[app_url id name].freeze
1527
+ end
1528
+
1529
+ def initialize(data = {})
1530
+ @app_url = data["app_url"]
1531
+ @id = parse_integer(data["id"])
1532
+ @name = data["name"]
1533
+ end
1534
+
1535
+ def to_h
1536
+ {
1537
+ "app_url" => @app_url,
1538
+ "id" => @id,
1539
+ "name" => @name,
1540
+ }.compact
1541
+ end
1542
+
1543
+ def to_json(*args)
1544
+ to_h.to_json(*args)
1545
+ end
1546
+ end
1547
+
1548
+ # DraftParent
1549
+ class DraftParent
1550
+ include TypeHelpers
1551
+ attr_accessor :app_url, :id, :title
1552
+
1553
+ # @return [Array<Symbol>]
1554
+ def self.required_fields
1555
+ %i[app_url id title].freeze
1556
+ end
1557
+
1558
+ def initialize(data = {})
1559
+ @app_url = data["app_url"]
1560
+ @id = parse_integer(data["id"])
1561
+ @title = data["title"]
1562
+ end
1563
+
1564
+ def to_h
1565
+ {
1566
+ "app_url" => @app_url,
1567
+ "id" => @id,
1568
+ "title" => @title,
1569
+ }.compact
1570
+ end
1571
+
1572
+ def to_json(*args)
1573
+ to_h.to_json(*args)
1574
+ end
1575
+ end
1576
+
1354
1577
  # Event
1355
1578
  class Event
1356
1579
  include TypeHelpers
@@ -1496,6 +1719,31 @@ module Basecamp
1496
1719
  end
1497
1720
  end
1498
1721
 
1722
+ # FieldKeyedErrors
1723
+ class FieldKeyedErrors
1724
+ include TypeHelpers
1725
+ attr_accessor :errors
1726
+
1727
+ # @return [Array<Symbol>]
1728
+ def self.required_fields
1729
+ %i[errors].freeze
1730
+ end
1731
+
1732
+ def initialize(data = {})
1733
+ @errors = parse_type(data["errors"], "FieldErrorMap")
1734
+ end
1735
+
1736
+ def to_h
1737
+ {
1738
+ "errors" => @errors,
1739
+ }.compact
1740
+ end
1741
+
1742
+ def to_json(*args)
1743
+ to_h.to_json(*args)
1744
+ end
1745
+ end
1746
+
1499
1747
  # Forward
1500
1748
  class Forward
1501
1749
  include TypeHelpers
@@ -2279,6 +2527,70 @@ module Basecamp
2279
2527
  end
2280
2528
  end
2281
2529
 
2530
+ # MyNote
2531
+ class MyNote
2532
+ include TypeHelpers
2533
+ attr_accessor :app_url, :content, :content_attachments, :created_at, :id, :type, :updated_at, :url
2534
+
2535
+ # @return [Array<Symbol>]
2536
+ def self.required_fields
2537
+ %i[app_url content content_attachments created_at id type updated_at url].freeze
2538
+ end
2539
+
2540
+ def initialize(data = {})
2541
+ @app_url = data["app_url"]
2542
+ @content = data["content"]
2543
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
2544
+ @created_at = data["created_at"]
2545
+ @id = data["id"]
2546
+ @type = data["type"]
2547
+ @updated_at = data["updated_at"]
2548
+ @url = data["url"]
2549
+ end
2550
+
2551
+ def to_h
2552
+ {
2553
+ "app_url" => @app_url,
2554
+ "content" => @content,
2555
+ "content_attachments" => @content_attachments,
2556
+ "created_at" => @created_at,
2557
+ "id" => @id,
2558
+ "type" => @type,
2559
+ "updated_at" => @updated_at,
2560
+ "url" => @url,
2561
+ }.reject { |k, v| v.nil? && !["created_at", "id", "updated_at"].include?(k) }
2562
+ end
2563
+
2564
+ def to_json(*args)
2565
+ to_h.to_json(*args)
2566
+ end
2567
+ end
2568
+
2569
+ # MyNoteAttributes
2570
+ class MyNoteAttributes
2571
+ include TypeHelpers
2572
+ attr_accessor :content
2573
+
2574
+ # @return [Array<Symbol>]
2575
+ def self.required_fields
2576
+ %i[content].freeze
2577
+ end
2578
+
2579
+ def initialize(data = {})
2580
+ @content = data["content"]
2581
+ end
2582
+
2583
+ def to_h
2584
+ {
2585
+ "content" => @content,
2586
+ }.compact
2587
+ end
2588
+
2589
+ def to_json(*args)
2590
+ to_h.to_json(*args)
2591
+ end
2592
+ end
2593
+
2282
2594
  # Notification
2283
2595
  class Notification
2284
2596
  include TypeHelpers
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Basecamp
4
- VERSION = "0.11.0"
5
- API_VERSION = "2026-07-30"
4
+ VERSION = "0.12.0"
5
+ API_VERSION = "2026-07-31"
6
6
  end
@@ -116,7 +116,7 @@ class ServiceGenerator
116
116
  'ClientVisibility' => %w[SetClientVisibility]
117
117
  },
118
118
  'Todos' => {
119
- 'Todos' => %w[ListTodos CreateTodo GetTodo ReplaceTodo CompleteTodo UncompleteTodo TrashTodo],
119
+ 'Todos' => %w[ListTodos CreateTodo CreateTodosetTodo GetTodo ReplaceTodo CompleteTodo UncompleteTodo TrashTodo],
120
120
  'Todolists' => %w[GetTodolistOrGroup UpdateTodolistOrGroup ListTodolists CreateTodolist RepositionTodolist],
121
121
  'Todosets' => %w[GetTodoset],
122
122
  'HillCharts' => %w[GetHillChart UpdateHillChartSettings],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: basecamp-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Basecamp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-07-31 00:00:00.000000000 Z
11
+ date: 2026-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -182,7 +182,9 @@ files:
182
182
  - lib/basecamp/generated/services/attachments_service.rb
183
183
  - lib/basecamp/generated/services/automation_service.rb
184
184
  - lib/basecamp/generated/services/base_service.rb
185
+ - lib/basecamp/generated/services/bookmarks_service.rb
185
186
  - lib/basecamp/generated/services/boosts_service.rb
187
+ - lib/basecamp/generated/services/calendars_service.rb
186
188
  - lib/basecamp/generated/services/campfires_service.rb
187
189
  - lib/basecamp/generated/services/card_columns_service.rb
188
190
  - lib/basecamp/generated/services/card_steps_service.rb
@@ -195,6 +197,7 @@ files:
195
197
  - lib/basecamp/generated/services/client_visibility_service.rb
196
198
  - lib/basecamp/generated/services/comments_service.rb
197
199
  - lib/basecamp/generated/services/documents_service.rb
200
+ - lib/basecamp/generated/services/drafts_service.rb
198
201
  - lib/basecamp/generated/services/events_service.rb
199
202
  - lib/basecamp/generated/services/everything_service.rb
200
203
  - lib/basecamp/generated/services/forwards_service.rb
@@ -205,6 +208,7 @@ files:
205
208
  - lib/basecamp/generated/services/message_types_service.rb
206
209
  - lib/basecamp/generated/services/messages_service.rb
207
210
  - lib/basecamp/generated/services/my_assignments_service.rb
211
+ - lib/basecamp/generated/services/my_notes_service.rb
208
212
  - lib/basecamp/generated/services/my_notifications_service.rb
209
213
  - lib/basecamp/generated/services/people_service.rb
210
214
  - lib/basecamp/generated/services/projects_service.rb