@37signals/basecamp 0.19.0 → 0.21.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 (187) hide show
  1. package/README.md +1 -0
  2. package/dist/client.d.ts +5 -5
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +5 -4
  5. package/dist/client.js.map +1 -1
  6. package/dist/generated/metadata.d.ts.map +1 -1
  7. package/dist/generated/metadata.js +165 -2
  8. package/dist/generated/metadata.js.map +1 -1
  9. package/dist/generated/metadata.ts +165 -2
  10. package/dist/generated/openapi-stripped.json +1931 -443
  11. package/dist/generated/path-mapping.d.ts.map +1 -1
  12. package/dist/generated/path-mapping.js +14 -1
  13. package/dist/generated/path-mapping.js.map +1 -1
  14. package/dist/generated/path-mapping.ts +14 -1
  15. package/dist/generated/person-id-sites.d.ts.map +1 -1
  16. package/dist/generated/person-id-sites.js +61 -2
  17. package/dist/generated/person-id-sites.js.map +1 -1
  18. package/dist/generated/person-id-sites.ts +61 -2
  19. package/dist/generated/schema.d.ts +1312 -129
  20. package/dist/generated/services/bookmarks.d.ts +1 -1
  21. package/dist/generated/services/bookmarks.js +1 -1
  22. package/dist/generated/services/bookmarks.ts +1 -1
  23. package/dist/generated/services/boosts.d.ts +2 -2
  24. package/dist/generated/services/boosts.js +2 -2
  25. package/dist/generated/services/boosts.ts +2 -2
  26. package/dist/generated/services/campfires.d.ts +4 -4
  27. package/dist/generated/services/campfires.js +4 -4
  28. package/dist/generated/services/campfires.ts +4 -4
  29. package/dist/generated/services/card-steps.d.ts +15 -11
  30. package/dist/generated/services/card-steps.d.ts.map +1 -1
  31. package/dist/generated/services/card-steps.js +4 -4
  32. package/dist/generated/services/card-steps.js.map +1 -1
  33. package/dist/generated/services/card-steps.ts +15 -11
  34. package/dist/generated/services/cards.d.ts +1 -1
  35. package/dist/generated/services/cards.js +1 -1
  36. package/dist/generated/services/cards.ts +1 -1
  37. package/dist/generated/services/checkins.d.ts +4 -4
  38. package/dist/generated/services/checkins.js +4 -4
  39. package/dist/generated/services/checkins.ts +4 -4
  40. package/dist/generated/services/client-approvals.d.ts +1 -1
  41. package/dist/generated/services/client-approvals.js +1 -1
  42. package/dist/generated/services/client-approvals.ts +1 -1
  43. package/dist/generated/services/client-correspondences.d.ts +1 -1
  44. package/dist/generated/services/client-correspondences.js +1 -1
  45. package/dist/generated/services/client-correspondences.ts +1 -1
  46. package/dist/generated/services/client-replies.d.ts +1 -1
  47. package/dist/generated/services/client-replies.js +1 -1
  48. package/dist/generated/services/client-replies.ts +1 -1
  49. package/dist/generated/services/comments.d.ts +1 -1
  50. package/dist/generated/services/comments.js +1 -1
  51. package/dist/generated/services/comments.ts +1 -1
  52. package/dist/generated/services/documents.d.ts +1 -1
  53. package/dist/generated/services/documents.js +1 -1
  54. package/dist/generated/services/documents.ts +1 -1
  55. package/dist/generated/services/drafts.d.ts +1 -1
  56. package/dist/generated/services/drafts.js +1 -1
  57. package/dist/generated/services/drafts.ts +1 -1
  58. package/dist/generated/services/events.d.ts +1 -1
  59. package/dist/generated/services/events.js +1 -1
  60. package/dist/generated/services/events.ts +1 -1
  61. package/dist/generated/services/everything.d.ts +14 -14
  62. package/dist/generated/services/everything.js +14 -14
  63. package/dist/generated/services/everything.ts +14 -14
  64. package/dist/generated/services/forwards.d.ts +2 -2
  65. package/dist/generated/services/forwards.js +2 -2
  66. package/dist/generated/services/forwards.ts +2 -2
  67. package/dist/generated/services/index.d.ts +2 -2
  68. package/dist/generated/services/index.d.ts.map +1 -1
  69. package/dist/generated/services/index.js +2 -2
  70. package/dist/generated/services/index.js.map +1 -1
  71. package/dist/generated/services/index.ts +2 -2
  72. package/dist/generated/services/lineup.d.ts +13 -0
  73. package/dist/generated/services/lineup.d.ts.map +1 -1
  74. package/dist/generated/services/lineup.js +18 -0
  75. package/dist/generated/services/lineup.js.map +1 -1
  76. package/dist/generated/services/lineup.ts +26 -0
  77. package/dist/generated/services/message-types.d.ts +1 -1
  78. package/dist/generated/services/message-types.js +1 -1
  79. package/dist/generated/services/message-types.ts +1 -1
  80. package/dist/generated/services/messages.d.ts +1 -1
  81. package/dist/generated/services/messages.js +1 -1
  82. package/dist/generated/services/messages.ts +1 -1
  83. package/dist/generated/services/my-notifications.d.ts +3 -2
  84. package/dist/generated/services/my-notifications.d.ts.map +1 -1
  85. package/dist/generated/services/my-notifications.js +1 -1
  86. package/dist/generated/services/my-notifications.js.map +1 -1
  87. package/dist/generated/services/my-notifications.ts +3 -2
  88. package/dist/generated/services/people.d.ts +3 -3
  89. package/dist/generated/services/people.js +3 -3
  90. package/dist/generated/services/people.ts +3 -3
  91. package/dist/generated/services/projects.d.ts +1 -1
  92. package/dist/generated/services/projects.js +1 -1
  93. package/dist/generated/services/projects.ts +1 -1
  94. package/dist/generated/services/recordings.d.ts +3 -3
  95. package/dist/generated/services/recordings.js +3 -3
  96. package/dist/generated/services/recordings.ts +3 -3
  97. package/dist/generated/services/reports.d.ts +1 -1
  98. package/dist/generated/services/reports.js +1 -1
  99. package/dist/generated/services/reports.ts +1 -1
  100. package/dist/generated/services/schedules.d.ts +1 -1
  101. package/dist/generated/services/schedules.js +1 -1
  102. package/dist/generated/services/schedules.ts +1 -1
  103. package/dist/generated/services/subtasks.d.ts +157 -0
  104. package/dist/generated/services/subtasks.d.ts.map +1 -0
  105. package/dist/generated/services/subtasks.js +240 -0
  106. package/dist/generated/services/subtasks.js.map +1 -0
  107. package/dist/generated/services/subtasks.ts +336 -0
  108. package/dist/generated/services/templates.d.ts +114 -10
  109. package/dist/generated/services/templates.d.ts.map +1 -1
  110. package/dist/generated/services/templates.js +147 -10
  111. package/dist/generated/services/templates.js.map +1 -1
  112. package/dist/generated/services/templates.ts +220 -13
  113. package/dist/generated/services/timeline.d.ts +1 -1
  114. package/dist/generated/services/timeline.js +1 -1
  115. package/dist/generated/services/timeline.ts +1 -1
  116. package/dist/generated/services/timesheets.d.ts +3 -3
  117. package/dist/generated/services/timesheets.js +3 -3
  118. package/dist/generated/services/timesheets.ts +3 -3
  119. package/dist/generated/services/todolist-groups.d.ts +1 -1
  120. package/dist/generated/services/todolist-groups.js +1 -1
  121. package/dist/generated/services/todolist-groups.ts +1 -1
  122. package/dist/generated/services/todolists.d.ts +1 -1
  123. package/dist/generated/services/todolists.js +1 -1
  124. package/dist/generated/services/todolists.ts +1 -1
  125. package/dist/generated/services/todos.d.ts +1 -1
  126. package/dist/generated/services/todos.js +1 -1
  127. package/dist/generated/services/todos.ts +1 -1
  128. package/dist/generated/services/uploads.d.ts +2 -2
  129. package/dist/generated/services/uploads.js +2 -2
  130. package/dist/generated/services/uploads.ts +2 -2
  131. package/dist/generated/services/vaults.d.ts +1 -1
  132. package/dist/generated/services/vaults.js +1 -1
  133. package/dist/generated/services/vaults.ts +1 -1
  134. package/dist/generated/services/webhooks.d.ts +1 -1
  135. package/dist/generated/services/webhooks.js +1 -1
  136. package/dist/generated/services/webhooks.ts +1 -1
  137. package/dist/index.d.ts +3 -3
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +4 -3
  140. package/dist/index.js.map +1 -1
  141. package/package.json +4 -4
  142. package/src/generated/metadata.ts +165 -2
  143. package/src/generated/openapi-stripped.json +1931 -443
  144. package/src/generated/path-mapping.ts +14 -1
  145. package/src/generated/person-id-sites.ts +61 -2
  146. package/src/generated/schema.d.ts +1312 -129
  147. package/src/generated/services/bookmarks.ts +1 -1
  148. package/src/generated/services/boosts.ts +2 -2
  149. package/src/generated/services/campfires.ts +4 -4
  150. package/src/generated/services/card-steps.ts +15 -11
  151. package/src/generated/services/cards.ts +1 -1
  152. package/src/generated/services/checkins.ts +4 -4
  153. package/src/generated/services/client-approvals.ts +1 -1
  154. package/src/generated/services/client-correspondences.ts +1 -1
  155. package/src/generated/services/client-replies.ts +1 -1
  156. package/src/generated/services/comments.ts +1 -1
  157. package/src/generated/services/documents.ts +1 -1
  158. package/src/generated/services/drafts.ts +1 -1
  159. package/src/generated/services/events.ts +1 -1
  160. package/src/generated/services/everything.ts +14 -14
  161. package/src/generated/services/forwards.ts +2 -2
  162. package/src/generated/services/index.ts +2 -2
  163. package/src/generated/services/lineup.ts +26 -0
  164. package/src/generated/services/message-types.ts +1 -1
  165. package/src/generated/services/messages.ts +1 -1
  166. package/src/generated/services/my-notifications.ts +3 -2
  167. package/src/generated/services/people.ts +3 -3
  168. package/src/generated/services/projects.ts +1 -1
  169. package/src/generated/services/recordings.ts +3 -3
  170. package/src/generated/services/reports.ts +1 -1
  171. package/src/generated/services/schedules.ts +1 -1
  172. package/src/generated/services/subtasks.ts +336 -0
  173. package/src/generated/services/templates.ts +220 -13
  174. package/src/generated/services/timeline.ts +1 -1
  175. package/src/generated/services/timesheets.ts +3 -3
  176. package/src/generated/services/todolist-groups.ts +1 -1
  177. package/src/generated/services/todolists.ts +1 -1
  178. package/src/generated/services/todos.ts +1 -1
  179. package/src/generated/services/uploads.ts +2 -2
  180. package/src/generated/services/vaults.ts +1 -1
  181. package/src/generated/services/webhooks.ts +1 -1
  182. package/dist/generated/services/automation.d.ts +0 -25
  183. package/dist/generated/services/automation.d.ts.map +0 -1
  184. package/dist/generated/services/automation.js +0 -33
  185. package/dist/generated/services/automation.js.map +0 -1
  186. package/dist/generated/services/automation.ts +0 -49
  187. package/src/generated/services/automation.ts +0 -49
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Basecamp",
5
- "version": "2026-09-02",
5
+ "version": "2026-09-15",
6
6
  "description": "Basecamp API",
7
7
  "contact": {
8
8
  "name": "Basecamp",
@@ -2747,7 +2747,7 @@
2747
2747
  }
2748
2748
  },
2749
2749
  "tags": [
2750
- "Automation"
2750
+ "Dock"
2751
2751
  ],
2752
2752
  "x-basecamp-retry": {
2753
2753
  "maxAttempts": 2,
@@ -2760,6 +2760,236 @@
2760
2760
  }
2761
2761
  }
2762
2762
  },
