@37signals/basecamp 0.7.3 → 0.9.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 (162) hide show
  1. package/README.md +82 -2
  2. package/dist/client.d.ts +7 -4
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +32 -23
  5. package/dist/client.js.map +1 -1
  6. package/dist/download.d.ts.map +1 -1
  7. package/dist/errors.d.ts +10 -0
  8. package/dist/errors.d.ts.map +1 -1
  9. package/dist/errors.js +7 -1
  10. package/dist/errors.js.map +1 -1
  11. package/dist/generated/metadata.d.ts +32 -0
  12. package/dist/generated/metadata.d.ts.map +1 -0
  13. package/dist/generated/metadata.js +2723 -0
  14. package/dist/generated/metadata.js.map +1 -0
  15. package/dist/generated/{metadata.json → metadata.ts} +141 -35
  16. package/dist/generated/openapi-stripped.json +1713 -478
  17. package/dist/generated/path-mapping.d.ts.map +1 -1
  18. package/dist/generated/path-mapping.js +10 -5
  19. package/dist/generated/path-mapping.js.map +1 -1
  20. package/dist/generated/path-mapping.ts +10 -5
  21. package/dist/generated/schema.d.ts +1027 -265
  22. package/dist/generated/services/campfires.d.ts +22 -1
  23. package/dist/generated/services/campfires.d.ts.map +1 -1
  24. package/dist/generated/services/campfires.js +33 -1
  25. package/dist/generated/services/campfires.js.map +1 -1
  26. package/dist/generated/services/campfires.ts +46 -1
  27. package/dist/generated/services/card-columns.d.ts +31 -28
  28. package/dist/generated/services/card-columns.d.ts.map +1 -1
  29. package/dist/generated/services/card-columns.js +57 -51
  30. package/dist/generated/services/card-columns.js.map +1 -1
  31. package/dist/generated/services/card-columns.ts +65 -59
  32. package/dist/generated/services/checkins.d.ts +3 -1
  33. package/dist/generated/services/checkins.d.ts.map +1 -1
  34. package/dist/generated/services/checkins.js +2 -1
  35. package/dist/generated/services/checkins.js.map +1 -1
  36. package/dist/generated/services/checkins.ts +4 -1
  37. package/dist/generated/services/documents.d.ts +2 -0
  38. package/dist/generated/services/documents.d.ts.map +1 -1
  39. package/dist/generated/services/documents.js +1 -0
  40. package/dist/generated/services/documents.js.map +1 -1
  41. package/dist/generated/services/documents.ts +3 -0
  42. package/dist/generated/services/gauges.d.ts +2 -2
  43. package/dist/generated/services/gauges.js +2 -2
  44. package/dist/generated/services/gauges.ts +2 -2
  45. package/dist/generated/services/index.d.ts +3 -2
  46. package/dist/generated/services/index.d.ts.map +1 -1
  47. package/dist/generated/services/index.js +3 -2
  48. package/dist/generated/services/index.js.map +1 -1
  49. package/dist/generated/services/index.ts +3 -2
  50. package/dist/generated/services/messages.d.ts +2 -0
  51. package/dist/generated/services/messages.d.ts.map +1 -1
  52. package/dist/generated/services/messages.js +1 -0
  53. package/dist/generated/services/messages.js.map +1 -1
  54. package/dist/generated/services/messages.ts +3 -0
  55. package/dist/generated/services/people.d.ts +2 -2
  56. package/dist/generated/services/people.js +2 -2
  57. package/dist/generated/services/people.ts +2 -2
  58. package/dist/generated/services/reports.d.ts +1 -1
  59. package/dist/generated/services/reports.js +1 -1
  60. package/dist/generated/services/reports.ts +1 -1
  61. package/dist/generated/services/schedules.d.ts +2 -0
  62. package/dist/generated/services/schedules.d.ts.map +1 -1
  63. package/dist/generated/services/schedules.js +1 -0
  64. package/dist/generated/services/schedules.js.map +1 -1
  65. package/dist/generated/services/schedules.ts +3 -0
  66. package/dist/generated/services/search.d.ts +30 -1
  67. package/dist/generated/services/search.d.ts.map +1 -1
  68. package/dist/generated/services/search.js +1 -1
  69. package/dist/generated/services/search.js.map +1 -1
  70. package/dist/generated/services/search.ts +31 -2
  71. package/dist/generated/services/templates.d.ts +3 -5
  72. package/dist/generated/services/templates.d.ts.map +1 -1
  73. package/dist/generated/services/templates.js +4 -5
  74. package/dist/generated/services/templates.js.map +1 -1
  75. package/dist/generated/services/templates.ts +6 -9
  76. package/dist/generated/services/todolists.d.ts +22 -0
  77. package/dist/generated/services/todolists.d.ts.map +1 -1
  78. package/dist/generated/services/todolists.js +31 -0
  79. package/dist/generated/services/todolists.js.map +1 -1
  80. package/dist/generated/services/todolists.ts +46 -0
  81. package/dist/generated/services/todos.d.ts +8 -8
  82. package/dist/generated/services/todos.d.ts.map +1 -1
  83. package/dist/generated/services/todos.js +9 -6
  84. package/dist/generated/services/todos.js.map +1 -1
  85. package/dist/generated/services/todos.ts +12 -9
  86. package/dist/generated/services/tools.d.ts +11 -10
  87. package/dist/generated/services/tools.d.ts.map +1 -1
  88. package/dist/generated/services/tools.js +16 -8
  89. package/dist/generated/services/tools.js.map +1 -1
  90. package/dist/generated/services/tools.ts +21 -13
  91. package/dist/generated/services/uploads.d.ts +2 -0
  92. package/dist/generated/services/uploads.d.ts.map +1 -1
  93. package/dist/generated/services/uploads.js +1 -0
  94. package/dist/generated/services/uploads.js.map +1 -1
  95. package/dist/generated/services/uploads.ts +3 -0
  96. package/dist/generated/services/webhooks.js +2 -2
  97. package/dist/generated/services/webhooks.js.map +1 -1
  98. package/dist/generated/services/webhooks.ts +2 -2
  99. package/dist/generated/services/wormholes.d.ts +70 -0
  100. package/dist/generated/services/wormholes.d.ts.map +1 -0
  101. package/dist/generated/services/wormholes.js +103 -0
  102. package/dist/generated/services/wormholes.js.map +1 -0
  103. package/dist/generated/services/wormholes.ts +145 -0
  104. package/dist/index.d.ts +8 -5
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +4 -3
  107. package/dist/index.js.map +1 -1
  108. package/dist/oauth/discovery.d.ts +105 -23
  109. package/dist/oauth/discovery.d.ts.map +1 -1
  110. package/dist/oauth/discovery.js +453 -61
  111. package/dist/oauth/discovery.js.map +1 -1
  112. package/dist/oauth/index.d.ts +2 -2
  113. package/dist/oauth/index.d.ts.map +1 -1
  114. package/dist/oauth/index.js +1 -1
  115. package/dist/oauth/index.js.map +1 -1
  116. package/dist/oauth/interactive-login.d.ts +20 -2
  117. package/dist/oauth/interactive-login.d.ts.map +1 -1
  118. package/dist/oauth/interactive-login.js +58 -4
  119. package/dist/oauth/interactive-login.js.map +1 -1
  120. package/dist/oauth/types.d.ts +54 -2
  121. package/dist/oauth/types.d.ts.map +1 -1
  122. package/dist/security.d.ts +22 -0
  123. package/dist/security.d.ts.map +1 -1
  124. package/dist/security.js +56 -1
  125. package/dist/security.js.map +1 -1
  126. package/dist/services/authorization.d.ts.map +1 -1
  127. package/dist/services/authorization.js +3 -0
  128. package/dist/services/authorization.js.map +1 -1
  129. package/dist/services/base.d.ts.map +1 -1
  130. package/dist/services/base.js +1 -3
  131. package/dist/services/base.js.map +1 -1
  132. package/dist/services/todos-extensions.d.ts +118 -0
  133. package/dist/services/todos-extensions.d.ts.map +1 -0
  134. package/dist/services/todos-extensions.js +113 -0
  135. package/dist/services/todos-extensions.js.map +1 -0
  136. package/dist/services/uploads-extensions.d.ts +33 -0
  137. package/dist/services/uploads-extensions.d.ts.map +1 -0
  138. package/dist/services/uploads-extensions.js +48 -0
  139. package/dist/services/uploads-extensions.js.map +1 -0
  140. package/package.json +7 -4
  141. package/src/generated/{metadata.json → metadata.ts} +141 -35
  142. package/src/generated/openapi-stripped.json +1713 -478
  143. package/src/generated/path-mapping.ts +10 -5
  144. package/src/generated/schema.d.ts +1027 -265
  145. package/src/generated/services/campfires.ts +46 -1
  146. package/src/generated/services/card-columns.ts +65 -59
  147. package/src/generated/services/checkins.ts +4 -1
  148. package/src/generated/services/documents.ts +3 -0
  149. package/src/generated/services/gauges.ts +2 -2
  150. package/src/generated/services/index.ts +3 -2
  151. package/src/generated/services/messages.ts +3 -0
  152. package/src/generated/services/people.ts +2 -2
  153. package/src/generated/services/reports.ts +1 -1
  154. package/src/generated/services/schedules.ts +3 -0
  155. package/src/generated/services/search.ts +31 -2
  156. package/src/generated/services/templates.ts +6 -9
  157. package/src/generated/services/todolists.ts +46 -0
  158. package/src/generated/services/todos.ts +12 -9
  159. package/src/generated/services/tools.ts +21 -13
  160. package/src/generated/services/uploads.ts +3 -0
  161. package/src/generated/services/webhooks.ts +2 -2
  162. package/src/generated/services/wormholes.ts +145 -0
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Basecamp",
5
- "version": "2026-03-23",
5
+ "version": "2026-07-24",
6
6
  "description": "Basecamp API",
7
7
  "contact": {
8
8
  "name": "Basecamp",
@@ -589,13 +589,346 @@
589
589
  }
590
590
  }
591
591
  },
