@37signals/basecamp 0.27.1 → 0.28.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.
Files changed (40) hide show
  1. package/dist/client.d.ts +1 -1
  2. package/dist/client.js +3 -3
  3. package/dist/client.js.map +1 -1
  4. package/dist/generated/metadata.d.ts.map +1 -1
  5. package/dist/generated/metadata.js +29 -1
  6. package/dist/generated/metadata.js.map +1 -1
  7. package/dist/generated/metadata.ts +29 -1
  8. package/dist/generated/openapi-stripped.json +291 -5
  9. package/dist/generated/path-mapping.d.ts.map +1 -1
  10. package/dist/generated/path-mapping.js +2 -0
  11. package/dist/generated/path-mapping.js.map +1 -1
  12. package/dist/generated/path-mapping.ts +2 -0
  13. package/dist/generated/person-id-sites.d.ts.map +1 -1
  14. package/dist/generated/person-id-sites.js +58 -0
  15. package/dist/generated/person-id-sites.js.map +1 -1
  16. package/dist/generated/person-id-sites.ts +58 -0
  17. package/dist/generated/schema.d.ts +231 -1
  18. package/dist/generated/services/projects.d.ts +37 -0
  19. package/dist/generated/services/projects.d.ts.map +1 -1
  20. package/dist/generated/services/projects.js +50 -0
  21. package/dist/generated/services/projects.js.map +1 -1
  22. package/dist/generated/services/projects.ts +76 -0
  23. package/dist/generated/services/tools.d.ts +1 -1
  24. package/dist/generated/services/tools.js +1 -1
  25. package/dist/generated/services/tools.ts +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/services/base.d.ts +4 -2
  30. package/dist/services/base.d.ts.map +1 -1
  31. package/dist/services/base.js +13 -3
  32. package/dist/services/base.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/generated/metadata.ts +29 -1
  35. package/src/generated/openapi-stripped.json +291 -5
  36. package/src/generated/path-mapping.ts +2 -0
  37. package/src/generated/person-id-sites.ts +58 -0
  38. package/src/generated/schema.d.ts +231 -1
  39. package/src/generated/services/projects.ts +76 -0
  40. package/src/generated/services/tools.ts +1 -1
@@ -20,10 +20,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
20
20
  "CreateCard": [
21
21
  "assignees.[]",
22
22
  "completer",
23
+ "completion.creator",
23
24
  "completion_subscribers.[]",
24
25
  "creator",
25
26
  "steps.[].assignees.[]",
26
27
  "steps.[].completer",
28
+ "steps.[].completion.creator",
27
29
  "steps.[].creator"
28
30
  ],