2763
+ "/buckets/{bucketId}/recordings/{recordingId}/templatifications.json": {
2764
+ "post": {
2765
+ "description": "Templatify a to-do list or card table",
2766
+ "operationId": "CreateTemplatification",
2767
+ "requestBody": {
2768
+ "content": {
2769
+ "application/json": {
2770
+ "schema": {
2771
+ "$ref": "#/components/schemas/CreateTemplatificationRequestContent"
2772
+ }
2773
+ }
2774
+ }
2775
+ },
2776
+ "parameters": [
2777
+ {
2778
+ "name": "bucketId",
2779
+ "in": "path",
2780
+ "schema": {
2781
+ "type": "integer",
2782
+ "format": "int64"
2783
+ },
2784
+ "required": true
2785
+ },
2786
+ {
2787
+ "name": "recordingId",
2788
+ "in": "path",
2789
+ "description": "The to-do list or card table to templatify. Anything else is a 403.",
2790
+ "schema": {
2791
+ "type": "integer",
2792
+ "description": "The to-do list or card table to templatify. Anything else is a 403.",
2793
+ "format": "int64"
2794
+ },
2795
+ "required": true
2796
+ }
2797
+ ],
2798
+ "responses": {
2799
+ "201": {
2800
+ "description": "CreateTemplatification 201 response",
2801
+ "content": {
2802
+ "application/json": {
2803
+ "schema": {
2804
+ "$ref": "#/components/schemas/CreateTemplatificationResponseContent"
2805
+ }
2806
+ }
2807
+ }
2808
+ },
2809
+ "401": {
2810
+ "description": "UnauthorizedError 401 response",
2811
+ "content": {
2812
+ "application/json": {
2813
+ "schema": {
2814
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
2815
+ }
2816
+ }
2817
+ }
2818
+ },
2819
+ "403": {
2820
+ "description": "ForbiddenError 403 response",
2821
+ "content": {
2822
+ "application/json": {
2823
+ "schema": {
2824
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
2825
+ }
2826
+ }
2827
+ }
2828
+ },
2829
+ "404": {
2830
+ "description": "NotFoundError 404 response",
2831
+ "content": {
2832
+ "application/json": {
2833
+ "schema": {
2834
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
2835
+ }
2836
+ }
2837
+ }
2838
+ },
2839
+ "422": {
2840
+ "description": "FieldValidationError 422 response",
2841
+ "content": {
2842
+ "application/json": {
2843
+ "schema": {
2844
+ "$ref": "#/components/schemas/FieldValidationErrorResponseContent"
2845
+ }
2846
+ }
2847
+ }
2848
+ },
2849
+ "429": {
2850
+ "description": "RateLimitError 429 response",
2851
+ "content": {
2852
+ "application/json": {
2853
+ "schema": {
2854
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
2855
+ }
2856
+ }
2857
+ }
2858
+ },
2859
+ "500": {
2860
+ "description": "InternalServerError 500 response",
2861
+ "content": {
2862
+ "application/json": {
2863
+ "schema": {
2864
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
2865
+ }
2866
+ }
2867
+ }
2868
+ }
2869
+ },
2870
+ "tags": [
2871
+ "Templates"
2872
+ ],
2873
+ "x-basecamp-retry": {
2874
+ "maxAttempts": 2,
2875
+ "baseDelayMs": 1000,
2876
+ "backoff": "exponential",
2877
+ "retryOn": [
2878
+ 429,
2879
+ 503
2880
+ ]
2881
+ }
2882
+ }
2883
+ },
2884
+ "/buckets/{bucketId}/recordings/{recordingId}/templatifications/{templatificationId}": {
2885
+ "get": {
2886
+ "description": "Get a templatification",
2887
+ "operationId": "GetTemplatification",
2888
+ "parameters": [
2889
+ {
2890
+ "name": "bucketId",
2891
+ "in": "path",
2892
+ "schema": {
2893
+ "type": "integer",
2894
+ "format": "int64"
2895
+ },
2896
+ "required": true
2897
+ },
2898
+ {
2899
+ "name": "recordingId",
2900
+ "in": "path",
2901
+ "schema": {
2902
+ "type": "integer",
2903
+ "format": "int64"
2904
+ },
2905
+ "required": true
2906
+ },
2907
+ {
2908
+ "name": "templatificationId",
2909
+ "in": "path",
2910
+ "schema": {
2911
+ "type": "integer",
2912
+ "format": "int64"
2913
+ },
2914
+ "required": true
2915
+ }
2916
+ ],
2917
+ "responses": {
2918
+ "200": {
2919
+ "description": "GetTemplatification 200 response",
2920
+ "content": {
2921
+ "application/json": {
2922
+ "schema": {
2923
+ "$ref": "#/components/schemas/GetTemplatificationResponseContent"
2924
+ }
2925
+ }
2926
+ }
2927
+ },
2928
+ "401": {
2929
+ "description": "UnauthorizedError 401 response",
2930
+ "content": {
2931
+ "application/json": {
2932
+ "schema": {
2933
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
2934
+ }
2935
+ }
2936
+ }
2937
+ },
2938
+ "403": {
2939
+ "description": "ForbiddenError 403 response",
2940
+ "content": {
2941
+ "application/json": {
2942
+ "schema": {
2943
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
2944
+ }
2945
+ }
2946
+ }
2947
+ },
2948
+ "404": {
2949
+ "description": "NotFoundError 404 response",
2950
+ "content": {
2951
+ "application/json": {
2952
+ "schema": {
2953
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
2954
+ }
2955
+ }
2956
+ }
2957
+ },
2958
+ "429": {
2959
+ "description": "RateLimitError 429 response",
2960
+ "content": {
2961
+ "application/json": {
2962
+ "schema": {
2963
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
2964
+ }
2965
+ }
2966
+ }
2967
+ },
2968
+ "500": {
2969
+ "description": "InternalServerError 500 response",
2970
+ "content": {
2971
+ "application/json": {
2972
+ "schema": {
2973
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
2974
+ }
2975
+ }
2976
+ }
2977
+ }
2978
+ },
2979
+ "tags": [
2980
+ "Templates"
2981
+ ],
2982
+ "x-basecamp-retry": {
2983
+ "maxAttempts": 3,
2984
+ "baseDelayMs": 1000,
2985
+ "backoff": "exponential",
2986
+ "retryOn": [
2987
+ 429,
2988
+ 503
2989
+ ]
2990
+ }
2991
+ }
2992
+ },
2763
2993
  "/buckets/{bucketId}/todosets/{todosetId}/todos.json": {
2764
2994
  "post": {
2765
2995
  "description": "Create a to-do directly under a project's to-do set, outside any to-do list.\nThis form exists only project-scoped (no account-scoped variant); parameters\nand response match the to-do-list create. Find a project's to-do set id via\nGetTodoset.",
@@ -3158,7 +3388,7 @@
3158
3388
  }
3159
3389
  },
3160
3390
  "tags": [
3161
- "Automation"
3391
+ "Webhooks"
3162
3392
  ],
3163
3393
  "x-basecamp-pagination": {
3164
3394
  "style": "link",
@@ -3272,7 +3502,7 @@
3272
3502
  }
3273
3503
  },
3274
3504
  "tags": [
3275
- "Automation"
3505
+ "Webhooks"
3276
3506
  ],
3277
3507
  "x-basecamp-retry": {
3278
3508
  "maxAttempts": 2,
@@ -7456,7 +7686,7 @@
7456
7686
  }
7457
7687
  },
7458
7688
  "tags": [
7459
- "Automation"
7689
+ "Dock"
7460
7690
  ],
7461
7691
  "x-basecamp-idempotent": {
7462
7692
  "natural": true
@@ -7538,7 +7768,7 @@
7538
7768
  }
7539
7769
  },
7540
7770
  "tags": [
7541
- "Automation"
7771
+ "Dock"
7542
7772
  ],
7543
7773
  "x-basecamp-retry": {
7544
7774
  "maxAttempts": 3,
@@ -7637,7 +7867,7 @@
7637
7867
  }
7638
7868
  },
7639
7869
  "tags": [
7640
- "Automation"
7870
+ "Dock"
7641
7871
  ],
7642
7872
  "x-basecamp-idempotent": {
7643
7873
  "natural": true
@@ -9420,7 +9650,7 @@
9420
9650
  }
9421
9651
  },
9422
9652
  "tags": [
9423
- "Automation"
9653
+ "Lineup"
9424
9654
  ],
9425
9655
  "x-basecamp-retry": {
9426
9656
  "maxAttempts": 3,
@@ -9502,7 +9732,7 @@
9502
9732
  }
9503
9733
  },
9504
9734
  "tags": [
9505
- "Automation"
9735
+ "Lineup"
9506
9736
  ],
9507
9737
  "x-basecamp-retry": {
9508
9738
  "maxAttempts": 2,
@@ -9576,7 +9806,7 @@
9576
9806
  }
9577
9807
  },
9578
9808
  "tags": [
9579
- "Automation"
9809
+ "Lineup"
9580
9810
  ],
9581
9811
  "x-basecamp-idempotent": {
9582
9812
  "natural": true
@@ -9670,7 +9900,7 @@
9670
9900
  }
9671
9901
  },
9672
9902
  "tags": [
9673
- "Automation"
9903
+ "Lineup"
9674
9904
  ],
9675
9905
  "x-basecamp-idempotent": {
9676
9906
  "natural": true
@@ -11685,7 +11915,7 @@
11685
11915
  },
11686
11916
  "/my/unreads.json": {
11687
11917
  "put": {
11688
- "description": "Mark specified items as read",
11918
+ "description": "Mark specified items as read\n\nA batch is capped at 500 readables; a larger one is refused with 422\nbefore any per-item work (bc3 `f3437f5c732`).",
11689
11919
  "operationId": "MarkAsRead",
11690
11920
  "requestBody": {
11691
11921
  "content": {
@@ -11722,6 +11952,16 @@
11722
11952
  }
11723
11953
  }
11724
11954
  },
11955
+ "422": {
11956
+ "description": "ValidationError 422 response",
11957
+ "content": {
11958
+ "application/json": {
11959
+ "schema": {
11960
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
11961
+ }
11962
+ }
11963
+ }
11964
+ },
11725
11965
  "429": {
11726
11966
  "description": "RateLimitError 429 response",
11727
11967
  "content": {
@@ -12618,7 +12858,7 @@
12618
12858
  }
12619
12859
  },
12620
12860
  "tags": [
12621
- "Automation"
12861
+ "Recordings"
12622
12862
  ],
12623
12863
  "x-basecamp-pagination": {
12624
12864
  "style": "link",
@@ -14408,7 +14648,7 @@
14408
14648
  }
14409
14649
  },
14410
14650
  "tags": [
14411
- "Automation"
14651
+ "Checkins"
14412
14652
  ],
14413
14653
  "x-basecamp-retry": {
14414
14654
  "maxAttempts": 3,
@@ -14500,7 +14740,7 @@
14500
14740
  }
14501
14741
  },
14502
14742
  "tags": [
14503
- "Automation"
14743
+ "Checkins"
14504
14744
  ],
14505
14745
  "x-basecamp-idempotent": {
14506
14746
  "natural": true
@@ -14584,7 +14824,7 @@
14584
14824
  }
14585
14825
  },
14586
14826
  "tags": [
14587
- "Automation"
14827
+ "Checkins"
14588
14828
  ],
14589
14829
  "x-basecamp-retry": {
14590
14830
  "maxAttempts": 3,
@@ -14675,7 +14915,7 @@
14675
14915
  }
14676
14916
  },
14677
14917
  "tags": [
14678
- "Automation"
14918
+ "Checkins"
14679
14919
  ],
14680
14920
  "x-basecamp-pagination": {
14681
14921
  "style": "link",
@@ -14779,7 +15019,7 @@
14779
15019
  }
14780
15020
  },
14781
15021
  "tags": [
14782
- "Automation"
15022
+ "Checkins"
14783
15023
  ],
14784
15024
  "x-basecamp-retry": {
14785
15025
  "maxAttempts": 2,
@@ -14860,7 +15100,7 @@
14860
15100
  }
14861
15101
  },
14862
15102
  "tags": [
14863
- "Automation"
15103
+ "Checkins"
14864
15104
  ],
14865
15105
  "x-basecamp-retry": {
14866
15106
  "maxAttempts": 3,
@@ -14958,7 +15198,7 @@
14958
15198
  }
14959
15199
  },
14960
15200
  "tags": [
14961
- "Automation"
15201
+ "Checkins"
14962
15202
  ],
14963
15203
  "x-basecamp-idempotent": {
14964
15204
  "natural": true
@@ -15052,7 +15292,7 @@
15052
15292
  }
15053
15293
  },
15054
15294
  "tags": [
15055
- "Automation"
15295
+ "Checkins"
15056
15296
  ],
15057
15297
  "x-basecamp-pagination": {
15058
15298
  "style": "link",
@@ -15156,7 +15396,7 @@
15156
15396
  }
15157
15397
  },
15158
15398
  "tags": [
15159
- "Automation"
15399
+ "Checkins"
15160
15400
  ],
15161
15401
  "x-basecamp-retry": {
15162
15402
  "maxAttempts": 2,
@@ -16837,7 +17077,7 @@
16837
17077
  }
16838
17078
  },
16839
17079
  "tags": [
16840
- "Automation"
17080
+ "Recordings"
16841
17081
  ],
16842
17082
  "x-basecamp-pagination": {
16843
17083
  "style": "link",
@@ -17139,7 +17379,7 @@
17139
17379
  }
17140
17380
  },
17141
17381
  "tags": [
17142
- "Automation"
17382
+ "Recordings"
17143
17383
  ],
17144
17384
  "x-basecamp-idempotent": {
17145
17385
  "natural": true
@@ -17241,7 +17481,7 @@
17241
17481
  }
17242
17482
  },
17243
17483
  "tags": [
17244
- "Automation"
17484
+ "Recordings"
17245
17485
  ],
17246
17486
  "x-basecamp-idempotent": {
17247
17487
  "natural": true
@@ -17328,7 +17568,7 @@
17328
17568
  }
17329
17569
  },
17330
17570
  "tags": [
17331
- "Automation"
17571
+ "Recordings"
17332
17572
  ],
17333
17573
  "x-basecamp-idempotent": {
17334
17574
  "natural": true
@@ -17346,7 +17586,7 @@
17346
17586
  },
17347
17587
  "/recordings/{recordingId}/status/archived.json": {
17348
17588
  "put": {
17349
- "description": "Archive a recording",
17589
+ "description": "Archive a recording; bc3 answers 403 for types it never lets be archived, timesheet entries among them",
17350
17590
  "operationId": "ArchiveRecording",
17351
17591
  "parameters": [
17352
17592
  {
@@ -17415,7 +17655,7 @@
17415
17655
  }
17416
17656
  },
17417
17657
  "tags": [
17418
- "Automation"
17658
+ "Recordings"
17419
17659
  ],
17420
17660
  "x-basecamp-idempotent": {
17421
17661
  "natural": true
@@ -17433,7 +17673,7 @@
17433
17673
  },
17434
17674
  "/recordings/{recordingId}/status/trashed.json": {
17435
17675
  "put": {
17436
- "description": "Trash a recording",
17676
+ "description": "Trash a recording; bc3 answers 403 for types it never lets be trashed, timesheet entries among them (DestroyTimesheetEntry removes those, permanently)",
17437
17677
  "operationId": "TrashRecording",
17438
17678
  "parameters": [
17439
17679
  {
@@ -17509,7 +17749,7 @@
17509
17749
  }
17510
17750
  },
17511
17751
  "tags": [
17512
- "Automation"
17752
+ "Recordings"
17513
17753
  ],
17514
17754
  "x-basecamp-idempotent": {
17515
17755
  "natural": true
@@ -17938,10 +18178,10 @@
17938
18178
  }
17939
18179
  }
17940
18180
  },
17941
- "/recordings/{recordingId}/timesheet.json": {
18181
+ "/recordings/{recordingId}/subtasks.json": {
17942
18182
  "get": {
17943
- "description": "Get timesheet for a specific recording",
17944
- "operationId": "GetRecordingTimesheet",
18183
+ "description": "List a recording's subtasks, in position order\n\nOnly to-dos and cards hold subtasks; check for `subtasks_count` and\n`subtasks_url` on the parent's JSON.\n\n**Pagination**: Uses Link header (RFC5988). Follow the `next` rel URL\nto fetch additional pages. X-Total-Count header provides total count.",
18184
+ "operationId": "ListSubtasks",
17945
18185
  "parameters": [
17946
18186
  {
17947
18187
  "name": "recordingId",
@@ -17952,28 +18192,6 @@
17952
18192
  },
17953
18193
  "required": true
17954
18194
  },
17955
- {
17956
- "name": "from",
17957
- "in": "query",
17958
- "schema": {
17959
- "type": "string"
17960
- }
17961
- },
17962
- {
17963
- "name": "to",
17964
- "in": "query",
17965
- "schema": {
17966
- "type": "string"
17967
- }
17968
- },
17969
- {
17970
- "name": "person_id",
17971
- "in": "query",
17972
- "schema": {
17973
- "type": "integer",
17974
- "format": "int64"
17975
- }
17976
- },
17977
18195
  {
17978
18196
  "name": "page",
17979
18197
  "in": "query",
@@ -17987,11 +18205,11 @@
17987
18205
  ],
17988
18206
  "responses": {
17989
18207
  "200": {
17990
- "description": "GetRecordingTimesheet 200 response",
18208
+ "description": "ListSubtasks 200 response",
17991
18209
  "content": {
17992
18210
  "application/json": {
17993
18211
  "schema": {
17994
- "$ref": "#/components/schemas/GetRecordingTimesheetResponseContent"
18212
+ "$ref": "#/components/schemas/ListSubtasksResponseContent"
17995
18213
  }
17996
18214
  }
17997
18215
  }
@@ -18026,6 +18244,16 @@
18026
18244
  }
18027
18245
  }
18028
18246
  },
18247
+ "429": {
18248
+ "description": "RateLimitError 429 response",
18249
+ "content": {
18250
+ "application/json": {
18251
+ "schema": {
18252
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
18253
+ }
18254
+ }
18255
+ }
18256
+ },
18029
18257
  "500": {
18030
18258
  "description": "InternalServerError 500 response",
18031
18259
  "content": {
@@ -18038,7 +18266,7 @@
18038
18266
  }
18039
18267
  },
18040
18268
  "tags": [
18041
- "Schedule"
18269
+ "Subtasks"
18042
18270
  ],
18043
18271
  "x-basecamp-pagination": {
18044
18272
  "style": "link",
@@ -18054,17 +18282,15 @@
18054
18282
  503
18055
18283
  ]
18056
18284
  }
18057
- }
18058
- },
18059
- "/recordings/{recordingId}/timesheet/entries.json": {
18285
+ },
18060
18286
  "post": {
18061
- "description": "Create a timesheet entry on a recording",
18062
- "operationId": "CreateTimesheetEntry",
18287
+ "description": "Create a subtask under a to-do or a card\n\nAny other recording answers `403 Forbidden`.",
18288
+ "operationId": "CreateSubtask",
18063
18289
  "requestBody": {
18064
18290
  "content": {
18065
18291
  "application/json": {
18066
18292
  "schema": {
18067
- "$ref": "#/components/schemas/CreateTimesheetEntryRequestContent"
18293
+ "$ref": "#/components/schemas/CreateSubtaskRequestContent"
18068
18294
  }
18069
18295
  }
18070
18296
  },
@@ -18083,11 +18309,11 @@
18083
18309
  ],
18084
18310
  "responses": {
18085
18311
  "201": {
18086
- "description": "CreateTimesheetEntry 201 response",
18312
+ "description": "CreateSubtask 201 response",
18087
18313
  "content": {
18088
18314
  "application/json": {
18089
18315
  "schema": {
18090
- "$ref": "#/components/schemas/CreateTimesheetEntryResponseContent"
18316
+ "$ref": "#/components/schemas/CreateSubtaskResponseContent"
18091
18317
  }
18092
18318
  }
18093
18319
  }
@@ -18112,6 +18338,16 @@
18112
18338
  }
18113
18339
  }
18114
18340
  },
18341
+ "404": {
18342
+ "description": "NotFoundError 404 response",
18343
+ "content": {
18344
+ "application/json": {
18345
+ "schema": {
18346
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
18347
+ }
18348
+ }
18349
+ }
18350
+ },
18115
18351
  "422": {
18116
18352
  "description": "ValidationError 422 response",
18117
18353
  "content": {
@@ -18144,10 +18380,10 @@
18144
18380
  }
18145
18381
  },
18146
18382
  "tags": [
18147
- "Schedule"
18383
+ "Subtasks"
18148
18384
  ],
18149
18385
  "x-basecamp-retry": {
18150
- "maxAttempts": 3,
18386
+ "maxAttempts": 2,
18151
18387
  "baseDelayMs": 1000,
18152
18388
  "backoff": "exponential",
18153
18389
  "retryOn": [
@@ -18157,24 +18393,63 @@
18157
18393
  }
18158
18394
  }
18159
18395
  },