592
- "/buckets/{bucketId}/webhooks.json": {
593
- "get": {
594
- "description": "List all webhooks for a project\n\n**Pagination**: Uses Link header (RFC5988). Follow the `next` rel URL\nto fetch additional pages. X-Total-Count header provides total count.",
595
- "operationId": "ListWebhooks",
592
+ "/buckets/{bucketId}/card_tables/columns/{columnId}/color.json": {
593
+ "put": {
594
+ "description": "Set the color of a column",
595
+ "operationId": "SetCardColumnColor",
596
+ "requestBody": {
597
+ "content": {
598
+ "application/json": {
599
+ "schema": {
600
+ "$ref": "#/components/schemas/SetCardColumnColorRequestContent"
601
+ }
602
+ }
603
+ },
604
+ "required": true
605
+ },
606
+ "parameters": [
607
+ {
608
+ "name": "bucketId",
609
+ "in": "path",
610
+ "schema": {
611
+ "type": "integer",
612
+ "format": "int64"
613
+ },
614
+ "required": true
615
+ },
616
+ {
617
+ "name": "columnId",
618
+ "in": "path",
619
+ "schema": {
620
+ "type": "integer",
621
+ "format": "int64"
622
+ },
623
+ "required": true
624
+ }
625
+ ],
626
+ "responses": {
627
+ "200": {
628
+ "description": "SetCardColumnColor 200 response",
629
+ "content": {
630
+ "application/json": {
631
+ "schema": {
632
+ "$ref": "#/components/schemas/SetCardColumnColorResponseContent"
633
+ }
634
+ }
635
+ }
636
+ },
637
+ "401": {
638
+ "description": "UnauthorizedError 401 response",
639
+ "content": {
640
+ "application/json": {
641
+ "schema": {
642
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
643
+ }
644
+ }
645
+ }
646
+ },
647
+ "403": {
648
+ "description": "ForbiddenError 403 response",
649
+ "content": {
650
+ "application/json": {
651
+ "schema": {
652
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
653
+ }
654
+ }
655
+ }
656
+ },
657
+ "404": {
658
+ "description": "NotFoundError 404 response",
659
+ "content": {
660
+ "application/json": {
661
+ "schema": {
662
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
663
+ }
664
+ }
665
+ }
666
+ },
667
+ "422": {
668
+ "description": "ValidationError 422 response",
669
+ "content": {
670
+ "application/json": {
671
+ "schema": {
672
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
673
+ }
674
+ }
675
+ }
676
+ },
677
+ "429": {
678
+ "description": "RateLimitError 429 response",
679
+ "content": {
680
+ "application/json": {
681
+ "schema": {
682
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
683
+ }
684
+ }
685
+ }
686
+ },
687
+ "500": {
688
+ "description": "InternalServerError 500 response",
689
+ "content": {
690
+ "application/json": {
691
+ "schema": {
692
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
693
+ }
694
+ }
695
+ }
696
+ }
697
+ },
698
+ "tags": [
699
+ "Card Tables"
700
+ ],
701
+ "x-basecamp-idempotent": {
702
+ "natural": true
703
+ },
704
+ "x-basecamp-retry": {
705
+ "maxAttempts": 3,
706
+ "baseDelayMs": 1000,
707
+ "backoff": "exponential",
708
+ "retryOn": [
709
+ 429,
710
+ 503
711
+ ]
712
+ }
713
+ }
714
+ },
715
+ "/buckets/{bucketId}/card_tables/columns/{columnId}/on_hold.json": {
716
+ "delete": {
717
+ "description": "Disable on-hold section in a column",
718
+ "operationId": "DisableCardColumnOnHold",
596
719
  "parameters": [
597
720
  {
598
- "name": "bucketId",
721
+ "name": "bucketId",
722
+ "in": "path",
723
+ "schema": {
724
+ "type": "integer",
725
+ "format": "int64"
726
+ },
727
+ "required": true
728
+ },
729
+ {
730
+ "name": "columnId",
731
+ "in": "path",
732
+ "schema": {
733
+ "type": "integer",
734
+ "format": "int64"
735
+ },
736
+ "required": true
737
+ }
738
+ ],
739
+ "responses": {
740
+ "200": {
741
+ "description": "DisableCardColumnOnHold 200 response",
742
+ "content": {
743
+ "application/json": {
744
+ "schema": {
745
+ "$ref": "#/components/schemas/DisableCardColumnOnHoldResponseContent"
746
+ }
747
+ }
748
+ }
749
+ },
750
+ "401": {
751
+ "description": "UnauthorizedError 401 response",
752
+ "content": {
753
+ "application/json": {
754
+ "schema": {
755
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
756
+ }
757
+ }
758
+ }
759
+ },
760
+ "403": {
761
+ "description": "ForbiddenError 403 response",
762
+ "content": {
763
+ "application/json": {
764
+ "schema": {
765
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
766
+ }
767
+ }
768
+ }
769
+ },
770
+ "404": {
771
+ "description": "NotFoundError 404 response",
772
+ "content": {
773
+ "application/json": {
774
+ "schema": {
775
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
776
+ }
777
+ }
778
+ }
779
+ },
780
+ "429": {
781
+ "description": "RateLimitError 429 response",
782
+ "content": {
783
+ "application/json": {
784
+ "schema": {
785
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
786
+ }
787
+ }
788
+ }
789
+ },
790
+ "500": {
791
+ "description": "InternalServerError 500 response",
792
+ "content": {
793
+ "application/json": {
794
+ "schema": {
795
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
796
+ }
797
+ }
798
+ }
799
+ }
800
+ },
801
+ "tags": [
802
+ "Card Tables"
803
+ ],
804
+ "x-basecamp-idempotent": {
805
+ "natural": true
806
+ },
807
+ "x-basecamp-retry": {
808
+ "maxAttempts": 3,
809
+ "baseDelayMs": 1000,
810
+ "backoff": "exponential",
811
+ "retryOn": [
812
+ 429,
813
+ 503
814
+ ]
815
+ }
816
+ },
817
+ "post": {
818
+ "description": "Enable on-hold section in a column",
819
+ "operationId": "EnableCardColumnOnHold",
820
+ "parameters": [
821
+ {
822
+ "name": "bucketId",
823
+ "in": "path",
824
+ "schema": {
825
+ "type": "integer",
826
+ "format": "int64"
827
+ },
828
+ "required": true
829
+ },
830
+ {
831
+ "name": "columnId",
832
+ "in": "path",
833
+ "schema": {
834
+ "type": "integer",
835
+ "format": "int64"
836
+ },
837
+ "required": true
838
+ }
839
+ ],
840
+ "responses": {
841
+ "200": {
842
+ "description": "EnableCardColumnOnHold 200 response",
843
+ "content": {
844
+ "application/json": {
845
+ "schema": {
846
+ "$ref": "#/components/schemas/EnableCardColumnOnHoldResponseContent"
847
+ }
848
+ }
849
+ }
850
+ },
851
+ "401": {
852
+ "description": "UnauthorizedError 401 response",
853
+ "content": {
854
+ "application/json": {
855
+ "schema": {
856
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
857
+ }
858
+ }
859
+ }
860
+ },
861
+ "403": {
862
+ "description": "ForbiddenError 403 response",
863
+ "content": {
864
+ "application/json": {
865
+ "schema": {
866
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
867
+ }
868
+ }
869
+ }
870
+ },
871
+ "422": {
872
+ "description": "ValidationError 422 response",
873
+ "content": {
874
+ "application/json": {
875
+ "schema": {
876
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
877
+ }
878
+ }
879
+ }
880
+ },
881
+ "429": {
882
+ "description": "RateLimitError 429 response",
883
+ "content": {
884
+ "application/json": {
885
+ "schema": {
886
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
887
+ }
888
+ }
889
+ }
890
+ },
891
+ "500": {
892
+ "description": "InternalServerError 500 response",
893
+ "content": {
894
+ "application/json": {
895
+ "schema": {
896
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
897
+ }
898
+ }
899
+ }
900
+ }
901
+ },
902
+ "tags": [
903
+ "Card Tables"
904
+ ],
905
+ "x-basecamp-retry": {
906
+ "maxAttempts": 2,
907
+ "baseDelayMs": 1000,
908
+ "backoff": "exponential",
909
+ "retryOn": [
910
+ 429,
911
+ 503
912
+ ]
913
+ }
914
+ }
915
+ },
916
+ "/buckets/{bucketId}/card_tables/wormholes/{wormholeId}": {
917
+ "delete": {
918
+ "description": "Delete a wormhole",
919
+ "operationId": "DeleteWormhole",
920
+ "parameters": [
921
+ {
922
+ "name": "bucketId",
923
+ "in": "path",
924
+ "schema": {
925
+ "type": "integer",
926
+ "format": "int64"
927
+ },
928
+ "required": true
929
+ },
930
+ {
931
+ "name": "wormholeId",
599
932
  "in": "path",
600
933
  "schema": {
601
934
  "type": "integer",
@@ -605,15 +938,8 @@
605
938
  }
606
939
  ],
607
940
  "responses": {
608
- "200": {
609
- "description": "ListWebhooks 200 response",
610
- "content": {
611
- "application/json": {
612
- "schema": {
613
- "$ref": "#/components/schemas/ListWebhooksResponseContent"
614
- }
615
- }
616
- }
941
+ "204": {
942
+ "description": "DeleteWormhole 204 response"
617
943
  },
618
944
  "401": {
619
945
  "description": "UnauthorizedError 401 response",
@@ -635,6 +961,16 @@
635
961
  }
636
962
  }
637
963
  },
964
+ "404": {
965
+ "description": "NotFoundError 404 response",
966
+ "content": {
967
+ "application/json": {
968
+ "schema": {
969
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
970
+ }
971
+ }
972
+ }
973
+ },
638
974
  "429": {
639
975
  "description": "RateLimitError 429 response",
640
976
  "content": {
@@ -657,12 +993,10 @@
657
993
  }
658
994
  },
659
995
  "tags": [
660
- "Automation"
996
+ "Card Tables"
661
997
  ],
662
- "x-basecamp-pagination": {
663
- "style": "link",
664
- "totalCountHeader": "X-Total-Count",
665
- "maxPageSize": 50
998
+ "x-basecamp-idempotent": {
999
+ "natural": true
666
1000
  },
667
1001
  "x-basecamp-retry": {
668
1002
  "maxAttempts": 3,
@@ -674,14 +1008,14 @@
674
1008
  ]
675
1009
  }
676
1010
  },
677
- "post": {
678
- "description": "Create a new webhook for a project",
679
- "operationId": "CreateWebhook",
1011
+ "put": {
1012
+ "description": "Update a wormhole's destination column",
1013
+ "operationId": "UpdateWormhole",
680
1014
  "requestBody": {
681
1015
  "content": {
682
1016
  "application/json": {
683
1017
  "schema": {
684
- "$ref": "#/components/schemas/CreateWebhookRequestContent"
1018
+ "$ref": "#/components/schemas/UpdateWormholeRequestContent"
685
1019
  }
686
1020
  }
687
1021
  },
@@ -696,25 +1030,24 @@
696
1030
  "format": "int64"
697
1031
  },
698
1032
  "required": true
1033
+ },
1034
+ {
1035
+ "name": "wormholeId",
1036
+ "in": "path",
1037
+ "schema": {
1038
+ "type": "integer",
1039
+ "format": "int64"
1040
+ },
1041
+ "required": true
699
1042
  }
700
1043
  ],
701
1044
  "responses": {
702
- "201": {
703
- "description": "CreateWebhook 201 response",
704
- "content": {
705
- "application/json": {
706
- "schema": {
707
- "$ref": "#/components/schemas/CreateWebhookResponseContent"
708
- }
709
- }
710
- }
711
- },
712
- "400": {
713
- "description": "BadRequestError 400 response",
1045
+ "200": {
1046
+ "description": "UpdateWormhole 200 response",
714
1047
  "content": {
715
1048
  "application/json": {
716
1049
  "schema": {
717
- "$ref": "#/components/schemas/BadRequestErrorResponseContent"
1050
+ "$ref": "#/components/schemas/UpdateWormholeResponseContent"
718
1051
  }
719
1052
  }
720
1053
  }
@@ -739,12 +1072,12 @@
739
1072
  }
740
1073
  }
741
1074
  },
742
- "429": {
743
- "description": "RateLimitError 429 response",
1075
+ "404": {
1076
+ "description": "NotFoundError 404 response",
744
1077
  "content": {
745
1078
  "application/json": {
746
1079
  "schema": {
747
- "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1080
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
748
1081
  }
749
1082
  }
750
1083
  }
@@ -758,23 +1091,16 @@
758
1091
  }
759
1092
  }
760
1093
  }
761
- },
762
- "507": {
763
- "description": "WebhookLimitError 507 response",
764
- "content": {
765
- "application/json": {
766
- "schema": {
767
- "$ref": "#/components/schemas/WebhookLimitErrorResponseContent"
768
- }
769
- }
770
- }
771
1094
  }
772
1095
  },
773
1096
  "tags": [
774
- "Automation"
1097
+ "Card Tables"
775
1098
  ],
1099
+ "x-basecamp-idempotent": {
1100
+ "natural": true
1101
+ },
776
1102
  "x-basecamp-retry": {
777
- "maxAttempts": 2,
1103
+ "maxAttempts": 3,
778
1104
  "baseDelayMs": 1000,
779
1105
  "backoff": "exponential",
780
1106
  "retryOn": [
@@ -784,13 +1110,32 @@
784
1110
  }
785
1111
  }
786
1112
  },