29
31
  "CreateCardColumn": [
@@ -33,6 +35,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
33
35
  "CreateCardStep": [
34
36
  "assignees.[]",
35
37
  "completer",
38
+ "completion.creator",
36
39
  "creator"
37
40
  ],
38
41
  "CreateCloudFile": [
@@ -72,6 +75,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
72
75
  "CreateSubtask": [
73
76
  "assignees.[]",
74
77
  "completer",
78
+ "completion.creator",
75
79
  "creator"
76
80
  ],
77
81
  "CreateTemplateLibraryCardTable": [
@@ -106,10 +110,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
106
110
  ],
107
111
  "CreateTodo": [
108
112
  "assignees.[]",
113
+ "completion.creator",
109
114
  "completion_subscribers.[]",
110
115
  "creator",
111
116
  "steps.[].assignees.[]",
112
117
  "steps.[].completer",
118
+ "steps.[].completion.creator",
113
119
  "steps.[].creator"
114
120
  ],
115
121
  "CreateTodolist": [
@@ -120,10 +126,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
120
126
  ],
121
127
  "CreateTodosetTodo": [
122
128
  "assignees.[]",
129
+ "completion.creator",
123
130
  "completion_subscribers.[]",
124
131
  "creator",
125
132
  "steps.[].assignees.[]",
126
133
  "steps.[].completer",
134
+ "steps.[].completion.creator",
127
135
  "steps.[].creator"
128
136
  ],
129
137
  "CreateTool": [
@@ -163,10 +171,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
163
171
  "GetAssignedTodos": [
164
172
  "person",
165
173
  "todos.[].assignees.[]",
174
+ "todos.[].completion.creator",
166
175
  "todos.[].completion_subscribers.[]",
167
176
  "todos.[].creator",
168
177
  "todos.[].steps.[].assignees.[]",
169
178
  "todos.[].steps.[].completer",
179
+ "todos.[].steps.[].completion.creator",
170
180
  "todos.[].steps.[].creator"
171
181
  ],
172
182
  "GetBoost": [
@@ -185,10 +195,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
185
195
  "GetCard": [
186
196
  "assignees.[]",
187
197
  "completer",
198
+ "completion.creator",
188
199
  "completion_subscribers.[]",
189
200
  "creator",
190
201
  "steps.[].assignees.[]",
191
202
  "steps.[].completer",
203
+ "steps.[].completion.creator",
192
204
  "steps.[].creator"
193
205
  ],
194
206
  "GetCardColumn": [
@@ -198,6 +210,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
198
210
  "GetCardStep": [
199
211
  "assignees.[]",
200
212
  "completer",
213
+ "completion.creator",
201
214
  "creator"
202
215
  ],
203
216
  "GetCardTable": [
@@ -236,18 +249,22 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
236
249
  "GetEverythingCompletedCards": [
237
250
  "[].cards.[].assignees.[]",
238
251
  "[].cards.[].completer",
252
+ "[].cards.[].completion.creator",
239
253
  "[].cards.[].completion_subscribers.[]",
240
254
  "[].cards.[].creator",
241
255
  "[].cards.[].steps.[].assignees.[]",
242
256
  "[].cards.[].steps.[].completer",
257
+ "[].cards.[].steps.[].completion.creator",
243
258
  "[].cards.[].steps.[].creator"
244
259
  ],
245
260
  "GetEverythingCompletedTodos": [
246
261
  "[].todos.[].assignees.[]",
262
+ "[].todos.[].completion.creator",
247
263
  "[].todos.[].completion_subscribers.[]",
248
264
  "[].todos.[].creator",
249
265
  "[].todos.[].steps.[].assignees.[]",
250
266
  "[].todos.[].steps.[].completer",
267
+ "[].todos.[].steps.[].completion.creator",
251
268
  "[].todos.[].steps.[].creator"
252
269
  ],
253
270
  "GetEverythingFiles": [
@@ -262,78 +279,96 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
262
279
  "GetEverythingNoDueDateCards": [
263
280
  "[].cards.[].assignees.[]",
264
281
  "[].cards.[].completer",
282
+ "[].cards.[].completion.creator",
265
283
  "[].cards.[].completion_subscribers.[]",
266
284
  "[].cards.[].creator",
267
285
  "[].cards.[].steps.[].assignees.[]",
268
286
  "[].cards.[].steps.[].completer",
287
+ "[].cards.[].steps.[].completion.creator",
269
288
  "[].cards.[].steps.[].creator"
270
289
  ],
271
290
  "GetEverythingNoDueDateTodos": [
272
291
  "[].todos.[].assignees.[]",
292
+ "[].todos.[].completion.creator",
273
293
  "[].todos.[].completion_subscribers.[]",
274
294
  "[].todos.[].creator",
275
295
  "[].todos.[].steps.[].assignees.[]",
276
296
  "[].todos.[].steps.[].completer",
297
+ "[].todos.[].steps.[].completion.creator",
277
298
  "[].todos.[].steps.[].creator"
278
299
  ],
279
300
  "GetEverythingNotNowCards": [
280
301
  "[].cards.[].assignees.[]",
281
302
  "[].cards.[].completer",
303
+ "[].cards.[].completion.creator",
282
304
  "[].cards.[].completion_subscribers.[]",
283
305
  "[].cards.[].creator",
284
306
  "[].cards.[].steps.[].assignees.[]",
285
307
  "[].cards.[].steps.[].completer",
308
+ "[].cards.[].steps.[].completion.creator",
286
309
  "[].cards.[].steps.[].creator"
287
310
  ],
288
311
  "GetEverythingOpenCards": [
289
312
  "[].cards.[].assignees.[]",
290
313
  "[].cards.[].completer",
314
+ "[].cards.[].completion.creator",
291
315
  "[].cards.[].completion_subscribers.[]",
292
316
  "[].cards.[].creator",
293
317
  "[].cards.[].steps.[].assignees.[]",
294
318
  "[].cards.[].steps.[].completer",
319
+ "[].cards.[].steps.[].completion.creator",
295
320
  "[].cards.[].steps.[].creator"
296
321
  ],
297
322
  "GetEverythingOpenTodos": [
298
323
  "[].todos.[].assignees.[]",
324
+ "[].todos.[].completion.creator",
299
325
  "[].todos.[].completion_subscribers.[]",
300
326
  "[].todos.[].creator",
301
327
  "[].todos.[].steps.[].assignees.[]",
302
328
  "[].todos.[].steps.[].completer",
329
+ "[].todos.[].steps.[].completion.creator",
303
330
  "[].todos.[].steps.[].creator"
304
331
  ],
305
332
  "GetEverythingOverdueCards": [
306
333
  "[].assignees.[]",
307
334
  "[].completer",
335
+ "[].completion.creator",
308
336
  "[].completion_subscribers.[]",
309
337
  "[].creator",
310
338
  "[].steps.[].assignees.[]",
311
339
  "[].steps.[].completer",
340
+ "[].steps.[].completion.creator",
312
341
  "[].steps.[].creator"
313
342
  ],
314
343
  "GetEverythingOverdueTodos": [
315
344
  "[].assignees.[]",
345
+ "[].completion.creator",
316
346
  "[].completion_subscribers.[]",
317
347
  "[].creator",
318
348
  "[].steps.[].assignees.[]",
319
349
  "[].steps.[].completer",
350
+ "[].steps.[].completion.creator",
320
351
  "[].steps.[].creator"
321
352
  ],
322
353
  "GetEverythingUnassignedCards": [
323
354
  "[].cards.[].assignees.[]",
324
355
  "[].cards.[].completer",
356
+ "[].cards.[].completion.creator",
325
357
  "[].cards.[].completion_subscribers.[]",
326
358
  "[].cards.[].creator",
327
359
  "[].cards.[].steps.[].assignees.[]",
328
360
  "[].cards.[].steps.[].completer",
361
+ "[].cards.[].steps.[].completion.creator",
329
362
  "[].cards.[].steps.[].creator"
330
363
  ],
331
364
  "GetEverythingUnassignedTodos": [
332
365
  "[].todos.[].assignees.[]",
366
+ "[].todos.[].completion.creator",
333
367
  "[].todos.[].completion_subscribers.[]",
334
368
  "[].todos.[].creator",
335
369
  "[].todos.[].steps.[].assignees.[]",
336
370
  "[].todos.[].steps.[].completer",
371
+ "[].todos.[].steps.[].completion.creator",
337
372
  "[].todos.[].steps.[].creator"
338
373
  ],
339
374
  "GetForward": [
@@ -374,28 +409,36 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
374
409
  ],
375
410
  "GetOverdueTodos": [
376
411
  "over_a_month_late.[].assignees.[]",
412
+ "over_a_month_late.[].completion.creator",
377
413
  "over_a_month_late.[].completion_subscribers.[]",
378
414
  "over_a_month_late.[].creator",
379
415
  "over_a_month_late.[].steps.[].assignees.[]",
380
416
  "over_a_month_late.[].steps.[].completer",
417
+ "over_a_month_late.[].steps.[].completion.creator",
381
418
  "over_a_month_late.[].steps.[].creator",
382
419
  "over_a_week_late.[].assignees.[]",
420
+ "over_a_week_late.[].completion.creator",
383
421
  "over_a_week_late.[].completion_subscribers.[]",
384
422
  "over_a_week_late.[].creator",
385
423
  "over_a_week_late.[].steps.[].assignees.[]",
386
424
  "over_a_week_late.[].steps.[].completer",
425
+ "over_a_week_late.[].steps.[].completion.creator",
387
426
  "over_a_week_late.[].steps.[].creator",
388
427
  "over_three_months_late.[].assignees.[]",
428
+ "over_three_months_late.[].completion.creator",
389
429
  "over_three_months_late.[].completion_subscribers.[]",
390
430
  "over_three_months_late.[].creator",
391
431
  "over_three_months_late.[].steps.[].assignees.[]",
392
432
  "over_three_months_late.[].steps.[].completer",
433
+ "over_three_months_late.[].steps.[].completion.creator",
393
434
  "over_three_months_late.[].steps.[].creator",
394
435
  "under_a_week_late.[].assignees.[]",
436
+ "under_a_week_late.[].completion.creator",
395
437
  "under_a_week_late.[].completion_subscribers.[]",
396
438
  "under_a_week_late.[].creator",
397
439
  "under_a_week_late.[].steps.[].assignees.[]",
398
440
  "under_a_week_late.[].steps.[].completer",
441
+ "under_a_week_late.[].steps.[].completion.creator",
399
442
  "under_a_week_late.[].steps.[].creator"
400
443
  ],
401
444
  "GetPerson": [
@@ -451,6 +494,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
451
494
  "GetSubtask": [
452
495
  "assignees.[]",
453
496
  "completer",
497
+ "completion.creator",
454
498
  "creator"
455
499
  ],
456
500
  "GetTemplateLibraryCardTables": [
@@ -485,10 +529,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
485
529
  ],
486
530
  "GetTodo": [
487
531
  "assignees.[]",
532
+ "completion.creator",
488
533
  "completion_subscribers.[]",
489
534
  "creator",
490
535
  "steps.[].assignees.[]",
491
536
  "steps.[].completer",
537
+ "steps.[].completion.creator",
492
538
  "steps.[].creator"
493
539
  ],
494
540
  "GetTodolistOrGroup": [
@@ -529,10 +575,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
529
575
  "ListCards": [
530
576
  "[].assignees.[]",
531
577
  "[].completer",
578
+ "[].completion.creator",
532
579
  "[].completion_subscribers.[]",
533
580
  "[].creator",
534
581
  "[].steps.[].assignees.[]",
535
582
  "[].steps.[].completer",
583
+ "[].steps.[].completion.creator",
536
584
  "[].steps.[].creator"
537
585
  ],
538
586
  "ListClientApprovals": [
@@ -608,6 +656,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
608
656
  "ListSubtasks": [
609
657
  "[].assignees.[]",
610
658
  "[].completer",
659
+ "[].completion.creator",
611
660
  "[].creator"
612
661
  ],
613
662
  "ListTodolistGroups": [
@@ -618,10 +667,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
618
667
  ],
619
668
  "ListTodos": [
620
669
  "[].assignees.[]",
670
+ "[].completion.creator",
621
671
  "[].completion_subscribers.[]",
622
672
  "[].creator",
623
673
  "[].steps.[].assignees.[]",
624
674
  "[].steps.[].completer",
675
+ "[].steps.[].completion.creator",
625
676
  "[].steps.[].creator"
626
677
  ],
627
678
  "ListUploadVersions": [
@@ -647,10 +698,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
647
698
  ],
648
699
  "ReplaceTodo": [
649
700
  "assignees.[]",
701
+ "completion.creator",
650
702
  "completion_subscribers.[]",
651
703
  "creator",
652
704
  "steps.[].assignees.[]",
653
705
  "steps.[].completer",
706
+ "steps.[].completion.creator",
654
707
  "steps.[].creator"
655
708
  ],
656
709
  "Search": [
@@ -664,6 +717,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
664
717
  "SetCardStepCompletion": [
665
718
  "assignees.[]",
666
719
  "completer",
720
+ "completion.creator",
667
721
  "creator"
668
722
  ],
669
723
  "SetClientVisibility": [
@@ -681,10 +735,12 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
681
735
  "UpdateCard": [
682
736
  "assignees.[]",
683
737
  "completer",
738
+ "completion.creator",
684
739
  "completion_subscribers.[]",
685
740
  "creator",
686
741
  "steps.[].assignees.[]",
687
742
  "steps.[].completer",
743
+ "steps.[].completion.creator",
688
744
  "steps.[].creator"
689
745
  ],
690
746
  "UpdateCardColumn": [
@@ -694,6 +750,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
694
750
  "UpdateCardStep": [
695
751
  "assignees.[]",
696
752
  "completer",
753
+ "completion.creator",
697
754
  "creator"
698
755
  ],
699
756
  "UpdateCloudFile": [
@@ -731,6 +788,7 @@ export const PERSON_ID_SITES: Readonly<Record<string, readonly string[]>> = {
731
788
  "UpdateSubtask": [
732
789
  "assignees.[]",
733
790
  "completer",
791
+ "completion.creator",
734
792
  "creator"
735
793
  ],
736
794
  "UpdateTimesheetEntry": [
@@ -1183,7 +1183,19 @@ export interface paths {
1183
1183
  /** @description Update (rename) an existing tool */
1184
1184
  put: operations["UpdateTool"];
1185
1185
  post?: never;
1186
- /** @description Delete a tool (trash it) */
1186
+ /**
1187
+ * @description Remove a tool from the dock: deletes an external link or an empty extra tool, and disables any other tool (returns 204 No Content either way).
1188
+ * Deleted: an external link, or a tool that is empty while the project has another
1189
+ * tool of the same type, enabled or disabled. Empty means nothing inside it is still
1190
+ * in place: items already in the trash don't count, archived and draft items do, and
1191
+ * for a Card Table only cards count, not columns. A deleted tool does not go to the
1192
+ * trash: Basecamp permanently destroys it, with everything inside it, about five days
1193
+ * later. Until then, a deleted external link can be restored in the Basecamp web app.
1194
+ * Disabled: every other tool, such as the only tool of its type or a tool with
1195
+ * content, exactly as DisableTool does. It keeps its content, and EnableTool restores it.
1196
+ * To tell which happened, get the tool afterwards: a deleted tool has status "deleted",
1197
+ * while a disabled one keeps its status and has no position.
1198
+ */
1187
1199
  delete: operations["DeleteTool"];
1188
1200
  options?: never;
1189
1201
  head?: never;
@@ -2442,6 +2454,31 @@ export interface paths {
2442
2454
  patch?: never;
2443
2455
  trace?: never;
2444
2456
  };
2457
+ "/projects/{projectId}/wallpaper.json": {
2458
+ parameters: {
2459
+ query?: never;
2460
+ header?: never;
2461
+ path?: never;
2462
+ cookie?: never;
2463
+ };
2464
+ get?: never;
2465
+ /**
2466
+ * @description Upload or replace the project's wallpaper (returns 204 No Content).
2467
+ * Uses the project's existing image validations, including GIF, HEIC and HEIF. Maximum 10 MB.
2468
+ * People and personal assistants follow project-edit permissions; shared agents are refused.
2469
+ */
2470
+ put: operations["UpdateProjectWallpaper"];
2471
+ post?: never;
2472
+ /**
2473
+ * @description Remove the project's wallpaper (returns 204 No Content).
2474
+ * People and personal assistants follow project-edit permissions; shared agents are refused.
2475
+ */
2476
+ delete: operations["RemoveProjectWallpaper"];
2477
+ options?: never;
2478
+ head?: never;
2479
+ patch?: never;
2480
+ trace?: never;
2481
+ };
2445
2482
  "/question_answers/{answerId}": {
2446
2483
  parameters: {
2447
2484
  query?: never;
@@ -4297,6 +4334,11 @@ export interface components {
4297
4334
  description_attachments: components["schemas"]["RichTextAttachment"][];
4298
4335
  due_on?: string | null;
4299
4336
  completed?: boolean;
4337
+ completion?: components["schemas"]["RecordingCompletion"];
4338
+ /**
4339
+ * @deprecated
4340
+ * @description This shape is deprecated since 2026-10: Never sent by Basecamp; read completion.created_at instead
4341
+ */
4300
4342
  completed_at?: string;
4301
4343
  /** Format: int32 */
4302
4344
  comments_count?: number;
@@ -4305,6 +4347,10 @@ export interface components {
4305
4347
  parent: components["schemas"]["RecordingParent"];
4306
4348
  bucket: components["schemas"]["TodoBucket"];
4307
4349
  creator: components["schemas"]["Person"];
4350
+ /**
4351
+ * @deprecated
4352
+ * @description This shape is deprecated since 2026-10: Never sent by Basecamp; read completion.creator instead
4353
+ */
4308
4354
  completer?: components["schemas"]["Person"];
4309
4355
  assignees?: components["schemas"]["Person"][];
4310
4356
  completion_subscribers?: components["schemas"]["Person"][];
@@ -6484,6 +6530,7 @@ export interface components {
6484
6530
  /** @description True only when the project carries a star on the current user's home page. */
6485
6531
  starred?: boolean;
6486
6532
  client_company?: components["schemas"]["ClientCompany"];
6533
+ wallpaper?: components["schemas"]["ProjectWallpaper"];
6487
6534
  /** @deprecated */
6488
6535
  clientside?: components["schemas"]["ClientSide"];
6489
6536
  };
@@ -6522,6 +6569,19 @@ export interface components {
6522
6569
  error: string;
6523
6570
  message?: string;
6524
6571
  };
6572
+ /**
6573
+ * @description The project's wallpaper, included only in single-project responses when attached.
6574
+ * Project lists and home responses omit it.
6575
+ */
6576
+ ProjectWallpaper: {
6577
+ /**
6578
+ * @description An authenticated API-host URL that redirects to the wallpaper image in storage, not a public image link.
6579
+ * Use the SDK's authenticated download helper instead of placing this URL directly in an image element.
6580
+ */
6581
+ url: string;
6582
+ /** @description fill|tile */
6583
+ mode: string;
6584
+ };
6525
6585
  Question: {
6526
6586
  /** Format: int64 */
6527
6587
  id: number;
@@ -6766,6 +6826,11 @@ export interface components {
6766
6826
  name: string;
6767
6827
  icon?: string;
6768
6828
  };
6829
+ /** @description Who completed a to-do, card or subtask, and when. */
6830
+ RecordingCompletion: {
6831
+ created_at: string;
6832
+ creator: components["schemas"]["Person"];
6833
+ };
6769
6834
  RecordingParent: {
6770
6835
  /** Format: int64 */
6771
6836
  id: number;
@@ -7397,10 +7462,19 @@ export interface components {
7397
7462
  position?: number;
7398
7463
  due_on?: string;
7399
7464
  completed?: boolean;
7465
+ completion?: components["schemas"]["RecordingCompletion"];
7466
+ /**
7467
+ * @deprecated
7468
+ * @description This shape is deprecated since 2026-10: Never sent by Basecamp; read completion.created_at instead
7469
+ */
7400
7470
  completed_at?: string;
7401
7471
  parent: components["schemas"]["RecordingParent"];
7402
7472
  bucket: components["schemas"]["TodoBucket"];
7403
7473
  creator: components["schemas"]["Person"];
7474
+ /**
7475
+ * @deprecated
7476
+ * @description This shape is deprecated since 2026-10: Never sent by Basecamp; read completion.creator instead
7477
+ */
7404
7478
  completer?: components["schemas"]["Person"];
7405
7479
  assignees?: components["schemas"]["Person"][];
7406
7480
  completion_url?: string;
@@ -7676,6 +7750,7 @@ export interface components {
7676
7750
  creator: components["schemas"]["Person"];
7677
7751
  description?: string;
7678
7752
  completed?: boolean;
7753
+ completion?: components["schemas"]["RecordingCompletion"];
7679
7754
  content: string;
7680
7755
  description_attachments: components["schemas"]["RichTextAttachment"][];
7681
7756
  starts_on?: string | null;
@@ -8286,8 +8361,14 @@ export interface components {
8286
8361
  /** @description invite|employee|team */
8287
8362
  admissions?: string;
8288
8363
  schedule_attributes?: components["schemas"]["ScheduleAttributes"];
8364
+ /**
8365
+ * @description How the project's wallpaper is laid out. Changes only the layout of a
8366
+ * wallpaper already attached; UpdateProjectWallpaper uploads one.
8367
+ */
8368
+ wallpaper_mode?: string;
8289
8369
  };
8290
8370
  UpdateProjectResponseContent: components["schemas"]["Project"];
8371
+ UpdateProjectWallpaperInputPayload: string;
8291
8372
  UpdateQuestionNotificationSettingsRequestContent: {
8292
8373
  /**
8293
8374
  * @description Whether the authenticated user is asked this question. Omit to leave it unchanged.
@@ -18861,6 +18942,155 @@ export interface operations {
18861
18942
  };
18862
18943
  };
18863
18944
  };
18945
+ UpdateProjectWallpaper: {
18946
+ parameters: {
18947
+ query?: {
18948
+ /** @description How the wallpaper is laid out. Omitted, the project's current mode is kept. */
18949
+ mode?: string;
18950
+ };
18951
+ header?: never;
18952
+ path: {
18953
+ projectId: number;
18954
+ };
18955
+ cookie?: never;
18956
+ };
18957
+ requestBody: {
18958
+ content: {
18959
+ "multipart/form-data": {
18960
+ /** Format: binary */
18961
+ wallpaper: string;
18962
+ };
18963
+ };
18964
+ };
18965
+ responses: {
18966
+ /** @description UpdateProjectWallpaper 204 response */
18967
+ 204: {
18968
+ headers: {
18969
+ [name: string]: unknown;
18970
+ };
18971
+ content?: never;
18972
+ };
18973
+ /** @description UnauthorizedError 401 response */
18974
+ 401: {
18975
+ headers: {
18976
+ [name: string]: unknown;
18977
+ };
18978
+ content: {
18979
+ "application/json": components["schemas"]["UnauthorizedErrorResponseContent"];
18980
+ };
18981
+ };
18982
+ /** @description ForbiddenError 403 response */
18983
+ 403: {
18984
+ headers: {
18985
+ [name: string]: unknown;
18986
+ };
18987
+ content: {
18988
+ "application/json": components["schemas"]["ForbiddenErrorResponseContent"];
18989
+ };
18990
+ };
18991
+ /** @description NotFoundError 404 response */
18992
+ 404: {
18993
+ headers: {
18994
+ [name: string]: unknown;
18995
+ };
18996
+ content: {
18997
+ "application/json": components["schemas"]["NotFoundErrorResponseContent"];
18998
+ };
18999
+ };
19000
+ /** @description ValidationError 422 response */
19001
+ 422: {
19002
+ headers: {
19003
+ [name: string]: unknown;
19004
+ };
19005
+ content: {
19006
+ "application/json": components["schemas"]["ValidationErrorResponseContent"];
19007
+ };
19008
+ };
19009
+ /** @description RateLimitError 429 response */
19010
+ 429: {
19011
+ headers: {
19012
+ [name: string]: unknown;
19013
+ };
19014
+ content: {
19015
+ "application/json": components["schemas"]["RateLimitErrorResponseContent"];
19016
+ };
19017
+ };
19018
+ /** @description InternalServerError 500 response */
19019
+ 500: {
19020
+ headers: {
19021
+ [name: string]: unknown;
19022
+ };
19023
+ content: {
19024
+ "application/json": components["schemas"]["InternalServerErrorResponseContent"];
19025
+ };
19026
+ };
19027
+ };
19028
+ };
19029
+ RemoveProjectWallpaper: {
19030
+ parameters: {
19031
+ query?: never;
19032
+ header?: never;
19033
+ path: {
19034
+ projectId: number;
19035
+ };
19036
+ cookie?: never;
19037
+ };
19038
+ requestBody?: never;
19039
+ responses: {
19040
+ /** @description RemoveProjectWallpaper 204 response */
19041
+ 204: {
19042
+ headers: {
19043
+ [name: string]: unknown;
19044
+ };
19045
+ content?: never;
19046
+ };
19047
+ /** @description UnauthorizedError 401 response */
19048
+ 401: {
19049
+ headers: {
19050
+ [name: string]: unknown;
19051
+ };
19052
+ content: {
19053
+ "application/json": components["schemas"]["UnauthorizedErrorResponseContent"];
19054
+ };
19055
+ };
19056
+ /** @description ForbiddenError 403 response */
19057
+ 403: {
19058
+ headers: {
19059
+ [name: string]: unknown;
19060
+ };
19061
+ content: {
19062
+ "application/json": components["schemas"]["ForbiddenErrorResponseContent"];
19063
+ };
19064
+ };
19065
+ /** @description NotFoundError 404 response */
19066
+ 404: {
19067
+ headers: {
19068
+ [name: string]: unknown;
19069
+ };
19070
+ content: {
19071
+ "application/json": components["schemas"]["NotFoundErrorResponseContent"];
19072
+ };
19073
+ };
19074
+ /** @description RateLimitError 429 response */
19075
+ 429: {
19076
+ headers: {
19077
+ [name: string]: unknown;
19078
+ };
19079
+ content: {
19080
+ "application/json": components["schemas"]["RateLimitErrorResponseContent"];
19081
+ };
19082
+ };
19083
+ /** @description InternalServerError 500 response */
19084
+ 500: {
19085
+ headers: {
19086
+ [name: string]: unknown;
19087
+ };
19088
+ content: {
19089
+ "application/json": components["schemas"]["InternalServerErrorResponseContent"];
19090
+ };
19091
+ };
19092
+ };
19093
+ };
18864
19094
  GetAnswer: {
18865
19095
  parameters: {
18866
19096
  query?: never;