18160
- "/recordings/{toolId}/position.json": {
18161
- "delete": {
18162
- "description": "Disable a tool (hide it from the project dock)",
18163
- "operationId": "DisableTool",
18396
+ "/recordings/{recordingId}/timesheet.json": {
18397
+ "get": {
18398
+ "description": "Get timesheet for a specific recording",
18399
+ "operationId": "GetRecordingTimesheet",
18164
18400
  "parameters": [
18165
18401
  {
18166
- "name": "toolId",
18402
+ "name": "recordingId",
18167
18403
  "in": "path",
18168
18404
  "schema": {
18169
18405
  "type": "integer",
18170
18406
  "format": "int64"
18171
18407
  },
18172
18408
  "required": true
18409
+ },
18410
+ {
18411
+ "name": "from",
18412
+ "in": "query",
18413
+ "schema": {
18414
+ "type": "string"
18415
+ }
18416
+ },
18417
+ {
18418
+ "name": "to",
18419
+ "in": "query",
18420
+ "schema": {
18421
+ "type": "string"
18422
+ }
18423
+ },
18424
+ {
18425
+ "name": "person_id",
18426
+ "in": "query",
18427
+ "schema": {
18428
+ "type": "integer",
18429
+ "format": "int64"
18430
+ }
18431
+ },
18432
+ {
18433
+ "name": "page",
18434
+ "in": "query",
18435
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18436
+ "schema": {
18437
+ "type": "integer",
18438
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18439
+ "format": "int32"
18440
+ }
18173
18441
  }
18174
18442
  ],
18175
18443
  "responses": {
18176
- "204": {
18177
- "description": "DisableTool 204 response"
18444
+ "200": {
18445
+ "description": "GetRecordingTimesheet 200 response",
18446
+ "content": {
18447
+ "application/json": {
18448
+ "schema": {
18449
+ "$ref": "#/components/schemas/GetRecordingTimesheetResponseContent"
18450
+ }
18451
+ }
18452
+ }
18178
18453
  },
18179
18454
  "401": {
18180
18455
  "description": "UnauthorizedError 401 response",
@@ -18218,10 +18493,12 @@
18218
18493
  }
18219
18494
  },
18220
18495
  "tags": [
18221
- "Automation"
18496
+ "Schedule"
18222
18497
  ],
18223
- "x-basecamp-idempotent": {
18224
- "natural": true
18498
+ "x-basecamp-pagination": {
18499
+ "style": "link",
18500
+ "totalCountHeader": "X-Total-Count",
18501
+ "maxPageSize": 50
18225
18502
  },
18226
18503
  "x-basecamp-retry": {
18227
18504
  "maxAttempts": 3,
@@ -18232,13 +18509,25 @@
18232
18509
  503
18233
18510
  ]
18234
18511
  }
18235
- },
18512
+ }
18513
+ },
18514
+ "/recordings/{recordingId}/timesheet/entries.json": {
18236
18515
  "post": {
18237
- "description": "Enable a tool (show it on the project dock)",
18238
- "operationId": "EnableTool",
18516
+ "description": "Create a timesheet entry on a recording",
18517
+ "operationId": "CreateTimesheetEntry",
18518
+ "requestBody": {
18519
+ "content": {
18520
+ "application/json": {
18521
+ "schema": {
18522
+ "$ref": "#/components/schemas/CreateTimesheetEntryRequestContent"
18523
+ }
18524
+ }
18525
+ },
18526
+ "required": true
18527
+ },
18239
18528
  "parameters": [
18240
18529
  {
18241
- "name": "toolId",
18530
+ "name": "recordingId",
18242
18531
  "in": "path",
18243
18532
  "schema": {
18244
18533
  "type": "integer",
@@ -18249,7 +18538,14 @@
18249
18538
  ],
18250
18539
  "responses": {
18251
18540
  "201": {
18252
- "description": "EnableTool 201 response"
18541
+ "description": "CreateTimesheetEntry 201 response",
18542
+ "content": {
18543
+ "application/json": {
18544
+ "schema": {
18545
+ "$ref": "#/components/schemas/CreateTimesheetEntryResponseContent"
18546
+ }
18547
+ }
18548
+ }
18253
18549
  },
18254
18550
  "401": {
18255
18551
  "description": "UnauthorizedError 401 response",
@@ -18303,10 +18599,10 @@
18303
18599
  }
18304
18600
  },
18305
18601
  "tags": [
18306
- "Automation"
18602
+ "Schedule"
18307
18603
  ],
18308
18604
  "x-basecamp-retry": {
18309
- "maxAttempts": 2,
18605
+ "maxAttempts": 3,
18310
18606
  "baseDelayMs": 1000,
18311
18607
  "backoff": "exponential",
18312
18608
  "retryOn": [
@@ -18314,20 +18610,12 @@
18314
18610
  503
18315
18611
  ]
18316
18612
  }
18317
- },
18318
- "put": {
18319
- "description": "Reposition a tool on the project dock",
18320
- "operationId": "RepositionTool",
18321
- "requestBody": {
18322
- "content": {
18323
- "application/json": {
18324
- "schema": {
18325
- "$ref": "#/components/schemas/RepositionToolRequestContent"
18326
- }
18327
- }
18328
- },
18329
- "required": true
18330
- },
18613
+ }
18614
+ },
18615
+ "/recordings/{toolId}/position.json": {
18616
+ "delete": {
18617
+ "description": "Disable a tool (hide it from the project dock)",
18618
+ "operationId": "DisableTool",
18331
18619
  "parameters": [
18332
18620
  {
18333
18621
  "name": "toolId",
@@ -18340,8 +18628,8 @@
18340
18628
  }
18341
18629
  ],
18342
18630
  "responses": {
18343
- "200": {
18344
- "description": "RepositionTool 200 response"
18631
+ "204": {
18632
+ "description": "DisableTool 204 response"
18345
18633
  },
18346
18634
  "401": {
18347
18635
  "description": "UnauthorizedError 401 response",
@@ -18373,16 +18661,6 @@
18373
18661
  }
18374
18662
  }
18375
18663
  },
18376
- "422": {
18377
- "description": "ValidationError 422 response",
18378
- "content": {
18379
- "application/json": {
18380
- "schema": {
18381
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
18382
- }
18383
- }
18384
- }
18385
- },
18386
18664
  "500": {
18387
18665
  "description": "InternalServerError 500 response",
18388
18666
  "content": {
@@ -18395,7 +18673,7 @@
18395
18673
  }
18396
18674
  },
18397
18675
  "tags": [
18398
- "Automation"
18676
+ "Dock"
18399
18677
  ],
18400
18678
  "x-basecamp-idempotent": {
18401
18679
  "natural": true
@@ -18409,43 +18687,24 @@
18409
18687
  503
18410
18688
  ]
18411
18689
  }
18412
- }
18413
- },
18414
- "/reports/gauges.json": {
18415
- "get": {
18416
- "description": "List gauges across all projects the authenticated user has access to.\nGauges are sorted by risk level (red, yellow, green), then alphabetically.",
18417
- "operationId": "ListGauges",
18690
+ },
18691
+ "post": {
18692
+ "description": "Enable a tool (show it on the project dock)",
18693
+ "operationId": "EnableTool",
18418
18694
  "parameters": [
18419
18695
  {
18420
- "name": "bucket_ids",
18421
- "in": "query",
18422
- "description": "Comma-separated list of project IDs. When provided, results are returned\nin the order specified instead of by risk level.",
18423
- "schema": {
18424
- "type": "string",
18425
- "description": "Comma-separated list of project IDs. When provided, results are returned\nin the order specified instead of by risk level."
18426
- }
18427
- },
18428
- {
18429
- "name": "page",
18430
- "in": "query",
18431
- "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18696
+ "name": "toolId",
18697
+ "in": "path",
18432
18698
  "schema": {
18433
18699
  "type": "integer",
18434
- "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18435
- "format": "int32"
18436
- }
18700
+ "format": "int64"
18701
+ },
18702
+ "required": true
18437
18703
  }
18438
18704
  ],
18439
18705
  "responses": {
18440
- "200": {
18441
- "description": "ListGauges 200 response",
18442
- "content": {
18443
- "application/json": {
18444
- "schema": {
18445
- "$ref": "#/components/schemas/ListGaugesResponseContent"
18446
- }
18447
- }
18448
- }
18706
+ "201": {
18707
+ "description": "EnableTool 201 response"
18449
18708
  },
18450
18709
  "401": {
18451
18710
  "description": "UnauthorizedError 401 response",
@@ -18467,6 +18726,16 @@
18467
18726
  }
18468
18727
  }
18469
18728
  },
18729
+ "422": {
18730
+ "description": "ValidationError 422 response",
18731
+ "content": {
18732
+ "application/json": {
18733
+ "schema": {
18734
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
18735
+ }
18736
+ }
18737
+ }
18738
+ },
18470
18739
  "429": {
18471
18740
  "description": "RateLimitError 429 response",
18472
18741
  "content": {
@@ -18489,15 +18758,10 @@
18489
18758
  }
18490
18759
  },
18491
18760
  "tags": [
18492
- "Gauges"
18761
+ "Dock"
18493
18762
  ],
18494
- "x-basecamp-pagination": {
18495
- "style": "link",
18496
- "totalCountHeader": "X-Total-Count",
18497
- "maxPageSize": 50
18498
- },
18499
18763
  "x-basecamp-retry": {
18500
- "maxAttempts": 3,
18764
+ "maxAttempts": 2,
18501
18765
  "baseDelayMs": 1000,
18502
18766
  "backoff": "exponential",
18503
18767
  "retryOn": [
@@ -18505,34 +18769,34 @@
18505
18769
  503
18506
18770
  ]
18507
18771
  }
18508
- }
18509
- },
18510
- "/reports/progress.json": {
18511
- "get": {
18512
- "description": "Get account-wide activity feed (progress report)",
18513
- "operationId": "GetProgressReport",
18772
+ },
18773
+ "put": {
18774
+ "description": "Reposition a tool on the project dock",
18775
+ "operationId": "RepositionTool",
18776
+ "requestBody": {
18777
+ "content": {
18778
+ "application/json": {
18779
+ "schema": {
18780
+ "$ref": "#/components/schemas/RepositionToolRequestContent"
18781
+ }
18782
+ }
18783
+ },
18784
+ "required": true
18785
+ },
18514
18786
  "parameters": [
18515
18787
  {
18516
- "name": "page",
18517
- "in": "query",
18518
- "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18788
+ "name": "toolId",
18789
+ "in": "path",
18519
18790
  "schema": {
18520
18791
  "type": "integer",
18521
- "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18522
- "format": "int32"
18523
- }
18792
+ "format": "int64"
18793
+ },
18794
+ "required": true
18524
18795
  }
18525
18796
  ],
18526
18797
  "responses": {
18527
18798
  "200": {
18528
- "description": "GetProgressReport 200 response",
18529
- "content": {
18530
- "application/json": {
18531
- "schema": {
18532
- "$ref": "#/components/schemas/GetProgressReportResponseContent"
18533
- }
18534
- }
18535
- }
18799
+ "description": "RepositionTool 200 response"
18536
18800
  },
18537
18801
  "401": {
18538
18802
  "description": "UnauthorizedError 401 response",
@@ -18554,12 +18818,22 @@
18554
18818
  }
18555
18819
  }
18556
18820
  },
18557
- "429": {
18558
- "description": "RateLimitError 429 response",
18821
+ "404": {
18822
+ "description": "NotFoundError 404 response",
18559
18823
  "content": {
18560
18824
  "application/json": {
18561
18825
  "schema": {
18562
- "$ref": "#/components/schemas/RateLimitErrorResponseContent"
18826
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
18827
+ }
18828
+ }
18829
+ }
18830
+ },
18831
+ "422": {
18832
+ "description": "ValidationError 422 response",
18833
+ "content": {
18834
+ "application/json": {
18835
+ "schema": {
18836
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
18563
18837
  }
18564
18838
  }
18565
18839
  }
@@ -18576,12 +18850,10 @@
18576
18850
  }
18577
18851
  },
18578
18852
  "tags": [
18579
- "Reports"
18853
+ "Dock"
18580
18854
  ],
18581
- "x-basecamp-pagination": {
18582
- "style": "link",
18583
- "totalCountHeader": "X-Total-Count",
18584
- "maxPageSize": 50
18855
+ "x-basecamp-idempotent": {
18856
+ "natural": true
18585
18857
  },
18586
18858
  "x-basecamp-retry": {
18587
18859
  "maxAttempts": 3,
@@ -18594,49 +18866,38 @@
18594
18866
  }
18595
18867
  }
18596
18868
  },
18597
- "/reports/schedules/upcoming.json": {
18869
+ "/reports/gauges.json": {
18598
18870
  "get": {
18599
- "description": "Get upcoming schedule entries and assignable items within a date window.\nThis endpoint is preserved as the canonical API path on BC5;\nthe BC5 `/calendar` web view is HTML-only.\n\nThe three arrays carry the report's own reduced projections —\nUpcomingScheduleEntry and UpcomingAssignable — not the shared ScheduleEntry\nand Todo/Card shapes. BC3 renders this report through\n`app/views/api/schedules/calendar/_entry.json.jbuilder` and\n`_assignable.json.jbuilder`, which emit a narrower key set than the\nper-resource partials, plus keys those partials never emit. See\nUpcomingScheduleEntry for the full accounting.",
18600
- "operationId": "GetUpcomingSchedule",
18871
+ "description": "List gauges across all projects the authenticated user has access to.\nGauges are sorted by risk level (red, yellow, green), then alphabetically.",
18872
+ "operationId": "ListGauges",
18601
18873
  "parameters": [
18602
18874
  {
18603
- "name": "window_starts_on",
18875
+ "name": "bucket_ids",
18604
18876
  "in": "query",
18605
- "description": "Inclusive first day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it.",
18877
+ "description": "Comma-separated list of project IDs. When provided, results are returned\nin the order specified instead of by risk level.",
18606
18878
  "schema": {
18607
18879
  "type": "string",
18608
- "description": "Inclusive first day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it."
18609
- },
18610
- "required": true
18880
+ "description": "Comma-separated list of project IDs. When provided, results are returned\nin the order specified instead of by risk level."
18881
+ }
18611
18882
  },
18612
18883
  {
18613
- "name": "window_ends_on",
18884
+ "name": "page",
18614
18885
  "in": "query",
18615
- "description": "Inclusive last day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it.",
18886
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18616
18887
  "schema": {
18617
- "type": "string",
18618
- "description": "Inclusive last day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it."
18619
- },
18620
- "required": true
18888
+ "type": "integer",
18889
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18890
+ "format": "int32"
18891
+ }
18621
18892
  }
18622
18893
  ],
18623
18894
  "responses": {
18624
18895
  "200": {
18625
- "description": "GetUpcomingSchedule 200 response",
18626
- "content": {
18627
- "application/json": {
18628
- "schema": {
18629
- "$ref": "#/components/schemas/GetUpcomingScheduleResponseContent"
18630
- }
18631
- }
18632
- }
18633
- },
18634
- "400": {
18635
- "description": "BadRequestError 400 response",
18896
+ "description": "ListGauges 200 response",
18636
18897
  "content": {
18637
18898
  "application/json": {
18638
18899
  "schema": {
18639
- "$ref": "#/components/schemas/BadRequestErrorResponseContent"
18900
+ "$ref": "#/components/schemas/ListGaugesResponseContent"
18640
18901
  }
18641
18902
  }
18642
18903
  }
@@ -18683,8 +18944,13 @@
18683
18944
  }
18684
18945
  },
18685
18946
  "tags": [
18686
- "Reports"
18947
+ "Gauges"
18687
18948
  ],
18949
+ "x-basecamp-pagination": {
18950
+ "style": "link",
18951
+ "totalCountHeader": "X-Total-Count",
18952
+ "maxPageSize": 50
18953
+ },
18688
18954
  "x-basecamp-retry": {
18689
18955
  "maxAttempts": 3,
18690
18956
  "baseDelayMs": 1000,
@@ -18696,41 +18962,29 @@
18696
18962
  }
18697
18963
  }
18698
18964
  },