787
- "/card_tables/cards/{cardId}": {
788
- "get": {
789
- "description": "Get a card by ID",
790
- "operationId": "GetCard",
1113
+ "/buckets/{bucketId}/card_tables/{cardTableId}/wormholes.json": {
1114
+ "post": {
1115
+ "description": "Create a wormhole linking this card table to a column on another card table.\n\nA wormhole is the only mechanism for moving a card to a different project: its\nid is a valid `column_id` for MoveCard, teleporting the card across projects.\n`destinationRecordingId` is the id of a column on another accessible card table.",
1116
+ "operationId": "CreateWormhole",
1117
+ "requestBody": {
1118
+ "content": {
1119
+ "application/json": {
1120
+ "schema": {
1121
+ "$ref": "#/components/schemas/CreateWormholeRequestContent"
1122
+ }
1123
+ }
1124
+ },
1125
+ "required": true
1126
+ },
791
1127
  "parameters": [
792
1128
  {
793
- "name": "cardId",
1129
+ "name": "bucketId",
1130
+ "in": "path",
1131
+ "schema": {
1132
+ "type": "integer",
1133
+ "format": "int64"
1134
+ },
1135
+ "required": true
1136
+ },
1137
+ {
1138
+ "name": "cardTableId",
794
1139
  "in": "path",
795
1140
  "schema": {
796
1141
  "type": "integer",
@@ -800,12 +1145,12 @@
800
1145
  }
801
1146
  ],
802
1147
  "responses": {
803
- "200": {
804
- "description": "GetCard 200 response",
1148
+ "201": {
1149
+ "description": "CreateWormhole 201 response",
805
1150
  "content": {
806
1151
  "application/json": {
807
1152
  "schema": {
808
- "$ref": "#/components/schemas/GetCardResponseContent"
1153
+ "$ref": "#/components/schemas/CreateWormholeResponseContent"
809
1154
  }
810
1155
  }
811
1156
  }
@@ -840,6 +1185,26 @@
840
1185
  }
841
1186
  }
842
1187
  },
1188
+ "422": {
1189
+ "description": "ValidationError 422 response",
1190
+ "content": {
1191
+ "application/json": {
1192
+ "schema": {
1193
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
1194
+ }
1195
+ }
1196
+ }
1197
+ },
1198
+ "429": {
1199
+ "description": "RateLimitError 429 response",
1200
+ "content": {
1201
+ "application/json": {
1202
+ "schema": {
1203
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1204
+ }
1205
+ }
1206
+ }
1207
+ },
843
1208
  "500": {
844
1209
  "description": "InternalServerError 500 response",
845
1210
  "content": {
@@ -855,7 +1220,7 @@
855
1220
  "Card Tables"
856
1221
  ],
857
1222
  "x-basecamp-retry": {
858
- "maxAttempts": 3,
1223
+ "maxAttempts": 2,
859
1224
  "baseDelayMs": 1000,
860
1225
  "backoff": "exponential",
861
1226
  "retryOn": [
@@ -863,22 +1228,25 @@
863
1228
  503
864
1229
  ]
865
1230
  }
866
- },
867
- "put": {
868
- "description": "Update an existing card",
869
- "operationId": "UpdateCard",
1231
+ }
1232
+ },
1233
+ "/buckets/{bucketId}/dock/tools.json": {
1234
+ "post": {
1235
+ "description": "Create a tool in a project dock",
1236
+ "operationId": "CreateTool",
870
1237
  "requestBody": {
871
1238
  "content": {
872
1239
  "application/json": {
873
1240
  "schema": {
874
- "$ref": "#/components/schemas/UpdateCardRequestContent"
1241
+ "$ref": "#/components/schemas/CreateToolRequestContent"
875
1242
  }
876
1243
  }
877
- }
1244
+ },
1245
+ "required": true
878
1246
  },
879
1247
  "parameters": [
880
1248
  {
881
- "name": "cardId",
1249
+ "name": "bucketId",
882
1250
  "in": "path",
883
1251
  "schema": {
884
1252
  "type": "integer",
@@ -888,12 +1256,12 @@
888
1256
  }
889
1257
  ],
890
1258
  "responses": {
891
- "200": {
892
- "description": "UpdateCard 200 response",
1259
+ "201": {
1260
+ "description": "CreateTool 201 response",
893
1261
  "content": {
894
1262
  "application/json": {
895
1263
  "schema": {
896
- "$ref": "#/components/schemas/UpdateCardResponseContent"
1264
+ "$ref": "#/components/schemas/CreateToolResponseContent"
897
1265
  }
898
1266
  }
899
1267
  }
@@ -918,22 +1286,22 @@
918
1286
  }
919
1287
  }
920
1288
  },
921
- "404": {
922
- "description": "NotFoundError 404 response",
1289
+ "422": {
1290
+ "description": "ValidationError 422 response",
923
1291
  "content": {
924
1292
  "application/json": {
925
1293
  "schema": {
926
- "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1294
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
927
1295
  }
928
1296
  }
929
1297
  }
930
1298
  },
931
- "422": {
932
- "description": "ValidationError 422 response",
1299
+ "429": {
1300
+ "description": "RateLimitError 429 response",
933
1301
  "content": {
934
1302
  "application/json": {
935
1303
  "schema": {
936
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
1304
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
937
1305
  }
938
1306
  }
939
1307
  }
@@ -950,13 +1318,10 @@
950
1318
  }
951
1319
  },
952
1320
  "tags": [
953
- "Card Tables"
1321
+ "Automation"
954
1322
  ],
955
- "x-basecamp-idempotent": {
956
- "natural": true
957
- },
958
1323
  "x-basecamp-retry": {
959
- "maxAttempts": 3,
1324
+ "maxAttempts": 2,
960
1325
  "baseDelayMs": 1000,
961
1326
  "backoff": "exponential",
962
1327
  "retryOn": [
@@ -966,15 +1331,99 @@
966
1331
  }
967
1332
  }
968
1333
  },
969
- "/card_tables/cards/{cardId}/moves.json": {
970
- "post": {
971
- "description": "Move a card to a different column",
972
- "operationId": "MoveCard",
1334
+ "/buckets/{bucketId}/webhooks.json": {
1335
+ "get": {
1336
+ "description": "List all webhooks for a project\n\n**Pagination**: Uses Link header (RFC5988). Follow the `next` rel URL\nto fetch additional pages. X-Total-Count header provides total count.",
1337
+ "operationId": "ListWebhooks",
1338
+ "parameters": [
1339
+ {
1340
+ "name": "bucketId",
1341
+ "in": "path",
1342
+ "schema": {
1343
+ "type": "integer",
1344
+ "format": "int64"
1345
+ },
1346
+ "required": true
1347
+ }
1348
+ ],
1349
+ "responses": {
1350
+ "200": {
1351
+ "description": "ListWebhooks 200 response",
1352
+ "content": {
1353
+ "application/json": {
1354
+ "schema": {
1355
+ "$ref": "#/components/schemas/ListWebhooksResponseContent"
1356
+ }
1357
+ }
1358
+ }
1359
+ },
1360
+ "401": {
1361
+ "description": "UnauthorizedError 401 response",
1362
+ "content": {
1363
+ "application/json": {
1364
+ "schema": {
1365
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
1366
+ }
1367
+ }
1368
+ }
1369
+ },
1370
+ "403": {
1371
+ "description": "ForbiddenError 403 response",
1372
+ "content": {
1373
+ "application/json": {
1374
+ "schema": {
1375
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
1376
+ }
1377
+ }
1378
+ }
1379
+ },
1380
+ "429": {
1381
+ "description": "RateLimitError 429 response",
1382
+ "content": {
1383
+ "application/json": {
1384
+ "schema": {
1385
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1386
+ }
1387
+ }
1388
+ }
1389
+ },
1390
+ "500": {
1391
+ "description": "InternalServerError 500 response",
1392
+ "content": {
1393
+ "application/json": {
1394
+ "schema": {
1395
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
1396
+ }
1397
+ }
1398
+ }
1399
+ }
1400
+ },
1401
+ "tags": [
1402
+ "Automation"
1403
+ ],
1404
+ "x-basecamp-pagination": {
1405
+ "style": "link",
1406
+ "totalCountHeader": "X-Total-Count",
1407
+ "maxPageSize": 50
1408
+ },
1409
+ "x-basecamp-retry": {
1410
+ "maxAttempts": 3,
1411
+ "baseDelayMs": 1000,
1412
+ "backoff": "exponential",
1413
+ "retryOn": [
1414
+ 429,
1415
+ 503
1416
+ ]
1417
+ }
1418
+ },
1419
+ "post": {
1420
+ "description": "Create a new webhook for a project",
1421
+ "operationId": "CreateWebhook",
973
1422
  "requestBody": {
974
1423
  "content": {
975
1424
  "application/json": {
976
1425
  "schema": {
977
- "$ref": "#/components/schemas/MoveCardRequestContent"
1426
+ "$ref": "#/components/schemas/CreateWebhookRequestContent"
978
1427
  }
979
1428
  }
980
1429
  },
@@ -982,7 +1431,7 @@
982
1431
  },
983
1432
  "parameters": [
984
1433
  {
985
- "name": "cardId",
1434
+ "name": "bucketId",
986
1435
  "in": "path",
987
1436
  "schema": {
988
1437
  "type": "integer",
@@ -992,35 +1441,42 @@
992
1441
  }
993
1442
  ],
994
1443
  "responses": {
995
- "204": {
996
- "description": "MoveCard 204 response"
1444
+ "201": {
1445
+ "description": "CreateWebhook 201 response",
1446
+ "content": {
1447
+ "application/json": {
1448
+ "schema": {
1449
+ "$ref": "#/components/schemas/CreateWebhookResponseContent"
1450
+ }
1451
+ }
1452
+ }
997
1453
  },
998
- "401": {
999
- "description": "UnauthorizedError 401 response",
1454
+ "400": {
1455
+ "description": "BadRequestError 400 response",
1000
1456
  "content": {
1001
1457
  "application/json": {
1002
1458
  "schema": {
1003
- "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
1459
+ "$ref": "#/components/schemas/BadRequestErrorResponseContent"
1004
1460
  }
1005
1461
  }
1006
1462
  }
1007
1463
  },
1008
- "403": {
1009
- "description": "ForbiddenError 403 response",
1464
+ "401": {
1465
+ "description": "UnauthorizedError 401 response",
1010
1466
  "content": {
1011
1467
  "application/json": {
1012
1468
  "schema": {
1013
- "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
1469
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
1014
1470
  }
1015
1471
  }
1016
1472
  }
1017
1473
  },
1018
- "422": {
1019
- "description": "ValidationError 422 response",
1474
+ "403": {
1475
+ "description": "ForbiddenError 403 response",
1020
1476
  "content": {
1021
1477
  "application/json": {
1022
1478
  "schema": {
1023
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
1479
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
1024
1480
  }
1025
1481
  }
1026
1482
  }
@@ -1044,10 +1500,20 @@
1044
1500
  }
1045
1501
  }
1046
1502
  }
1503
+ },
1504
+ "507": {
1505
+ "description": "WebhookLimitError 507 response",
1506
+ "content": {
1507
+ "application/json": {
1508
+ "schema": {
1509
+ "$ref": "#/components/schemas/WebhookLimitErrorResponseContent"
1510
+ }
1511
+ }
1512
+ }
1047
1513
  }
1048
1514
  },
1049
1515
  "tags": [
1050
- "Card Tables"
1516
+ "Automation"
1051
1517
  ],
1052
1518
  "x-basecamp-retry": {
1053
1519
  "maxAttempts": 2,
@@ -1060,20 +1526,10 @@
1060
1526
  }
1061
1527
  }
1062
1528
  },
1063
- "/card_tables/cards/{cardId}/positions.json": {
1064
- "post": {
1065
- "description": "Reposition a step within a card",
1066
- "operationId": "RepositionCardStep",
1067
- "requestBody": {
1068
- "content": {
1069
- "application/json": {
1070
- "schema": {
1071
- "$ref": "#/components/schemas/RepositionCardStepRequestContent"
1072
- }
1073
- }
1074
- },
1075
- "required": true
1076
- },
1529
+ "/card_tables/cards/{cardId}": {
1530
+ "get": {
1531
+ "description": "Get a card by ID",
1532
+ "operationId": "GetCard",
1077
1533
  "parameters": [
1078
1534
  {
1079
1535
  "name": "cardId",
@@ -1087,44 +1543,41 @@
1087
1543
  ],
1088
1544
  "responses": {
1089
1545
  "200": {
1090
- "description": "RepositionCardStep 200 response"
1091
- },
1092
- "401": {
1093
- "description": "UnauthorizedError 401 response",
1546
+ "description": "GetCard 200 response",
1094
1547
  "content": {
1095
1548
  "application/json": {
1096
1549
  "schema": {
1097
- "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
1550
+ "$ref": "#/components/schemas/GetCardResponseContent"
1098
1551
  }
1099
1552
  }
1100
1553
  }
1101
1554
  },
1102
- "403": {
1103
- "description": "ForbiddenError 403 response",
1555
+ "401": {
1556
+ "description": "UnauthorizedError 401 response",
1104
1557
  "content": {
1105
1558
  "application/json": {
1106
1559
  "schema": {
1107
- "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
1560
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
1108
1561
  }
1109
1562
  }
1110
1563
  }
1111
1564
  },
1112
- "422": {
1113
- "description": "ValidationError 422 response",
1565
+ "403": {
1566
+ "description": "ForbiddenError 403 response",
1114
1567
  "content": {
1115
1568
  "application/json": {
1116
1569
  "schema": {
1117
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
1570
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
1118
1571
  }
1119
1572
  }
1120
1573
  }
1121
1574
  },
1122
- "429": {
1123
- "description": "RateLimitError 429 response",
1575
+ "404": {
1576
+ "description": "NotFoundError 404 response",
1124
1577
  "content": {
1125
1578
  "application/json": {
1126
1579
  "schema": {
1127
- "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1580
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1128
1581
  }
1129
1582
  }
1130
1583
  }
@@ -1144,7 +1597,7 @@
1144
1597
  "Card Tables"
1145
1598
  ],
1146
1599
  "x-basecamp-retry": {
1147
- "maxAttempts": 2,
1600
+ "maxAttempts": 3,
1148
1601
  "baseDelayMs": 1000,
1149
1602
  "backoff": "exponential",
1150
1603
  "retryOn": [
@@ -1152,21 +1605,18 @@
1152
1605
  503
1153
1606
  ]
1154
1607
  }
1155
- }
1156
- },
1157
- "/card_tables/cards/{cardId}/steps.json": {
1158
- "post": {
1159
- "description": "Create a step on a card",
1160
- "operationId": "CreateCardStep",
1608
+ },
1609
+ "put": {
1610
+ "description": "Update an existing card",
1611
+ "operationId": "UpdateCard",
1161
1612
  "requestBody": {
1162
1613
  "content": {
1163
1614
  "application/json": {
1164
1615
  "schema": {
1165
- "$ref": "#/components/schemas/CreateCardStepRequestContent"
1616
+ "$ref": "#/components/schemas/UpdateCardRequestContent"
1166
1617
  }
1167
1618
  }
1168
- },
1169
- "required": true
1619
+ }
1170
1620
  },
1171
1621
  "parameters": [
1172
1622
  {
@@ -1180,12 +1630,12 @@
1180
1630
  }
1181
1631
  ],
1182
1632
  "responses": {
1183
- "201": {
1184
- "description": "CreateCardStep 201 response",
1633
+ "200": {
1634
+ "description": "UpdateCard 200 response",
1185
1635
  "content": {
1186
1636
  "application/json": {
1187
1637
  "schema": {
1188
- "$ref": "#/components/schemas/CreateCardStepResponseContent"
1638
+ "$ref": "#/components/schemas/UpdateCardResponseContent"
1189
1639
  }
1190
1640
  }
1191
1641
  }
@@ -1210,22 +1660,22 @@
1210
1660
  }
1211
1661
  }
1212
1662
  },
1213
- "422": {
1214
- "description": "ValidationError 422 response",
1663
+ "404": {
1664
+ "description": "NotFoundError 404 response",
1215
1665
  "content": {
1216
1666
  "application/json": {
1217
1667
  "schema": {
1218
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
1668
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1219
1669
  }
1220
1670
  }
1221
1671
  }
1222
1672
  },
1223
- "429": {
1224
- "description": "RateLimitError 429 response",
1673
+ "422": {
1674
+ "description": "ValidationError 422 response",
1225
1675
  "content": {
1226
1676
  "application/json": {
1227
1677
  "schema": {
1228
- "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1678
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
1229
1679
  }
1230
1680
  }
1231
1681
  }
@@ -1244,8 +1694,11 @@
1244
1694
  "tags": [
1245
1695
  "Card Tables"
1246
1696
  ],
1697
+ "x-basecamp-idempotent": {
1698
+ "natural": true
1699
+ },
1247
1700
  "x-basecamp-retry": {
1248
- "maxAttempts": 2,
1701
+ "maxAttempts": 3,
1249
1702
  "baseDelayMs": 1000,
1250
1703
  "backoff": "exponential",
1251
1704
  "retryOn": [
@@ -1255,13 +1708,23 @@
1255
1708
  }
1256
1709
  }
1257
1710
  },
1258
- "/card_tables/columns/{columnId}": {
1259
- "get": {
1260
- "description": "Get a card column by ID",
1261
- "operationId": "GetCardColumn",
1711
+ "/card_tables/cards/{cardId}/moves.json": {
1712
+ "post": {
1713
+ "description": "Move a card to a different column",
1714
+ "operationId": "MoveCard",
1715
+ "requestBody": {
1716
+ "content": {
1717
+ "application/json": {
1718
+ "schema": {
1719
+ "$ref": "#/components/schemas/MoveCardRequestContent"
1720
+ }
1721
+ }
1722
+ },
1723
+ "required": true
1724
+ },
1262
1725
  "parameters": [
1263
1726
  {
1264
- "name": "columnId",
1727
+ "name": "cardId",
1265
1728
  "in": "path",
1266
1729
  "schema": {
1267
1730
  "type": "integer",
@@ -1271,15 +1734,8 @@
1271
1734
  }
1272
1735
  ],
1273
1736
  "responses": {
1274
- "200": {
1275
- "description": "GetCardColumn 200 response",
1276
- "content": {
1277
- "application/json": {
1278
- "schema": {
1279
- "$ref": "#/components/schemas/GetCardColumnResponseContent"
1280
- }
1281
- }
1282
- }
1737
+ "204": {
1738
+ "description": "MoveCard 204 response"
1283
1739
  },
1284
1740
  "401": {
1285
1741
  "description": "UnauthorizedError 401 response",
@@ -1301,12 +1757,22 @@
1301
1757
  }
1302
1758
  }
1303
1759
  },
1304
- "404": {
1305
- "description": "NotFoundError 404 response",
1760
+ "422": {
1761
+ "description": "ValidationError 422 response",
1306
1762
  "content": {
1307
1763
  "application/json": {
1308
1764
  "schema": {
1309
- "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1765
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
1766
+ }
1767
+ }
1768
+ }
1769
+ },
1770
+ "429": {
1771
+ "description": "RateLimitError 429 response",
1772
+ "content": {
1773
+ "application/json": {
1774
+ "schema": {
1775
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1310
1776
  }
1311
1777
  }
1312
1778
  }
@@ -1326,7 +1792,7 @@
1326
1792
  "Card Tables"
1327
1793
  ],
1328
1794
  "x-basecamp-retry": {
1329
- "maxAttempts": 3,
1795
+ "maxAttempts": 2,
1330
1796
  "baseDelayMs": 1000,
1331
1797
  "backoff": "exponential",
1332
1798
  "retryOn": [
@@ -1334,22 +1800,25 @@
1334
1800
  503
1335
1801
  ]
1336
1802
  }
1337
- },
1338
- "put": {
1339
- "description": "Update an existing column",
1340
- "operationId": "UpdateCardColumn",
1803
+ }
1804
+ },
1805
+ "/card_tables/cards/{cardId}/positions.json": {
1806
+ "post": {
1807
+ "description": "Reposition a step within a card",
1808
+ "operationId": "RepositionCardStep",
1341
1809
  "requestBody": {
1342
1810
  "content": {
1343
1811
  "application/json": {
1344
1812
  "schema": {
1345
- "$ref": "#/components/schemas/UpdateCardColumnRequestContent"
1813
+ "$ref": "#/components/schemas/RepositionCardStepRequestContent"
1346
1814
  }
1347
1815
  }
1348
- }
1816
+ },
1817
+ "required": true
1349
1818
  },
1350
1819
  "parameters": [
1351
1820
  {
1352
- "name": "columnId",
1821
+ "name": "cardId",
1353
1822
  "in": "path",
1354
1823
  "schema": {
1355
1824
  "type": "integer",
@@ -1360,14 +1829,7 @@
1360
1829
  ],
1361
1830
  "responses": {
1362
1831
  "200": {
1363
- "description": "UpdateCardColumn 200 response",
1364
- "content": {
1365
- "application/json": {
1366
- "schema": {
1367
- "$ref": "#/components/schemas/UpdateCardColumnResponseContent"
1368
- }
1369
- }
1370
- }
1832
+ "description": "RepositionCardStep 200 response"
1371
1833
  },
1372
1834
  "401": {
1373
1835
  "description": "UnauthorizedError 401 response",
@@ -1389,22 +1851,22 @@
1389
1851
  }
1390
1852
  }
1391
1853
  },
1392
- "404": {
1393
- "description": "NotFoundError 404 response",
1854
+ "422": {
1855
+ "description": "ValidationError 422 response",
1394
1856
  "content": {
1395
1857
  "application/json": {
1396
1858
  "schema": {
1397
- "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1859
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
1398
1860
  }
1399
1861
  }
1400
1862
  }
1401
1863
  },
1402
- "422": {
1403
- "description": "ValidationError 422 response",
1864
+ "429": {
1865
+ "description": "RateLimitError 429 response",
1404
1866
  "content": {
1405
1867
  "application/json": {
1406
1868
  "schema": {
1407
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
1869
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1408
1870
  }
1409
1871
  }
1410
1872
  }
@@ -1423,11 +1885,8 @@
1423
1885
  "tags": [
1424
1886
  "Card Tables"
1425
1887
  ],
1426
- "x-basecamp-idempotent": {
1427
- "natural": true
1428
- },
1429
1888
  "x-basecamp-retry": {
1430
- "maxAttempts": 3,
1889
+ "maxAttempts": 2,
1431
1890
  "baseDelayMs": 1000,
1432
1891
  "backoff": "exponential",
1433
1892
  "retryOn": [
@@ -1437,15 +1896,15 @@
1437
1896
  }
1438
1897
  }
1439
1898
  },
1440
- "/card_tables/columns/{columnId}/color.json": {
1441
- "put": {
1442
- "description": "Set the color of a column",
1443
- "operationId": "SetCardColumnColor",
1899
+ "/card_tables/cards/{cardId}/steps.json": {
1900
+ "post": {
1901
+ "description": "Create a step on a card",
1902
+ "operationId": "CreateCardStep",
1444
1903
  "requestBody": {
1445
1904
  "content": {
1446
1905
  "application/json": {
1447
1906
  "schema": {
1448
- "$ref": "#/components/schemas/SetCardColumnColorRequestContent"
1907
+ "$ref": "#/components/schemas/CreateCardStepRequestContent"
1449
1908
  }
1450
1909
  }
1451
1910
  },
@@ -1453,7 +1912,7 @@
1453
1912
  },
1454
1913
  "parameters": [
1455
1914
  {
1456
- "name": "columnId",
1915
+ "name": "cardId",
1457
1916
  "in": "path",
1458
1917
  "schema": {
1459
1918
  "type": "integer",
@@ -1463,12 +1922,12 @@
1463
1922
  }
1464
1923
  ],
1465
1924
  "responses": {
1466
- "200": {
1467
- "description": "SetCardColumnColor 200 response",
1925
+ "201": {
1926
+ "description": "CreateCardStep 201 response",
1468
1927
  "content": {
1469
1928
  "application/json": {
1470
1929
  "schema": {
1471
- "$ref": "#/components/schemas/SetCardColumnColorResponseContent"
1930
+ "$ref": "#/components/schemas/CreateCardStepResponseContent"
1472
1931
  }
1473
1932
  }
1474
1933
  }
@@ -1493,22 +1952,22 @@
1493
1952
  }
1494
1953
  }
1495
1954
  },
1496
- "404": {
1497
- "description": "NotFoundError 404 response",
1955
+ "422": {
1956
+ "description": "ValidationError 422 response",
1498
1957
  "content": {
1499
1958
  "application/json": {
1500
1959
  "schema": {
1501
- "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1960
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
1502
1961
  }
1503
1962
  }
1504
1963
  }
1505
1964
  },
1506
- "422": {
1507
- "description": "ValidationError 422 response",
1965
+ "429": {
1966
+ "description": "RateLimitError 429 response",
1508
1967
  "content": {
1509
1968
  "application/json": {
1510
1969
  "schema": {
1511
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
1970
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
1512
1971
  }
1513
1972
  }
1514
1973
  }
@@ -1526,12 +1985,9 @@
1526
1985
  },
1527
1986
  "tags": [
1528
1987
  "Card Tables"
1529
- ],
1530
- "x-basecamp-idempotent": {
1531
- "natural": true
1532
- },
1988
+ ],
1533
1989
  "x-basecamp-retry": {
1534
- "maxAttempts": 3,
1990
+ "maxAttempts": 2,
1535
1991
  "baseDelayMs": 1000,
1536
1992
  "backoff": "exponential",
1537
1993
  "retryOn": [
@@ -1541,10 +1997,10 @@
1541
1997
  }
1542
1998
  }
1543
1999
  },
1544
- "/card_tables/columns/{columnId}/on_hold.json": {
1545
- "delete": {
1546
- "description": "Disable on-hold section in a column",
1547
- "operationId": "DisableCardColumnOnHold",
2000
+ "/card_tables/columns/{columnId}": {
2001
+ "get": {
2002
+ "description": "Get a card column by ID",
2003
+ "operationId": "GetCardColumn",
1548
2004
  "parameters": [
1549
2005
  {
1550
2006
  "name": "columnId",
@@ -1558,11 +2014,11 @@
1558
2014
  ],
1559
2015
  "responses": {
1560
2016
  "200": {
1561
- "description": "DisableCardColumnOnHold 200 response",
2017
+ "description": "GetCardColumn 200 response",
1562
2018
  "content": {
1563
2019
  "application/json": {
1564
2020
  "schema": {
1565
- "$ref": "#/components/schemas/DisableCardColumnOnHoldResponseContent"
2021
+ "$ref": "#/components/schemas/GetCardColumnResponseContent"
1566
2022
  }
1567
2023
  }
1568
2024
  }
@@ -1611,9 +2067,6 @@
1611
2067
  "tags": [
1612
2068
  "Card Tables"
1613
2069
  ],
1614
- "x-basecamp-idempotent": {
1615
- "natural": true
1616
- },
1617
2070
  "x-basecamp-retry": {
1618
2071
  "maxAttempts": 3,
1619
2072
  "baseDelayMs": 1000,
@@ -1624,9 +2077,18 @@
1624
2077
  ]
1625
2078
  }
1626
2079
  },
1627
- "post": {
1628
- "description": "Enable on-hold section in a column",
1629
- "operationId": "EnableCardColumnOnHold",
2080
+ "put": {
2081
+ "description": "Update an existing column",
2082
+ "operationId": "UpdateCardColumn",
2083
+ "requestBody": {
2084
+ "content": {
2085
+ "application/json": {
2086
+ "schema": {
2087
+ "$ref": "#/components/schemas/UpdateCardColumnRequestContent"
2088
+ }
2089
+ }
2090
+ }
2091
+ },
1630
2092
  "parameters": [
1631
2093
  {
1632
2094
  "name": "columnId",
@@ -1640,11 +2102,11 @@
1640
2102
  ],
1641
2103
  "responses": {
1642
2104
  "200": {
1643
- "description": "EnableCardColumnOnHold 200 response",
2105
+ "description": "UpdateCardColumn 200 response",
1644
2106
  "content": {
1645
2107
  "application/json": {
1646
2108
  "schema": {
1647
- "$ref": "#/components/schemas/EnableCardColumnOnHoldResponseContent"
2109
+ "$ref": "#/components/schemas/UpdateCardColumnResponseContent"
1648
2110
  }
1649
2111
  }
1650
2112
  }
@@ -1669,22 +2131,22 @@
1669
2131
  }
1670
2132
  }
1671
2133
  },
1672
- "422": {
1673
- "description": "ValidationError 422 response",
2134
+ "404": {
2135
+ "description": "NotFoundError 404 response",
1674
2136
  "content": {
1675
2137
  "application/json": {
1676
2138
  "schema": {
1677
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
2139
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
1678
2140
  }
1679
2141
  }
1680
2142
  }
1681
2143
  },
1682
- "429": {
1683
- "description": "RateLimitError 429 response",
2144
+ "422": {
2145
+ "description": "ValidationError 422 response",
1684
2146
  "content": {
1685
2147
  "application/json": {
1686
2148
  "schema": {
1687
- "$ref": "#/components/schemas/RateLimitErrorResponseContent"
2149
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
1688
2150
  }
1689
2151
  }
1690
2152
  }
@@ -1703,8 +2165,11 @@
1703
2165
  "tags": [
1704
2166
  "Card Tables"
1705
2167
  ],
2168
+ "x-basecamp-idempotent": {
2169
+ "natural": true
2170
+ },
1706
2171
  "x-basecamp-retry": {
1707
- "maxAttempts": 2,
2172
+ "maxAttempts": 3,
1708
2173
  "baseDelayMs": 1000,
1709
2174
  "backoff": "exponential",
1710
2175
  "retryOn": [
@@ -3871,7 +4336,7 @@
3871
4336
  },
3872
4337
  "/chats/{campfireId}/lines/{lineId}": {
3873
4338
  "delete": {
3874
- "description": "Delete a campfire line",
4339
+ "description": "Delete a campfire line; allowed for the line's creator or an admin.\nThe API responds 403 Forbidden otherwise.",
3875
4340
  "operationId": "DeleteCampfireLine",
3876
4341
  "parameters": [
3877
4342
  {
@@ -4041,6 +4506,120 @@
4041
4506
  503
4042
4507
  ]
4043
4508
  }
4509
+ },
4510
+ "put": {
4511
+ "description": "Update an existing campfire line; the content is always treated as rich text (HTML).\nThe server coerces every edited line to rich text and ignores any content\ntype hint. Only the line's creator may edit it, and only text and\nrich-text lines are editable.",
4512
+ "operationId": "UpdateCampfireLine",
4513
+ "requestBody": {
4514
+ "content": {
4515
+ "application/json": {
4516
+ "schema": {
4517
+ "$ref": "#/components/schemas/UpdateCampfireLineRequestContent"
4518
+ }
4519
+ }
4520
+ },
4521
+ "required": true
4522
+ },
4523
+ "parameters": [
4524
+ {
4525
+ "name": "campfireId",
4526
+ "in": "path",
4527
+ "schema": {
4528
+ "type": "integer",
4529
+ "format": "int64"
4530
+ },
4531
+ "required": true
4532
+ },
4533
+ {
4534
+ "name": "lineId",
4535
+ "in": "path",
4536
+ "schema": {
4537
+ "type": "integer",
4538
+ "format": "int64"
4539
+ },
4540
+ "required": true
4541
+ }
4542
+ ],
4543
+ "responses": {
4544
+ "204": {
4545
+ "description": "UpdateCampfireLine 204 response"
4546
+ },
4547
+ "401": {
4548
+ "description": "UnauthorizedError 401 response",
4549
+ "content": {
4550
+ "application/json": {
4551
+ "schema": {
4552
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
4553
+ }
4554
+ }
4555
+ }
4556
+ },
4557
+ "403": {
4558
+ "description": "ForbiddenError 403 response",
4559
+ "content": {
4560
+ "application/json": {
4561
+ "schema": {
4562
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
4563
+ }
4564
+ }
4565
+ }
4566
+ },
4567
+ "404": {
4568
+ "description": "NotFoundError 404 response",
4569
+ "content": {
4570
+ "application/json": {
4571
+ "schema": {
4572
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
4573
+ }
4574
+ }
4575
+ }
4576
+ },
4577
+ "422": {
4578
+ "description": "ValidationError 422 response",
4579
+ "content": {
4580
+ "application/json": {
4581
+ "schema": {
4582
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
4583
+ }
4584
+ }
4585
+ }
4586
+ },
4587
+ "429": {
4588
+ "description": "RateLimitError 429 response",
4589
+ "content": {
4590
+ "application/json": {
4591
+ "schema": {
4592
+ "$ref": "#/components/schemas/RateLimitErrorResponseContent"
4593
+ }
4594
+ }
4595
+ }
4596
+ },
4597
+ "500": {
4598
+ "description": "InternalServerError 500 response",
4599
+ "content": {
4600
+ "application/json": {
4601
+ "schema": {
4602
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
4603
+ }
4604
+ }
4605
+ }
4606
+ }
4607
+ },
4608
+ "tags": [
4609
+ "Campfire"
4610
+ ],
4611
+ "x-basecamp-idempotent": {
4612
+ "natural": true
4613
+ },
4614
+ "x-basecamp-retry": {
4615
+ "maxAttempts": 3,
4616
+ "baseDelayMs": 1000,
4617
+ "backoff": "exponential",
4618
+ "retryOn": [
4619
+ 429,
4620
+ 503
4621
+ ]
4622
+ }
4044
4623
  }
4045
4624
  },
4046
4625
  "/chats/{campfireId}/uploads.json": {
@@ -4860,99 +5439,10 @@
4860
5439
  }
4861
5440
  }
4862
5441
  },
4863
- "/comments/{commentId}": {
4864
- "get": {
4865
- "description": "Get a single comment by id",
4866
- "operationId": "GetComment",
4867
- "parameters": [
4868
- {
4869
- "name": "commentId",
4870
- "in": "path",
4871
- "schema": {
4872
- "type": "integer",
4873
- "format": "int64"
4874
- },
4875
- "required": true
4876
- }
4877
- ],
4878
- "responses": {
4879
- "200": {
4880
- "description": "GetComment 200 response",
4881
- "content": {
4882
- "application/json": {
4883
- "schema": {
4884
- "$ref": "#/components/schemas/GetCommentResponseContent"
4885
- }
4886
- }
4887
- }
4888
- },
4889
- "401": {
4890
- "description": "UnauthorizedError 401 response",
4891
- "content": {
4892
- "application/json": {
4893
- "schema": {
4894
- "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
4895
- }
4896
- }
4897
- }
4898
- },
4899
- "403": {
4900
- "description": "ForbiddenError 403 response",
4901
- "content": {
4902
- "application/json": {
4903
- "schema": {
4904
- "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
4905
- }
4906
- }
4907
- }
4908
- },
4909
- "404": {
4910
- "description": "NotFoundError 404 response",
4911
- "content": {
4912
- "application/json": {
4913
- "schema": {
4914
- "$ref": "#/components/schemas/NotFoundErrorResponseContent"
4915
- }
4916
- }
4917
- }
4918
- },
4919
- "500": {
4920
- "description": "InternalServerError 500 response",
4921
- "content": {
4922
- "application/json": {
4923
- "schema": {
4924
- "$ref": "#/components/schemas/InternalServerErrorResponseContent"
4925
- }
4926
- }
4927
- }
4928
- }
4929
- },
4930
- "tags": [
4931
- "Messages"
4932
- ],
4933
- "x-basecamp-retry": {
4934
- "maxAttempts": 3,
4935
- "baseDelayMs": 1000,
4936
- "backoff": "exponential",
4937
- "retryOn": [
4938
- 429,
4939
- 503
4940
- ]
4941
- }
4942
- },
4943
- "put": {
4944
- "description": "Update an existing comment",
4945
- "operationId": "UpdateComment",
4946
- "requestBody": {
4947
- "content": {
4948
- "application/json": {
4949
- "schema": {
4950
- "$ref": "#/components/schemas/UpdateCommentRequestContent"
4951
- }
4952
- }
4953
- },
4954
- "required": true
4955
- },
5442
+ "/comments/{commentId}": {
5443
+ "get": {
5444
+ "description": "Get a single comment by id",
5445
+ "operationId": "GetComment",
4956
5446
  "parameters": [
4957
5447
  {
4958
5448
  "name": "commentId",
@@ -4966,11 +5456,11 @@
4966
5456
  ],
4967
5457
  "responses": {
4968
5458
  "200": {
4969
- "description": "UpdateComment 200 response",
5459
+ "description": "GetComment 200 response",
4970
5460
  "content": {
4971
5461
  "application/json": {
4972
5462
  "schema": {
4973
- "$ref": "#/components/schemas/UpdateCommentResponseContent"
5463
+ "$ref": "#/components/schemas/GetCommentResponseContent"
4974
5464
  }
4975
5465
  }
4976
5466
  }
@@ -5005,16 +5495,6 @@
5005
5495
  }
5006
5496
  }
5007
5497
  },
5008
- "422": {
5009
- "description": "ValidationError 422 response",
5010
- "content": {
5011
- "application/json": {
5012
- "schema": {
5013
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
5014
- }
5015
- }
5016
- }
5017
- },
5018
5498
  "500": {
5019
5499
  "description": "InternalServerError 500 response",
5020
5500
  "content": {
@@ -5029,9 +5509,6 @@
5029
5509
  "tags": [
5030
5510
  "Messages"
5031
5511
  ],
5032
- "x-basecamp-idempotent": {
5033
- "natural": true
5034
- },
5035
5512
  "x-basecamp-retry": {
5036
5513
  "maxAttempts": 3,
5037
5514
  "baseDelayMs": 1000,
@@ -5041,30 +5518,38 @@
5041
5518
  503
5042
5519
  ]
5043
5520
  }
5044
- }
5045
- },
5046
- "/dock/tools.json": {
5047
- "post": {
5048
- "description": "Clone an existing tool to create a new one",
5049
- "operationId": "CloneTool",
5521
+ },
5522
+ "put": {
5523
+ "description": "Update an existing comment",
5524
+ "operationId": "UpdateComment",
5050
5525
  "requestBody": {
5051
5526
  "content": {
5052
5527
  "application/json": {
5053
5528
  "schema": {
5054
- "$ref": "#/components/schemas/CloneToolRequestContent"
5529
+ "$ref": "#/components/schemas/UpdateCommentRequestContent"
5055
5530
  }
5056
5531
  }
5057
5532
  },
5058
5533
  "required": true
5059
5534
  },
5060
- "parameters": [],
5535
+ "parameters": [
5536
+ {
5537
+ "name": "commentId",
5538
+ "in": "path",
5539
+ "schema": {
5540
+ "type": "integer",
5541
+ "format": "int64"
5542
+ },
5543
+ "required": true
5544
+ }
5545
+ ],
5061
5546
  "responses": {
5062
- "201": {
5063
- "description": "CloneTool 201 response",
5547
+ "200": {
5548
+ "description": "UpdateComment 200 response",
5064
5549
  "content": {
5065
5550
  "application/json": {
5066
5551
  "schema": {
5067
- "$ref": "#/components/schemas/CloneToolResponseContent"
5552
+ "$ref": "#/components/schemas/UpdateCommentResponseContent"
5068
5553
  }
5069
5554
  }
5070
5555
  }
@@ -5089,22 +5574,22 @@
5089
5574
  }
5090
5575
  }
5091
5576
  },
5092
- "422": {
5093
- "description": "ValidationError 422 response",
5577
+ "404": {
5578
+ "description": "NotFoundError 404 response",
5094
5579
  "content": {
5095
5580
  "application/json": {
5096
5581
  "schema": {
5097
- "$ref": "#/components/schemas/ValidationErrorResponseContent"
5582
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
5098
5583
  }
5099
5584
  }
5100
5585
  }
5101
5586
  },
5102
- "429": {
5103
- "description": "RateLimitError 429 response",
5587
+ "422": {
5588
+ "description": "ValidationError 422 response",
5104
5589
  "content": {
5105
5590
  "application/json": {
5106
5591
  "schema": {
5107
- "$ref": "#/components/schemas/RateLimitErrorResponseContent"
5592
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
5108
5593
  }
5109
5594
  }
5110
5595
  }
@@ -5121,10 +5606,13 @@
5121
5606
  }
5122
5607
  },
5123
5608
  "tags": [
5124
- "Automation"
5609
+ "Messages"
5125
5610
  ],
5611
+ "x-basecamp-idempotent": {
5612
+ "natural": true
5613
+ },
5126
5614
  "x-basecamp-retry": {
5127
- "maxAttempts": 2,
5615
+ "maxAttempts": 3,
5128
5616
  "baseDelayMs": 1000,
5129
5617
  "backoff": "exponential",
5130
5618
  "retryOn": [
@@ -7757,7 +8245,7 @@
7757
8245
  },
7758
8246
  "/my/readings.json": {
7759
8247
  "get": {
7760
- "description": "Get the current user's notification inbox (the \"Hey!\" menu).\nNotifications are grouped into unreads, reads, and memories.\nReads are paginated (50 per page). Unreads are capped at 100.",
8248
+ "description": "Get the current user's notification inbox (the \"Hey!\" menu).\nNotifications are grouped into unreads, reads, bubble-ups, and\nscheduled bubble-ups (`memories` remains as an always-empty\nplaceholder on BC5). Reads are paginated (50 per page). Unreads are\ncapped at 100. Bubble-ups are capped per `limit_bubble_ups`.",
7761
8249
  "operationId": "GetMyNotifications",
7762
8250
  "parameters": [
7763
8251
  {
@@ -13211,7 +13699,7 @@
13211
13699
  },
13212
13700
  "/reports/schedules/upcoming.json": {
13213
13701
  "get": {
13214
- "description": "Get upcoming schedule entries within a date window",
13702
+ "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.",
13215
13703
  "operationId": "GetUpcomingSchedule",
13216
13704
  "parameters": [
13217
13705
  {
@@ -14374,14 +14862,126 @@
14374
14862
  },
14375
14863
  "required": true
14376
14864
  },
14865
+ {
14866
+ "name": "type_names[]",
14867
+ "in": "query",
14868
+ "description": "Recording types to include. Use `key` values from the metadata\nendpoint's `recording_search_types`. Available since Basecamp 5.",
14869
+ "style": "form",
14870
+ "schema": {
14871
+ "type": "array",
14872
+ "items": {
14873
+ "type": "string"
14874
+ },
14875
+ "description": "Recording types to include. Use `key` values from the metadata\nendpoint's `recording_search_types`. Available since Basecamp 5.",
14876
+ "x-go-type-skip-optional-pointer": false
14877
+ },
14878
+ "explode": true
14879
+ },
14880
+ {
14881
+ "name": "bucket_ids[]",
14882
+ "in": "query",
14883
+ "description": "Project IDs to filter by. Available since Basecamp 5.",
14884
+ "style": "form",
14885
+ "schema": {
14886
+ "type": "array",
14887
+ "items": {
14888
+ "type": "integer",
14889
+ "format": "int64"
14890
+ },
14891
+ "description": "Project IDs to filter by. Available since Basecamp 5.",
14892
+ "x-go-type-skip-optional-pointer": false
14893
+ },
14894
+ "explode": true
14895
+ },
14896
+ {
14897
+ "name": "creator_ids[]",
14898
+ "in": "query",
14899
+ "description": "Creator person IDs to filter by. Available since Basecamp 5.",
14900
+ "style": "form",
14901
+ "schema": {
14902
+ "type": "array",
14903
+ "items": {
14904
+ "type": "integer",
14905
+ "format": "int64"
14906
+ },
14907
+ "description": "Creator person IDs to filter by. Available since Basecamp 5.",
14908
+ "x-go-type-skip-optional-pointer": false
14909
+ },
14910
+ "explode": true
14911
+ },
14912
+ {
14913
+ "name": "file_type",
14914
+ "in": "query",
14915
+ "description": "Filter attachments by type. Use `key` values from the metadata\nendpoint's `file_search_types`.",
14916
+ "schema": {
14917
+ "type": "string",
14918
+ "description": "Filter attachments by type. Use `key` values from the metadata\nendpoint's `file_search_types`."
14919
+ }
14920
+ },
14921
+ {
14922
+ "name": "exclude_chat",
14923
+ "in": "query",
14924
+ "description": "Set to true to exclude chat results.",
14925
+ "schema": {
14926
+ "type": "boolean",
14927
+ "description": "Set to true to exclude chat results."
14928
+ }
14929
+ },
14930
+ {
14931
+ "name": "since",
14932
+ "in": "query",
14933
+ "description": "last_7_days|last_30_days|last_90_days|last_12_months|forever",
14934
+ "schema": {
14935
+ "type": "string",
14936
+ "description": "last_7_days|last_30_days|last_90_days|last_12_months|forever"
14937
+ }
14938
+ },
14377
14939
  {
14378
14940
  "name": "sort",
14379
14941
  "in": "query",
14380
- "description": "best_match|created_at",
14942
+ "description": "best_match|recency",
14381
14943
  "schema": {
14382
14944
  "type": "string",
14383
- "description": "best_match|created_at"
14945
+ "description": "best_match|recency"
14384
14946
  }
14947
+ },
14948
+ {
14949
+ "name": "type",
14950
+ "in": "query",
14951
+ "description": "Deprecated: prefer type_names[].",
14952
+ "schema": {
14953
+ "type": "string",
14954
+ "deprecated": true,
14955
+ "description": "Deprecated: prefer type_names[].\nThis shape is deprecated since 2026-07: Use typeNames (type_names[]) instead"
14956
+ },
14957
+ "deprecated": true,
14958
+ "x-deprecated-reason": "prefer type_names[]."
14959
+ },
14960
+ {
14961
+ "name": "bucket_id",
14962
+ "in": "query",
14963
+ "description": "Deprecated: prefer bucket_ids[].",
14964
+ "schema": {
14965
+ "type": "integer",
14966
+ "deprecated": true,
14967
+ "description": "Deprecated: prefer bucket_ids[].\nThis shape is deprecated since 2026-07: Use bucketIds (bucket_ids[]) instead",
14968
+ "format": "int64"
14969
+ },
14970
+ "deprecated": true,
14971
+ "x-deprecated-reason": "prefer bucket_ids[]."
14972
+ },
14973
+ {
14974
+ "name": "creator_id",
14975
+ "in": "query",
14976
+ "description": "Deprecated: prefer creator_ids[].",
14977
+ "schema": {
14978
+ "type": "integer",
14979
+ "deprecated": true,
14980
+ "description": "Deprecated: prefer creator_ids[].\nThis shape is deprecated since 2026-07: Use creatorIds (creator_ids[]) instead",
14981
+ "format": "int64"
14982
+ },
14983
+ "deprecated": true,
14984
+ "x-deprecated-reason": "prefer creator_ids[]."
14385
14985
  }
14386
14986
  ],
14387
14987
  "responses": {
@@ -15479,6 +16079,7 @@
15479
16079
  "title": "Launch Tasks",
15480
16080
  "inherits_status": true,
15481
16081
  "type": "Todolist",
16082
+ "description_attachments": [],
15482
16083
  "url": "https://3.basecampapi.com/999/buckets/12345678/todolists/987654.json",
15483
16084
  "app_url": "https://3.basecamp.com/999/buckets/12345678/todolists/987654",
15484
16085
  "creator": {
@@ -16244,16 +16845,17 @@
16244
16845
  }
16245
16846
  },
16246
16847
  "put": {
16247
- "description": "Update an existing todo",
16248
- "operationId": "UpdateTodo",
16848
+ "description": "Replace a todo with a new complete representation.\nThe request body is the todo's full writable state: any writable field\nomitted from the request is cleared server-side (empty/missing\nassignee_ids clears assignees, missing description clears it, and so\non). content is required — a request without it is rejected.\nTo set some fields while preserving the rest, use the SDK's merge-safe\nupdate or edit methods, which GET the current todo and PUT the full\nrepresentation back. Those read-modify-write helpers are not atomic:\na concurrent write between the GET and PUT is overwritten (last write\nwins for the whole representation; the window is one round-trip).",
16849
+ "operationId": "ReplaceTodo",
16249
16850
  "requestBody": {
16250
16851
  "content": {
16251
16852
  "application/json": {
16252
16853
  "schema": {
16253
- "$ref": "#/components/schemas/UpdateTodoRequestContent"
16854
+ "$ref": "#/components/schemas/ReplaceTodoRequestContent"
16254
16855
  }
16255
16856
  }
16256
- }
16857
+ },
16858
+ "required": true
16257
16859
  },
16258
16860
  "parameters": [
16259
16861
  {
@@ -16268,11 +16870,11 @@
16268
16870
  ],
16269
16871
  "responses": {
16270
16872
  "200": {
16271
- "description": "UpdateTodo 200 response",
16873
+ "description": "ReplaceTodo 200 response",
16272
16874
  "content": {
16273
16875
  "application/json": {
16274
16876
  "schema": {
16275
- "$ref": "#/components/schemas/UpdateTodoResponseContent"
16877
+ "$ref": "#/components/schemas/ReplaceTodoResponseContent"
16276
16878
  }
16277
16879
  }
16278
16880
  }
@@ -16342,6 +16944,10 @@
16342
16944
  429,
16343
16945
  503
16344
16946
  ]
16947
+ },
16948
+ "x-basecamp-write-semantics": {
16949
+ "mode": "replace",
16950
+ "clearsOmitted": true
16345
16951
  }
16346
16952
  }
16347
16953
  },
@@ -16601,6 +17207,103 @@
16601
17207
  }
16602
17208
  }
16603
17209
  },
17210
+ "/todosets/todolists/{todolistId}/position.json": {
17211
+ "put": {
17212
+ "description": "Reposition a to-do list within its to-do set.\nposition is the 1-based index among the to-do lists the caller can see; the server\ntranslates it relative to loose to-dos and hidden completed lists. Shifts siblings.",
17213
+ "operationId": "RepositionTodolist",
17214
+ "requestBody": {
17215
+ "content": {
17216
+ "application/json": {
17217
+ "schema": {
17218
+ "$ref": "#/components/schemas/RepositionTodolistRequestContent"
17219
+ }
17220
+ }
17221
+ },
17222
+ "required": true
17223
+ },
17224
+ "parameters": [
17225
+ {
17226
+ "name": "todolistId",
17227
+ "in": "path",
17228
+ "schema": {
17229
+ "type": "integer",
17230
+ "format": "int64"
17231
+ },
17232
+ "required": true
17233
+ }
17234
+ ],
17235
+ "responses": {
17236
+ "204": {
17237
+ "description": "RepositionTodolist 204 response"
17238
+ },
17239
+ "401": {
17240
+ "description": "UnauthorizedError 401 response",
17241
+ "content": {
17242
+ "application/json": {
17243
+ "schema": {
17244
+ "$ref": "#/components/schemas/UnauthorizedErrorResponseContent"
17245
+ }
17246
+ }
17247
+ }
17248
+ },
17249
+ "403": {
17250
+ "description": "ForbiddenError 403 response",
17251
+ "content": {
17252
+ "application/json": {
17253
+ "schema": {
17254
+ "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
17255
+ }
17256
+ }
17257
+ }
17258
+ },
17259
+ "404": {
17260
+ "description": "NotFoundError 404 response",
17261
+ "content": {
17262
+ "application/json": {
17263
+ "schema": {
17264
+ "$ref": "#/components/schemas/NotFoundErrorResponseContent"
17265
+ }
17266
+ }
17267
+ }
17268
+ },
17269
+ "422": {
17270
+ "description": "ValidationError 422 response",
17271
+ "content": {
17272
+ "application/json": {
17273
+ "schema": {
17274
+ "$ref": "#/components/schemas/ValidationErrorResponseContent"
17275
+ }
17276
+ }
17277
+ }
17278
+ },
17279
+ "500": {
17280
+ "description": "InternalServerError 500 response",
17281
+ "content": {
17282
+ "application/json": {
17283
+ "schema": {
17284
+ "$ref": "#/components/schemas/InternalServerErrorResponseContent"
17285
+ }
17286
+ }
17287
+ }
17288
+ }
17289
+ },
17290
+ "tags": [
17291
+ "Todos"
17292
+ ],
17293
+ "x-basecamp-idempotent": {
17294
+ "natural": true
17295
+ },
17296
+ "x-basecamp-retry": {
17297
+ "maxAttempts": 3,
17298
+ "baseDelayMs": 1000,
17299
+ "backoff": "exponential",
17300
+ "retryOn": [
17301
+ 429,
17302
+ 503
17303
+ ]
17304
+ }
17305
+ }
17306
+ },
16604
17307
  "/todosets/{todosetId}": {
16605
17308
  "get": {
16606
17309
  "description": "Get a todoset (container for todolists in a project)",
@@ -18765,7 +19468,8 @@
18765
19468
  "format": "int64"
18766
19469
  },
18767
19470
  "download_url": {
18768
- "type": "string"
19471
+ "type": "string",
19472
+ "x-basecamp-auth-routable-url": {}
18769
19473
  }
18770
19474
  }
18771
19475
  },
@@ -18830,6 +19534,12 @@
18830
19534
  "description": {
18831
19535
  "type": "string"
18832
19536
  },
19537
+ "description_attachments": {
19538
+ "type": "array",
19539
+ "items": {
19540
+ "$ref": "#/components/schemas/RichTextAttachment"
19541
+ }
19542
+ },
18833
19543
  "due_on": {
18834
19544
  "type": "string",
18835
19545
  "x-go-type": "types.Date",
@@ -18902,6 +19612,7 @@
18902
19612
  "bucket",
18903
19613
  "created_at",
18904
19614
  "creator",
19615
+ "description_attachments",
18905
19616
  "id",
18906
19617
  "inherits_status",
18907
19618
  "parent",
@@ -19246,6 +19957,12 @@
19246
19957
  "items": {
19247
19958
  "$ref": "#/components/schemas/CardColumn"
19248
19959
  }
19960
+ },
19961
+ "wormholes": {
19962
+ "type": "array",
19963
+ "items": {
19964
+ "$ref": "#/components/schemas/Wormhole"
19965
+ }
19249
19966
  }
19250
19967
  },
19251
19968
  "required": [
@@ -19373,6 +20090,12 @@
19373
20090
  "content": {
19374
20091
  "type": "string"
19375
20092
  },
20093
+ "content_attachments": {
20094
+ "type": "array",
20095
+ "items": {
20096
+ "$ref": "#/components/schemas/RichTextAttachment"
20097
+ }
20098
+ },
19376
20099
  "subject": {
19377
20100
  "type": "string"
19378
20101
  },
@@ -19407,6 +20130,7 @@
19407
20130
  "required": [
19408
20131
  "app_url",
19409
20132
  "bucket",
20133
+ "content_attachments",
19410
20134
  "created_at",
19411
20135
  "creator",
19412
20136
  "id",
@@ -19562,6 +20286,12 @@
19562
20286
  "content": {
19563
20287
  "type": "string"
19564
20288
  },
20289
+ "content_attachments": {
20290
+ "type": "array",
20291
+ "items": {
20292
+ "$ref": "#/components/schemas/RichTextAttachment"
20293
+ }
20294
+ },
19565
20295
  "subject": {
19566
20296
  "type": "string"
19567
20297
  },
@@ -19576,6 +20306,7 @@
19576
20306
  "required": [
19577
20307
  "app_url",
19578
20308
  "bucket",
20309
+ "content_attachments",
19579
20310
  "created_at",
19580
20311
  "creator",
19581
20312
  "id",
@@ -19649,12 +20380,19 @@
19649
20380
  },
19650
20381
  "content": {
19651
20382
  "type": "string"
20383
+ },
20384
+ "content_attachments": {
20385
+ "type": "array",
20386
+ "items": {
20387
+ "$ref": "#/components/schemas/RichTextAttachment"
20388
+ }
19652
20389
  }
19653
20390
  },
19654
20391
  "required": [
19655
20392
  "app_url",
19656
20393
  "bucket",
19657
20394
  "content",
20395
+ "content_attachments",
19658
20396
  "created_at",
19659
20397
  "creator",
19660
20398
  "id",
@@ -19677,28 +20415,10 @@
19677
20415
  "type": "string"
19678
20416
  },
19679
20417
  "app_url": {
19680
- "type": "string"
19681
- }
19682
- }
19683
- },
19684
- "CloneToolRequestContent": {
19685
- "type": "object",
19686
- "properties": {
19687
- "source_recording_id": {
19688
- "type": "integer",
19689
- "format": "int64",
19690
- "x-go-type-skip-optional-pointer": false
19691
- },
19692
- "title": {
19693
- "type": "string"
19694
- }
19695
- },
19696
- "required": [
19697
- "source_recording_id"
19698
- ]
19699
- },
19700
- "CloneToolResponseContent": {
19701
- "$ref": "#/components/schemas/Tool"
20418
+ "type": "string"
20419
+ }
20420
+ },
20421
+ "x-deprecated-reason": "This shape is deprecated since 2024-01: Use Client Visibility feature instead"
19702
20422
  },
19703
20423
  "Comment": {
19704
20424
  "type": "object",
@@ -19760,6 +20480,12 @@
19760
20480
  "content": {
19761
20481
  "type": "string"
19762
20482
  },
20483
+ "content_attachments": {
20484
+ "type": "array",
20485
+ "items": {
20486
+ "$ref": "#/components/schemas/RichTextAttachment"
20487
+ }
20488
+ },
19763
20489
  "boosts_count": {
19764
20490
  "type": "integer",
19765
20491
  "format": "int32"
@@ -19772,6 +20498,7 @@
19772
20498
  "app_url",
19773
20499
  "bucket",
19774
20500
  "content",
20501
+ "content_attachments",
19775
20502
  "created_at",
19776
20503
  "creator",
19777
20504
  "id",
@@ -19951,6 +20678,10 @@
19951
20678
  "format": "int64"
19952
20679
  },
19953
20680
  "x-go-type-skip-optional-pointer": false
20681
+ },
20682
+ "visible_to_clients": {
20683
+ "type": "boolean",
20684
+ "x-go-type-skip-optional-pointer": false
19954
20685
  }
19955
20686
  },
19956
20687
  "required": [
@@ -20056,6 +20787,10 @@
20056
20787
  "format": "int64"
20057
20788
  },
20058
20789
  "x-go-type-skip-optional-pointer": false
20790
+ },
20791
+ "visible_to_clients": {
20792
+ "type": "boolean",
20793
+ "x-go-type-skip-optional-pointer": false
20059
20794
  }
20060
20795
  },
20061
20796
  "required": [
@@ -20111,15 +20846,12 @@
20111
20846
  "CreateProjectFromTemplateRequestContent": {
20112
20847
  "type": "object",
20113
20848
  "properties": {
20114
- "name": {
20115
- "type": "string"
20116
- },
20117
- "description": {
20118
- "type": "string"
20849
+ "project": {
20850
+ "$ref": "#/components/schemas/ProjectConstructionAttributes"
20119
20851
  }
20120
20852
  },
20121
20853
  "required": [
20122
- "name"
20854
+ "project"
20123
20855
  ]
20124
20856
  },
20125
20857
  "CreateProjectFromTemplateResponseContent": {
@@ -20150,6 +20882,10 @@
20150
20882
  },
20151
20883
  "schedule": {
20152
20884
  "$ref": "#/components/schemas/QuestionSchedule"
20885
+ },
20886
+ "visible_to_clients": {
20887
+ "type": "boolean",
20888
+ "x-go-type-skip-optional-pointer": false
20153
20889
  }
20154
20890
  },
20155
20891
  "required": [
@@ -20222,6 +20958,10 @@
20222
20958
  "format": "int64"
20223
20959
  },
20224
20960
  "x-go-type-skip-optional-pointer": false
20961
+ },
20962
+ "visible_to_clients": {
20963
+ "type": "boolean",
20964
+ "x-go-type-skip-optional-pointer": false
20225
20965
  }
20226
20966
  },
20227
20967
  "required": [
@@ -20349,6 +21089,10 @@
20349
21089
  },
20350
21090
  "description": {
20351
21091
  "type": "string"
21092
+ },
21093
+ "visible_to_clients": {
21094
+ "type": "boolean",
21095
+ "x-go-type-skip-optional-pointer": false
20352
21096
  }
20353
21097
  },
20354
21098
  "required": [
@@ -20358,6 +21102,25 @@
20358
21102
  "CreateTodolistResponseContent": {
20359
21103
  "$ref": "#/components/schemas/Todolist"
20360
21104
  },
21105
+ "CreateToolRequestContent": {
21106
+ "type": "object",
21107
+ "properties": {
21108
+ "tool_type": {
21109
+ "type": "string",
21110
+ "description": "Tool type to add to the project dock. Values: Chat::Transcript|Inbox|Kanban::Board|Message::Board|Questionnaire|Schedule|Todoset|Vault."
21111
+ },
21112
+ "title": {
21113
+ "type": "string",
21114
+ "description": "Title for the new tool. When omitted, Basecamp assigns the next available default title for the tool type."
21115
+ }
21116
+ },
21117
+ "required": [
21118
+ "tool_type"
21119
+ ]
21120
+ },
21121
+ "CreateToolResponseContent": {
21122
+ "$ref": "#/components/schemas/Tool"
21123
+ },
20361
21124
  "CreateUploadRequestContent": {
20362
21125
  "type": "object",
20363
21126
  "properties": {
@@ -20377,6 +21140,10 @@
20377
21140
  "format": "int64"
20378
21141
  },
20379
21142
  "x-go-type-skip-optional-pointer": false
21143
+ },
21144
+ "visible_to_clients": {
21145
+ "type": "boolean",
21146
+ "x-go-type-skip-optional-pointer": false
20380
21147
  }
20381
21148
  },
20382
21149
  "required": [
@@ -20425,6 +21192,23 @@
20425
21192
  "CreateWebhookResponseContent": {
20426
21193
  "$ref": "#/components/schemas/Webhook"
20427
21194
  },
21195
+ "CreateWormholeRequestContent": {
21196
+ "type": "object",
21197
+ "properties": {
21198
+ "destination_recording_id": {
21199
+ "type": "integer",
21200
+ "description": "Id of the destination column (on another accessible card table) to link to.",
21201
+ "format": "int64",
21202
+ "x-go-type-skip-optional-pointer": false
21203
+ }
21204
+ },
21205
+ "required": [
21206
+ "destination_recording_id"
21207
+ ]
21208
+ },
21209
+ "CreateWormholeResponseContent": {
21210
+ "$ref": "#/components/schemas/Wormhole"
21211
+ },
20428
21212
  "DisableCardColumnOnHoldResponseContent": {
20429
21213
  "$ref": "#/components/schemas/CardColumn"
20430
21214
  },
@@ -20539,6 +21323,12 @@
20539
21323
  "content": {
20540
21324
  "type": "string"
20541
21325
  },
21326
+ "content_attachments": {
21327
+ "type": "array",
21328
+ "items": {
21329
+ "$ref": "#/components/schemas/RichTextAttachment"
21330
+ }
21331
+ },
20542
21332
  "boosts_count": {
20543
21333
  "type": "integer",
20544
21334
  "format": "int32"
@@ -20550,6 +21340,7 @@
20550
21340
  "required": [
20551
21341
  "app_url",
20552
21342
  "bucket",
21343
+ "content_attachments",
20553
21344
  "created_at",
20554
21345
  "creator",
20555
21346
  "id",
@@ -20741,6 +21532,12 @@
20741
21532
  "content": {
20742
21533
  "type": "string"
20743
21534
  },
21535
+ "content_attachments": {
21536
+ "type": "array",
21537
+ "items": {
21538
+ "$ref": "#/components/schemas/RichTextAttachment"
21539
+ }
21540
+ },
20744
21541
  "subject": {
20745
21542
  "type": "string"
20746
21543
  },
@@ -20758,6 +21555,7 @@
20758
21555
  "required": [
20759
21556
  "app_url",
20760
21557
  "bucket",
21558
+ "content_attachments",
20761
21559
  "created_at",
20762
21560
  "creator",
20763
21561
  "id",
@@ -20832,6 +21630,12 @@
20832
21630
  "content": {
20833
21631
  "type": "string"
20834
21632
  },
21633
+ "content_attachments": {
21634
+ "type": "array",
21635
+ "items": {
21636
+ "$ref": "#/components/schemas/RichTextAttachment"
21637
+ }
21638
+ },
20835
21639
  "boosts_count": {
20836
21640
  "type": "integer",
20837
21641
  "format": "int32"
@@ -20844,6 +21648,7 @@
20844
21648
  "app_url",
20845
21649
  "bucket",
20846
21650
  "content",
21651
+ "content_attachments",
20847
21652
  "created_at",
20848
21653
  "creator",
20849
21654
  "id",
@@ -20914,6 +21719,13 @@
20914
21719
  "description": {
20915
21720
  "type": "string"
20916
21721
  },
21722
+ "description_attachments": {
21723
+ "type": "array",
21724
+ "items": {
21725
+ "$ref": "#/components/schemas/RichTextAttachment"
21726
+ },
21727
+ "description": "Optional (no `@required`): the type-specific partial renders the\ncompanion array only when the gauge has needles (bc3 `if\ngauge.any_needles?`), so a needle-less gauge omits the key entirely.\nNon-nullable — never served as JSON `null`."
21728
+ },
20917
21729
  "enabled": {
20918
21730
  "type": "boolean"
20919
21731
  },
@@ -21012,6 +21824,12 @@
21012
21824
  "description": {
21013
21825
  "type": "string"
21014
21826
  },
21827
+ "description_attachments": {
21828
+ "type": "array",
21829
+ "items": {
21830
+ "$ref": "#/components/schemas/RichTextAttachment"
21831
+ }
21832
+ },
21015
21833
  "color": {
21016
21834
  "type": "string"
21017
21835
  },
@@ -21022,6 +21840,7 @@
21022
21840
  },
21023
21841
  "required": [
21024
21842
  "created_at",
21843
+ "description_attachments",
21025
21844
  "id",
21026
21845
  "updated_at"
21027
21846
  ]
@@ -21207,7 +22026,22 @@
21207
22026
  "type": "array",
21208
22027
  "items": {
21209
22028
  "$ref": "#/components/schemas/Notification"
21210
- }
22029
+ },
22030
+ "description": "Legacy \"save forever\" collection. Permanently `[]` on BC5 by documented\ncontract (`doc/api/sections/my_notifications.md`, codified by BC3 #11628):\nan always-empty placeholder superseded by `bubble_ups`. BC4 (the `four`\nbranch) still populates it — an accepted BC4→BC5 subtractive delta\nrecorded in `spec/api-gaps/memories-emptied-regression.md`. New\nintegrations should use `bubble_ups` / `scheduled_bubble_ups` and must\nnot rely on `memories` on BC5."
22031
+ },
22032
+ "bubble_ups": {
22033
+ "type": "array",
22034
+ "items": {
22035
+ "$ref": "#/components/schemas/Notification"
22036
+ },
22037
+ "description": "Items the user has saved with Bubble Up (BC5 addition). Roughly the\nsuccessor to `memories` but with optional scheduling — see\n`scheduled_bubble_ups` for the time-deferred subset."
22038
+ },
22039
+ "scheduled_bubble_ups": {
22040
+ "type": "array",
22041
+ "items": {
22042
+ "$ref": "#/components/schemas/Notification"
22043
+ },
22044
+ "description": "Bubble Ups scheduled to resurface in the future (BC5 addition)."
21211
22045
  }
21212
22046
  }
21213
22047
  },
@@ -21899,6 +22733,12 @@
21899
22733
  "content": {
21900
22734
  "type": "string"
21901
22735
  },
22736
+ "content_attachments": {
22737
+ "type": "array",
22738
+ "items": {
22739
+ "$ref": "#/components/schemas/RichTextAttachment"
22740
+ }
22741
+ },
21902
22742
  "category": {
21903
22743
  "$ref": "#/components/schemas/MessageType"
21904
22744
  },
@@ -21914,6 +22754,7 @@
21914
22754
  "app_url",
21915
22755
  "bucket",
21916
22756
  "content",
22757
+ "content_attachments",
21917
22758
  "created_at",
21918
22759
  "creator",
21919
22760
  "id",
@@ -22262,7 +23103,8 @@
22262
23103
  "x-go-type-skip-optional-pointer": true
22263
23104
  },
22264
23105
  "section": {
22265
- "type": "string"
23106
+ "type": "string",
23107
+ "description": "The notification category: `inbox`, `chats`, `pings`, `bubbles`,\nor `mentions`."
22266
23108
  },
22267
23109
  "unread_count": {
22268
23110
  "type": "integer",
@@ -22317,6 +23159,19 @@
22317
23159
  "memory_url": {
22318
23160
  "type": "string"
22319
23161
  },
23162
+ "bubble_up_url": {
23163
+ "type": "string",
23164
+ "description": "URL for the Bubble Up record covering this notification (BC5 addition).\nEligibility-gated — only present on items the current user can bubble up."
23165
+ },
23166
+ "bubble_up_at": {
23167
+ "type": "string",
23168
+ "description": "Scheduled resurfacing time when this item is queued as a scheduled\nBubble Up (BC5 addition). Absent when there is no scheduled time.",
23169
+ "x-go-type": "time.Time",
23170
+ "x-go-type-import": {
23171
+ "path": "time"
23172
+ },
23173
+ "x-go-type-skip-optional-pointer": true
23174
+ },
22320
23175
  "subscription_url": {
22321
23176
  "type": "string"
22322
23177
  },
@@ -22353,6 +23208,7 @@
22353
23208
  },
22354
23209
  "OutOfOffice": {
22355
23210
  "type": "object",
23211
+ "description": "When out of office is not enabled, `enabled` is `false` and\n`start_date`, `end_date`, and `back_on_date` are omitted.",
22356
23212
  "properties": {
22357
23213
  "person": {
22358
23214
  "$ref": "#/components/schemas/OutOfOfficePerson"
@@ -22368,6 +23224,10 @@
22368
23224
  },
22369
23225
  "end_date": {
22370
23226
  "type": "string"
23227
+ },
23228
+ "back_on_date": {
23229
+ "type": "string",
23230
+ "description": "First working day after the out-of-office window ends.\nOmitted when out of office is not enabled."
22371
23231
  }
22372
23232
  }
22373
23233
  },
@@ -22399,6 +23259,10 @@
22399
23259
  "name": {
22400
23260
  "type": "string",
22401
23261
  "format": "password"
23262
+ },
23263
+ "avatar_url": {
23264
+ "type": "string",
23265
+ "format": "password"
22402
23266
  }
22403
23267
  },
22404
23268
  "required": [
@@ -22463,6 +23327,15 @@
22463
23327
  "redact": false
22464
23328
  }
22465
23329
  },
23330
+ "tagline": {
23331
+ "type": "string",
23332
+ "description": "Alias of `bio` introduced in BC5. BC3 emits both keys with identical content;\nolder BC4 responses may omit `tagline`. Prefer `bio` for cross-version reads.",
23333
+ "format": "password",
23334
+ "x-basecamp-sensitive": {
23335
+ "category": "pii",
23336
+ "redact": false
23337
+ }
23338
+ },
22466
23339
  "location": {
22467
23340
  "type": "string",
22468
23341
  "format": "password",
@@ -22562,7 +23435,8 @@
22562
23435
  "type": "string"
22563
23436
  },
22564
23437
  "time_zone_name": {
22565
- "type": "string"
23438
+ "type": "string",
23439
+ "description": "Returned as a Rails-style name (e.g. \"Central Time (US & Canada)\")."
22566
23440
  },
22567
23441
  "first_week_day": {
22568
23442
  "type": "string"
@@ -22577,7 +23451,7 @@
22577
23451
  "properties": {
22578
23452
  "time_zone_name": {
22579
23453
  "type": "string",
22580
- "description": "Time zone name (e.g. \"America/Chicago\", \"London\", \"UTC\")"
23454
+ "description": "Time zone name. Accepts any valid Rails time zone name (e.g.\n\"London\", \"UTC\") as well as IANA identifiers (e.g.\n\"America/Chicago\"), which are normalized to the matching\nRails-style name before saving."
22581
23455
  },
22582
23456
  "first_week_day": {
22583
23457
  "type": "string",
@@ -22660,6 +23534,12 @@
22660
23534
  "purpose": {
22661
23535
  "type": "string"
22662
23536
  },
23537
+ "start_date": {
23538
+ "type": "string"
23539
+ },
23540
+ "end_date": {
23541
+ "type": "string"
23542
+ },
22663
23543
  "clients_enabled": {
22664
23544
  "type": "boolean"
22665
23545
  },
@@ -22686,7 +23566,8 @@
22686
23566
  },
22687
23567
  "clientside": {
22688
23568
  "$ref": "#/components/schemas/ClientSide",
22689
- "deprecated": true
23569
+ "deprecated": true,
23570
+ "x-deprecated-reason": "This shape is deprecated since 2024-01: Use Client Visibility feature instead"
22690
23571
  }
22691
23572
  },
22692
23573
  "required": [
@@ -22739,6 +23620,20 @@
22739
23620
  "status"
22740
23621
  ]
22741
23622
  },
23623
+ "ProjectConstructionAttributes": {
23624
+ "type": "object",
23625
+ "properties": {
23626
+ "name": {
23627
+ "type": "string"
23628
+ },
23629
+ "description": {
23630
+ "type": "string"
23631
+ }
23632
+ },
23633
+ "required": [
23634
+ "name"
23635
+ ]
23636
+ },
22742
23637
  "Question": {
22743
23638
  "type": "object",
22744
23639
  "properties": {
@@ -22890,6 +23785,12 @@
22890
23785
  "content": {
22891
23786
  "type": "string"
22892
23787
  },
23788
+ "content_attachments": {
23789
+ "type": "array",
23790
+ "items": {
23791
+ "$ref": "#/components/schemas/RichTextAttachment"
23792
+ }
23793
+ },
22893
23794
  "group_on": {
22894
23795
  "type": "string",
22895
23796
  "x-go-type": "types.Date",
@@ -22919,6 +23820,7 @@
22919
23820
  "app_url",
22920
23821
  "bucket",
22921
23822
  "content",
23823
+ "content_attachments",
22922
23824
  "created_at",
22923
23825
  "creator",
22924
23826
  "id",
@@ -23190,6 +24092,20 @@
23190
24092
  "content": {
23191
24093
  "type": "string"
23192
24094
  },
24095
+ "content_attachments": {
24096
+ "type": "array",
24097
+ "items": {
24098
+ "$ref": "#/components/schemas/RichTextAttachment"
24099
+ },
24100
+ "description": "Rich-text companion arrays carried through the generic recording\nprojection (`to_recordable_partial_path` renders the full type-specific\npartial). A given recording is one type, so it carries only the array\nmatching its rich-text attribute (`content_attachments` for a\nComment/Message, `description_attachments` for a Todo/Card); a\nwebhook-sourced recording (base partial) carries neither. Optional (no\n`@required`), non-nullable."
24101
+ },
24102
+ "description_attachments": {
24103
+ "type": "array",
24104
+ "items": {
24105
+ "$ref": "#/components/schemas/RichTextAttachment"
24106
+ },
24107
+ "description": "See `content_attachments` — the description-attribute companion array."
24108
+ },
23193
24109
  "comments_count": {
23194
24110
  "type": "integer",
23195
24111
  "format": "int32"
@@ -23276,6 +24192,57 @@
23276
24192
  "url"
23277
24193
  ]
23278
24194
  },
24195
+ "ReplaceTodoRequestContent": {
24196
+ "type": "object",
24197
+ "properties": {
24198
+ "content": {
24199
+ "type": "string"
24200
+ },
24201
+ "description": {
24202
+ "type": "string"
24203
+ },
24204
+ "assignee_ids": {
24205
+ "type": "array",
24206
+ "items": {
24207
+ "type": "integer",
24208
+ "format": "int64"
24209
+ }
24210
+ },
24211
+ "completion_subscriber_ids": {
24212
+ "type": "array",
24213
+ "items": {
24214
+ "type": "integer",
24215
+ "format": "int64"
24216
+ }
24217
+ },
24218
+ "notify": {
24219
+ "type": "boolean",
24220
+ "x-go-type-skip-optional-pointer": false
24221
+ },
24222
+ "due_on": {
24223
+ "type": "string",
24224
+ "x-go-type": "types.Date",
24225
+ "x-go-type-import": {
24226
+ "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
24227
+ },
24228
+ "x-go-type-skip-optional-pointer": true
24229
+ },
24230
+ "starts_on": {
24231
+ "type": "string",
24232
+ "x-go-type": "types.Date",
24233
+ "x-go-type-import": {
24234
+ "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
24235
+ },
24236
+ "x-go-type-skip-optional-pointer": true
24237
+ }
24238
+ },
24239
+ "required": [
24240
+ "content"
24241
+ ]
24242
+ },
24243
+ "ReplaceTodoResponseContent": {
24244
+ "$ref": "#/components/schemas/Todo"
24245
+ },
23279
24246
  "RepositionCardStepRequestContent": {
23280
24247
  "type": "object",
23281
24248
  "properties": {
@@ -23325,26 +24292,108 @@
23325
24292
  "position"
23326
24293
  ]
23327
24294
  },
24295
+ "RepositionTodolistRequestContent": {
24296
+ "type": "object",
24297
+ "properties": {
24298
+ "position": {
24299
+ "type": "integer",
24300
+ "format": "int32"
24301
+ }
24302
+ },
24303
+ "required": [
24304
+ "position"
24305
+ ]
24306
+ },
23328
24307
  "RepositionToolRequestContent": {
23329
24308
  "type": "object",
23330
24309
  "properties": {
23331
24310
  "position": {
23332
24311
  "type": "integer",
23333
- "format": "int32"
24312
+ "format": "int32"
24313
+ }
24314
+ },
24315
+ "required": [
24316
+ "position"
24317
+ ]
24318
+ },
24319
+ "ResumeQuestionResponseContent": {
24320
+ "type": "object",
24321
+ "properties": {
24322
+ "paused": {
24323
+ "type": "boolean"
24324
+ }
24325
+ }
24326
+ },
24327
+ "RichTextAttachment": {
24328
+ "type": "object",
24329
+ "description": "Structured metadata for a downloadable file attachment embedded in a\nrich text attribute. Every rich text attribute in an API response is\naccompanied by a corresponding `*_attachments` array named after the\nattribute (a Todo's `description_attachments` for its `description`).\nMentions, remote images, and opengraph embeds are excluded — only\ndownloadable file attachments appear.",
24330
+ "properties": {
24331
+ "id": {
24332
+ "type": "integer",
24333
+ "format": "int64",
24334
+ "x-go-type-skip-optional-pointer": false
24335
+ },
24336
+ "sgid": {
24337
+ "type": "string"
24338
+ },
24339
+ "filename": {
24340
+ "type": "string"
24341
+ },
24342
+ "content_type": {
24343
+ "type": "string"
24344
+ },
24345
+ "byte_size": {
24346
+ "type": "integer",
24347
+ "format": "int64"
24348
+ },
24349
+ "download_url": {
24350
+ "type": "string",
24351
+ "x-basecamp-auth-routable-url": {}
24352
+ },
24353
+ "width": {
24354
+ "type": "integer",
24355
+ "description": "Pixel dimensions, present as keys on every attachment but null for\nnon-image blobs, and the BC3 API may serialize them float-spelled\n(`1024.0`) — hence optional/nullable rather than `@required` (the enhance\npass marks them `nullable: true` in the OpenAPI). All SDKs decode both\nforms faithfully and type the nullable value statically: Go `types.FlexInt`\n→ `*int32`, Kotlin `Int?` via `FlexibleIntSerializer`, Swift `Int32?`,\nTypeScript `number | null`, Python `Optional[int | float]` (raw JSON keeps\nthe float), Ruby nilable. See SPEC.md §10 Type Fidelity.",
24356
+ "format": "int32",
24357
+ "nullable": true,
24358
+ "x-go-type": "types.FlexInt",
24359
+ "x-go-type-import": {
24360
+ "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
24361
+ },
24362
+ "x-go-type-skip-optional-pointer": false
24363
+ },
24364
+ "height": {
24365
+ "type": "integer",
24366
+ "description": "See `width` — same nullable/float-spelled behavior and cross-SDK note.",
24367
+ "format": "int32",
24368
+ "nullable": true,
24369
+ "x-go-type": "types.FlexInt",
24370
+ "x-go-type-import": {
24371
+ "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
24372
+ },
24373
+ "x-go-type-skip-optional-pointer": false
24374
+ },
24375
+ "previewable": {
24376
+ "type": "boolean"
24377
+ },
24378
+ "preview_url": {
24379
+ "type": "string"
24380
+ },
24381
+ "thumbnail_url": {
24382
+ "type": "string"
23334
24383
  }
23335
24384
  },
23336
24385
  "required": [
23337
- "position"
24386
+ "byte_size",
24387
+ "content_type",
24388
+ "download_url",
24389
+ "filename",
24390
+ "id",
24391
+ "preview_url",
24392
+ "previewable",
24393
+ "sgid",
24394
+ "thumbnail_url"
23338
24395
  ]
23339
24396
  },
23340
- "ResumeQuestionResponseContent": {
23341
- "type": "object",
23342
- "properties": {
23343
- "paused": {
23344
- "type": "boolean"
23345
- }
23346
- }
23347
- },
23348
24397
  "Schedule": {
23349
24398
  "type": "object",
23350
24399
  "properties": {
@@ -23513,6 +24562,12 @@
23513
24562
  "description": {
23514
24563
  "type": "string"
23515
24564
  },
24565
+ "description_attachments": {
24566
+ "type": "array",
24567
+ "items": {
24568
+ "$ref": "#/components/schemas/RichTextAttachment"
24569
+ }
24570
+ },
23516
24571
  "all_day": {
23517
24572
  "type": "boolean"
23518
24573
  },
@@ -23551,6 +24606,7 @@
23551
24606
  "bucket",
23552
24607
  "created_at",
23553
24608
  "creator",
24609
+ "description_attachments",
23554
24610
  "id",
23555
24611
  "inherits_status",
23556
24612
  "parent",
@@ -23566,26 +24622,43 @@
23566
24622
  "SearchMetadata": {
23567
24623
  "type": "object",
23568
24624
  "properties": {
23569
- "projects": {
24625
+ "recording_search_types": {
23570
24626
  "type": "array",
23571
24627
  "items": {
23572
- "$ref": "#/components/schemas/SearchProject"
24628
+ "$ref": "#/components/schemas/SearchType"
23573
24629
  }
23574
- }
23575
- }
23576
- },
23577
- "SearchProject": {
23578
- "type": "object",
23579
- "properties": {
23580
- "id": {
23581
- "type": "integer",
23582
- "format": "int64",
23583
- "x-go-type-skip-optional-pointer": false
23584
24630
  },
23585
- "name": {
24631
+ "file_search_types": {
24632
+ "type": "array",
24633
+ "items": {
24634
+ "$ref": "#/components/schemas/SearchType"
24635
+ }
24636
+ },
24637
+ "default_creator_label": {
24638
+ "type": "string"
24639
+ },
24640
+ "default_bucket_label": {
24641
+ "type": "string"
24642
+ },
24643
+ "default_circle_label": {
24644
+ "type": "string"
24645
+ },
24646
+ "default_file_type_label": {
24647
+ "type": "string"
24648
+ },
24649
+ "default_type_label": {
23586
24650
  "type": "string"
23587
24651
  }
23588
- }
24652
+ },
24653
+ "required": [
24654
+ "default_bucket_label",
24655
+ "default_circle_label",
24656
+ "default_creator_label",
24657
+ "default_file_type_label",
24658
+ "default_type_label",
24659
+ "file_search_types",
24660
+ "recording_search_types"
24661
+ ]
23589
24662
  },
23590
24663
  "SearchResponseContent": {
23591
24664
  "type": "array",
@@ -23656,6 +24729,20 @@
23656
24729
  "description": {
23657
24730
  "type": "string"
23658
24731
  },
24732
+ "content_attachments": {
24733
+ "type": "array",
24734
+ "items": {
24735
+ "$ref": "#/components/schemas/RichTextAttachment"
24736
+ },
24737
+ "description": "Rich-text companion arrays carried through the polymorphic search\nprojection. A given result is one recording type, so it carries only\nthe array matching its rich-text attribute (`content_attachments` for a\nComment/Message, `description_attachments` for a Todo); a webhook-sourced\nresult carries neither. Optional (no `@required`), non-nullable. Distinct\nfrom the generic `attachments` key (the recording's aggregate downloadable\nfiles), which is a separate projection concern and not modeled here."
24738
+ },
24739
+ "description_attachments": {
24740
+ "type": "array",
24741
+ "items": {
24742
+ "$ref": "#/components/schemas/RichTextAttachment"
24743
+ },
24744
+ "description": "See `content_attachments` — the description-attribute companion array."
24745
+ },
23659
24746
  "subject": {
23660
24747
  "type": "string"
23661
24748
  }
@@ -23668,6 +24755,27 @@
23668
24755
  "url"
23669
24756
  ]
23670
24757
  },
24758
+ "SearchType": {
24759
+ "type": "object",
24760
+ "description": "A selectable search filter option. `key` is the value passed back as a\nfilter parameter (null represents the default \"everything\" option); `value`\nis the human-readable label.",
24761
+ "properties": {
24762
+ "key": {
24763
+ "type": [
24764
+ "string",
24765
+ "null"
24766
+ ],
24767
+ "description": "Always present on the wire; `null` for the default \"everything\" option.\n`@required` models the presence; nullability of the value is layered on in\nthe OpenAPI (smithy-build.json jsonAdd -> type: [\"string\", \"null\"]) since\nSmithy has no native required-and-nullable.",
24768
+ "x-go-type": "*string"
24769
+ },
24770
+ "value": {
24771
+ "type": "string"
24772
+ }
24773
+ },
24774
+ "required": [
24775
+ "key",
24776
+ "value"
24777
+ ]
24778
+ },
23671
24779
  "SetCardColumnColorRequestContent": {
23672
24780
  "type": "object",
23673
24781
  "properties": {
@@ -24011,6 +25119,12 @@
24011
25119
  "content": {
24012
25120
  "type": "string"
24013
25121
  },
25122
+ "description_attachments": {
25123
+ "type": "array",
25124
+ "items": {
25125
+ "$ref": "#/components/schemas/RichTextAttachment"
25126
+ }
25127
+ },
24014
25128
  "starts_on": {
24015
25129
  "type": "string",
24016
25130
  "x-go-type": "types.Date",
@@ -24048,6 +25162,13 @@
24048
25162
  },
24049
25163
  "boosts_url": {
24050
25164
  "type": "string"
25165
+ },
25166
+ "steps": {
25167
+ "type": "array",
25168
+ "items": {
25169
+ "$ref": "#/components/schemas/CardStep"
25170
+ },
25171
+ "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."
24051
25172
  }
24052
25173
  },
24053
25174
  "required": [
@@ -24056,6 +25177,7 @@
24056
25177
  "content",
24057
25178
  "created_at",
24058
25179
  "creator",
25180
+ "description_attachments",
24059
25181
  "id",
24060
25182
  "inherits_status",
24061
25183
  "parent",
@@ -24192,6 +25314,12 @@
24192
25314
  "description": {
24193
25315
  "type": "string"
24194
25316
  },
25317
+ "description_attachments": {
25318
+ "type": "array",
25319
+ "items": {
25320
+ "$ref": "#/components/schemas/RichTextAttachment"
25321
+ }
25322
+ },
24195
25323
  "completed": {
24196
25324
  "type": "boolean"
24197
25325
  },
@@ -24223,6 +25351,7 @@
24223
25351
  "bucket",
24224
25352
  "created_at",
24225
25353
  "creator",
25354
+ "description_attachments",
24226
25355
  "id",
24227
25356
  "inherits_status",
24228
25357
  "name",
@@ -24444,6 +25573,24 @@
24444
25573
  },
24445
25574
  "app_todolists_url": {
24446
25575
  "type": "string"
25576
+ },
25577
+ "todos_count": {
25578
+ "type": "integer",
25579
+ "description": "Total count of todos across all todolists in this todoset (BC5 addition).",
25580
+ "format": "int32"
25581
+ },
25582
+ "completed_loose_todos_count": {
25583
+ "type": "integer",
25584
+ "description": "Count of completed loose todos at the todoset level (BC5 addition).",
25585
+ "format": "int32"
25586
+ },
25587
+ "todos_url": {
25588
+ "type": "string",
25589
+ "description": "API URL for listing todos directly under this todoset (BC5 addition)."
25590
+ },
25591
+ "app_todos_url": {
25592
+ "type": "string",
25593
+ "description": "In-app URL for viewing the todoset's todos (BC5 addition)."
24447
25594
  }
24448
25595
  },
24449
25596
  "required": [
@@ -24564,6 +25711,18 @@
24564
25711
  "UpdateAccountNameResponseContent": {
24565
25712
  "$ref": "#/components/schemas/Account"
24566
25713
  },
25714
+ "UpdateCampfireLineRequestContent": {
25715
+ "type": "object",
25716
+ "properties": {
25717
+ "content": {
25718
+ "type": "string",
25719
+ "description": "The new line content, interpreted as rich text (HTML)"
25720
+ }
25721
+ },
25722
+ "required": [
25723
+ "content"
25724
+ ]
25725
+ },
24567
25726
  "UpdateCardColumnRequestContent": {
24568
25727
  "type": "object",
24569
25728
  "properties": {
@@ -25020,54 +26179,6 @@
25020
26179
  "UpdateTimesheetEntryResponseContent": {
25021
26180
  "$ref": "#/components/schemas/TimesheetEntry"
25022
26181
  },
25023
- "UpdateTodoRequestContent": {
25024
- "type": "object",
25025
- "properties": {
25026
- "content": {
25027
- "type": "string"
25028
- },
25029
- "description": {
25030
- "type": "string"
25031
- },
25032
- "assignee_ids": {
25033
- "type": "array",
25034
- "items": {
25035
- "type": "integer",
25036
- "format": "int64"
25037
- }
25038
- },
25039
- "completion_subscriber_ids": {
25040
- "type": "array",
25041
- "items": {
25042
- "type": "integer",
25043
- "format": "int64"
25044
- }
25045
- },
25046
- "notify": {
25047
- "type": "boolean",
25048
- "x-go-type-skip-optional-pointer": false
25049
- },
25050
- "due_on": {
25051
- "type": "string",
25052
- "x-go-type": "types.Date",
25053
- "x-go-type-import": {
25054
- "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
25055
- },
25056
- "x-go-type-skip-optional-pointer": true
25057
- },
25058
- "starts_on": {
25059
- "type": "string",
25060
- "x-go-type": "types.Date",
25061
- "x-go-type-import": {
25062
- "path": "github.com/basecamp/basecamp-sdk/go/pkg/types"
25063
- },
25064
- "x-go-type-skip-optional-pointer": true
25065
- }
25066
- }
25067
- },
25068
- "UpdateTodoResponseContent": {
25069
- "$ref": "#/components/schemas/Todo"
25070
- },
25071
26182
  "UpdateTodolistOrGroupRequestContent": {
25072
26183
  "type": "object",
25073
26184
  "properties": {
@@ -25144,6 +26255,23 @@
25144
26255
  "UpdateWebhookResponseContent": {
25145
26256
  "$ref": "#/components/schemas/Webhook"
25146
26257
  },
26258
+ "UpdateWormholeRequestContent": {
26259
+ "type": "object",
26260
+ "properties": {
26261
+ "destination_recording_id": {
26262
+ "type": "integer",
26263
+ "description": "Id of the new destination column (on another accessible card table).",
26264
+ "format": "int64",
26265
+ "x-go-type-skip-optional-pointer": false
26266
+ }
26267
+ },
26268
+ "required": [
26269
+ "destination_recording_id"
26270
+ ]
26271
+ },
26272
+ "UpdateWormholeResponseContent": {
26273
+ "$ref": "#/components/schemas/Wormhole"
26274
+ },
25147
26275
  "Upload": {
25148
26276
  "type": "object",
25149
26277
  "properties": {
@@ -25218,6 +26346,12 @@
25218
26346
  "description": {
25219
26347
  "type": "string"
25220
26348
  },
26349
+ "description_attachments": {
26350
+ "type": "array",
26351
+ "items": {
26352
+ "$ref": "#/components/schemas/RichTextAttachment"
26353
+ }
26354
+ },
25221
26355
  "content_type": {
25222
26356
  "type": "string"
25223
26357
  },
@@ -25244,7 +26378,8 @@
25244
26378
  "x-go-type-skip-optional-pointer": true
25245
26379
  },
25246
26380
  "download_url": {
25247
- "type": "string"
26381
+ "type": "string",
26382
+ "x-basecamp-auth-routable-url": {}
25248
26383
  },
25249
26384
  "filename": {
25250
26385
  "type": "string"
@@ -25262,6 +26397,7 @@
25262
26397
  "bucket",
25263
26398
  "created_at",
25264
26399
  "creator",
26400
+ "description_attachments",
25265
26401
  "id",
25266
26402
  "inherits_status",
25267
26403
  "parent",
@@ -25431,7 +26567,8 @@
25431
26567
  "type": "array",
25432
26568
  "items": {
25433
26569
  "$ref": "#/components/schemas/WebhookDelivery"
25434
- }
26570
+ },
26571
+ "description": "Up to the 25 most recent delivery exchanges, most recent first.\nEmpty when the webhook hasn't delivered anything yet."
25435
26572
  }
25436
26573
  },
25437
26574
  "required": [
@@ -25577,6 +26714,104 @@
25577
26714
  "required": [
25578
26715
  "error"
25579
26716
  ]
26717
+ },
26718
+ "Wormhole": {
26719
+ "type": "object",
26720
+ "description": "A wormhole links this card table to a column on another card table, enabling\ncards to move across projects. It carries the full recording representation\nplus the destination-linkage fields. The wormhole's own `url`/`app_url`/`parent`\npoint at the *source* board; `destination_url` is the only field identifying\nthe destination column.",
26721
+ "properties": {
26722
+ "id": {
26723
+ "type": "integer",
26724
+ "format": "int64",
26725
+ "x-go-type-skip-optional-pointer": false
26726
+ },
26727
+ "status": {
26728
+ "type": "string"
26729
+ },
26730
+ "visible_to_clients": {
26731
+ "type": "boolean"
26732
+ },
26733
+ "created_at": {
26734
+ "type": "string",
26735
+ "x-go-type": "time.Time",
26736
+ "x-go-type-import": {
26737
+ "path": "time"
26738
+ },
26739
+ "x-go-type-skip-optional-pointer": true
26740
+ },
26741
+ "updated_at": {
26742
+ "type": "string",
26743
+ "x-go-type": "time.Time",
26744
+ "x-go-type-import": {
26745
+ "path": "time"
26746
+ },
26747
+ "x-go-type-skip-optional-pointer": true
26748
+ },
26749
+ "title": {
26750
+ "type": "string"
26751
+ },
26752
+ "inherits_status": {
26753
+ "type": "boolean"
26754
+ },
26755
+ "type": {
26756
+ "type": "string"
26757
+ },
26758
+ "url": {
26759
+ "type": "string"
26760
+ },
26761
+ "app_url": {
26762
+ "type": "string"
26763
+ },
26764
+ "bookmark_url": {
26765
+ "type": "string"
26766
+ },
26767
+ "parent": {
26768
+ "$ref": "#/components/schemas/RecordingParent"
26769
+ },
26770
+ "bucket": {
26771
+ "$ref": "#/components/schemas/TodoBucket"
26772
+ },
26773
+ "creator": {
26774
+ "$ref": "#/components/schemas/Person"
26775
+ },
26776
+ "color": {
26777
+ "type": [
26778
+ "string",
26779
+ "null"
26780
+ ],
26781
+ "description": "Wormhole color; always emitted on the wire (`json.color recording.color`),\n`null` when unset. Like destination_url, `@required` models the presence and\nthe nullability is layered on in the OpenAPI (smithy-build.json jsonAdd ->\ntype: [\"string\",\"null\"] + x-go-type \"*string\").",
26782
+ "x-go-type": "*string"
26783
+ },
26784
+ "linked": {
26785
+ "type": "boolean",
26786
+ "description": "True only while the destination column, its board, and its bucket are all\nactive; false once the destination is unlinked. Always emitted."
26787
+ },
26788
+ "destination_url": {
26789
+ "type": [
26790
+ "string",
26791
+ "null"
26792
+ ],
26793
+ "description": "URL of the destination column; always present on the wire, `null` for an\nunlinked wormhole. `@required` models the presence; the nullability of the\nvalue is layered on in the OpenAPI (smithy-build.json jsonAdd -> type:\n[\"string\",\"null\"] + x-go-type \"*string\") since Smithy has no native\nrequired-and-nullable — exactly the SearchType.key treatment. SDKs model it\nas required-but-nullable (`string | null`, not `string | null | undefined`).",
26794
+ "x-go-type": "*string"
26795
+ }
26796
+ },
26797
+ "required": [
26798
+ "app_url",
26799
+ "bucket",
26800
+ "color",
26801
+ "created_at",
26802
+ "creator",
26803
+ "destination_url",
26804
+ "id",
26805
+ "inherits_status",
26806
+ "linked",
26807
+ "parent",
26808
+ "status",
26809
+ "title",
26810
+ "type",
26811
+ "updated_at",
26812
+ "url",
26813
+ "visible_to_clients"
26814
+ ]
25580
26815
  }
25581
26816
  }
25582
26817
  }