18699
- "/reports/timesheet.json": {
18965
+ "/reports/progress.json": {
18700
18966
  "get": {
18701
- "description": "Get account-wide timesheet report",
18702
- "operationId": "GetTimesheetReport",
18967
+ "description": "Get account-wide activity feed (progress report)",
18968
+ "operationId": "GetProgressReport",
18703
18969
  "parameters": [
18704
18970
  {
18705
- "name": "from",
18706
- "in": "query",
18707
- "schema": {
18708
- "type": "string"
18709
- }
18710
- },
18711
- {
18712
- "name": "to",
18713
- "in": "query",
18714
- "schema": {
18715
- "type": "string"
18716
- }
18717
- },
18718
- {
18719
- "name": "person_id",
18971
+ "name": "page",
18720
18972
  "in": "query",
18973
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18721
18974
  "schema": {
18722
18975
  "type": "integer",
18723
- "format": "int64"
18976
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
18977
+ "format": "int32"
18724
18978
  }
18725
18979
  }
18726
18980
  ],
18727
18981
  "responses": {
18728
18982
  "200": {
18729
- "description": "GetTimesheetReport 200 response",
18983
+ "description": "GetProgressReport 200 response",
18730
18984
  "content": {
18731
18985
  "application/json": {
18732
18986
  "schema": {
18733
- "$ref": "#/components/schemas/GetTimesheetReportResponseContent"
18987
+ "$ref": "#/components/schemas/GetProgressReportResponseContent"
18734
18988
  }
18735
18989
  }
18736
18990
  }
@@ -18755,12 +19009,12 @@
18755
19009
  }
18756
19010
  }
18757
19011
  },
18758
- "404": {
18759
- "description": "NotFoundError 404 response",
19012
+ "429": {
19013
+ "description": "RateLimitError 429 response",
18760
19014
  "content": {
18761
19015
  "application/json": {
18762
19016
  "schema": {
18763
- "$ref": "#/components/schemas/NotFoundErrorResponseContent"
19017
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
18764
19018
  }
18765
19019
  }
18766
19020
  }
@@ -18777,8 +19031,13 @@
18777
19031
  }
18778
19032
  },
18779
19033
  "tags": [
18780
- "Schedule"
19034
+ "Reports"
18781
19035
  ],
19036
+ "x-basecamp-pagination": {
19037
+ "style": "link",
19038
+ "totalCountHeader": "X-Total-Count",
19039
+ "maxPageSize": 50
19040
+ },
18782
19041
  "x-basecamp-retry": {
18783
19042
  "maxAttempts": 3,
18784
19043
  "baseDelayMs": 1000,
@@ -18790,18 +19049,49 @@
18790
19049
  }
18791
19050
  }
18792
19051
  },
18793
- "/reports/todos/assigned.json": {
19052
+ "/reports/schedules/upcoming.json": {
18794
19053
  "get": {
18795
- "description": "List people who can be assigned todos",
18796
- "operationId": "ListAssignablePeople",
18797
- "parameters": [],
19054
+ "description": "Get upcoming schedule entries and assignable items within a date window.\nThis endpoint is preserved as the canonical API path on BC5;\nthe BC5 `/calendar` web view is HTML-only.\n\nThe three arrays carry the report's own reduced projections —\nUpcomingScheduleEntry and UpcomingAssignable — not the shared ScheduleEntry\nand Todo/Card shapes. BC3 renders this report through\n`app/views/api/schedules/calendar/_entry.json.jbuilder` and\n`_assignable.json.jbuilder`, which emit a narrower key set than the\nper-resource partials, plus keys those partials never emit. See\nUpcomingScheduleEntry for the full accounting.",
19055
+ "operationId": "GetUpcomingSchedule",
19056
+ "parameters": [
19057
+ {
19058
+ "name": "window_starts_on",
19059
+ "in": "query",
19060
+ "description": "Inclusive first day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it.",
19061
+ "schema": {
19062
+ "type": "string",
19063
+ "description": "Inclusive first day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it."
19064
+ },
19065
+ "required": true
19066
+ },
19067
+ {
19068
+ "name": "window_ends_on",
19069
+ "in": "query",
19070
+ "description": "Inclusive last day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it.",
19071
+ "schema": {
19072
+ "type": "string",
19073
+ "description": "Inclusive last day of the window, `YYYY-MM-DD`. Required — BC3 answers 400 without it."
19074
+ },
19075
+ "required": true
19076
+ }
19077
+ ],
18798
19078
  "responses": {
18799
19079
  "200": {
18800
- "description": "ListAssignablePeople 200 response",
19080
+ "description": "GetUpcomingSchedule 200 response",
18801
19081
  "content": {
18802
19082
  "application/json": {
18803
19083
  "schema": {
18804
- "$ref": "#/components/schemas/ListAssignablePeopleResponseContent"
19084
+ "$ref": "#/components/schemas/GetUpcomingScheduleResponseContent"
19085
+ }
19086
+ }
19087
+ }
19088
+ },
19089
+ "400": {
19090
+ "description": "BadRequestError 400 response",
19091
+ "content": {
19092
+ "application/json": {
19093
+ "schema": {
19094
+ "$ref": "#/components/schemas/BadRequestErrorResponseContent"
18805
19095
  }
18806
19096
  }
18807
19097
  }
@@ -18848,7 +19138,7 @@
18848
19138
  }
18849
19139
  },
18850
19140
  "tags": [
18851
- "People"
19141
+ "Reports"
18852
19142
  ],
18853
19143
  "x-basecamp-retry": {
18854
19144
  "maxAttempts": 3,
@@ -18861,37 +19151,41 @@
18861
19151
  }
18862
19152
  }
18863
19153
  },
18864
- "/reports/todos/assigned/{personId}": {
19154
+ "/reports/timesheet.json": {
18865
19155
  "get": {
18866
- "description": "Get todos assigned to a specific person",
18867
- "operationId": "GetAssignedTodos",
19156
+ "description": "Get account-wide timesheet report",
19157
+ "operationId": "GetTimesheetReport",
18868
19158
  "parameters": [
18869
19159
  {
18870
- "name": "personId",
18871
- "in": "path",
19160
+ "name": "from",
19161
+ "in": "query",
18872
19162
  "schema": {
18873
- "type": "integer",
18874
- "format": "int64"
18875
- },
18876
- "required": true
19163
+ "type": "string"
19164
+ }
18877
19165
  },
18878
19166
  {
18879
- "name": "group_by",
19167
+ "name": "to",
18880
19168
  "in": "query",
18881
- "description": "Group by \"bucket\" or \"date\"",
18882
19169
  "schema": {
18883
- "type": "string",
18884
- "description": "Group by \"bucket\" or \"date\""
19170
+ "type": "string"
19171
+ }
19172
+ },
19173
+ {
19174
+ "name": "person_id",
19175
+ "in": "query",
19176
+ "schema": {
19177
+ "type": "integer",
19178
+ "format": "int64"
18885
19179
  }
18886
19180
  }
18887
19181
  ],
18888
19182
  "responses": {
18889
19183
  "200": {
18890
- "description": "GetAssignedTodos 200 response",
19184
+ "description": "GetTimesheetReport 200 response",
18891
19185
  "content": {
18892
19186
  "application/json": {
18893
19187
  "schema": {
18894
- "$ref": "#/components/schemas/GetAssignedTodosResponseContent"
19188
+ "$ref": "#/components/schemas/GetTimesheetReportResponseContent"
18895
19189
  }
18896
19190
  }
18897
19191
  }
@@ -18926,16 +19220,6 @@
18926
19220
  }
18927
19221
  }
18928
19222
  },
18929
- "429": {
18930
- "description": "RateLimitError 429 response",
18931
- "content": {
18932
- "application/json": {
18933
- "schema": {
18934
- "$ref": "#/components/schemas/RateLimitErrorResponseContent"
18935
- }
18936
- }
18937
- }
18938
- },
18939
19223
  "500": {
18940
19224
  "description": "InternalServerError 500 response",
18941
19225
  "content": {
@@ -18948,7 +19232,7 @@
18948
19232
  }
18949
19233
  },
18950
19234
  "tags": [
18951
- "Reports"
19235
+ "Schedule"
18952
19236
  ],
18953
19237
  "x-basecamp-retry": {
18954
19238
  "maxAttempts": 3,
@@ -18961,18 +19245,18 @@
18961
19245
  }
18962
19246
  }
18963
19247
  },
18964
- "/reports/todos/overdue.json": {
19248
+ "/reports/todos/assigned.json": {
18965
19249
  "get": {
18966
- "description": "Get overdue todos grouped by lateness",
18967
- "operationId": "GetOverdueTodos",
19250
+ "description": "List people who can be assigned todos",
19251
+ "operationId": "ListAssignablePeople",
18968
19252
  "parameters": [],
18969
19253
  "responses": {
18970
19254
  "200": {
18971
- "description": "GetOverdueTodos 200 response",
19255
+ "description": "ListAssignablePeople 200 response",
18972
19256
  "content": {
18973
19257
  "application/json": {
18974
19258
  "schema": {
18975
- "$ref": "#/components/schemas/GetOverdueTodosResponseContent"
19259
+ "$ref": "#/components/schemas/ListAssignablePeopleResponseContent"
18976
19260
  }
18977
19261
  }
18978
19262
  }
@@ -19019,7 +19303,7 @@
19019
19303
  }
19020
19304
  },
19021
19305
  "tags": [
19022
- "Reports"
19306
+ "People"
19023
19307
  ],
19024
19308
  "x-basecamp-retry": {
19025
19309
  "maxAttempts": 3,
@@ -19032,10 +19316,10 @@
19032
19316
  }
19033
19317
  }
19034
19318
  },
19035
- "/reports/users/progress/{personId}.json": {
19319
+ "/reports/todos/assigned/{personId}": {
19036
19320
  "get": {
19037
- "description": "Get a person's activity timeline",
19038
- "operationId": "GetPersonProgress",
19321
+ "description": "Get todos assigned to a specific person",
19322
+ "operationId": "GetAssignedTodos",
19039
19323
  "parameters": [
19040
19324
  {
19041
19325
  "name": "personId",
@@ -19047,23 +19331,22 @@
19047
19331
  "required": true
19048
19332
  },
19049
19333
  {
19050
- "name": "page",
19334
+ "name": "group_by",
19051
19335
  "in": "query",
19052
- "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
19336
+ "description": "Group by \"bucket\" or \"date\"",
19053
19337
  "schema": {
19054
- "type": "integer",
19055
- "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
19056
- "format": "int32"
19338
+ "type": "string",
19339
+ "description": "Group by \"bucket\" or \"date\""
19057
19340
  }
19058
19341
  }
19059
19342
  ],
19060
19343
  "responses": {
19061
19344
  "200": {
19062
- "description": "GetPersonProgress 200 response",
19345
+ "description": "GetAssignedTodos 200 response",
19063
19346
  "content": {
19064
19347
  "application/json": {
19065
19348
  "schema": {
19066
- "$ref": "#/components/schemas/GetPersonProgressResponseContent"
19349
+ "$ref": "#/components/schemas/GetAssignedTodosResponseContent"
19067
19350
  }
19068
19351
  }
19069
19352
  }
@@ -19122,12 +19405,6 @@
19122
19405
  "tags": [
19123
19406
  "Reports"
19124
19407
  ],
19125
- "x-basecamp-pagination": {
19126
- "style": "link",
19127
- "totalCountHeader": "X-Total-Count",
19128
- "maxPageSize": 50,
19129
- "key": "events"
19130
- },
19131
19408
  "x-basecamp-retry": {
19132
19409
  "maxAttempts": 3,
19133
19410
  "baseDelayMs": 1000,
@@ -19139,28 +19416,206 @@
19139
19416
  }
19140
19417
  }
19141
19418
  },
19142
- "/schedule_entries/{entryId}": {
19419
+ "/reports/todos/overdue.json": {
19143
19420
  "get": {
19144
- "description": "Get a single schedule entry by id.\nNote: Recurring entries will redirect (302) to their recordable URL.\nUse GetScheduleEntryOccurrence for recurring entries instead.",
19145
- "operationId": "GetScheduleEntry",
19146
- "parameters": [
19147
- {
19148
- "name": "entryId",
19149
- "in": "path",
19150
- "schema": {
19151
- "type": "integer",
19152
- "format": "int64"
19153
- },
19154
- "required": true
19155
- }
19156
- ],
19421
+ "description": "Get overdue todos grouped by lateness",
19422
+ "operationId": "GetOverdueTodos",
19423
+ "parameters": [],
19157
19424
  "responses": {
19158
19425
  "200": {
19159
- "description": "GetScheduleEntry 200 response",
19426
+ "description": "GetOverdueTodos 200 response",
19160
19427
  "content": {
19161
19428
  "application/json": {
19162
19429
  "schema": {
19163
- "$ref": "#/components/schemas/GetScheduleEntryResponseContent"
19430
+ "$ref": "#/components/schemas/GetOverdueTodosResponseContent"
19431
+ }
19432
+ }
19433
+ }
19434
+ },
19435
+ "401": {
19436
+ "description": "UnauthorizedError 401 response",
19437
+ "content": {
19438
+ "application/json": {
19439
+ "schema": {
19440
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
19441
+ }
19442
+ }
19443
+ }
19444
+ },
19445
+ "403": {
19446
+ "description": "ForbiddenError 403 response",
19447
+ "content": {
19448
+ "application/json": {
19449
+ "schema": {
19450
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
19451
+ }
19452
+ }
19453
+ }
19454
+ },
19455
+ "429": {
19456
+ "description": "RateLimitError 429 response",
19457
+ "content": {
19458
+ "application/json": {
19459
+ "schema": {
19460
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
19461
+ }
19462
+ }
19463
+ }
19464
+ },
19465
+ "500": {
19466
+ "description": "InternalServerError 500 response",
19467
+ "content": {
19468
+ "application/json": {
19469
+ "schema": {
19470
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
19471
+ }
19472
+ }
19473
+ }
19474
+ }
19475
+ },
19476
+ "tags": [
19477
+ "Reports"
19478
+ ],
19479
+ "x-basecamp-retry": {
19480
+ "maxAttempts": 3,
19481
+ "baseDelayMs": 1000,
19482
+ "backoff": "exponential",
19483
+ "retryOn": [
19484
+ 429,
19485
+ 503
19486
+ ]
19487
+ }
19488
+ }
19489
+ },
19490
+ "/reports/users/progress/{personId}.json": {
19491
+ "get": {
19492
+ "description": "Get a person's activity timeline",
19493
+ "operationId": "GetPersonProgress",
19494
+ "parameters": [
19495
+ {
19496
+ "name": "personId",
19497
+ "in": "path",
19498
+ "schema": {
19499
+ "type": "integer",
19500
+ "format": "int64"
19501
+ },
19502
+ "required": true
19503
+ },
19504
+ {
19505
+ "name": "page",
19506
+ "in": "query",
19507
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
19508
+ "schema": {
19509
+ "type": "integer",
19510
+ "description": "Page number for paginating through results. Defaults to 1. A positive value selects exactly that page, not a starting offset; see SPEC section 8.",
19511
+ "format": "int32"
19512
+ }
19513
+ }
19514
+ ],
19515
+ "responses": {
19516
+ "200": {
19517
+ "description": "GetPersonProgress 200 response",
19518
+ "content": {
19519
+ "application/json": {
19520
+ "schema": {
19521
+ "$ref": "#/components/schemas/GetPersonProgressResponseContent"
19522
+ }
19523
+ }
19524
+ }
19525
+ },
19526
+ "401": {
19527
+ "description": "UnauthorizedError 401 response",
19528
+ "content": {
19529
+ "application/json": {
19530
+ "schema": {
19531
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
19532
+ }
19533
+ }
19534
+ }
19535
+ },
19536
+ "403": {
19537
+ "description": "ForbiddenError 403 response",
19538
+ "content": {
19539
+ "application/json": {
19540
+ "schema": {
19541
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
19542
+ }
19543
+ }
19544
+ }
19545
+ },
19546
+ "404": {
19547
+ "description": "NotFoundError 404 response",
19548
+ "content": {
19549
+ "application/json": {
19550
+ "schema": {
19551
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
19552
+ }
19553
+ }
19554
+ }
19555
+ },
19556
+ "429": {
19557
+ "description": "RateLimitError 429 response",
19558
+ "content": {
19559
+ "application/json": {
19560
+ "schema": {
19561
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
19562
+ }
19563
+ }
19564
+ }
19565
+ },
19566
+ "500": {
19567
+ "description": "InternalServerError 500 response",
19568
+ "content": {
19569
+ "application/json": {
19570
+ "schema": {
19571
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
19572
+ }
19573
+ }
19574
+ }
19575
+ }
19576
+ },
19577
+ "tags": [
19578
+ "Reports"
19579
+ ],
19580
+ "x-basecamp-pagination": {
19581
+ "style": "link",
19582
+ "totalCountHeader": "X-Total-Count",
19583
+ "maxPageSize": 50,
19584
+ "key": "events"
19585
+ },
19586
+ "x-basecamp-retry": {
19587
+ "maxAttempts": 3,
19588
+ "baseDelayMs": 1000,
19589
+ "backoff": "exponential",
19590
+ "retryOn": [
19591
+ 429,
19592
+ 503
19593
+ ]
19594
+ }
19595
+ }
19596
+ },
19597
+ "/schedule_entries/{entryId}": {
19598
+ "get": {
19599
+ "description": "Get a single schedule entry by id.\nNote: Recurring entries will redirect (302) to their recordable URL.\nUse GetScheduleEntryOccurrence for recurring entries instead.",
19600
+ "operationId": "GetScheduleEntry",
19601
+ "parameters": [
19602
+ {
19603
+ "name": "entryId",
19604
+ "in": "path",
19605
+ "schema": {
19606
+ "type": "integer",
19607
+ "format": "int64"
19608
+ },
19609
+ "required": true
19610
+ }
19611
+ ],
19612
+ "responses": {
19613
+ "200": {
19614
+ "description": "GetScheduleEntry 200 response",
19615
+ "content": {
19616
+ "application/json": {
19617
+ "schema": {
19618
+ "$ref": "#/components/schemas/GetScheduleEntryResponseContent"
19164
19619
  }
19165
19620
  }
19166
19621
  }
@@ -20002,7 +20457,7 @@
20002
20457
  }
20003
20458
  },
20004
20459
  "tags": [
20005
- "Automation"
20460
+ "Search"
20006
20461
  ],
20007
20462
  "x-basecamp-pagination": {
20008
20463
  "style": "link",
@@ -20078,7 +20533,7 @@
20078
20533
  }
20079
20534
  },
20080
20535
  "tags": [
20081
- "Automation"
20536
+ "Search"
20082
20537
  ],
20083
20538
  "x-basecamp-retry": {
20084
20539
  "maxAttempts": 3,
@@ -20528,18 +20983,103 @@
20528
20983
  }
20529
20984
  }
20530
20985
  },
20531
- "/template_library.json": {
20986
+ "/subtasks/{subtaskId}": {
20987
+ "delete": {
20988
+ "description": "Delete a subtask\n\nOn accounts where deleting is limited to admins and the creator, everyone\nelse gets `403 Forbidden`.",
20989
+ "operationId": "DeleteSubtask",
20990
+ "parameters": [
20991
+ {
20992
+ "name": "subtaskId",
20993
+ "in": "path",
20994
+ "schema": {
20995
+ "type": "integer",
20996
+ "format": "int64"
20997
+ },
20998
+ "required": true
20999
+ }
21000
+ ],
21001
+ "responses": {
21002
+ "204": {
21003
+ "description": "DeleteSubtask 204 response"
21004
+ },
21005
+ "401": {
21006
+ "description": "UnauthorizedError 401 response",
21007
+ "content": {
21008
+ "application/json": {
21009
+ "schema": {
21010
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21011
+ }
21012
+ }
21013
+ }
21014
+ },
21015
+ "403": {
21016
+ "description": "ForbiddenError 403 response",
21017
+ "content": {
21018
+ "application/json": {
21019
+ "schema": {
21020
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21021
+ }
21022
+ }
21023
+ }
21024
+ },
21025
+ "404": {
21026
+ "description": "NotFoundError 404 response",
21027
+ "content": {
21028
+ "application/json": {
21029
+ "schema": {
21030
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
21031
+ }
21032
+ }
21033
+ }
21034
+ },
21035
+ "500": {
21036
+ "description": "InternalServerError 500 response",
21037
+ "content": {
21038
+ "application/json": {
21039
+ "schema": {
21040
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21041
+ }
21042
+ }
21043
+ }
21044
+ }
21045
+ },
21046
+ "tags": [
21047
+ "Subtasks"
21048
+ ],
21049
+ "x-basecamp-idempotent": {
21050
+ "natural": true
21051
+ },
21052
+ "x-basecamp-retry": {
21053
+ "maxAttempts": 3,
21054
+ "baseDelayMs": 1000,
21055
+ "backoff": "exponential",
21056
+ "retryOn": [
21057
+ 429,
21058
+ 503
21059
+ ]
21060
+ }
21061
+ },
20532
21062
  "get": {
20533
- "description": "Get the account's to-do list template library",
20534
- "operationId": "GetTemplateLibrary",
20535
- "parameters": [],
21063
+ "description": "Get a subtask by ID",
21064
+ "operationId": "GetSubtask",
21065
+ "parameters": [
21066
+ {
21067
+ "name": "subtaskId",
21068
+ "in": "path",
21069
+ "schema": {
21070
+ "type": "integer",
21071
+ "format": "int64"
21072
+ },
21073
+ "required": true
21074
+ }
21075
+ ],
20536
21076
  "responses": {
20537
21077
  "200": {
20538
- "description": "GetTemplateLibrary 200 response",
21078
+ "description": "GetSubtask 200 response",
20539
21079
  "content": {
20540
21080
  "application/json": {
20541
21081
  "schema": {
20542
- "$ref": "#/components/schemas/GetTemplateLibraryResponseContent"
21082
+ "$ref": "#/components/schemas/GetSubtaskResponseContent"
20543
21083
  }
20544
21084
  }
20545
21085
  }
@@ -20564,6 +21104,266 @@
20564
21104
  }
20565
21105
  }
20566
21106
  },
21107
+ "404": {
21108
+ "description": "NotFoundError 404 response",
21109
+ "content": {
21110
+ "application/json": {
21111
+ "schema": {
21112
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
21113
+ }
21114
+ }
21115
+ }
21116
+ },
21117
+ "500": {
21118
+ "description": "InternalServerError 500 response",
21119
+ "content": {
21120
+ "application/json": {
21121
+ "schema": {
21122
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21123
+ }
21124
+ }
21125
+ }
21126
+ }
21127
+ },
21128
+ "tags": [
21129
+ "Subtasks"
21130
+ ],
21131
+ "x-basecamp-retry": {
21132
+ "maxAttempts": 3,
21133
+ "baseDelayMs": 1000,
21134
+ "backoff": "exponential",
21135
+ "retryOn": [
21136
+ 429,
21137
+ 503
21138
+ ]
21139
+ }
21140
+ },
21141
+ "put": {
21142
+ "description": "Update a subtask\n\nA partial update: every omitted parameter is left unchanged. Clearing a\nvalue takes an explicit send — `\"due_on\": null` clears the due date (an\nempty string is accepted too, and is what the Ruby, Python and TypeScript\nSDKs send, since they drop nil, None and undefined from the body);\n`\"assignee_ids\": []` removes every assignee. Send at least one parameter:\nan empty body is refused with `400 Bad Request`.",
21143
+ "operationId": "UpdateSubtask",
21144
+ "requestBody": {
21145
+ "content": {
21146
+ "application/json": {
21147
+ "schema": {
21148
+ "$ref": "#/components/schemas/UpdateSubtaskRequestContent"
21149
+ }
21150
+ }
21151
+ }
21152
+ },
21153
+ "parameters": [
21154
+ {
21155
+ "name": "subtaskId",
21156
+ "in": "path",
21157
+ "schema": {
21158
+ "type": "integer",
21159
+ "format": "int64"
21160
+ },
21161
+ "required": true
21162
+ }
21163
+ ],
21164
+ "responses": {
21165
+ "200": {
21166
+ "description": "UpdateSubtask 200 response",
21167
+ "content": {
21168
+ "application/json": {
21169
+ "schema": {
21170
+ "$ref": "#/components/schemas/UpdateSubtaskResponseContent"
21171
+ }
21172
+ }
21173
+ }
21174
+ },
21175
+ "401": {
21176
+ "description": "UnauthorizedError 401 response",
21177
+ "content": {
21178
+ "application/json": {
21179
+ "schema": {
21180
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21181
+ }
21182
+ }
21183
+ }
21184
+ },
21185
+ "403": {
21186
+ "description": "ForbiddenError 403 response",
21187
+ "content": {
21188
+ "application/json": {
21189
+ "schema": {
21190
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21191
+ }
21192
+ }
21193
+ }
21194
+ },
21195
+ "404": {
21196
+ "description": "NotFoundError 404 response",
21197
+ "content": {
21198
+ "application/json": {
21199
+ "schema": {
21200
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
21201
+ }
21202
+ }
21203
+ }
21204
+ },
21205
+ "422": {
21206
+ "description": "ValidationError 422 response",
21207
+ "content": {
21208
+ "application/json": {
21209
+ "schema": {
21210
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
21211
+ }
21212
+ }
21213
+ }
21214
+ },
21215
+ "500": {
21216
+ "description": "InternalServerError 500 response",
21217
+ "content": {
21218
+ "application/json": {
21219
+ "schema": {
21220
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21221
+ }
21222
+ }
21223
+ }
21224
+ }
21225
+ },
21226
+ "tags": [
21227
+ "Subtasks"
21228
+ ],
21229
+ "x-basecamp-idempotent": {
21230
+ "natural": true
21231
+ },
21232
+ "x-basecamp-retry": {
21233
+ "maxAttempts": 3,
21234
+ "baseDelayMs": 1000,
21235
+ "backoff": "exponential",
21236
+ "retryOn": [
21237
+ 429,
21238
+ 503
21239
+ ]
21240
+ }
21241
+ }
21242
+ },
21243
+ "/subtasks/{subtaskId}/completion.json": {
21244
+ "delete": {
21245
+ "description": "Mark a subtask as not completed",
21246
+ "operationId": "UncompleteSubtask",
21247
+ "parameters": [
21248
+ {
21249
+ "name": "subtaskId",
21250
+ "in": "path",
21251
+ "schema": {
21252
+ "type": "integer",
21253
+ "format": "int64"
21254
+ },
21255
+ "required": true
21256
+ }
21257
+ ],
21258
+ "responses": {
21259
+ "204": {
21260
+ "description": "UncompleteSubtask 204 response"
21261
+ },
21262
+ "401": {
21263
+ "description": "UnauthorizedError 401 response",
21264
+ "content": {
21265
+ "application/json": {
21266
+ "schema": {
21267
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21268
+ }
21269
+ }
21270
+ }
21271
+ },
21272
+ "403": {
21273
+ "description": "ForbiddenError 403 response",
21274
+ "content": {
21275
+ "application/json": {
21276
+ "schema": {
21277
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21278
+ }
21279
+ }
21280
+ }
21281
+ },
21282
+ "404": {
21283
+ "description": "NotFoundError 404 response",
21284
+ "content": {
21285
+ "application/json": {
21286
+ "schema": {
21287
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
21288
+ }
21289
+ }
21290
+ }
21291
+ },
21292
+ "500": {
21293
+ "description": "InternalServerError 500 response",
21294
+ "content": {
21295
+ "application/json": {
21296
+ "schema": {
21297
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21298
+ }
21299
+ }
21300
+ }
21301
+ }
21302
+ },
21303
+ "tags": [
21304
+ "Subtasks"
21305
+ ],
21306
+ "x-basecamp-idempotent": {
21307
+ "natural": true
21308
+ },
21309
+ "x-basecamp-retry": {
21310
+ "maxAttempts": 3,
21311
+ "baseDelayMs": 1000,
21312
+ "backoff": "exponential",
21313
+ "retryOn": [
21314
+ 429,
21315
+ 503
21316
+ ]
21317
+ }
21318
+ },
21319
+ "post": {
21320
+ "description": "Mark a subtask as completed",
21321
+ "operationId": "CompleteSubtask",
21322
+ "parameters": [
21323
+ {
21324
+ "name": "subtaskId",
21325
+ "in": "path",
21326
+ "schema": {
21327
+ "type": "integer",
21328
+ "format": "int64"
21329
+ },
21330
+ "required": true
21331
+ }
21332
+ ],
21333
+ "responses": {
21334
+ "204": {
21335
+ "description": "CompleteSubtask 204 response"
21336
+ },
21337
+ "401": {
21338
+ "description": "UnauthorizedError 401 response",
21339
+ "content": {
21340
+ "application/json": {
21341
+ "schema": {
21342
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21343
+ }
21344
+ }
21345
+ }
21346
+ },
21347
+ "403": {
21348
+ "description": "ForbiddenError 403 response",
21349
+ "content": {
21350
+ "application/json": {
21351
+ "schema": {
21352
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21353
+ }
21354
+ }
21355
+ }
21356
+ },
21357
+ "404": {
21358
+ "description": "NotFoundError 404 response",
21359
+ "content": {
21360
+ "application/json": {
21361
+ "schema": {
21362
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
21363
+ }
21364
+ }
21365
+ }
21366
+ },
20567
21367
  "429": {
20568
21368
  "description": "RateLimitError 429 response",
20569
21369
  "content": {
@@ -20586,8 +21386,11 @@
20586
21386
  }
20587
21387
  },
20588
21388
  "tags": [
20589
- "Automation"
21389
+ "Subtasks"
20590
21390
  ],
21391
+ "x-basecamp-idempotent": {
21392
+ "natural": true
21393
+ },
20591
21394
  "x-basecamp-retry": {
20592
21395
  "maxAttempts": 3,
20593
21396
  "baseDelayMs": 1000,
@@ -20599,9 +21402,266 @@
20599
21402
  }
20600
21403
  }
20601
21404
  },
21405
+ "/subtasks/{subtaskId}/position.json": {
21406
+ "put": {
21407
+ "description": "Move a subtask to a new position among its siblings",
21408
+ "operationId": "RepositionSubtask",
21409
+ "requestBody": {
21410
+ "content": {
21411
+ "application/json": {
21412
+ "schema": {
21413
+ "$ref": "#/components/schemas/RepositionSubtaskRequestContent"
21414
+ }
21415
+ }
21416
+ },
21417
+ "required": true
21418
+ },
21419
+ "parameters": [
21420
+ {
21421
+ "name": "subtaskId",
21422
+ "in": "path",
21423
+ "schema": {
21424
+ "type": "integer",
21425
+ "format": "int64"
21426
+ },
21427
+ "required": true
21428
+ }
21429
+ ],
21430
+ "responses": {
21431
+ "204": {
21432
+ "description": "RepositionSubtask 204 response"
21433
+ },
21434
+ "401": {
21435
+ "description": "UnauthorizedError 401 response",
21436
+ "content": {
21437
+ "application/json": {
21438
+ "schema": {
21439
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21440
+ }
21441
+ }
21442
+ }
21443
+ },
21444
+ "403": {
21445
+ "description": "ForbiddenError 403 response",
21446
+ "content": {
21447
+ "application/json": {
21448
+ "schema": {
21449
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21450
+ }
21451
+ }
21452
+ }
21453
+ },
21454
+ "404": {
21455
+ "description": "NotFoundError 404 response",
21456
+ "content": {
21457
+ "application/json": {
21458
+ "schema": {
21459
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
21460
+ }
21461
+ }
21462
+ }
21463
+ },
21464
+ "422": {
21465
+ "description": "ValidationError 422 response",
21466
+ "content": {
21467
+ "application/json": {
21468
+ "schema": {
21469
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
21470
+ }
21471
+ }
21472
+ }
21473
+ },
21474
+ "500": {
21475
+ "description": "InternalServerError 500 response",
21476
+ "content": {
21477
+ "application/json": {
21478
+ "schema": {
21479
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21480
+ }
21481
+ }
21482
+ }
21483
+ }
21484
+ },
21485
+ "tags": [
21486
+ "Subtasks"
21487
+ ],
21488
+ "x-basecamp-idempotent": {
21489
+ "natural": true
21490
+ },
21491
+ "x-basecamp-retry": {
21492
+ "maxAttempts": 3,
21493
+ "baseDelayMs": 1000,
21494
+ "backoff": "exponential",
21495
+ "retryOn": [
21496
+ 429,
21497
+ 503
21498
+ ]
21499
+ }
21500
+ }
21501
+ },
21502
+ "/template_library/card_tables.json": {
21503
+ "get": {
21504
+ "description": "Get the account's card table templates",
21505
+ "operationId": "GetTemplateLibraryCardTables",
21506
+ "parameters": [],
21507
+ "responses": {
21508
+ "200": {
21509
+ "description": "GetTemplateLibraryCardTables 200 response",
21510
+ "content": {
21511
+ "application/json": {
21512
+ "schema": {
21513
+ "$ref": "#/components/schemas/GetTemplateLibraryCardTablesResponseContent"
21514
+ }
21515
+ }
21516
+ }
21517
+ },
21518
+ "401": {
21519
+ "description": "UnauthorizedError 401 response",
21520
+ "content": {
21521
+ "application/json": {
21522
+ "schema": {
21523
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21524
+ }
21525
+ }
21526
+ }
21527
+ },
21528
+ "403": {
21529
+ "description": "ForbiddenError 403 response",
21530
+ "content": {
21531
+ "application/json": {
21532
+ "schema": {
21533
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21534
+ }
21535
+ }
21536
+ }
21537
+ },
21538
+ "429": {
21539
+ "description": "RateLimitError 429 response",
21540
+ "content": {
21541
+ "application/json": {
21542
+ "schema": {
21543
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
21544
+ }
21545
+ }
21546
+ }
21547
+ },
21548
+ "500": {
21549
+ "description": "InternalServerError 500 response",
21550
+ "content": {
21551
+ "application/json": {
21552
+ "schema": {
21553
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21554
+ }
21555
+ }
21556
+ }
21557
+ }
21558
+ },
21559
+ "tags": [
21560
+ "Templates"
21561
+ ],
21562
+ "x-basecamp-retry": {
21563
+ "maxAttempts": 3,
21564
+ "baseDelayMs": 1000,
21565
+ "backoff": "exponential",
21566
+ "retryOn": [
21567
+ 429,
21568
+ 503
21569
+ ]
21570
+ }
21571
+ },
21572
+ "post": {
21573
+ "description": "Create a card table template with the default columns",
21574
+ "operationId": "CreateTemplateLibraryCardTable",
21575
+ "requestBody": {
21576
+ "content": {
21577
+ "application/json": {
21578
+ "schema": {
21579
+ "$ref": "#/components/schemas/CreateTemplateLibraryCardTableRequestContent"
21580
+ }
21581
+ }
21582
+ },
21583
+ "required": true
21584
+ },
21585
+ "parameters": [],
21586
+ "responses": {
21587
+ "201": {
21588
+ "description": "CreateTemplateLibraryCardTable 201 response",
21589
+ "content": {
21590
+ "application/json": {
21591
+ "schema": {
21592
+ "$ref": "#/components/schemas/CreateTemplateLibraryCardTableResponseContent"
21593
+ }
21594
+ }
21595
+ }
21596
+ },
21597
+ "401": {
21598
+ "description": "UnauthorizedError 401 response",
21599
+ "content": {
21600
+ "application/json": {
21601
+ "schema": {
21602
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21603
+ }
21604
+ }
21605
+ }
21606
+ },
21607
+ "403": {
21608
+ "description": "ForbiddenError 403 response",
21609
+ "content": {
21610
+ "application/json": {
21611
+ "schema": {
21612
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21613
+ }
21614
+ }
21615
+ }
21616
+ },
21617
+ "422": {
21618
+ "description": "ValidationError 422 response",
21619
+ "content": {
21620
+ "application/json": {
21621
+ "schema": {
21622
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
21623
+ }
21624
+ }
21625
+ }
21626
+ },
21627
+ "429": {
21628
+ "description": "RateLimitError 429 response",
21629
+ "content": {
21630
+ "application/json": {
21631
+ "schema": {
21632
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
21633
+ }
21634
+ }
21635
+ }
21636
+ },
21637
+ "500": {
21638
+ "description": "InternalServerError 500 response",
21639
+ "content": {
21640
+ "application/json": {
21641
+ "schema": {
21642
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21643
+ }
21644
+ }
21645
+ }
21646
+ }
21647
+ },
21648
+ "tags": [
21649
+ "Templates"
21650
+ ],
21651
+ "x-basecamp-retry": {
21652
+ "maxAttempts": 2,
21653
+ "baseDelayMs": 1000,
21654
+ "backoff": "exponential",
21655
+ "retryOn": [
21656
+ 429,
21657
+ 503
21658
+ ]
21659
+ }
21660
+ }
21661
+ },
20602
21662
  "/template_library/copies.json": {
20603
21663
  "post": {
20604
- "description": "Start copying a to-do list template into a project",
21664
+ "description": "Start copying a to-do list or card table template into a project",
20605
21665
  "operationId": "CreateTemplateLibraryCopy",
20606
21666
  "requestBody": {
20607
21667
  "content": {
@@ -20687,7 +21747,7 @@
20687
21747
  }
20688
21748
  },
20689
21749
  "tags": [
20690
- "Automation"
21750
+ "Templates"
20691
21751
  ],
20692
21752
  "x-basecamp-retry": {
20693
21753
  "maxAttempts": 2,
@@ -20778,7 +21838,7 @@
20778
21838
  }
20779
21839
  },
20780
21840
  "tags": [
20781
- "Automation"
21841
+ "Templates"
20782
21842
  ],
20783
21843
  "x-basecamp-retry": {
20784
21844
  "maxAttempts": 3,
@@ -20791,6 +21851,166 @@
20791
21851
  }
20792
21852
  }
20793
21853
  },
21854
+ "/template_library/todolists.json": {
21855
+ "get": {
21856
+ "description": "Get the account's to-do list templates",
21857
+ "operationId": "GetTemplateLibraryTodolists",
21858
+ "parameters": [],
21859
+ "responses": {
21860
+ "200": {
21861
+ "description": "GetTemplateLibraryTodolists 200 response",
21862
+ "content": {
21863
+ "application/json": {
21864
+ "schema": {
21865
+ "$ref": "#/components/schemas/GetTemplateLibraryTodolistsResponseContent"
21866
+ }
21867
+ }
21868
+ }
21869
+ },
21870
+ "401": {
21871
+ "description": "UnauthorizedError 401 response",
21872
+ "content": {
21873
+ "application/json": {
21874
+ "schema": {
21875
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21876
+ }
21877
+ }
21878
+ }
21879
+ },
21880
+ "403": {
21881
+ "description": "ForbiddenError 403 response",
21882
+ "content": {
21883
+ "application/json": {
21884
+ "schema": {
21885
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21886
+ }
21887
+ }
21888
+ }
21889
+ },
21890
+ "429": {
21891
+ "description": "RateLimitError 429 response",
21892
+ "content": {
21893
+ "application/json": {
21894
+ "schema": {
21895
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
21896
+ }
21897
+ }
21898
+ }
21899
+ },
21900
+ "500": {
21901
+ "description": "InternalServerError 500 response",
21902
+ "content": {
21903
+ "application/json": {
21904
+ "schema": {
21905
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21906
+ }
21907
+ }
21908
+ }
21909
+ }
21910
+ },
21911
+ "tags": [
21912
+ "Templates"
21913
+ ],
21914
+ "x-basecamp-retry": {
21915
+ "maxAttempts": 3,
21916
+ "baseDelayMs": 1000,
21917
+ "backoff": "exponential",
21918
+ "retryOn": [
21919
+ 429,
21920
+ 503
21921
+ ]
21922
+ }
21923
+ },
21924
+ "post": {
21925
+ "description": "Create an empty to-do list template",
21926
+ "operationId": "CreateTemplateLibraryTodolist",
21927
+ "requestBody": {
21928
+ "content": {
21929
+ "application/json": {
21930
+ "schema": {
21931
+ "$ref": "#/components/schemas/CreateTemplateLibraryTodolistRequestContent"
21932
+ }
21933
+ }
21934
+ },
21935
+ "required": true
21936
+ },
21937
+ "parameters": [],
21938
+ "responses": {
21939
+ "201": {
21940
+ "description": "CreateTemplateLibraryTodolist 201 response",
21941
+ "content": {
21942
+ "application/json": {
21943
+ "schema": {
21944
+ "$ref": "#/components/schemas/CreateTemplateLibraryTodolistResponseContent"
21945
+ }
21946
+ }
21947
+ }
21948
+ },
21949
+ "401": {
21950
+ "description": "UnauthorizedError 401 response",
21951
+ "content": {
21952
+ "application/json": {
21953
+ "schema": {
21954
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
21955
+ }
21956
+ }
21957
+ }
21958
+ },
21959
+ "403": {
21960
+ "description": "ForbiddenError 403 response",
21961
+ "content": {
21962
+ "application/json": {
21963
+ "schema": {
21964
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
21965
+ }
21966
+ }
21967
+ }
21968
+ },
21969
+ "422": {
21970
+ "description": "ValidationError 422 response",
21971
+ "content": {
21972
+ "application/json": {
21973
+ "schema": {
21974
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
21975
+ }
21976
+ }
21977
+ }
21978
+ },
21979
+ "429": {
21980
+ "description": "RateLimitError 429 response",
21981
+ "content": {
21982
+ "application/json": {
21983
+ "schema": {
21984
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
21985
+ }
21986
+ }
21987
+ }
21988
+ },
21989
+ "500": {
21990
+ "description": "InternalServerError 500 response",
21991
+ "content": {
21992
+ "application/json": {
21993
+ "schema": {
21994
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
21995
+ }
21996
+ }
21997
+ }
21998
+ }
21999
+ },
22000
+ "tags": [
22001
+ "Templates"
22002
+ ],
22003
+ "x-basecamp-retry": {
22004
+ "maxAttempts": 2,
22005
+ "baseDelayMs": 1000,
22006
+ "backoff": "exponential",
22007
+ "retryOn": [
22008
+ 429,
22009
+ 503
22010
+ ]
22011
+ }
22012
+ }
22013
+ },
20794
22014
  "/templates.json": {
20795
22015
  "get": {
20796
22016
  "description": "List all templates visible to the current user\n\n**Pagination**: Uses Link header (RFC5988). Follow the `next` rel URL\nto fetch additional pages. X-Total-Count header provides total count.",
@@ -20869,7 +22089,7 @@
20869
22089
  }
20870
22090
  },
20871
22091
  "tags": [
20872
- "Automation"
22092
+ "Templates"
20873
22093
  ],
20874
22094
  "x-basecamp-pagination": {
20875
22095
  "style": "link",
@@ -20963,7 +22183,7 @@
20963
22183
  }
20964
22184
  },
20965
22185
  "tags": [
20966
- "Automation"
22186
+ "Templates"
20967
22187
  ],
20968
22188
  "x-basecamp-retry": {
20969
22189
  "maxAttempts": 2,
@@ -21037,7 +22257,7 @@
21037
22257
  }
21038
22258
  },
21039
22259
  "tags": [
21040
- "Automation"
22260
+ "Templates"
21041
22261
  ],
21042
22262
  "x-basecamp-idempotent": {
21043
22263
  "natural": true
@@ -21119,7 +22339,7 @@
21119
22339
  }
21120
22340
  },
21121
22341
  "tags": [
21122
- "Automation"
22342
+ "Templates"
21123
22343
  ],
21124
22344
  "x-basecamp-retry": {
21125
22345
  "maxAttempts": 3,
@@ -21217,7 +22437,7 @@
21217
22437
  }
21218
22438
  },
21219
22439
  "tags": [
21220
- "Automation"
22440
+ "Templates"
21221
22441
  ],
21222
22442
  "x-basecamp-idempotent": {
21223
22443
  "natural": true
@@ -21321,7 +22541,7 @@
21321
22541
  }
21322
22542
  },
21323
22543
  "tags": [
21324
- "Automation"
22544
+ "Templates"
21325
22545
  ],
21326
22546
  "x-basecamp-retry": {
21327
22547
  "maxAttempts": 2,
@@ -21411,7 +22631,7 @@
21411
22631
  }
21412
22632
  },
21413
22633
  "tags": [
21414
- "Automation"
22634
+ "Templates"
21415
22635
  ],
21416
22636
  "x-basecamp-retry": {
21417
22637
  "maxAttempts": 3,
@@ -21426,7 +22646,7 @@
21426
22646
  },
21427
22647
  "/timesheet_entries/{entryId}": {
21428
22648
  "delete": {
21429
- "description": "Permanently delete a timesheet entry; answers 403 when the caller may not archive or trash it.",
22649
+ "description": "Permanently delete a timesheet entry, which never appears in the trash and cannot be restored; this is the only way to remove one, since bc3 answers 403 to TrashRecording and ArchiveRecording for every timesheet entry, and it answers 403 when the caller may not remove the entry.",
21430
22650
  "operationId": "DestroyTimesheetEntry",
21431
22651
  "parameters": [
21432
22652
  {
@@ -25254,7 +26474,7 @@
25254
26474
  }
25255
26475
  },
25256
26476
  "tags": [
25257
- "Automation"
26477
+ "Webhooks"
25258
26478
  ],
25259
26479
  "x-basecamp-idempotent": {
25260
26480
  "natural": true
@@ -25336,7 +26556,7 @@
25336
26556
  }
25337
26557
  },
25338
26558
  "tags": [
25339
- "Automation"
26559
+ "Webhooks"
25340
26560
  ],
25341
26561
  "x-basecamp-retry": {
25342
26562
  "maxAttempts": 3,
@@ -25444,7 +26664,7 @@
25444
26664
  }
25445
26665
  },
25446
26666
  "tags": [
25447
- "Automation"
26667
+ "Webhooks"
25448
26668
  ],
25449
26669
  "x-basecamp-idempotent": {
25450
26670
  "natural": true
@@ -26115,8 +27335,9 @@
26115
27335
  "steps": {
26116
27336
  "type": "array",
26117
27337
  "items": {
26118
- "$ref": "#/components/schemas/CardStep"
27338
+ "$ref": "#/components/schemas/Subtask"
26119
27339
  },
27340
+ "description": "The first 100 subtasks, embedded read-only. A card with more than 100\nreports the total in `subtasks_count`; fetch the rest from `subtasks_url`.",
26120
27341
  "x-go-type-skip-optional-pointer": true
26121
27342
  },
26122
27343
  "boosts_count": {
@@ -26125,6 +27346,18 @@
26125
27346
  },
26126
27347
  "boosts_url": {
26127
27348
  "type": "string"
27349
+ },
27350
+ "subtasks_count": {
27351
+ "type": "integer",
27352
+ "description": "Subtask accounting (BC3 #12659). `subtasks_count` is the real total,\n`subtasks_completed_count` how many are done, and `subtasks_url` the\npaginated listing of all of them (`ListSubtasks`).",
27353
+ "format": "int32"
27354
+ },
27355
+ "subtasks_completed_count": {
27356
+ "type": "integer",
27357
+ "format": "int32"
27358
+ },
27359
+ "subtasks_url": {
27360
+ "type": "string"
26128
27361
  }
26129
27362
  },
26130
27363
  "required": [
@@ -26295,7 +27528,7 @@
26295
27528
  "updated_at"
26296
27529
  ]
26297
27530
  },
26298
- "CardStep": {
27531
+ "CardTable": {
26299
27532
  "type": "object",
26300
27533
  "properties": {
26301
27534
  "id": {
@@ -26340,113 +27573,20 @@
26340
27573
  "bookmark_url": {
26341
27574
  "type": "string"
26342
27575
  },
27576
+ "subscription_url": {
27577
+ "type": "string"
27578
+ },
26343
27579
  "position": {
26344
27580
  "type": "integer",
27581
+ "description": "Position on the project dock. Absent on a card table template, which the\nlibrary orders by title instead.",
26345
27582
  "format": "int32"
26346
27583
  },
26347
- "due_on": {
26348
- "type": "string",
26349
- "x-go-type": "types.Date",
26350
- "x-go-type-import": {
26351
- "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
26352
- }
26353
- },
26354
- "completed": {
26355
- "type": "boolean"
26356
- },
26357
- "completed_at": {
26358
- "type": "string",
26359
- "x-go-type": "time.Time",
26360
- "x-go-type-import": {
26361
- "path": "time"
26362
- }
26363
- },
26364
27584
  "parent": {
26365
27585
  "$ref": "#/components/schemas/RecordingParent"
26366
27586
  },
26367
- "bucket": {
26368
- "$ref": "#/components/schemas/TodoBucket"
26369
- },
26370
- "creator": {
26371
- "$ref": "#/components/schemas/Person"
26372
- },
26373
- "completer": {
26374
- "$ref": "#/components/schemas/Person"
26375
- },
26376
- "assignees": {
26377
- "type": "array",
26378
- "items": {
26379
- "$ref": "#/components/schemas/Person"
26380
- },
26381
- "x-go-type-skip-optional-pointer": true
26382
- },
26383
- "completion_url": {
26384
- "type": "string"
26385
- }
26386
- },
26387
- "required": [
26388
- "app_url",
26389
- "bucket",
26390
- "created_at",
26391
- "creator",
26392
- "id",
26393
- "inherits_status",
26394
- "parent",
26395
- "status",
26396
- "title",
26397
- "type",
26398
- "updated_at",
26399
- "url",
26400
- "visible_to_clients"
26401
- ]
26402
- },
26403
- "CardTable": {
26404
- "type": "object",
26405
- "properties": {
26406
- "id": {
26407
- "type": "integer",
26408
- "format": "int64"
26409
- },
26410
- "status": {
26411
- "type": "string"
26412
- },
26413
- "visible_to_clients": {
26414
- "type": "boolean"
26415
- },
26416
- "created_at": {
27587
+ "public_link_url": {
26417
27588
  "type": "string",
26418
- "x-go-type": "time.Time",
26419
- "x-go-type-import": {
26420
- "path": "time"
26421
- }
26422
- },
26423
- "updated_at": {
26424
- "type": "string",
26425
- "x-go-type": "time.Time",
26426
- "x-go-type-import": {
26427
- "path": "time"
26428
- }
26429
- },
26430
- "title": {
26431
- "type": "string"
26432
- },
26433
- "inherits_status": {
26434
- "type": "boolean"
26435
- },
26436
- "type": {
26437
- "type": "string"
26438
- },
26439
- "url": {
26440
- "type": "string"
26441
- },
26442
- "app_url": {
26443
- "type": "string"
26444
- },
26445
- "bookmark_url": {
26446
- "type": "string"
26447
- },
26448
- "subscription_url": {
26449
- "type": "string"
27589
+ "description": "Public sharing URL. Absent for callers who may not share publicly, so the\nsame card table can carry it for one person and not another."
26450
27590
  },
26451
27591
  "bucket": {
26452
27592
  "$ref": "#/components/schemas/TodoBucket"
@@ -27310,7 +28450,7 @@
27310
28450
  ]
27311
28451
  },
27312
28452
  "CreateCardStepResponseContent": {
27313
- "$ref": "#/components/schemas/CardStep"
28453
+ "$ref": "#/components/schemas/Subtask"
27314
28454
  },
27315
28455
  "CreateChatbotRequestContent": {
27316
28456
  "type": "object",
@@ -27792,15 +28932,65 @@
27792
28932
  "url"
27793
28933
  ]
27794
28934
  },
28935
+ "CreateSubtaskRequestContent": {
28936
+ "type": "object",
28937
+ "properties": {
28938
+ "title": {
28939
+ "type": "string"
28940
+ },
28941
+ "due_on": {
28942
+ "type": "string",
28943
+ "x-go-type": "types.Date",
28944
+ "x-go-type-import": {
28945
+ "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
28946
+ }
28947
+ },
28948
+ "assignee_ids": {
28949
+ "type": "array",
28950
+ "items": {
28951
+ "type": "integer",
28952
+ "format": "int64"
28953
+ }
28954
+ }
28955
+ },
28956
+ "required": [
28957
+ "title"
28958
+ ]
28959
+ },
28960
+ "CreateSubtaskResponseContent": {
28961
+ "$ref": "#/components/schemas/Subtask"
28962
+ },
28963
+ "CreateTemplateLibraryCardTableRequestContent": {
28964
+ "type": "object",
28965
+ "properties": {
28966
+ "name": {
28967
+ "type": "string",
28968
+ "description": "The template's name. Write-only: the response carries it as `title`."
28969
+ }
28970
+ },
28971
+ "required": [
28972
+ "name"
28973
+ ]
28974
+ },
28975
+ "CreateTemplateLibraryCardTableResponseContent": {
28976
+ "$ref": "#/components/schemas/CardTable"
28977
+ },
27795
28978
  "CreateTemplateLibraryCopyRequestContent": {
27796
28979
  "type": "object",
27797
28980
  "properties": {
27798
28981
  "template_recording_id": {
27799
28982
  "type": "integer",
28983
+ "description": "The to-do list or card table in the library to copy.",
28984
+ "format": "int64"
28985
+ },
28986
+ "destination_project_id": {
28987
+ "type": "integer",
28988
+ "description": "The destination project. Basecamp resolves the container from the\ntemplate's kind, so a caller naming a project needs to know nothing about\ndocks or to-do sets. Supply this or destination_parent_id; if both are\nsent, destination_parent_id wins.",
27800
28989
  "format": "int64"
27801
28990
  },
27802
28991
  "destination_parent_id": {
27803
28992
  "type": "integer",
28993
+ "description": "The container to copy into, for a caller that already holds one: the\nproject's to-do set for a to-do list template, or its dock for a card\ntable. A caller who may not edit it gets 404, not 403.",
27804
28994
  "format": "int64"
27805
28995
  },
27806
28996
  "adding_people_confirmed": {
@@ -27809,13 +28999,31 @@
27809
28999
  }
27810
29000
  },
27811
29001
  "required": [
27812
- "destination_parent_id",
27813
29002
  "template_recording_id"
27814
29003
  ]
27815
29004
  },
27816
29005
  "CreateTemplateLibraryCopyResponseContent": {
27817
29006
  "$ref": "#/components/schemas/TemplateLibraryCopy"
27818
29007
  },
29008
+ "CreateTemplateLibraryTodolistRequestContent": {
29009
+ "type": "object",
29010
+ "properties": {
29011
+ "name": {
29012
+ "type": "string",
29013
+ "description": "What to call the template."
29014
+ },
29015
+ "description": {
29016
+ "type": "string",
29017
+ "description": "Rich text describing the template."
29018
+ }
29019
+ },
29020
+ "required": [
29021
+ "name"
29022
+ ]
29023
+ },
29024
+ "CreateTemplateLibraryTodolistResponseContent": {
29025
+ "$ref": "#/components/schemas/Todolist"
29026
+ },
27819
29027
  "CreateTemplateRequestContent": {
27820
29028
  "type": "object",
27821
29029
  "properties": {
@@ -27833,6 +29041,30 @@
27833
29041
  "CreateTemplateResponseContent": {
27834
29042
  "$ref": "#/components/schemas/Template"
27835
29043
  },
29044
+ "CreateTemplatificationRequestContent": {
29045
+ "type": "object",
29046
+ "properties": {
29047
+ "template_name": {
29048
+ "type": "string",
29049
+ "description": "What to call the template. Defaults to the source recording's own title."
29050
+ },
29051
+ "copy_comments": {
29052
+ "type": "boolean",
29053
+ "description": "Carry the comments across."
29054
+ },
29055
+ "copy_assignments": {
29056
+ "type": "boolean",
29057
+ "description": "Carry assignees and the people involved across, adding them to the library\nif they are not already there."
29058
+ },
29059
+ "move_cards_to_triage": {
29060
+ "type": "boolean",
29061
+ "description": "Gather the cards into Triage. Card tables only, and ignored otherwise."
29062
+ }
29063
+ }
29064
+ },
29065
+ "CreateTemplatificationResponseContent": {
29066
+ "$ref": "#/components/schemas/Templatification"
29067
+ },
27836
29068
  "CreateTimesheetEntryRequestContent": {
27837
29069
  "type": "object",
27838
29070
  "properties": {
@@ -29487,7 +30719,7 @@
29487
30719
  "$ref": "#/components/schemas/Card"
29488
30720
  },
29489
30721
  "GetCardStepResponseContent": {
29490
- "$ref": "#/components/schemas/CardStep"
30722
+ "$ref": "#/components/schemas/Subtask"
29491
30723
  },
29492
30724
  "GetCardTableResponseContent": {
29493
30725
  "$ref": "#/components/schemas/CardTable"
@@ -29850,15 +31082,24 @@
29850
31082
  "GetSubscriptionResponseContent": {
29851
31083
  "$ref": "#/components/schemas/Subscription"
29852
31084
  },
31085
+ "GetSubtaskResponseContent": {
31086
+ "$ref": "#/components/schemas/Subtask"
31087
+ },
31088
+ "GetTemplateLibraryCardTablesResponseContent": {
31089
+ "$ref": "#/components/schemas/TemplateLibraryCardTables"
31090
+ },
29853
31091
  "GetTemplateLibraryCopyResponseContent": {
29854
31092
  "$ref": "#/components/schemas/TemplateLibraryCopy"
29855
31093
  },
29856
- "GetTemplateLibraryResponseContent": {
29857
- "$ref": "#/components/schemas/TemplateLibrary"
31094
+ "GetTemplateLibraryTodolistsResponseContent": {
31095
+ "$ref": "#/components/schemas/TemplateLibraryTodolists"
29858
31096
  },
29859
31097
  "GetTemplateResponseContent": {
29860
31098
  "$ref": "#/components/schemas/Template"
29861
31099
  },
31100
+ "GetTemplatificationResponseContent": {
31101
+ "$ref": "#/components/schemas/Templatification"
31102
+ },
29862
31103
  "GetTimesheetEntryResponseContent": {
29863
31104
  "$ref": "#/components/schemas/TimesheetEntry"
29864
31105
  },
@@ -30473,6 +31714,12 @@
30473
31714
  "$ref": "#/components/schemas/ScheduleEntry"
30474
31715
  }
30475
31716
  },
31717
+ "ListSubtasksResponseContent": {
31718
+ "type": "array",
31719
+ "items": {
31720
+ "$ref": "#/components/schemas/Subtask"
31721
+ }
31722
+ },
30476
31723
  "ListTemplatesResponseContent": {
30477
31724
  "type": "array",
30478
31725
  "items": {
@@ -30529,7 +31776,8 @@
30529
31776
  "items": {
30530
31777
  "type": "string"
30531
31778
  },
30532
- "description": "Array of readable_sgid values identifying the items to mark as read"
31779
+ "maxItems": 500,
31780
+ "description": "Array of readable_sgid values identifying the items to mark as read.\nAt most 500 per request."
30533
31781
  }
30534
31782
  },
30535
31783
  "required": [
@@ -32180,6 +33428,18 @@
32180
33428
  "boosts_url": {
32181
33429
  "type": "string"
32182
33430
  },
33431
+ "subtasks_count": {
33432
+ "type": "integer",
33433
+ "description": "Subtask count/URL. Carried on subtaskable recordings — to-dos and cards,\nwhose type-specific partials render with `subtaskable: true` (BC3\n#12659). Optional (absent on every other recording type and on the\nbase/webhook partial).",
33434
+ "format": "int32"
33435
+ },
33436
+ "subtasks_completed_count": {
33437
+ "type": "integer",
33438
+ "format": "int32"
33439
+ },
33440
+ "subtasks_url": {
33441
+ "type": "string"
33442
+ },
32183
33443
  "subject": {
32184
33444
  "type": "string",
32185
33445
  "description": "Message subject. Present on `Message` recordings — notably the account-wide\n`/messages.json` aggregate feed, whose message partial renders `subject`."
@@ -32454,7 +33714,7 @@
32454
33714
  },
32455
33715
  "position": {
32456
33716
  "type": "integer",
32457
- "description": "0-indexed position",
33717
+ "description": "The 1-based position to move it to (1 = top), the same `reposition_to`\na to-do uses. bc3's doc said \"Zero indexed\" until BC3 #12659 corrected\nit; the server never was.",
32458
33718
  "format": "int32"
32459
33719
  }
32460
33720
  },
@@ -32463,6 +33723,19 @@
32463
33723
  "source_id"
32464
33724
  ]
32465
33725
  },
33726
+ "RepositionSubtaskRequestContent": {
33727
+ "type": "object",
33728
+ "properties": {
33729
+ "position": {
33730
+ "type": "integer",
33731
+ "description": "The 1-based position to move it to",
33732
+ "format": "int32"
33733
+ }
33734
+ },
33735
+ "required": [
33736
+ "position"
33737
+ ]
33738
+ },
32466
33739
  "RepositionTodoRequestContent": {
32467
33740
  "type": "object",
32468
33741
  "properties": {
@@ -33242,7 +34515,7 @@
33242
34515
  ]
33243
34516
  },
33244
34517
  "SetCardStepCompletionResponseContent": {
33245
- "$ref": "#/components/schemas/CardStep"
34518
+ "$ref": "#/components/schemas/Subtask"
33246
34519
  },
33247
34520
  "SetClientVisibilityRequestContent": {
33248
34521
  "type": "object",
@@ -33306,6 +34579,111 @@
33306
34579
  "url"
33307
34580
  ]
33308
34581
  },
34582
+ "Subtask": {
34583
+ "type": "object",
34584
+ "properties": {
34585
+ "id": {
34586
+ "type": "integer",
34587
+ "format": "int64"
34588
+ },
34589
+ "status": {
34590
+ "type": "string"
34591
+ },
34592
+ "visible_to_clients": {
34593
+ "type": "boolean"
34594
+ },
34595
+ "created_at": {
34596
+ "type": "string",
34597
+ "x-go-type": "time.Time",
34598
+ "x-go-type-import": {
34599
+ "path": "time"
34600
+ }
34601
+ },
34602
+ "updated_at": {
34603
+ "type": "string",
34604
+ "x-go-type": "time.Time",
34605
+ "x-go-type-import": {
34606
+ "path": "time"
34607
+ }
34608
+ },
34609
+ "title": {
34610
+ "type": "string"
34611
+ },
34612
+ "inherits_status": {
34613
+ "type": "boolean"
34614
+ },
34615
+ "type": {
34616
+ "type": "string"
34617
+ },
34618
+ "url": {
34619
+ "type": "string"
34620
+ },
34621
+ "app_url": {
34622
+ "type": "string"
34623
+ },
34624
+ "bookmark_url": {
34625
+ "type": "string"
34626
+ },
34627
+ "position": {
34628
+ "type": "integer",
34629
+ "format": "int32"
34630
+ },
34631
+ "due_on": {
34632
+ "type": "string",
34633
+ "x-go-type": "types.Date",
34634
+ "x-go-type-import": {
34635
+ "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
34636
+ }
34637
+ },
34638
+ "completed": {
34639
+ "type": "boolean"
34640
+ },
34641
+ "completed_at": {
34642
+ "type": "string",
34643
+ "x-go-type": "time.Time",
34644
+ "x-go-type-import": {
34645
+ "path": "time"
34646
+ }
34647
+ },
34648
+ "parent": {
34649
+ "$ref": "#/components/schemas/RecordingParent"
34650
+ },
34651
+ "bucket": {
34652
+ "$ref": "#/components/schemas/TodoBucket"
34653
+ },
34654
+ "creator": {
34655
+ "$ref": "#/components/schemas/Person"
34656
+ },
34657
+ "completer": {
34658
+ "$ref": "#/components/schemas/Person"
34659
+ },
34660
+ "assignees": {
34661
+ "type": "array",
34662
+ "items": {
34663
+ "$ref": "#/components/schemas/Person"
34664
+ },
34665
+ "x-go-type-skip-optional-pointer": true
34666
+ },
34667
+ "completion_url": {
34668
+ "type": "string"
34669
+ }
34670
+ },
34671
+ "required": [
34672
+ "app_url",
34673
+ "bucket",
34674
+ "created_at",
34675
+ "creator",
34676
+ "id",
34677
+ "inherits_status",
34678
+ "parent",
34679
+ "status",
34680
+ "title",
34681
+ "type",
34682
+ "updated_at",
34683
+ "url",
34684
+ "visible_to_clients"
34685
+ ]
34686
+ },
33309
34687
  "Template": {
33310
34688
  "type": "object",
33311
34689
  "properties": {
@@ -33357,26 +34735,35 @@
33357
34735
  "updated_at"
33358
34736
  ]
33359
34737
  },
33360
- "TemplateLibrary": {
34738
+ "TemplateLibraryCardTables": {
33361
34739
  "type": "object",
33362
34740
  "properties": {
33363
34741
  "bucket": {
33364
34742
  "$ref": "#/components/schemas/RecordingBucket"
33365
34743
  },
33366
- "todoset": {
33367
- "$ref": "#/components/schemas/RecordingParent"
34744
+ "kanban_boardset": {
34745
+ "anyOf": [
34746
+ {
34747
+ "$ref": "#/components/schemas/RecordingParent"
34748
+ },
34749
+ {
34750
+ "type": "null"
34751
+ }
34752
+ ],
34753
+ "x-go-type": "RecordingParent"
33368
34754
  },
33369
- "todolists": {
34755
+ "card_tables": {
33370
34756
  "type": "array",
33371
34757
  "items": {
33372
- "$ref": "#/components/schemas/Todolist"
33373
- }
34758
+ "$ref": "#/components/schemas/Recording"
34759
+ },
34760
+ "description": "Active templates in title order, as recording projections: read one through\nGetCardTable to see its columns."
33374
34761
  }
33375
34762
  },
33376
34763
  "required": [
33377
34764
  "bucket",
33378
- "todolists",
33379
- "todoset"
34765
+ "card_tables",
34766
+ "kanban_boardset"
33380
34767
  ]
33381
34768
  },
33382
34769
  "TemplateLibraryConfirmationPerson": {
@@ -33433,6 +34820,9 @@
33433
34820
  },
33434
34821
  "destination_todolist": {
33435
34822
  "$ref": "#/components/schemas/Todolist"
34823
+ },
34824
+ "destination_card_table": {
34825
+ "$ref": "#/components/schemas/CardTable"
33436
34826
  }
33437
34827
  },
33438
34828
  "required": [
@@ -33443,6 +34833,61 @@
33443
34833
  "url"
33444
34834
  ]
33445
34835
  },
34836
+ "TemplateLibraryTodolists": {
34837
+ "type": "object",
34838
+ "properties": {
34839
+ "bucket": {
34840
+ "$ref": "#/components/schemas/RecordingBucket"
34841
+ },
34842
+ "todoset": {
34843
+ "$ref": "#/components/schemas/RecordingParent"
34844
+ },
34845
+ "todolists": {
34846
+ "type": "array",
34847
+ "items": {
34848
+ "$ref": "#/components/schemas/Todolist"
34849
+ }
34850
+ }
34851
+ },
34852
+ "required": [
34853
+ "bucket",
34854
+ "todolists",
34855
+ "todoset"
34856
+ ]
34857
+ },
34858
+ "Templatification": {
34859
+ "type": "object",
34860
+ "description": "The record of templatifying a recording into the library. Carries no\ndestination parent, unlike a copy: the destination is always the library.",
34861
+ "properties": {
34862
+ "id": {
34863
+ "type": "integer",
34864
+ "format": "int64"
34865
+ },
34866
+ "status": {
34867
+ "type": "string",
34868
+ "description": "pending|processing|completed|failed"
34869
+ },
34870
+ "source_recording_id": {
34871
+ "type": "integer",
34872
+ "format": "int64"
34873
+ },
34874
+ "url": {
34875
+ "type": "string"
34876
+ },
34877
+ "destination_todolist": {
34878
+ "$ref": "#/components/schemas/Todolist"
34879
+ },
34880
+ "destination_card_table": {
34881
+ "$ref": "#/components/schemas/CardTable"
34882
+ }
34883
+ },
34884
+ "required": [
34885
+ "id",
34886
+ "source_recording_id",
34887
+ "status",
34888
+ "url"
34889
+ ]
34890
+ },
33446
34891
  "TimelineAttachment": {
33447
34892
  "type": "object",
33448
34893
  "description": "A single timeline-event attachment. This is an optional-field superset over\ntwo wire variants — a full Upload recording (upload-kind recordings, rendered\nby BC3's uploads/_upload partial: the complete recording projection + rich-\ntext description + the upload body) and a rich-text attachment/blob partial\n(all other recordings) — so one element type decodes either. Every field is\noptional; a given instance populates only the fields of the variant it\nrepresents. The upload-recording variant enumerates the full documented\nprojection so no documented field is silently dropped on decode.",
@@ -33933,12 +35378,24 @@
33933
35378
  "boosts_url": {
33934
35379
  "type": "string"
33935
35380
  },
35381
+ "subtasks_count": {
35382
+ "type": "integer",
35383
+ "description": "Subtask accounting (BC3 #12659). `subtasks_count` is the real total,\n`subtasks_completed_count` how many are done, and `subtasks_url` the\npaginated listing of all of them (`ListSubtasks`).",
35384
+ "format": "int32"
35385
+ },
35386
+ "subtasks_completed_count": {
35387
+ "type": "integer",
35388
+ "format": "int32"
35389
+ },
35390
+ "subtasks_url": {
35391
+ "type": "string"
35392
+ },
33936
35393
  "steps": {
33937
35394
  "type": "array",
33938
35395
  "items": {
33939
- "$ref": "#/components/schemas/CardStep"
35396
+ "$ref": "#/components/schemas/Subtask"
33940
35397
  },
33941
- "description": "Steps embedded in the Todo response (BC5 addition). The shared\n`steps/step` jbuilder partial emits the same shape as `CardStep`,\nso the existing `CardStepList` is reused.",
35398
+ "description": "The first 100 subtasks, embedded read-only (BC5 addition). The shared\n`subtasks/subtask` jbuilder partial emits the same `Subtask` shape a card\nembeds. A to-do with more than 100 reports the total in\n`subtasks_count`; fetch the rest from `subtasks_url`.",
33942
35399
  "x-go-type-skip-optional-pointer": true
33943
35400
  }
33944
35401
  },
@@ -34748,7 +36205,7 @@
34748
36205
  }
34749
36206
  },
34750
36207
  "UpdateCardStepResponseContent": {
34751
- "$ref": "#/components/schemas/CardStep"
36208
+ "$ref": "#/components/schemas/Subtask"
34752
36209
  },
34753
36210
  "UpdateChatbotRequestContent": {
34754
36211
  "type": "object",
@@ -35169,6 +36626,31 @@
35169
36626
  "UpdateSubscriptionResponseContent": {
35170
36627
  "$ref": "#/components/schemas/Subscription"
35171
36628
  },
36629
+ "UpdateSubtaskRequestContent": {
36630
+ "type": "object",
36631
+ "properties": {
36632
+ "title": {
36633
+ "type": "string"
36634
+ },
36635
+ "due_on": {
36636
+ "type": "string",
36637
+ "x-go-type": "types.Date",
36638
+ "x-go-type-import": {
36639
+ "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
36640
+ }
36641
+ },
36642
+ "assignee_ids": {
36643
+ "type": "array",
36644
+ "items": {
36645
+ "type": "integer",
36646
+ "format": "int64"
36647
+ }
36648
+ }
36649
+ }
36650
+ },
36651
+ "UpdateSubtaskResponseContent": {
36652
+ "$ref": "#/components/schemas/Subtask"
36653
+ },
35172
36654
  "UpdateTemplateRequestContent": {
35173
36655
  "type": "object",
35174
36656
  "properties": {
@@ -35904,6 +37386,12 @@
35904
37386
  "url",
35905
37387
  "visible_to_clients"
35906
37388
  ]
37389
+ },
37390
+ "CardStep": {
37391
+ "$ref": "#/components/schemas/Subtask",
37392
+ "deprecated": true,
37393
+ "description": "Deprecated: renamed to Subtask, the same Kanban::Step record.",
37394
+ "x-deprecated-reason": "renamed to Subtask, the same Kanban::Step record."
35907
37395
  }
35908
37396
  }
35909
37397
  }