@boatdev/sdk 1.9.4 → 1.9.6

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 (169) hide show
  1. package/.openapi-generator/FILES +44 -0
  2. package/dist/apis/BoatApi.d.ts +305 -7
  3. package/dist/apis/BoatApi.js +764 -15
  4. package/dist/esm/apis/BoatApi.d.ts +305 -7
  5. package/dist/esm/apis/BoatApi.js +764 -15
  6. package/dist/esm/models/AccountAiUsageResponse.d.ts +83 -0
  7. package/dist/esm/models/AccountAiUsageResponse.js +78 -0
  8. package/dist/esm/models/AiProxySettings.d.ts +81 -0
  9. package/dist/esm/models/AiProxySettings.js +76 -0
  10. package/dist/esm/models/AiProxySettingsAllOfPricing.d.ts +38 -0
  11. package/dist/esm/models/AiProxySettingsAllOfPricing.js +47 -0
  12. package/dist/esm/models/AiUsageRow.d.ts +80 -0
  13. package/dist/esm/models/AiUsageRow.js +75 -0
  14. package/dist/esm/models/AiUsageTotals.d.ts +62 -0
  15. package/dist/esm/models/AiUsageTotals.js +63 -0
  16. package/dist/esm/models/CreateCredentialProfileRequest.d.ts +44 -0
  17. package/dist/esm/models/CreateCredentialProfileRequest.js +47 -0
  18. package/dist/esm/models/CredentialId.d.ts +36 -0
  19. package/dist/esm/models/CredentialId.js +54 -0
  20. package/dist/esm/models/CredentialProfile.d.ts +82 -0
  21. package/dist/esm/models/CredentialProfile.js +77 -0
  22. package/dist/esm/models/CredentialProfileDeletedResponse.d.ts +44 -0
  23. package/dist/esm/models/CredentialProfileDeletedResponse.js +51 -0
  24. package/dist/esm/models/CredentialProfileListResponse.d.ts +45 -0
  25. package/dist/esm/models/CredentialProfileListResponse.js +52 -0
  26. package/dist/esm/models/CredentialProfileOwner.d.ts +58 -0
  27. package/dist/esm/models/CredentialProfileOwner.js +62 -0
  28. package/dist/esm/models/CredentialProfileResponse.d.ts +51 -0
  29. package/dist/esm/models/CredentialProfileResponse.js +56 -0
  30. package/dist/esm/models/DeletionOperation.d.ts +1 -1
  31. package/dist/esm/models/FileUrlRequest.d.ts +38 -0
  32. package/dist/esm/models/FileUrlRequest.js +45 -0
  33. package/dist/esm/models/FileUrlResponse.d.ts +78 -0
  34. package/dist/esm/models/FileUrlResponse.js +77 -0
  35. package/dist/esm/models/ProcessListResponse.d.ts +1 -1
  36. package/dist/esm/models/SandboxAiAccessResponse.d.ts +56 -0
  37. package/dist/esm/models/SandboxAiAccessResponse.js +59 -0
  38. package/dist/esm/models/SandboxAiUsage.d.ts +64 -0
  39. package/dist/esm/models/SandboxAiUsage.js +65 -0
  40. package/dist/esm/models/SandboxAiUsageResponse.d.ts +88 -0
  41. package/dist/esm/models/SandboxAiUsageResponse.js +81 -0
  42. package/dist/esm/models/SandboxEnvironment.d.ts +13 -1
  43. package/dist/esm/models/SandboxEnvironment.js +4 -0
  44. package/dist/esm/models/SetCredentialKeyRequest.d.ts +32 -0
  45. package/dist/esm/models/SetCredentialKeyRequest.js +43 -0
  46. package/dist/esm/models/SetCustomApiRequest.d.ts +38 -0
  47. package/dist/esm/models/SetCustomApiRequest.js +47 -0
  48. package/dist/esm/models/SetSandboxAiAccessRequest.d.ts +32 -0
  49. package/dist/esm/models/SetSandboxAiAccessRequest.js +43 -0
  50. package/dist/esm/models/SnapshotSummary.d.ts +14 -0
  51. package/dist/esm/models/SnapshotSummary.js +9 -0
  52. package/dist/esm/models/UpdateAiProxyRequest.d.ts +32 -0
  53. package/dist/esm/models/UpdateAiProxyRequest.js +43 -0
  54. package/dist/esm/models/UpdateCredentialProfileRequest.d.ts +38 -0
  55. package/dist/esm/models/UpdateCredentialProfileRequest.js +43 -0
  56. package/dist/esm/models/UpdateSandboxEnvironmentRequest.d.ts +12 -0
  57. package/dist/esm/models/UpdateSandboxEnvironmentRequest.js +4 -0
  58. package/dist/esm/models/index.d.ts +22 -0
  59. package/dist/esm/models/index.js +22 -0
  60. package/dist/models/AccountAiUsageResponse.d.ts +83 -0
  61. package/dist/models/AccountAiUsageResponse.js +85 -0
  62. package/dist/models/AiProxySettings.d.ts +81 -0
  63. package/dist/models/AiProxySettings.js +83 -0
  64. package/dist/models/AiProxySettingsAllOfPricing.d.ts +38 -0
  65. package/dist/models/AiProxySettingsAllOfPricing.js +54 -0
  66. package/dist/models/AiUsageRow.d.ts +80 -0
  67. package/dist/models/AiUsageRow.js +82 -0
  68. package/dist/models/AiUsageTotals.d.ts +62 -0
  69. package/dist/models/AiUsageTotals.js +70 -0
  70. package/dist/models/CreateCredentialProfileRequest.d.ts +44 -0
  71. package/dist/models/CreateCredentialProfileRequest.js +54 -0
  72. package/dist/models/CredentialId.d.ts +36 -0
  73. package/dist/models/CredentialId.js +62 -0
  74. package/dist/models/CredentialProfile.d.ts +82 -0
  75. package/dist/models/CredentialProfile.js +84 -0
  76. package/dist/models/CredentialProfileDeletedResponse.d.ts +44 -0
  77. package/dist/models/CredentialProfileDeletedResponse.js +58 -0
  78. package/dist/models/CredentialProfileListResponse.d.ts +45 -0
  79. package/dist/models/CredentialProfileListResponse.js +59 -0
  80. package/dist/models/CredentialProfileOwner.d.ts +58 -0
  81. package/dist/models/CredentialProfileOwner.js +70 -0
  82. package/dist/models/CredentialProfileResponse.d.ts +51 -0
  83. package/dist/models/CredentialProfileResponse.js +63 -0
  84. package/dist/models/DeletionOperation.d.ts +1 -1
  85. package/dist/models/FileUrlRequest.d.ts +38 -0
  86. package/dist/models/FileUrlRequest.js +52 -0
  87. package/dist/models/FileUrlResponse.d.ts +78 -0
  88. package/dist/models/FileUrlResponse.js +85 -0
  89. package/dist/models/ProcessListResponse.d.ts +1 -1
  90. package/dist/models/SandboxAiAccessResponse.d.ts +56 -0
  91. package/dist/models/SandboxAiAccessResponse.js +66 -0
  92. package/dist/models/SandboxAiUsage.d.ts +64 -0
  93. package/dist/models/SandboxAiUsage.js +72 -0
  94. package/dist/models/SandboxAiUsageResponse.d.ts +88 -0
  95. package/dist/models/SandboxAiUsageResponse.js +88 -0
  96. package/dist/models/SandboxEnvironment.d.ts +13 -1
  97. package/dist/models/SandboxEnvironment.js +4 -0
  98. package/dist/models/SetCredentialKeyRequest.d.ts +32 -0
  99. package/dist/models/SetCredentialKeyRequest.js +50 -0
  100. package/dist/models/SetCustomApiRequest.d.ts +38 -0
  101. package/dist/models/SetCustomApiRequest.js +54 -0
  102. package/dist/models/SetSandboxAiAccessRequest.d.ts +32 -0
  103. package/dist/models/SetSandboxAiAccessRequest.js +50 -0
  104. package/dist/models/SnapshotSummary.d.ts +14 -0
  105. package/dist/models/SnapshotSummary.js +10 -1
  106. package/dist/models/UpdateAiProxyRequest.d.ts +32 -0
  107. package/dist/models/UpdateAiProxyRequest.js +50 -0
  108. package/dist/models/UpdateCredentialProfileRequest.d.ts +38 -0
  109. package/dist/models/UpdateCredentialProfileRequest.js +50 -0
  110. package/dist/models/UpdateSandboxEnvironmentRequest.d.ts +12 -0
  111. package/dist/models/UpdateSandboxEnvironmentRequest.js +4 -0
  112. package/dist/models/index.d.ts +22 -0
  113. package/dist/models/index.js +22 -0
  114. package/docs/AccountAiUsageResponse.md +48 -0
  115. package/docs/AiProxySettings.md +48 -0
  116. package/docs/AiProxySettingsAllOfPricing.md +34 -0
  117. package/docs/AiUsageRow.md +48 -0
  118. package/docs/AiUsageTotals.md +43 -0
  119. package/docs/BoatApi.md +1568 -359
  120. package/docs/CreateCredentialProfileRequest.md +36 -0
  121. package/docs/CredentialId.md +31 -0
  122. package/docs/CredentialProfile.md +49 -0
  123. package/docs/CredentialProfileDeletedResponse.md +36 -0
  124. package/docs/CredentialProfileListResponse.md +36 -0
  125. package/docs/CredentialProfileOwner.md +38 -0
  126. package/docs/CredentialProfileResponse.md +38 -0
  127. package/docs/FileUrlRequest.md +34 -0
  128. package/docs/FileUrlResponse.md +42 -0
  129. package/docs/SandboxAiAccessResponse.md +40 -0
  130. package/docs/SandboxAiUsage.md +42 -0
  131. package/docs/SandboxAiUsageResponse.md +50 -0
  132. package/docs/SandboxEnvironment.md +4 -0
  133. package/docs/SetCredentialKeyRequest.md +32 -0
  134. package/docs/SetCustomApiRequest.md +34 -0
  135. package/docs/SetSandboxAiAccessRequest.md +32 -0
  136. package/docs/SnapshotSummary.md +2 -0
  137. package/docs/UpdateAiProxyRequest.md +32 -0
  138. package/docs/UpdateCredentialProfileRequest.md +34 -0
  139. package/docs/UpdateSandboxEnvironmentRequest.md +4 -0
  140. package/package.json +1 -1
  141. package/src/apis/BoatApi.ts +1257 -105
  142. package/src/models/AccountAiUsageResponse.ts +160 -0
  143. package/src/models/AiProxySettings.ts +146 -0
  144. package/src/models/AiProxySettingsAllOfPricing.ts +75 -0
  145. package/src/models/AiUsageRow.ts +138 -0
  146. package/src/models/AiUsageTotals.ts +111 -0
  147. package/src/models/CreateCredentialProfileRequest.ts +82 -0
  148. package/src/models/CredentialId.ts +64 -0
  149. package/src/models/CredentialProfile.ts +153 -0
  150. package/src/models/CredentialProfileDeletedResponse.ts +84 -0
  151. package/src/models/CredentialProfileListResponse.ts +92 -0
  152. package/src/models/CredentialProfileOwner.ts +104 -0
  153. package/src/models/CredentialProfileResponse.ts +101 -0
  154. package/src/models/DeletionOperation.ts +1 -1
  155. package/src/models/FileUrlRequest.ts +74 -0
  156. package/src/models/FileUrlResponse.ts +131 -0
  157. package/src/models/ProcessListResponse.ts +1 -1
  158. package/src/models/SandboxAiAccessResponse.ts +102 -0
  159. package/src/models/SandboxAiUsage.ts +126 -0
  160. package/src/models/SandboxAiUsageResponse.ts +162 -0
  161. package/src/models/SandboxEnvironment.ts +17 -1
  162. package/src/models/SetCredentialKeyRequest.ts +66 -0
  163. package/src/models/SetCustomApiRequest.ts +75 -0
  164. package/src/models/SetSandboxAiAccessRequest.ts +66 -0
  165. package/src/models/SnapshotSummary.ts +17 -0
  166. package/src/models/UpdateAiProxyRequest.ts +66 -0
  167. package/src/models/UpdateCredentialProfileRequest.ts +73 -0
  168. package/src/models/UpdateSandboxEnvironmentRequest.ts +16 -0
  169. package/src/models/index.ts +22 -0
package/docs/BoatApi.md CHANGED
@@ -15,10 +15,16 @@ All URIs are relative to *https://boat.dev/api/v1*
15
15
  | [**commandStatus**](BoatApi.md#commandstatus) | **GET** /sandboxes/{sandboxId}/commands/{processId} | Get detached command status and logs |
16
16
  | [**conversations**](BoatApi.md#conversations) | **GET** /sandboxes/{sandboxId}/conversations | List boat conversations |
17
17
  | [**create**](BoatApi.md#create) | **POST** /sandboxes | Create sandbox |
18
+ | [**createCredentialProfile**](BoatApi.md#createcredentialprofileoperation) | **POST** /credential-profiles | Create a credential profile |
19
+ | [**createDownloadUrl**](BoatApi.md#createdownloadurl) | **POST** /sandboxes/{sandboxId}/files/download-url | Get a download URL for a sandbox file |
18
20
  | [**createEnvironment**](BoatApi.md#createenvironment) | **POST** /environments | Create a sandbox environment |
19
21
  | [**createScopedApiKey**](BoatApi.md#createscopedapikeyoperation) | **POST** /api-keys/scoped | Create a scoped API key |
20
22
  | [**createSnapshotShare**](BoatApi.md#createsnapshotshare) | **POST** /named-snapshots/{name}/shares | Share a named snapshot |
23
+ | [**createUploadUrl**](BoatApi.md#createuploadurl) | **POST** /sandboxes/{sandboxId}/files/upload-url | Get an upload URL for a sandbox file |
21
24
  | [**createWebhook**](BoatApi.md#createwebhook) | **POST** /webhooks | Create webhook |
25
+ | [**deleteCredentialProfile**](BoatApi.md#deletecredentialprofile) | **DELETE** /credential-profiles/{profile} | Delete a credential profile |
26
+ | [**deleteCredentialProfileCustomApi**](BoatApi.md#deletecredentialprofilecustomapi) | **DELETE** /credential-profiles/{profile}/custom-apis/{name} | Remove a custom API |
27
+ | [**deleteCredentialProfileKey**](BoatApi.md#deletecredentialprofilekey) | **DELETE** /credential-profiles/{profile}/keys/{credential} | Remove a credential profile credential |
22
28
  | [**deleteEnvironment**](BoatApi.md#deleteenvironment) | **DELETE** /environments/{environmentId} | Delete a sandbox environment |
23
29
  | [**deleteEnvironmentRepo**](BoatApi.md#deleteenvironmentrepo) | **DELETE** /environments/{environmentId}/repos/{repositoryId} | Remove a repository from an environment |
24
30
  | [**deleteEnvironmentSecretFile**](BoatApi.md#deleteenvironmentsecretfile) | **DELETE** /environments/{environmentId}/secret-files | Remove one secret file |
@@ -34,11 +40,14 @@ All URIs are relative to *https://boat.dev/api/v1*
34
40
  | [**events**](BoatApi.md#events) | **GET** /sandboxes/{sandboxId}/events | List boat events |
35
41
  | [**fork**](BoatApi.md#forkoperation) | **POST** /sandboxes/{sandboxId}/fork | Fork sandbox |
36
42
  | [**get**](BoatApi.md#get) | **GET** /sandboxes/{sandboxId} | Get sandbox |
43
+ | [**getAiProxy**](BoatApi.md#getaiproxy) | **GET** /ai-proxy | Get AI credentials proxy |
44
+ | [**getAiUsage**](BoatApi.md#getaiusage) | **GET** /ai-usage | Get AI usage |
37
45
  | [**getCommand**](BoatApi.md#getcommand) | **GET** /sandboxes/{sandboxId}/command-history/{commandId} | Get one command from the history |
38
46
  | [**getDataRetention**](BoatApi.md#getdataretention) | **GET** /account/data-retention | Get account data-retention policy |
39
47
  | [**getDeletionOperation**](BoatApi.md#getdeletionoperation) | **GET** /deletion-operations/{operationId} | Get deletion operation |
40
48
  | [**getLatestSandboxSnapshot**](BoatApi.md#getlatestsandboxsnapshot) | **GET** /sandboxes/{sandboxId}/snapshots/latest | Get latest boat snapshot |
41
49
  | [**getNamedSnapshot**](BoatApi.md#getnamedsnapshot) | **GET** /named-snapshots/{name} | Get a named snapshot |
50
+ | [**getSandboxAiUsage**](BoatApi.md#getsandboxaiusage) | **GET** /sandboxes/{sandboxId}/ai-usage | Get sandbox AI usage |
42
51
  | [**getSnapshotDownload**](BoatApi.md#getsnapshotdownload) | **GET** /snapshots/{snapshotId}/download | Get snapshot download |
43
52
  | [**getSnapshotFile**](BoatApi.md#getsnapshotfile) | **GET** /snapshots/{snapshotId}/files | Download a file or folder from a snapshot |
44
53
  | [**getSnapshotTree**](BoatApi.md#getsnapshottree) | **GET** /snapshots/{snapshotId}/tree | Get snapshot file tree |
@@ -48,6 +57,7 @@ All URIs are relative to *https://boat.dev/api/v1*
48
57
  | [**hostPort**](BoatApi.md#hostportoperation) | **POST** /sandboxes/{sandboxId}/host | Expose a sandbox port on a public HTTPS URL |
49
58
  | [**interrupt**](BoatApi.md#interrupt) | **POST** /sandboxes/{sandboxId}/interrupt | Interrupt running work |
50
59
  | [**limits**](BoatApi.md#limits) | **GET** /limits | Get Boat limits |
60
+ | [**listCredentialProfiles**](BoatApi.md#listcredentialprofiles) | **GET** /credential-profiles | List credential profiles |
51
61
  | [**listNamedSnapshots**](BoatApi.md#listnamedsnapshots) | **GET** /named-snapshots | List named snapshots |
52
62
  | [**listOrganizations**](BoatApi.md#listorganizations) | **GET** /orgs | List organizations |
53
63
  | [**listSandboxSnapshots**](BoatApi.md#listsandboxsnapshots) | **GET** /sandboxes/{sandboxId}/snapshots | List boat snapshots |
@@ -71,8 +81,11 @@ All URIs are relative to *https://boat.dev/api/v1*
71
81
  | [**secrets**](BoatApi.md#secrets) | **GET** /secrets | Get Boat secrets setup |
72
82
  | [**selectRepo**](BoatApi.md#selectrepo) | **POST** /repos | Select repository for sandboxes |
73
83
  | [**setActiveOrganization**](BoatApi.md#setactiveorganization) | **PATCH** /orgs/active | Set the active organization |
84
+ | [**setCredentialProfileCustomApi**](BoatApi.md#setcredentialprofilecustomapi) | **PUT** /credential-profiles/{profile}/custom-apis/{name} | Set a custom API |
85
+ | [**setCredentialProfileKey**](BoatApi.md#setcredentialprofilekey) | **PUT** /credential-profiles/{profile}/keys/{credential} | Set a credential profile API key |
74
86
  | [**setEnvironmentSecretFile**](BoatApi.md#setenvironmentsecretfileoperation) | **PUT** /environments/{environmentId}/secret-files | Write one secret file |
75
87
  | [**setEnvironmentVar**](BoatApi.md#setenvironmentvaroperation) | **PUT** /environments/{environmentId}/vars/{key} | Set one environment variable |
88
+ | [**setSandboxAiAccess**](BoatApi.md#setsandboxaiaccessoperation) | **PUT** /sandboxes/{sandboxId}/ai-access | Block or unblock sandbox AI access |
76
89
  | [**setTelemetry**](BoatApi.md#settelemetry) | **PUT** /telemetry | Set OpenTelemetry export |
77
90
  | [**share**](BoatApi.md#share) | **POST** /sandboxes/{sandboxId}/share | Share sandbox with the organization |
78
91
  | [**sshKey**](BoatApi.md#sshkeyoperation) | **POST** /sandboxes/{sandboxId}/sshkey | Configure sandbox SSH key |
@@ -80,6 +93,8 @@ All URIs are relative to *https://boat.dev/api/v1*
80
93
  | [**stop**](BoatApi.md#stopoperation) | **POST** /sandboxes/{sandboxId}/stop | Stop and archive sandbox |
81
94
  | [**stopCommand**](BoatApi.md#stopcommand) | **DELETE** /sandboxes/{sandboxId}/commands/{processId} | Stop a detached command |
82
95
  | [**update**](BoatApi.md#update) | **PATCH** /sandboxes/{sandboxId} | Update sandbox |
96
+ | [**updateAiProxy**](BoatApi.md#updateaiproxyoperation) | **PUT** /ai-proxy | Turn the AI credentials proxy on or off |
97
+ | [**updateCredentialProfile**](BoatApi.md#updatecredentialprofileoperation) | **PUT** /credential-profiles/{profile} | Update a credential profile |
83
98
  | [**updateDataRetention**](BoatApi.md#updatedataretention) | **PATCH** /account/data-retention | Update account data-retention policy |
84
99
  | [**updateEnvironment**](BoatApi.md#updateenvironment) | **PUT** /environments/{environmentId} | Update a sandbox environment |
85
100
  | [**updateSecrets**](BoatApi.md#updatesecrets) | **POST** /secrets | Update Boat secrets setup |
@@ -92,7 +107,7 @@ All URIs are relative to *https://boat.dev/api/v1*
92
107
 
93
108
  ## addEnvironmentRepo
94
109
 
95
- > EnvironmentItemChangeResponse addEnvironmentRepo(environmentId, addEnvironmentRepoRequest)
110
+ > EnvironmentItemChangeResponse addEnvironmentRepo(environmentId, addEnvironmentRepoRequest, org)
96
111
 
97
112
  Add a repository to an environment
98
113
 
@@ -120,6 +135,8 @@ async function example() {
120
135
  environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
121
136
  // AddEnvironmentRepoRequest
122
137
  addEnvironmentRepoRequest: ...,
138
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
139
+ org: org_example,
123
140
  } satisfies AddEnvironmentRepoOperationRequest;
124
141
 
125
142
  try {
@@ -141,6 +158,7 @@ example().catch(console.error);
141
158
  |------------- | ------------- | ------------- | -------------|
142
159
  | **environmentId** | `string` | | [Defaults to `undefined`] |
143
160
  | **addEnvironmentRepoRequest** | [AddEnvironmentRepoRequest](AddEnvironmentRepoRequest.md) | | |
161
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
144
162
 
145
163
  ### Return type
146
164
 
@@ -905,7 +923,7 @@ async function example() {
905
923
  const body = {
906
924
  // string | Optional exactly-once key for creating a sandbox. Send your own opaque, account-unique value (a UUID) to make `POST /sandboxes` safe to retry when the response is lost (network timeout, 5xx): the first request creates the sandbox and binds it to the key; every later request with the **same account, key, and request body** returns that same sandbox instead of creating a second, billable one. Behavior: keys are retained for **24 hours**; a concurrent or early retry while the first sandbox is still being minted returns `409` `idempotency_in_progress` (retry shortly, same key); reusing a key with a **different body** returns `409` `idempotency_key_reused`; timeouts and 5xx are safe to retry with the same key; a create that fails before the sandbox exists releases the key within ~2 minutes so a retry can create the sandbox. Omit the header to keep the default (non-idempotent) behavior. (optional)
907
925
  idempotencyKey: idempotencyKey_example,
908
- // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes, snapshots, and environments stay creator-private. (optional)
926
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
909
927
  org: org_example,
910
928
  // string | Same as the `org` query parameter. Query wins when both are set. (optional)
911
929
  xBoatOrg: xBoatOrg_example,
@@ -931,7 +949,7 @@ example().catch(console.error);
931
949
  | Name | Type | Description | Notes |
932
950
  |------------- | ------------- | ------------- | -------------|
933
951
  | **idempotencyKey** | `string` | Optional exactly-once key for creating a sandbox. Send your own opaque, account-unique value (a UUID) to make `POST /sandboxes` safe to retry when the response is lost (network timeout, 5xx): the first request creates the sandbox and binds it to the key; every later request with the **same account, key, and request body** returns that same sandbox instead of creating a second, billable one. Behavior: keys are retained for **24 hours**; a concurrent or early retry while the first sandbox is still being minted returns `409` `idempotency_in_progress` (retry shortly, same key); reusing a key with a **different body** returns `409` `idempotency_key_reused`; timeouts and 5xx are safe to retry with the same key; a create that fails before the sandbox exists releases the key within ~2 minutes so a retry can create the sandbox. Omit the header to keep the default (non-idempotent) behavior. | [Optional] [Defaults to `undefined`] |
934
- | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes, snapshots, and environments stay creator-private. | [Optional] [Defaults to `undefined`] |
952
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
935
953
  | **xBoatOrg** | `string` | Same as the `org` query parameter. Query wins when both are set. | [Optional] [Defaults to `undefined`] |
936
954
  | **createSandboxRequest** | [CreateSandboxRequest](CreateSandboxRequest.md) | | [Optional] |
937
955
 
@@ -962,13 +980,13 @@ example().catch(console.error);
962
980
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
963
981
 
964
982
 
965
- ## createEnvironment
983
+ ## createCredentialProfile
966
984
 
967
- > SandboxEnvironmentListResponse createEnvironment(createSandboxEnvironmentRequest)
985
+ > CredentialProfileResponse createCredentialProfile(createCredentialProfileRequest)
968
986
 
969
- Create a sandbox environment
987
+ Create a credential profile
970
988
 
971
- Create a new named environment. It starts on version 1 with all fine-grained flags on and `safeForThirdParties` off.
989
+ Creates an empty profile, or a copy of `copyFrom`. With `org`, the profile belongs to that organization and only its owners can create it. Needs an API key with `account.admin`.
972
990
 
973
991
  ### Example
974
992
 
@@ -977,7 +995,7 @@ import {
977
995
  Configuration,
978
996
  BoatApi,
979
997
  } from '@boatdev/sdk';
980
- import type { CreateEnvironmentRequest } from '@boatdev/sdk';
998
+ import type { CreateCredentialProfileOperationRequest } from '@boatdev/sdk';
981
999
 
982
1000
  async function example() {
983
1001
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -988,12 +1006,12 @@ async function example() {
988
1006
  const api = new BoatApi(config);
989
1007
 
990
1008
  const body = {
991
- // CreateSandboxEnvironmentRequest
992
- createSandboxEnvironmentRequest: ...,
993
- } satisfies CreateEnvironmentRequest;
1009
+ // CreateCredentialProfileRequest
1010
+ createCredentialProfileRequest: {"name":"work","copyFrom":"default"},
1011
+ } satisfies CreateCredentialProfileOperationRequest;
994
1012
 
995
1013
  try {
996
- const data = await api.createEnvironment(body);
1014
+ const data = await api.createCredentialProfile(body);
997
1015
  console.log(data);
998
1016
  } catch (error) {
999
1017
  console.error(error);
@@ -1009,11 +1027,11 @@ example().catch(console.error);
1009
1027
 
1010
1028
  | Name | Type | Description | Notes |
1011
1029
  |------------- | ------------- | ------------- | -------------|
1012
- | **createSandboxEnvironmentRequest** | [CreateSandboxEnvironmentRequest](CreateSandboxEnvironmentRequest.md) | | |
1030
+ | **createCredentialProfileRequest** | [CreateCredentialProfileRequest](CreateCredentialProfileRequest.md) | | |
1013
1031
 
1014
1032
  ### Return type
1015
1033
 
1016
- [**SandboxEnvironmentListResponse**](SandboxEnvironmentListResponse.md)
1034
+ [**CredentialProfileResponse**](CredentialProfileResponse.md)
1017
1035
 
1018
1036
  ### Authorization
1019
1037
 
@@ -1028,21 +1046,22 @@ example().catch(console.error);
1028
1046
  ### HTTP response details
1029
1047
  | Status code | Description | Response headers |
1030
1048
  |-------------|-------------|------------------|
1031
- | **200** | Environment created; full list returned. | - |
1049
+ | **201** | Profile created. | - |
1032
1050
  | **400** | Invalid request body or parameters. | - |
1033
1051
  | **401** | Missing or invalid bearer token. | - |
1052
+ | **403** | Authenticated token is not allowed to perform this action. | - |
1034
1053
  | **409** | Request conflicts with current account or sandbox state. | - |
1035
1054
 
1036
1055
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1037
1056
 
1038
1057
 
1039
- ## createScopedApiKey
1058
+ ## createDownloadUrl
1040
1059
 
1041
- > ApiKeySecretResponse createScopedApiKey(createScopedApiKeyRequest)
1060
+ > FileUrlResponse createDownloadUrl(sandboxId, fileUrlRequest)
1042
1061
 
1043
- Create a scoped API key
1062
+ Get a download URL for a sandbox file
1044
1063
 
1045
- Creates a scoped, expiring API key. Requires a dashboard/CLI session or an admin-scoped token. The secret is returned once. This dedicated path returns a typed 503 until scoped credential creation is activated.
1064
+ Returns a short-lived URL that the sandbox serves itself. GET it to download the file as raw bytes, with no size limit and no Authorization header. The URL is bound to this path and expires after `ttlSeconds` (default 15 minutes, at most 1 hour). Needs `file.read`. Treat the URL as a secret until it expires.
1046
1065
 
1047
1066
  ### Example
1048
1067
 
@@ -1051,7 +1070,7 @@ import {
1051
1070
  Configuration,
1052
1071
  BoatApi,
1053
1072
  } from '@boatdev/sdk';
1054
- import type { CreateScopedApiKeyOperationRequest } from '@boatdev/sdk';
1073
+ import type { CreateDownloadUrlRequest } from '@boatdev/sdk';
1055
1074
 
1056
1075
  async function example() {
1057
1076
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1062,12 +1081,14 @@ async function example() {
1062
1081
  const api = new BoatApi(config);
1063
1082
 
1064
1083
  const body = {
1065
- // CreateScopedApiKeyRequest
1066
- createScopedApiKeyRequest: ...,
1067
- } satisfies CreateScopedApiKeyOperationRequest;
1084
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
1085
+ sandboxId: sandboxId_example,
1086
+ // FileUrlRequest
1087
+ fileUrlRequest: ...,
1088
+ } satisfies CreateDownloadUrlRequest;
1068
1089
 
1069
1090
  try {
1070
- const data = await api.createScopedApiKey(body);
1091
+ const data = await api.createDownloadUrl(body);
1071
1092
  console.log(data);
1072
1093
  } catch (error) {
1073
1094
  console.error(error);
@@ -1083,11 +1104,12 @@ example().catch(console.error);
1083
1104
 
1084
1105
  | Name | Type | Description | Notes |
1085
1106
  |------------- | ------------- | ------------- | -------------|
1086
- | **createScopedApiKeyRequest** | [CreateScopedApiKeyRequest](CreateScopedApiKeyRequest.md) | | |
1107
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
1108
+ | **fileUrlRequest** | [FileUrlRequest](FileUrlRequest.md) | | |
1087
1109
 
1088
1110
  ### Return type
1089
1111
 
1090
- [**ApiKeySecretResponse**](ApiKeySecretResponse.md)
1112
+ [**FileUrlResponse**](FileUrlResponse.md)
1091
1113
 
1092
1114
  ### Authorization
1093
1115
 
@@ -1102,22 +1124,22 @@ example().catch(console.error);
1102
1124
  ### HTTP response details
1103
1125
  | Status code | Description | Response headers |
1104
1126
  |-------------|-------------|------------------|
1105
- | **201** | Created key metadata plus the one-time secret. | - |
1127
+ | **200** | Signed download URL. | - |
1106
1128
  | **400** | Invalid request body or parameters. | - |
1107
1129
  | **401** | Missing or invalid bearer token. | - |
1108
- | **403** | Authenticated token is not allowed to perform this action. | - |
1109
- | **503** | Scoped credential creation has not been activated yet. | - |
1130
+ | **404** | Resource not found. | - |
1131
+ | **409** | Request conflicts with current account or sandbox state. | - |
1110
1132
 
1111
1133
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1112
1134
 
1113
1135
 
1114
- ## createSnapshotShare
1136
+ ## createEnvironment
1115
1137
 
1116
- > NamedSnapshotShareCreatedResponse createSnapshotShare(name)
1138
+ > SandboxEnvironmentListResponse createEnvironment(createSandboxEnvironmentRequest, org)
1117
1139
 
1118
- Share a named snapshot
1140
+ Create a sandbox environment
1119
1141
 
1120
- Make a secret code that lets any Boat account create a sandbox from this named snapshot (`boat snapshot share <name>` in the CLI). The response shows the code once; Boat stores only a hash. Re-saving the name changes what the code deploys. Removing the name removes its codes. Everything on the disk is shared, so do not keep secrets in files on it. Needs `snapshot.write`.
1142
+ Create a new named environment. It starts on version 1 with all fine-grained flags on and `safeForThirdParties` off.
1121
1143
 
1122
1144
  ### Example
1123
1145
 
@@ -1126,7 +1148,7 @@ import {
1126
1148
  Configuration,
1127
1149
  BoatApi,
1128
1150
  } from '@boatdev/sdk';
1129
- import type { CreateSnapshotShareRequest } from '@boatdev/sdk';
1151
+ import type { CreateEnvironmentRequest } from '@boatdev/sdk';
1130
1152
 
1131
1153
  async function example() {
1132
1154
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1137,12 +1159,14 @@ async function example() {
1137
1159
  const api = new BoatApi(config);
1138
1160
 
1139
1161
  const body = {
1140
- // string
1141
- name: name_example,
1142
- } satisfies CreateSnapshotShareRequest;
1162
+ // CreateSandboxEnvironmentRequest
1163
+ createSandboxEnvironmentRequest: ...,
1164
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
1165
+ org: org_example,
1166
+ } satisfies CreateEnvironmentRequest;
1143
1167
 
1144
1168
  try {
1145
- const data = await api.createSnapshotShare(body);
1169
+ const data = await api.createEnvironment(body);
1146
1170
  console.log(data);
1147
1171
  } catch (error) {
1148
1172
  console.error(error);
@@ -1158,11 +1182,12 @@ example().catch(console.error);
1158
1182
 
1159
1183
  | Name | Type | Description | Notes |
1160
1184
  |------------- | ------------- | ------------- | -------------|
1161
- | **name** | `string` | | [Defaults to `undefined`] |
1185
+ | **createSandboxEnvironmentRequest** | [CreateSandboxEnvironmentRequest](CreateSandboxEnvironmentRequest.md) | | |
1186
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
1162
1187
 
1163
1188
  ### Return type
1164
1189
 
1165
- [**NamedSnapshotShareCreatedResponse**](NamedSnapshotShareCreatedResponse.md)
1190
+ [**SandboxEnvironmentListResponse**](SandboxEnvironmentListResponse.md)
1166
1191
 
1167
1192
  ### Authorization
1168
1193
 
@@ -1170,27 +1195,28 @@ example().catch(console.error);
1170
1195
 
1171
1196
  ### HTTP request headers
1172
1197
 
1173
- - **Content-Type**: Not defined
1198
+ - **Content-Type**: `application/json`
1174
1199
  - **Accept**: `application/json`
1175
1200
 
1176
1201
 
1177
1202
  ### HTTP response details
1178
1203
  | Status code | Description | Response headers |
1179
1204
  |-------------|-------------|------------------|
1180
- | **201** | Code created. Store `shareCode` now; Boat does not show it again. | - |
1205
+ | **200** | Environment created; full list returned. | - |
1206
+ | **400** | Invalid request body or parameters. | - |
1181
1207
  | **401** | Missing or invalid bearer token. | - |
1182
- | **404** | Resource not found. | - |
1208
+ | **409** | Request conflicts with current account or sandbox state. | - |
1183
1209
 
1184
1210
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1185
1211
 
1186
1212
 
1187
- ## createWebhook
1213
+ ## createScopedApiKey
1188
1214
 
1189
- > WebhookSecretResponse createWebhook(webhookCreateRequest)
1215
+ > ApiKeySecretResponse createScopedApiKey(createScopedApiKeyRequest)
1190
1216
 
1191
- Create webhook
1217
+ Create a scoped API key
1192
1218
 
1193
- Registers an account-wide endpoint for sandbox lifecycle events. The endpoint must use HTTPS on port 443 and resolve only to public addresses. Redirects are not followed during delivery. The signing secret is returned only in this response. An account can register at most 10 unique endpoint URLs.
1219
+ Creates a scoped, expiring API key. Requires a dashboard/CLI session or an admin-scoped token. The secret is returned once. This dedicated path returns a typed 503 until scoped credential creation is activated.
1194
1220
 
1195
1221
  ### Example
1196
1222
 
@@ -1199,7 +1225,7 @@ import {
1199
1225
  Configuration,
1200
1226
  BoatApi,
1201
1227
  } from '@boatdev/sdk';
1202
- import type { CreateWebhookRequest } from '@boatdev/sdk';
1228
+ import type { CreateScopedApiKeyOperationRequest } from '@boatdev/sdk';
1203
1229
 
1204
1230
  async function example() {
1205
1231
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1210,12 +1236,12 @@ async function example() {
1210
1236
  const api = new BoatApi(config);
1211
1237
 
1212
1238
  const body = {
1213
- // WebhookCreateRequest
1214
- webhookCreateRequest: {"name":"Production automation","url":"https://example.com/hooks/sandbox","events":["sandbox.ready","sandbox.error"]},
1215
- } satisfies CreateWebhookRequest;
1239
+ // CreateScopedApiKeyRequest
1240
+ createScopedApiKeyRequest: ...,
1241
+ } satisfies CreateScopedApiKeyOperationRequest;
1216
1242
 
1217
1243
  try {
1218
- const data = await api.createWebhook(body);
1244
+ const data = await api.createScopedApiKey(body);
1219
1245
  console.log(data);
1220
1246
  } catch (error) {
1221
1247
  console.error(error);
@@ -1231,11 +1257,11 @@ example().catch(console.error);
1231
1257
 
1232
1258
  | Name | Type | Description | Notes |
1233
1259
  |------------- | ------------- | ------------- | -------------|
1234
- | **webhookCreateRequest** | [WebhookCreateRequest](WebhookCreateRequest.md) | | |
1260
+ | **createScopedApiKeyRequest** | [CreateScopedApiKeyRequest](CreateScopedApiKeyRequest.md) | | |
1235
1261
 
1236
1262
  ### Return type
1237
1263
 
1238
- [**WebhookSecretResponse**](WebhookSecretResponse.md)
1264
+ [**ApiKeySecretResponse**](ApiKeySecretResponse.md)
1239
1265
 
1240
1266
  ### Authorization
1241
1267
 
@@ -1250,21 +1276,22 @@ example().catch(console.error);
1250
1276
  ### HTTP response details
1251
1277
  | Status code | Description | Response headers |
1252
1278
  |-------------|-------------|------------------|
1253
- | **201** | Webhook created. Store the one-time signing secret now. | - |
1279
+ | **201** | Created key metadata plus the one-time secret. | - |
1254
1280
  | **400** | Invalid request body or parameters. | - |
1255
1281
  | **401** | Missing or invalid bearer token. | - |
1256
- | **409** | Request conflicts with current account or sandbox state. | - |
1282
+ | **403** | Authenticated token is not allowed to perform this action. | - |
1283
+ | **503** | Scoped credential creation has not been activated yet. | - |
1257
1284
 
1258
1285
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1259
1286
 
1260
1287
 
1261
- ## deleteEnvironment
1288
+ ## createSnapshotShare
1262
1289
 
1263
- > SandboxEnvironmentResponse deleteEnvironment(environmentId)
1290
+ > NamedSnapshotShareCreatedResponse createSnapshotShare(name)
1264
1291
 
1265
- Delete a sandbox environment
1292
+ Share a named snapshot
1266
1293
 
1267
- Soft-deletes an environment. The default environment cannot be deleted, and at least one environment is always kept.
1294
+ Make a secret code that lets any Boat account create a sandbox from this named snapshot (`boat snapshot share <name>` in the CLI). The response shows the code once; Boat stores only a hash. Re-saving the name changes what the code deploys. Removing the name removes its codes. Everything on the disk is shared, so do not keep secrets in files on it. Needs `snapshot.write`.
1268
1295
 
1269
1296
  ### Example
1270
1297
 
@@ -1273,7 +1300,7 @@ import {
1273
1300
  Configuration,
1274
1301
  BoatApi,
1275
1302
  } from '@boatdev/sdk';
1276
- import type { DeleteEnvironmentRequest } from '@boatdev/sdk';
1303
+ import type { CreateSnapshotShareRequest } from '@boatdev/sdk';
1277
1304
 
1278
1305
  async function example() {
1279
1306
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1284,12 +1311,12 @@ async function example() {
1284
1311
  const api = new BoatApi(config);
1285
1312
 
1286
1313
  const body = {
1287
- // string | Environment id returned by `GET /environments`.
1288
- environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1289
- } satisfies DeleteEnvironmentRequest;
1314
+ // string
1315
+ name: name_example,
1316
+ } satisfies CreateSnapshotShareRequest;
1290
1317
 
1291
1318
  try {
1292
- const data = await api.deleteEnvironment(body);
1319
+ const data = await api.createSnapshotShare(body);
1293
1320
  console.log(data);
1294
1321
  } catch (error) {
1295
1322
  console.error(error);
@@ -1305,11 +1332,11 @@ example().catch(console.error);
1305
1332
 
1306
1333
  | Name | Type | Description | Notes |
1307
1334
  |------------- | ------------- | ------------- | -------------|
1308
- | **environmentId** | `string` | Environment id returned by `GET /environments`. | [Defaults to `undefined`] |
1335
+ | **name** | `string` | | [Defaults to `undefined`] |
1309
1336
 
1310
1337
  ### Return type
1311
1338
 
1312
- [**SandboxEnvironmentResponse**](SandboxEnvironmentResponse.md)
1339
+ [**NamedSnapshotShareCreatedResponse**](NamedSnapshotShareCreatedResponse.md)
1313
1340
 
1314
1341
  ### Authorization
1315
1342
 
@@ -1324,21 +1351,20 @@ example().catch(console.error);
1324
1351
  ### HTTP response details
1325
1352
  | Status code | Description | Response headers |
1326
1353
  |-------------|-------------|------------------|
1327
- | **200** | Environment soft-deleted. | - |
1354
+ | **201** | Code created. Store `shareCode` now; Boat does not show it again. | - |
1328
1355
  | **401** | Missing or invalid bearer token. | - |
1329
1356
  | **404** | Resource not found. | - |
1330
- | **409** | Request conflicts with current account or sandbox state. | - |
1331
1357
 
1332
1358
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1333
1359
 
1334
1360
 
1335
- ## deleteEnvironmentRepo
1361
+ ## createUploadUrl
1336
1362
 
1337
- > EnvironmentItemChangeResponse deleteEnvironmentRepo(environmentId, repositoryId)
1363
+ > FileUrlResponse createUploadUrl(sandboxId, fileUrlRequest)
1338
1364
 
1339
- Remove a repository from an environment
1365
+ Get an upload URL for a sandbox file
1340
1366
 
1341
- Removes one repository from the environment\'s selection. Mints a new immutable version.
1367
+ Returns a short-lived URL that the sandbox serves itself. PUT the file as the raw request body to write it, with no size limit and no Authorization header. Missing directories are created; an existing file is replaced only once the upload completes. The URL is bound to this path and expires after `ttlSeconds` (default 15 minutes, at most 1 hour). Needs `file.write`. Treat the URL as a secret until it expires.
1342
1368
 
1343
1369
  ### Example
1344
1370
 
@@ -1347,7 +1373,7 @@ import {
1347
1373
  Configuration,
1348
1374
  BoatApi,
1349
1375
  } from '@boatdev/sdk';
1350
- import type { DeleteEnvironmentRepoRequest } from '@boatdev/sdk';
1376
+ import type { CreateUploadUrlRequest } from '@boatdev/sdk';
1351
1377
 
1352
1378
  async function example() {
1353
1379
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1358,14 +1384,14 @@ async function example() {
1358
1384
  const api = new BoatApi(config);
1359
1385
 
1360
1386
  const body = {
1361
- // string
1362
- environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1363
- // string | The repository `databaseId`.
1364
- repositoryId: repositoryId_example,
1365
- } satisfies DeleteEnvironmentRepoRequest;
1387
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
1388
+ sandboxId: sandboxId_example,
1389
+ // FileUrlRequest
1390
+ fileUrlRequest: ...,
1391
+ } satisfies CreateUploadUrlRequest;
1366
1392
 
1367
1393
  try {
1368
- const data = await api.deleteEnvironmentRepo(body);
1394
+ const data = await api.createUploadUrl(body);
1369
1395
  console.log(data);
1370
1396
  } catch (error) {
1371
1397
  console.error(error);
@@ -1381,12 +1407,12 @@ example().catch(console.error);
1381
1407
 
1382
1408
  | Name | Type | Description | Notes |
1383
1409
  |------------- | ------------- | ------------- | -------------|
1384
- | **environmentId** | `string` | | [Defaults to `undefined`] |
1385
- | **repositoryId** | `string` | The repository `databaseId`. | [Defaults to `undefined`] |
1410
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
1411
+ | **fileUrlRequest** | [FileUrlRequest](FileUrlRequest.md) | | |
1386
1412
 
1387
1413
  ### Return type
1388
1414
 
1389
- [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
1415
+ [**FileUrlResponse**](FileUrlResponse.md)
1390
1416
 
1391
1417
  ### Authorization
1392
1418
 
@@ -1394,27 +1420,29 @@ example().catch(console.error);
1394
1420
 
1395
1421
  ### HTTP request headers
1396
1422
 
1397
- - **Content-Type**: Not defined
1423
+ - **Content-Type**: `application/json`
1398
1424
  - **Accept**: `application/json`
1399
1425
 
1400
1426
 
1401
1427
  ### HTTP response details
1402
1428
  | Status code | Description | Response headers |
1403
1429
  |-------------|-------------|------------------|
1404
- | **200** | New version minted. | - |
1430
+ | **200** | Signed upload URL. | - |
1431
+ | **400** | Invalid request body or parameters. | - |
1405
1432
  | **401** | Missing or invalid bearer token. | - |
1406
1433
  | **404** | Resource not found. | - |
1434
+ | **409** | Request conflicts with current account or sandbox state. | - |
1407
1435
 
1408
1436
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1409
1437
 
1410
1438
 
1411
- ## deleteEnvironmentSecretFile
1439
+ ## createWebhook
1412
1440
 
1413
- > EnvironmentItemChangeResponse deleteEnvironmentSecretFile(path, environmentId)
1441
+ > WebhookSecretResponse createWebhook(webhookCreateRequest)
1414
1442
 
1415
- Remove one secret file
1443
+ Create webhook
1416
1444
 
1417
- Removes the secret file at `path`. Mints a new immutable version.
1445
+ Registers an account-wide endpoint for sandbox lifecycle events. The endpoint must use HTTPS on port 443 and resolve only to public addresses. Redirects are not followed during delivery. The signing secret is returned only in this response. An account can register at most 10 unique endpoint URLs.
1418
1446
 
1419
1447
  ### Example
1420
1448
 
@@ -1423,7 +1451,7 @@ import {
1423
1451
  Configuration,
1424
1452
  BoatApi,
1425
1453
  } from '@boatdev/sdk';
1426
- import type { DeleteEnvironmentSecretFileRequest } from '@boatdev/sdk';
1454
+ import type { CreateWebhookRequest } from '@boatdev/sdk';
1427
1455
 
1428
1456
  async function example() {
1429
1457
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1434,14 +1462,12 @@ async function example() {
1434
1462
  const api = new BoatApi(config);
1435
1463
 
1436
1464
  const body = {
1437
- // string
1438
- path: path_example,
1439
- // string
1440
- environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1441
- } satisfies DeleteEnvironmentSecretFileRequest;
1465
+ // WebhookCreateRequest
1466
+ webhookCreateRequest: {"name":"Production automation","url":"https://example.com/hooks/sandbox","events":["sandbox.ready","sandbox.error"]},
1467
+ } satisfies CreateWebhookRequest;
1442
1468
 
1443
1469
  try {
1444
- const data = await api.deleteEnvironmentSecretFile(body);
1470
+ const data = await api.createWebhook(body);
1445
1471
  console.log(data);
1446
1472
  } catch (error) {
1447
1473
  console.error(error);
@@ -1457,12 +1483,11 @@ example().catch(console.error);
1457
1483
 
1458
1484
  | Name | Type | Description | Notes |
1459
1485
  |------------- | ------------- | ------------- | -------------|
1460
- | **path** | `string` | | [Defaults to `undefined`] |
1461
- | **environmentId** | `string` | | [Defaults to `undefined`] |
1486
+ | **webhookCreateRequest** | [WebhookCreateRequest](WebhookCreateRequest.md) | | |
1462
1487
 
1463
1488
  ### Return type
1464
1489
 
1465
- [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
1490
+ [**WebhookSecretResponse**](WebhookSecretResponse.md)
1466
1491
 
1467
1492
  ### Authorization
1468
1493
 
@@ -1470,27 +1495,28 @@ example().catch(console.error);
1470
1495
 
1471
1496
  ### HTTP request headers
1472
1497
 
1473
- - **Content-Type**: Not defined
1498
+ - **Content-Type**: `application/json`
1474
1499
  - **Accept**: `application/json`
1475
1500
 
1476
1501
 
1477
1502
  ### HTTP response details
1478
1503
  | Status code | Description | Response headers |
1479
1504
  |-------------|-------------|------------------|
1480
- | **200** | New version minted. | - |
1505
+ | **201** | Webhook created. Store the one-time signing secret now. | - |
1506
+ | **400** | Invalid request body or parameters. | - |
1481
1507
  | **401** | Missing or invalid bearer token. | - |
1482
- | **404** | Resource not found. | - |
1508
+ | **409** | Request conflicts with current account or sandbox state. | - |
1483
1509
 
1484
1510
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1485
1511
 
1486
1512
 
1487
- ## deleteEnvironmentVar
1513
+ ## deleteCredentialProfile
1488
1514
 
1489
- > EnvironmentItemChangeResponse deleteEnvironmentVar(environmentId, key)
1515
+ > CredentialProfileDeletedResponse deleteCredentialProfile(profile)
1490
1516
 
1491
- Remove one environment variable
1517
+ Delete a credential profile
1492
1518
 
1493
- Removes a single variable. Mints a new immutable version.
1519
+ Deletes the profile. A default profile returns `409 is_default`. A profile that an environment names returns `409 in_use`. Needs an API key with `account.admin`.
1494
1520
 
1495
1521
  ### Example
1496
1522
 
@@ -1499,7 +1525,7 @@ import {
1499
1525
  Configuration,
1500
1526
  BoatApi,
1501
1527
  } from '@boatdev/sdk';
1502
- import type { DeleteEnvironmentVarRequest } from '@boatdev/sdk';
1528
+ import type { DeleteCredentialProfileRequest } from '@boatdev/sdk';
1503
1529
 
1504
1530
  async function example() {
1505
1531
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1510,14 +1536,12 @@ async function example() {
1510
1536
  const api = new BoatApi(config);
1511
1537
 
1512
1538
  const body = {
1513
- // string
1514
- environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1515
- // string | Environment variable name.
1516
- key: key_example,
1517
- } satisfies DeleteEnvironmentVarRequest;
1539
+ // string | Profile id or name.
1540
+ profile: profile_example,
1541
+ } satisfies DeleteCredentialProfileRequest;
1518
1542
 
1519
1543
  try {
1520
- const data = await api.deleteEnvironmentVar(body);
1544
+ const data = await api.deleteCredentialProfile(body);
1521
1545
  console.log(data);
1522
1546
  } catch (error) {
1523
1547
  console.error(error);
@@ -1533,12 +1557,11 @@ example().catch(console.error);
1533
1557
 
1534
1558
  | Name | Type | Description | Notes |
1535
1559
  |------------- | ------------- | ------------- | -------------|
1536
- | **environmentId** | `string` | | [Defaults to `undefined`] |
1537
- | **key** | `string` | Environment variable name. | [Defaults to `undefined`] |
1560
+ | **profile** | `string` | Profile id or name. | [Defaults to `undefined`] |
1538
1561
 
1539
1562
  ### Return type
1540
1563
 
1541
- [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
1564
+ [**CredentialProfileDeletedResponse**](CredentialProfileDeletedResponse.md)
1542
1565
 
1543
1566
  ### Authorization
1544
1567
 
@@ -1553,20 +1576,22 @@ example().catch(console.error);
1553
1576
  ### HTTP response details
1554
1577
  | Status code | Description | Response headers |
1555
1578
  |-------------|-------------|------------------|
1556
- | **200** | New version minted. | - |
1579
+ | **200** | Profile deleted. | - |
1557
1580
  | **401** | Missing or invalid bearer token. | - |
1581
+ | **403** | Authenticated token is not allowed to perform this action. | - |
1558
1582
  | **404** | Resource not found. | - |
1583
+ | **409** | Request conflicts with current account or sandbox state. | - |
1559
1584
 
1560
1585
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1561
1586
 
1562
1587
 
1563
- ## deleteNamedSnapshot
1588
+ ## deleteCredentialProfileCustomApi
1564
1589
 
1565
- > NamedSnapshotDeletedResponse deleteNamedSnapshot(name)
1590
+ > CredentialProfileResponse deleteCredentialProfileCustomApi(profile, name)
1566
1591
 
1567
- Remove a named snapshot
1592
+ Remove a custom API
1568
1593
 
1569
- Remove a named snapshot and release its storage (`boat snapshot rm <name>` in the CLI). Sandboxes already deployed from it are unaffected.
1594
+ Removes one custom API from the profile. Needs an API key with `account.admin`.
1570
1595
 
1571
1596
  ### Example
1572
1597
 
@@ -1575,7 +1600,7 @@ import {
1575
1600
  Configuration,
1576
1601
  BoatApi,
1577
1602
  } from '@boatdev/sdk';
1578
- import type { DeleteNamedSnapshotRequest } from '@boatdev/sdk';
1603
+ import type { DeleteCredentialProfileCustomApiRequest } from '@boatdev/sdk';
1579
1604
 
1580
1605
  async function example() {
1581
1606
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1586,12 +1611,14 @@ async function example() {
1586
1611
  const api = new BoatApi(config);
1587
1612
 
1588
1613
  const body = {
1589
- // string
1614
+ // string | Profile id or name.
1615
+ profile: profile_example,
1616
+ // string | Environment variable name of the custom API, for example `STRIPE_KEY`. Provider names (`ANTHROPIC_*`, `OPENAI_*`, and so on) and names that end in `_BASE_URL` are reserved.
1590
1617
  name: name_example,
1591
- } satisfies DeleteNamedSnapshotRequest;
1618
+ } satisfies DeleteCredentialProfileCustomApiRequest;
1592
1619
 
1593
1620
  try {
1594
- const data = await api.deleteNamedSnapshot(body);
1621
+ const data = await api.deleteCredentialProfileCustomApi(body);
1595
1622
  console.log(data);
1596
1623
  } catch (error) {
1597
1624
  console.error(error);
@@ -1607,11 +1634,12 @@ example().catch(console.error);
1607
1634
 
1608
1635
  | Name | Type | Description | Notes |
1609
1636
  |------------- | ------------- | ------------- | -------------|
1610
- | **name** | `string` | | [Defaults to `undefined`] |
1637
+ | **profile** | `string` | Profile id or name. | [Defaults to `undefined`] |
1638
+ | **name** | `string` | Environment variable name of the custom API, for example `STRIPE_KEY`. Provider names (`ANTHROPIC_*`, `OPENAI_*`, and so on) and names that end in `_BASE_URL` are reserved. | [Defaults to `undefined`] |
1611
1639
 
1612
1640
  ### Return type
1613
1641
 
1614
- [**NamedSnapshotDeletedResponse**](NamedSnapshotDeletedResponse.md)
1642
+ [**CredentialProfileResponse**](CredentialProfileResponse.md)
1615
1643
 
1616
1644
  ### Authorization
1617
1645
 
@@ -1626,21 +1654,21 @@ example().catch(console.error);
1626
1654
  ### HTTP response details
1627
1655
  | Status code | Description | Response headers |
1628
1656
  |-------------|-------------|------------------|
1629
- | **200** | Removed. | - |
1657
+ | **200** | The updated profile. | - |
1630
1658
  | **401** | Missing or invalid bearer token. | - |
1659
+ | **403** | Authenticated token is not allowed to perform this action. | - |
1631
1660
  | **404** | Resource not found. | - |
1632
- | **409** | `save_in_progress`: a save under this name is still running. Wait for it to settle before removing it. | - |
1633
1661
 
1634
1662
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1635
1663
 
1636
1664
 
1637
- ## deleteSandbox
1665
+ ## deleteCredentialProfileKey
1638
1666
 
1639
- > DeletionOperationResponse deleteSandbox(xAsciiConfirmDelete, sandboxId)
1667
+ > CredentialProfileResponse deleteCredentialProfileKey(profile, credential)
1640
1668
 
1641
- Permanently delete sandbox data
1669
+ Remove a credential profile credential
1642
1670
 
1643
- Accept irreversible background deletion of the sandbox machine, snapshots, and content-bearing records. This is not archive: the sandbox cannot be resumed. Named snapshots and other shared artifacts remain independent. Poll the returned operation until `completed`.
1671
+ Removes one credential, an API key or a sign-in. Needs an API key with `account.admin`.
1644
1672
 
1645
1673
  ### Example
1646
1674
 
@@ -1649,7 +1677,7 @@ import {
1649
1677
  Configuration,
1650
1678
  BoatApi,
1651
1679
  } from '@boatdev/sdk';
1652
- import type { DeleteSandboxRequest } from '@boatdev/sdk';
1680
+ import type { DeleteCredentialProfileKeyRequest } from '@boatdev/sdk';
1653
1681
 
1654
1682
  async function example() {
1655
1683
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1660,14 +1688,14 @@ async function example() {
1660
1688
  const api = new BoatApi(config);
1661
1689
 
1662
1690
  const body = {
1663
- // string | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion.
1664
- xAsciiConfirmDelete: xAsciiConfirmDelete_example,
1665
- // string | Public Sandbox id returned by create/list/get sandbox calls.
1666
- sandboxId: sandboxId_example,
1667
- } satisfies DeleteSandboxRequest;
1691
+ // string | Profile id or name.
1692
+ profile: profile_example,
1693
+ // CredentialId
1694
+ credential: ...,
1695
+ } satisfies DeleteCredentialProfileKeyRequest;
1668
1696
 
1669
1697
  try {
1670
- const data = await api.deleteSandbox(body);
1698
+ const data = await api.deleteCredentialProfileKey(body);
1671
1699
  console.log(data);
1672
1700
  } catch (error) {
1673
1701
  console.error(error);
@@ -1683,12 +1711,12 @@ example().catch(console.error);
1683
1711
 
1684
1712
  | Name | Type | Description | Notes |
1685
1713
  |------------- | ------------- | ------------- | -------------|
1686
- | **xAsciiConfirmDelete** | `string` | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion. | [Defaults to `undefined`] |
1687
- | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
1714
+ | **profile** | `string` | Profile id or name. | [Defaults to `undefined`] |
1715
+ | **credential** | `CredentialId` | | [Defaults to `undefined`] [Enum: anthropic-api-key, openai-api-key, openrouter-api-key, llmgateway-api-key, deepseek-api-key, moonshot-api-key, mistral-api-key, claude-subscription, chatgpt-subscription, kimi-subscription, mistral-vibe-subscription, claude-bedrock, codex-bedrock] |
1688
1716
 
1689
1717
  ### Return type
1690
1718
 
1691
- [**DeletionOperationResponse**](DeletionOperationResponse.md)
1719
+ [**CredentialProfileResponse**](CredentialProfileResponse.md)
1692
1720
 
1693
1721
  ### Authorization
1694
1722
 
@@ -1703,22 +1731,22 @@ example().catch(console.error);
1703
1731
  ### HTTP response details
1704
1732
  | Status code | Description | Response headers |
1705
1733
  |-------------|-------------|------------------|
1706
- | **202** | Deletion confirmed and accepted for background processing. | - |
1734
+ | **200** | The updated profile. | - |
1735
+ | **400** | Invalid request body or parameters. | - |
1707
1736
  | **401** | Missing or invalid bearer token. | - |
1708
1737
  | **403** | Authenticated token is not allowed to perform this action. | - |
1709
1738
  | **404** | Resource not found. | - |
1710
- | **409** | Request conflicts with current account or sandbox state. | - |
1711
1739
 
1712
1740
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1713
1741
 
1714
1742
 
1715
- ## deleteSandboxSnapshots
1743
+ ## deleteEnvironment
1716
1744
 
1717
- > DeletionOperationListResponse deleteSandboxSnapshots(sandboxId, xAsciiConfirmDelete)
1745
+ > SandboxEnvironmentResponse deleteEnvironment(environmentId, org)
1718
1746
 
1719
- Permanently delete all snapshots of a sandbox
1747
+ Delete a sandbox environment
1720
1748
 
1721
- Accept irreversible deletion of every unpinned snapshot of this sandbox. The sandbox itself and its named snapshots stay. Snapshots disappear from lists, restores and forks immediately; their stored data is purged in the background. Set `X-Ascii-Confirm-Delete` to the sandbox id.
1749
+ Soft-deletes an environment. The default environment cannot be deleted, and at least one environment is always kept.
1722
1750
 
1723
1751
  ### Example
1724
1752
 
@@ -1727,7 +1755,7 @@ import {
1727
1755
  Configuration,
1728
1756
  BoatApi,
1729
1757
  } from '@boatdev/sdk';
1730
- import type { DeleteSandboxSnapshotsRequest } from '@boatdev/sdk';
1758
+ import type { DeleteEnvironmentRequest } from '@boatdev/sdk';
1731
1759
 
1732
1760
  async function example() {
1733
1761
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1738,14 +1766,14 @@ async function example() {
1738
1766
  const api = new BoatApi(config);
1739
1767
 
1740
1768
  const body = {
1741
- // string | Public Sandbox id returned by create/list/get sandbox calls.
1742
- sandboxId: sandboxId_example,
1743
- // string | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion.
1744
- xAsciiConfirmDelete: xAsciiConfirmDelete_example,
1745
- } satisfies DeleteSandboxSnapshotsRequest;
1769
+ // string | Environment id returned by `GET /environments`.
1770
+ environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1771
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
1772
+ org: org_example,
1773
+ } satisfies DeleteEnvironmentRequest;
1746
1774
 
1747
1775
  try {
1748
- const data = await api.deleteSandboxSnapshots(body);
1776
+ const data = await api.deleteEnvironment(body);
1749
1777
  console.log(data);
1750
1778
  } catch (error) {
1751
1779
  console.error(error);
@@ -1761,12 +1789,12 @@ example().catch(console.error);
1761
1789
 
1762
1790
  | Name | Type | Description | Notes |
1763
1791
  |------------- | ------------- | ------------- | -------------|
1764
- | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
1765
- | **xAsciiConfirmDelete** | `string` | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion. | [Defaults to `undefined`] |
1792
+ | **environmentId** | `string` | Environment id returned by `GET /environments`. | [Defaults to `undefined`] |
1793
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
1766
1794
 
1767
1795
  ### Return type
1768
1796
 
1769
- [**DeletionOperationListResponse**](DeletionOperationListResponse.md)
1797
+ [**SandboxEnvironmentResponse**](SandboxEnvironmentResponse.md)
1770
1798
 
1771
1799
  ### Authorization
1772
1800
 
@@ -1781,22 +1809,21 @@ example().catch(console.error);
1781
1809
  ### HTTP response details
1782
1810
  | Status code | Description | Response headers |
1783
1811
  |-------------|-------------|------------------|
1784
- | **202** | One accepted deletion operation per snapshot. | - |
1812
+ | **200** | Environment soft-deleted. | - |
1785
1813
  | **401** | Missing or invalid bearer token. | - |
1786
- | **403** | Authenticated token is not allowed to perform this action. | - |
1787
1814
  | **404** | Resource not found. | - |
1788
1815
  | **409** | Request conflicts with current account or sandbox state. | - |
1789
1816
 
1790
1817
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1791
1818
 
1792
1819
 
1793
- ## deleteSnapshot
1820
+ ## deleteEnvironmentRepo
1794
1821
 
1795
- > DeletionOperationResponse deleteSnapshot(snapshotId, xAsciiConfirmDelete)
1822
+ > EnvironmentItemChangeResponse deleteEnvironmentRepo(environmentId, repositoryId, org)
1796
1823
 
1797
- Permanently delete snapshot data
1824
+ Remove a repository from an environment
1798
1825
 
1799
- Accept irreversible deletion of an unpinned snapshot owned by the authenticated account. Any such snapshot is accepted: it disappears from lists, restores and forks immediately, and its stored data is purged in the background once nothing still reads it (see the operation\'s `stage`). `409` only means `X-Ascii-Confirm-Delete` is missing or wrong.
1826
+ Removes one repository from the environment\'s selection. Mints a new immutable version.
1800
1827
 
1801
1828
  ### Example
1802
1829
 
@@ -1805,7 +1832,7 @@ import {
1805
1832
  Configuration,
1806
1833
  BoatApi,
1807
1834
  } from '@boatdev/sdk';
1808
- import type { DeleteSnapshotRequest } from '@boatdev/sdk';
1835
+ import type { DeleteEnvironmentRepoRequest } from '@boatdev/sdk';
1809
1836
 
1810
1837
  async function example() {
1811
1838
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -1816,15 +1843,482 @@ async function example() {
1816
1843
  const api = new BoatApi(config);
1817
1844
 
1818
1845
  const body = {
1819
- // string | Snapshot id returned by the snapshot list/latest calls.
1820
- snapshotId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1821
- // string | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion.
1822
- xAsciiConfirmDelete: xAsciiConfirmDelete_example,
1823
- } satisfies DeleteSnapshotRequest;
1824
-
1825
- try {
1826
- const data = await api.deleteSnapshot(body);
1827
- console.log(data);
1846
+ // string
1847
+ environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1848
+ // string | The repository `databaseId`.
1849
+ repositoryId: repositoryId_example,
1850
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
1851
+ org: org_example,
1852
+ } satisfies DeleteEnvironmentRepoRequest;
1853
+
1854
+ try {
1855
+ const data = await api.deleteEnvironmentRepo(body);
1856
+ console.log(data);
1857
+ } catch (error) {
1858
+ console.error(error);
1859
+ }
1860
+ }
1861
+
1862
+ // Run the test
1863
+ example().catch(console.error);
1864
+ ```
1865
+
1866
+ ### Parameters
1867
+
1868
+
1869
+ | Name | Type | Description | Notes |
1870
+ |------------- | ------------- | ------------- | -------------|
1871
+ | **environmentId** | `string` | | [Defaults to `undefined`] |
1872
+ | **repositoryId** | `string` | The repository `databaseId`. | [Defaults to `undefined`] |
1873
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
1874
+
1875
+ ### Return type
1876
+
1877
+ [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
1878
+
1879
+ ### Authorization
1880
+
1881
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
1882
+
1883
+ ### HTTP request headers
1884
+
1885
+ - **Content-Type**: Not defined
1886
+ - **Accept**: `application/json`
1887
+
1888
+
1889
+ ### HTTP response details
1890
+ | Status code | Description | Response headers |
1891
+ |-------------|-------------|------------------|
1892
+ | **200** | New version minted. | - |
1893
+ | **401** | Missing or invalid bearer token. | - |
1894
+ | **404** | Resource not found. | - |
1895
+
1896
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1897
+
1898
+
1899
+ ## deleteEnvironmentSecretFile
1900
+
1901
+ > EnvironmentItemChangeResponse deleteEnvironmentSecretFile(path, environmentId, org)
1902
+
1903
+ Remove one secret file
1904
+
1905
+ Removes the secret file at `path`. Mints a new immutable version.
1906
+
1907
+ ### Example
1908
+
1909
+ ```ts
1910
+ import {
1911
+ Configuration,
1912
+ BoatApi,
1913
+ } from '@boatdev/sdk';
1914
+ import type { DeleteEnvironmentSecretFileRequest } from '@boatdev/sdk';
1915
+
1916
+ async function example() {
1917
+ console.log("🚀 Testing @boatdev/sdk SDK...");
1918
+ const config = new Configuration({
1919
+ // Configure HTTP bearer authorization: BoatBearerAuth
1920
+ accessToken: "YOUR BEARER TOKEN",
1921
+ });
1922
+ const api = new BoatApi(config);
1923
+
1924
+ const body = {
1925
+ // string
1926
+ path: path_example,
1927
+ // string
1928
+ environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
1929
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
1930
+ org: org_example,
1931
+ } satisfies DeleteEnvironmentSecretFileRequest;
1932
+
1933
+ try {
1934
+ const data = await api.deleteEnvironmentSecretFile(body);
1935
+ console.log(data);
1936
+ } catch (error) {
1937
+ console.error(error);
1938
+ }
1939
+ }
1940
+
1941
+ // Run the test
1942
+ example().catch(console.error);
1943
+ ```
1944
+
1945
+ ### Parameters
1946
+
1947
+
1948
+ | Name | Type | Description | Notes |
1949
+ |------------- | ------------- | ------------- | -------------|
1950
+ | **path** | `string` | | [Defaults to `undefined`] |
1951
+ | **environmentId** | `string` | | [Defaults to `undefined`] |
1952
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
1953
+
1954
+ ### Return type
1955
+
1956
+ [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
1957
+
1958
+ ### Authorization
1959
+
1960
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
1961
+
1962
+ ### HTTP request headers
1963
+
1964
+ - **Content-Type**: Not defined
1965
+ - **Accept**: `application/json`
1966
+
1967
+
1968
+ ### HTTP response details
1969
+ | Status code | Description | Response headers |
1970
+ |-------------|-------------|------------------|
1971
+ | **200** | New version minted. | - |
1972
+ | **401** | Missing or invalid bearer token. | - |
1973
+ | **404** | Resource not found. | - |
1974
+
1975
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
1976
+
1977
+
1978
+ ## deleteEnvironmentVar
1979
+
1980
+ > EnvironmentItemChangeResponse deleteEnvironmentVar(environmentId, key, org)
1981
+
1982
+ Remove one environment variable
1983
+
1984
+ Removes a single variable. Mints a new immutable version.
1985
+
1986
+ ### Example
1987
+
1988
+ ```ts
1989
+ import {
1990
+ Configuration,
1991
+ BoatApi,
1992
+ } from '@boatdev/sdk';
1993
+ import type { DeleteEnvironmentVarRequest } from '@boatdev/sdk';
1994
+
1995
+ async function example() {
1996
+ console.log("🚀 Testing @boatdev/sdk SDK...");
1997
+ const config = new Configuration({
1998
+ // Configure HTTP bearer authorization: BoatBearerAuth
1999
+ accessToken: "YOUR BEARER TOKEN",
2000
+ });
2001
+ const api = new BoatApi(config);
2002
+
2003
+ const body = {
2004
+ // string
2005
+ environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
2006
+ // string | Environment variable name.
2007
+ key: key_example,
2008
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
2009
+ org: org_example,
2010
+ } satisfies DeleteEnvironmentVarRequest;
2011
+
2012
+ try {
2013
+ const data = await api.deleteEnvironmentVar(body);
2014
+ console.log(data);
2015
+ } catch (error) {
2016
+ console.error(error);
2017
+ }
2018
+ }
2019
+
2020
+ // Run the test
2021
+ example().catch(console.error);
2022
+ ```
2023
+
2024
+ ### Parameters
2025
+
2026
+
2027
+ | Name | Type | Description | Notes |
2028
+ |------------- | ------------- | ------------- | -------------|
2029
+ | **environmentId** | `string` | | [Defaults to `undefined`] |
2030
+ | **key** | `string` | Environment variable name. | [Defaults to `undefined`] |
2031
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
2032
+
2033
+ ### Return type
2034
+
2035
+ [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
2036
+
2037
+ ### Authorization
2038
+
2039
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
2040
+
2041
+ ### HTTP request headers
2042
+
2043
+ - **Content-Type**: Not defined
2044
+ - **Accept**: `application/json`
2045
+
2046
+
2047
+ ### HTTP response details
2048
+ | Status code | Description | Response headers |
2049
+ |-------------|-------------|------------------|
2050
+ | **200** | New version minted. | - |
2051
+ | **401** | Missing or invalid bearer token. | - |
2052
+ | **404** | Resource not found. | - |
2053
+
2054
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2055
+
2056
+
2057
+ ## deleteNamedSnapshot
2058
+
2059
+ > NamedSnapshotDeletedResponse deleteNamedSnapshot(name)
2060
+
2061
+ Remove a named snapshot
2062
+
2063
+ Remove a named snapshot and release its storage (`boat snapshot rm <name>` in the CLI). Sandboxes already deployed from it are unaffected.
2064
+
2065
+ ### Example
2066
+
2067
+ ```ts
2068
+ import {
2069
+ Configuration,
2070
+ BoatApi,
2071
+ } from '@boatdev/sdk';
2072
+ import type { DeleteNamedSnapshotRequest } from '@boatdev/sdk';
2073
+
2074
+ async function example() {
2075
+ console.log("🚀 Testing @boatdev/sdk SDK...");
2076
+ const config = new Configuration({
2077
+ // Configure HTTP bearer authorization: BoatBearerAuth
2078
+ accessToken: "YOUR BEARER TOKEN",
2079
+ });
2080
+ const api = new BoatApi(config);
2081
+
2082
+ const body = {
2083
+ // string
2084
+ name: name_example,
2085
+ } satisfies DeleteNamedSnapshotRequest;
2086
+
2087
+ try {
2088
+ const data = await api.deleteNamedSnapshot(body);
2089
+ console.log(data);
2090
+ } catch (error) {
2091
+ console.error(error);
2092
+ }
2093
+ }
2094
+
2095
+ // Run the test
2096
+ example().catch(console.error);
2097
+ ```
2098
+
2099
+ ### Parameters
2100
+
2101
+
2102
+ | Name | Type | Description | Notes |
2103
+ |------------- | ------------- | ------------- | -------------|
2104
+ | **name** | `string` | | [Defaults to `undefined`] |
2105
+
2106
+ ### Return type
2107
+
2108
+ [**NamedSnapshotDeletedResponse**](NamedSnapshotDeletedResponse.md)
2109
+
2110
+ ### Authorization
2111
+
2112
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
2113
+
2114
+ ### HTTP request headers
2115
+
2116
+ - **Content-Type**: Not defined
2117
+ - **Accept**: `application/json`
2118
+
2119
+
2120
+ ### HTTP response details
2121
+ | Status code | Description | Response headers |
2122
+ |-------------|-------------|------------------|
2123
+ | **200** | Removed. | - |
2124
+ | **401** | Missing or invalid bearer token. | - |
2125
+ | **404** | Resource not found. | - |
2126
+ | **409** | `save_in_progress`: a save under this name is still running. Wait for it to settle before removing it. | - |
2127
+
2128
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2129
+
2130
+
2131
+ ## deleteSandbox
2132
+
2133
+ > DeletionOperationResponse deleteSandbox(xAsciiConfirmDelete, sandboxId)
2134
+
2135
+ Permanently delete sandbox data
2136
+
2137
+ Accept irreversible background deletion of the sandbox machine, snapshots, and content-bearing records. This is not archive: the sandbox cannot be resumed. Named snapshots and other shared artifacts remain independent. Poll the returned operation until `completed`.
2138
+
2139
+ ### Example
2140
+
2141
+ ```ts
2142
+ import {
2143
+ Configuration,
2144
+ BoatApi,
2145
+ } from '@boatdev/sdk';
2146
+ import type { DeleteSandboxRequest } from '@boatdev/sdk';
2147
+
2148
+ async function example() {
2149
+ console.log("🚀 Testing @boatdev/sdk SDK...");
2150
+ const config = new Configuration({
2151
+ // Configure HTTP bearer authorization: BoatBearerAuth
2152
+ accessToken: "YOUR BEARER TOKEN",
2153
+ });
2154
+ const api = new BoatApi(config);
2155
+
2156
+ const body = {
2157
+ // string | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion.
2158
+ xAsciiConfirmDelete: xAsciiConfirmDelete_example,
2159
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
2160
+ sandboxId: sandboxId_example,
2161
+ } satisfies DeleteSandboxRequest;
2162
+
2163
+ try {
2164
+ const data = await api.deleteSandbox(body);
2165
+ console.log(data);
2166
+ } catch (error) {
2167
+ console.error(error);
2168
+ }
2169
+ }
2170
+
2171
+ // Run the test
2172
+ example().catch(console.error);
2173
+ ```
2174
+
2175
+ ### Parameters
2176
+
2177
+
2178
+ | Name | Type | Description | Notes |
2179
+ |------------- | ------------- | ------------- | -------------|
2180
+ | **xAsciiConfirmDelete** | `string` | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion. | [Defaults to `undefined`] |
2181
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
2182
+
2183
+ ### Return type
2184
+
2185
+ [**DeletionOperationResponse**](DeletionOperationResponse.md)
2186
+
2187
+ ### Authorization
2188
+
2189
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
2190
+
2191
+ ### HTTP request headers
2192
+
2193
+ - **Content-Type**: Not defined
2194
+ - **Accept**: `application/json`
2195
+
2196
+
2197
+ ### HTTP response details
2198
+ | Status code | Description | Response headers |
2199
+ |-------------|-------------|------------------|
2200
+ | **202** | Deletion confirmed and accepted for background processing. | - |
2201
+ | **401** | Missing or invalid bearer token. | - |
2202
+ | **403** | Authenticated token is not allowed to perform this action. | - |
2203
+ | **404** | Resource not found. | - |
2204
+ | **409** | Request conflicts with current account or sandbox state. | - |
2205
+
2206
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2207
+
2208
+
2209
+ ## deleteSandboxSnapshots
2210
+
2211
+ > DeletionOperationListResponse deleteSandboxSnapshots(sandboxId, xAsciiConfirmDelete)
2212
+
2213
+ Permanently delete all snapshots of a sandbox
2214
+
2215
+ Accept irreversible deletion of every unpinned snapshot of this sandbox. The sandbox itself and its named snapshots stay. Snapshots disappear from lists, restores and forks immediately; their stored data is purged in the background. Set `X-Ascii-Confirm-Delete` to the sandbox id.
2216
+
2217
+ ### Example
2218
+
2219
+ ```ts
2220
+ import {
2221
+ Configuration,
2222
+ BoatApi,
2223
+ } from '@boatdev/sdk';
2224
+ import type { DeleteSandboxSnapshotsRequest } from '@boatdev/sdk';
2225
+
2226
+ async function example() {
2227
+ console.log("🚀 Testing @boatdev/sdk SDK...");
2228
+ const config = new Configuration({
2229
+ // Configure HTTP bearer authorization: BoatBearerAuth
2230
+ accessToken: "YOUR BEARER TOKEN",
2231
+ });
2232
+ const api = new BoatApi(config);
2233
+
2234
+ const body = {
2235
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
2236
+ sandboxId: sandboxId_example,
2237
+ // string | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion.
2238
+ xAsciiConfirmDelete: xAsciiConfirmDelete_example,
2239
+ } satisfies DeleteSandboxSnapshotsRequest;
2240
+
2241
+ try {
2242
+ const data = await api.deleteSandboxSnapshots(body);
2243
+ console.log(data);
2244
+ } catch (error) {
2245
+ console.error(error);
2246
+ }
2247
+ }
2248
+
2249
+ // Run the test
2250
+ example().catch(console.error);
2251
+ ```
2252
+
2253
+ ### Parameters
2254
+
2255
+
2256
+ | Name | Type | Description | Notes |
2257
+ |------------- | ------------- | ------------- | -------------|
2258
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
2259
+ | **xAsciiConfirmDelete** | `string` | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion. | [Defaults to `undefined`] |
2260
+
2261
+ ### Return type
2262
+
2263
+ [**DeletionOperationListResponse**](DeletionOperationListResponse.md)
2264
+
2265
+ ### Authorization
2266
+
2267
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
2268
+
2269
+ ### HTTP request headers
2270
+
2271
+ - **Content-Type**: Not defined
2272
+ - **Accept**: `application/json`
2273
+
2274
+
2275
+ ### HTTP response details
2276
+ | Status code | Description | Response headers |
2277
+ |-------------|-------------|------------------|
2278
+ | **202** | One accepted deletion operation per snapshot. | - |
2279
+ | **401** | Missing or invalid bearer token. | - |
2280
+ | **403** | Authenticated token is not allowed to perform this action. | - |
2281
+ | **404** | Resource not found. | - |
2282
+ | **409** | Request conflicts with current account or sandbox state. | - |
2283
+
2284
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2285
+
2286
+
2287
+ ## deleteSnapshot
2288
+
2289
+ > DeletionOperationResponse deleteSnapshot(snapshotId, xAsciiConfirmDelete)
2290
+
2291
+ Permanently delete snapshot data
2292
+
2293
+ Accept irreversible deletion of an unpinned snapshot owned by the authenticated account. Any such snapshot is accepted: it disappears from lists, restores and forks immediately, and its stored data is purged in the background once nothing still reads it (see the operation\'s `stage`). `409` only means `X-Ascii-Confirm-Delete` is missing or wrong.
2294
+
2295
+ ### Example
2296
+
2297
+ ```ts
2298
+ import {
2299
+ Configuration,
2300
+ BoatApi,
2301
+ } from '@boatdev/sdk';
2302
+ import type { DeleteSnapshotRequest } from '@boatdev/sdk';
2303
+
2304
+ async function example() {
2305
+ console.log("🚀 Testing @boatdev/sdk SDK...");
2306
+ const config = new Configuration({
2307
+ // Configure HTTP bearer authorization: BoatBearerAuth
2308
+ accessToken: "YOUR BEARER TOKEN",
2309
+ });
2310
+ const api = new BoatApi(config);
2311
+
2312
+ const body = {
2313
+ // string | Snapshot id returned by the snapshot list/latest calls.
2314
+ snapshotId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
2315
+ // string | Must exactly equal the target `sandboxId` or `snapshotId`. A missing or mismatched value returns `409` without accepting deletion.
2316
+ xAsciiConfirmDelete: xAsciiConfirmDelete_example,
2317
+ } satisfies DeleteSnapshotRequest;
2318
+
2319
+ try {
2320
+ const data = await api.deleteSnapshot(body);
2321
+ console.log(data);
1828
2322
  } catch (error) {
1829
2323
  console.error(error);
1830
2324
  }
@@ -2074,15 +2568,176 @@ example().catch(console.error);
2074
2568
 
2075
2569
  ### HTTP request headers
2076
2570
 
2077
- - **Content-Type**: `application/json`
2571
+ - **Content-Type**: `application/json`
2572
+ - **Accept**: `application/json`
2573
+
2574
+
2575
+ ### HTTP response details
2576
+ | Status code | Description | Response headers |
2577
+ |-------------|-------------|------------------|
2578
+ | **200** | Desktop streaming URL, or provisioning state for VNC setup. | - |
2579
+ | **400** | Invalid request body or parameters. | - |
2580
+ | **401** | Missing or invalid bearer token. | - |
2581
+ | **402** | Account cannot currently create or operate sandboxes. The error body may include a dashboard billing URL, but billing actions are not part of the v1 API. | - |
2582
+ | **404** | Resource not found. | - |
2583
+
2584
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2585
+
2586
+
2587
+ ## environments
2588
+
2589
+ > SandboxEnvironmentListResponse environments(org)
2590
+
2591
+ List Sandbox environments
2592
+
2593
+ Returns every non-deleted sandbox environment with its latest-version flags, contents, and per-version sandbox usage. A default environment named `base` is created on first access if none exists.
2594
+
2595
+ ### Example
2596
+
2597
+ ```ts
2598
+ import {
2599
+ Configuration,
2600
+ BoatApi,
2601
+ } from '@boatdev/sdk';
2602
+ import type { EnvironmentsRequest } from '@boatdev/sdk';
2603
+
2604
+ async function example() {
2605
+ console.log("🚀 Testing @boatdev/sdk SDK...");
2606
+ const config = new Configuration({
2607
+ // Configure HTTP bearer authorization: BoatBearerAuth
2608
+ accessToken: "YOUR BEARER TOKEN",
2609
+ });
2610
+ const api = new BoatApi(config);
2611
+
2612
+ const body = {
2613
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
2614
+ org: org_example,
2615
+ } satisfies EnvironmentsRequest;
2616
+
2617
+ try {
2618
+ const data = await api.environments(body);
2619
+ console.log(data);
2620
+ } catch (error) {
2621
+ console.error(error);
2622
+ }
2623
+ }
2624
+
2625
+ // Run the test
2626
+ example().catch(console.error);
2627
+ ```
2628
+
2629
+ ### Parameters
2630
+
2631
+
2632
+ | Name | Type | Description | Notes |
2633
+ |------------- | ------------- | ------------- | -------------|
2634
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
2635
+
2636
+ ### Return type
2637
+
2638
+ [**SandboxEnvironmentListResponse**](SandboxEnvironmentListResponse.md)
2639
+
2640
+ ### Authorization
2641
+
2642
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
2643
+
2644
+ ### HTTP request headers
2645
+
2646
+ - **Content-Type**: Not defined
2647
+ - **Accept**: `application/json`
2648
+
2649
+
2650
+ ### HTTP response details
2651
+ | Status code | Description | Response headers |
2652
+ |-------------|-------------|------------------|
2653
+ | **200** | The account\'s sandbox environments. | - |
2654
+ | **401** | Missing or invalid bearer token. | - |
2655
+
2656
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2657
+
2658
+
2659
+ ## events
2660
+
2661
+ > EventsResponse events(sandboxId, limit, cursor, sort, type, conversation)
2662
+
2663
+ List boat events
2664
+
2665
+ Return Sandbox work, lifecycle, and progress events so product UIs can show what the sandbox is doing. A Sandbox runs many conversations in parallel; this streams **all** of them by default and every event carries a `conversationId`. Filter to one or more with `conversation`. Event payloads are extensible. Clients can long-poll this endpoint with `sort=asc` and a cursor to stream responses. Response events expose agent text, streaming partials via `data.is_streaming`, and tool calls/results via `data.tools`.
2666
+
2667
+ ### Example
2668
+
2669
+ ```ts
2670
+ import {
2671
+ Configuration,
2672
+ BoatApi,
2673
+ } from '@boatdev/sdk';
2674
+ import type { EventsRequest } from '@boatdev/sdk';
2675
+
2676
+ async function example() {
2677
+ console.log("🚀 Testing @boatdev/sdk SDK...");
2678
+ const config = new Configuration({
2679
+ // Configure HTTP bearer authorization: BoatBearerAuth
2680
+ accessToken: "YOUR BEARER TOKEN",
2681
+ });
2682
+ const api = new BoatApi(config);
2683
+
2684
+ const body = {
2685
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
2686
+ sandboxId: sandboxId_example,
2687
+ // number | Maximum items to return. (optional)
2688
+ limit: 56,
2689
+ // string | Opaque pagination cursor returned as `pageInfo.nextCursor`. (optional)
2690
+ cursor: cursor_example,
2691
+ // 'asc' | 'desc' | Sort direction for cursor pagination. (optional)
2692
+ sort: sort_example,
2693
+ // string | Comma-separated event type filter, for example `prompt,response,steer`. (optional)
2694
+ type: type_example,
2695
+ // string | Only return events for this conversation id. Repeat the parameter (or comma-separate) for several. Omit to stream every conversation on the sandbox. See [Integrated agents](/integrated-agents). (optional)
2696
+ conversation: conversation_example,
2697
+ } satisfies EventsRequest;
2698
+
2699
+ try {
2700
+ const data = await api.events(body);
2701
+ console.log(data);
2702
+ } catch (error) {
2703
+ console.error(error);
2704
+ }
2705
+ }
2706
+
2707
+ // Run the test
2708
+ example().catch(console.error);
2709
+ ```
2710
+
2711
+ ### Parameters
2712
+
2713
+
2714
+ | Name | Type | Description | Notes |
2715
+ |------------- | ------------- | ------------- | -------------|
2716
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
2717
+ | **limit** | `number` | Maximum items to return. | [Optional] [Defaults to `100`] |
2718
+ | **cursor** | `string` | Opaque pagination cursor returned as `pageInfo.nextCursor`. | [Optional] [Defaults to `undefined`] |
2719
+ | **sort** | `asc`, `desc` | Sort direction for cursor pagination. | [Optional] [Defaults to `'desc'`] [Enum: asc, desc] |
2720
+ | **type** | `string` | Comma-separated event type filter, for example `prompt,response,steer`. | [Optional] [Defaults to `undefined`] |
2721
+ | **conversation** | `string` | Only return events for this conversation id. Repeat the parameter (or comma-separate) for several. Omit to stream every conversation on the sandbox. See [Integrated agents](/integrated-agents). | [Optional] [Defaults to `undefined`] |
2722
+
2723
+ ### Return type
2724
+
2725
+ [**EventsResponse**](EventsResponse.md)
2726
+
2727
+ ### Authorization
2728
+
2729
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
2730
+
2731
+ ### HTTP request headers
2732
+
2733
+ - **Content-Type**: Not defined
2078
2734
  - **Accept**: `application/json`
2079
2735
 
2080
2736
 
2081
2737
  ### HTTP response details
2082
2738
  | Status code | Description | Response headers |
2083
2739
  |-------------|-------------|------------------|
2084
- | **200** | Desktop streaming URL, or provisioning state for VNC setup. | - |
2085
- | **400** | Invalid request body or parameters. | - |
2740
+ | **200** | The agent\'s work on the sandbox (prompts, responses), not sandbox lifecycle. A sandbox that was never prompted returns an empty list even though it started, stopped and resumed. | - |
2086
2741
  | **401** | Missing or invalid bearer token. | - |
2087
2742
  | **402** | Account cannot currently create or operate sandboxes. The error body may include a dashboard billing URL, but billing actions are not part of the v1 API. | - |
2088
2743
  | **404** | Resource not found. | - |
@@ -2090,13 +2745,13 @@ example().catch(console.error);
2090
2745
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2091
2746
 
2092
2747
 
2093
- ## environments
2748
+ ## fork
2094
2749
 
2095
- > SandboxEnvironmentListResponse environments()
2750
+ > SandboxActionResponse fork(sandboxId, idempotencyKey, forkRequest)
2096
2751
 
2097
- List Sandbox environments
2752
+ Fork sandbox
2098
2753
 
2099
- Returns every non-deleted sandbox environment with its latest-version flags, contents, and per-version sandbox usage. A default environment named `base` is created on first access if none exists.
2754
+ Provision a new sandbox from an existing one. Send an `Idempotency-Key` header to make this call safe to retry after a lost response without creating a second billable fork.
2100
2755
 
2101
2756
  ### Example
2102
2757
 
@@ -2105,7 +2760,7 @@ import {
2105
2760
  Configuration,
2106
2761
  BoatApi,
2107
2762
  } from '@boatdev/sdk';
2108
- import type { EnvironmentsRequest } from '@boatdev/sdk';
2763
+ import type { ForkOperationRequest } from '@boatdev/sdk';
2109
2764
 
2110
2765
  async function example() {
2111
2766
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -2115,8 +2770,17 @@ async function example() {
2115
2770
  });
2116
2771
  const api = new BoatApi(config);
2117
2772
 
2773
+ const body = {
2774
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
2775
+ sandboxId: sandboxId_example,
2776
+ // string | Optional exactly-once key for creating a sandbox. Send your own opaque, account-unique value (a UUID) to make `POST /sandboxes` safe to retry when the response is lost (network timeout, 5xx): the first request creates the sandbox and binds it to the key; every later request with the **same account, key, and request body** returns that same sandbox instead of creating a second, billable one. Behavior: keys are retained for **24 hours**; a concurrent or early retry while the first sandbox is still being minted returns `409` `idempotency_in_progress` (retry shortly, same key); reusing a key with a **different body** returns `409` `idempotency_key_reused`; timeouts and 5xx are safe to retry with the same key; a create that fails before the sandbox exists releases the key within ~2 minutes so a retry can create the sandbox. Omit the header to keep the default (non-idempotent) behavior. (optional)
2777
+ idempotencyKey: idempotencyKey_example,
2778
+ // ForkRequest (optional)
2779
+ forkRequest: ...,
2780
+ } satisfies ForkOperationRequest;
2781
+
2118
2782
  try {
2119
- const data = await api.environments();
2783
+ const data = await api.fork(body);
2120
2784
  console.log(data);
2121
2785
  } catch (error) {
2122
2786
  console.error(error);
@@ -2129,11 +2793,16 @@ example().catch(console.error);
2129
2793
 
2130
2794
  ### Parameters
2131
2795
 
2132
- This endpoint does not need any parameter.
2796
+
2797
+ | Name | Type | Description | Notes |
2798
+ |------------- | ------------- | ------------- | -------------|
2799
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
2800
+ | **idempotencyKey** | `string` | Optional exactly-once key for creating a sandbox. Send your own opaque, account-unique value (a UUID) to make `POST /sandboxes` safe to retry when the response is lost (network timeout, 5xx): the first request creates the sandbox and binds it to the key; every later request with the **same account, key, and request body** returns that same sandbox instead of creating a second, billable one. Behavior: keys are retained for **24 hours**; a concurrent or early retry while the first sandbox is still being minted returns `409` `idempotency_in_progress` (retry shortly, same key); reusing a key with a **different body** returns `409` `idempotency_key_reused`; timeouts and 5xx are safe to retry with the same key; a create that fails before the sandbox exists releases the key within ~2 minutes so a retry can create the sandbox. Omit the header to keep the default (non-idempotent) behavior. | [Optional] [Defaults to `undefined`] |
2801
+ | **forkRequest** | [ForkRequest](ForkRequest.md) | | [Optional] |
2133
2802
 
2134
2803
  ### Return type
2135
2804
 
2136
- [**SandboxEnvironmentListResponse**](SandboxEnvironmentListResponse.md)
2805
+ [**SandboxActionResponse**](SandboxActionResponse.md)
2137
2806
 
2138
2807
  ### Authorization
2139
2808
 
@@ -2141,26 +2810,31 @@ This endpoint does not need any parameter.
2141
2810
 
2142
2811
  ### HTTP request headers
2143
2812
 
2144
- - **Content-Type**: Not defined
2813
+ - **Content-Type**: `application/json`
2145
2814
  - **Accept**: `application/json`
2146
2815
 
2147
2816
 
2148
2817
  ### HTTP response details
2149
2818
  | Status code | Description | Response headers |
2150
2819
  |-------------|-------------|------------------|
2151
- | **200** | The account\'s sandbox environments. | - |
2820
+ | **202** | Fork started. The response `id` is the new forked sandbox id. | - |
2152
2821
  | **401** | Missing or invalid bearer token. | - |
2822
+ | **402** | Account cannot currently create or operate sandboxes. The error body may include a dashboard billing URL, but billing actions are not part of the v1 API. | - |
2823
+ | **404** | Resource not found. | - |
2824
+ | **409** | Request conflicts with current account or sandbox state. | - |
2825
+ | **429** | Machine start or concurrent-sandbox limit reached. Create, fork and resume each count as one machine start against your plan\'s start limits (see the Billing guide; `rate_limited`, naming the window you hit). A sandbox that would exceed your plan\'s concurrent-sandbox cap is refused with `limit_reached`, or `member_limit_reached` when an organization owner has capped you below the plan. | - |
2826
+ | **503** | No capacity. `no_ready_machine`: a `failFast` create, fork or resume found no ready machine of that type; nothing was started, billed, or counted, and a resumed sandbox stays stopped. `out_of_capacity`: creates and forks are paused until the provisioning queue drains. | - |
2153
2827
 
2154
2828
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2155
2829
 
2156
2830
 
2157
- ## events
2831
+ ## get
2158
2832
 
2159
- > EventsResponse events(sandboxId, limit, cursor, sort, type, conversation)
2833
+ > SandboxInfoResponse get(sandboxId)
2160
2834
 
2161
- List boat events
2835
+ Get sandbox
2162
2836
 
2163
- Return Sandbox work, lifecycle, and progress events so product UIs can show what the sandbox is doing. A Sandbox runs many conversations in parallel; this streams **all** of them by default and every event carries a `conversationId`. Filter to one or more with `conversation`. Event payloads are extensible. Clients can long-poll this endpoint with `sort=asc` and a cursor to stream responses. Response events expose agent text, streaming partials via `data.is_streaming`, and tool calls/results via `data.tools`.
2837
+ Poll this endpoint after create, stop, resume, or fork operations.
2164
2838
 
2165
2839
  ### Example
2166
2840
 
@@ -2169,7 +2843,7 @@ import {
2169
2843
  Configuration,
2170
2844
  BoatApi,
2171
2845
  } from '@boatdev/sdk';
2172
- import type { EventsRequest } from '@boatdev/sdk';
2846
+ import type { GetRequest } from '@boatdev/sdk';
2173
2847
 
2174
2848
  async function example() {
2175
2849
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -2182,20 +2856,10 @@ async function example() {
2182
2856
  const body = {
2183
2857
  // string | Public Sandbox id returned by create/list/get sandbox calls.
2184
2858
  sandboxId: sandboxId_example,
2185
- // number | Maximum items to return. (optional)
2186
- limit: 56,
2187
- // string | Opaque pagination cursor returned as `pageInfo.nextCursor`. (optional)
2188
- cursor: cursor_example,
2189
- // 'asc' | 'desc' | Sort direction for cursor pagination. (optional)
2190
- sort: sort_example,
2191
- // string | Comma-separated event type filter, for example `prompt,response,steer`. (optional)
2192
- type: type_example,
2193
- // string | Only return events for this conversation id. Repeat the parameter (or comma-separate) for several. Omit to stream every conversation on the sandbox. See [Integrated agents](/integrated-agents). (optional)
2194
- conversation: conversation_example,
2195
- } satisfies EventsRequest;
2859
+ } satisfies GetRequest;
2196
2860
 
2197
2861
  try {
2198
- const data = await api.events(body);
2862
+ const data = await api.get(body);
2199
2863
  console.log(data);
2200
2864
  } catch (error) {
2201
2865
  console.error(error);
@@ -2212,15 +2876,10 @@ example().catch(console.error);
2212
2876
  | Name | Type | Description | Notes |
2213
2877
  |------------- | ------------- | ------------- | -------------|
2214
2878
  | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
2215
- | **limit** | `number` | Maximum items to return. | [Optional] [Defaults to `100`] |
2216
- | **cursor** | `string` | Opaque pagination cursor returned as `pageInfo.nextCursor`. | [Optional] [Defaults to `undefined`] |
2217
- | **sort** | `asc`, `desc` | Sort direction for cursor pagination. | [Optional] [Defaults to `'desc'`] [Enum: asc, desc] |
2218
- | **type** | `string` | Comma-separated event type filter, for example `prompt,response,steer`. | [Optional] [Defaults to `undefined`] |
2219
- | **conversation** | `string` | Only return events for this conversation id. Repeat the parameter (or comma-separate) for several. Omit to stream every conversation on the sandbox. See [Integrated agents](/integrated-agents). | [Optional] [Defaults to `undefined`] |
2220
2879
 
2221
2880
  ### Return type
2222
2881
 
2223
- [**EventsResponse**](EventsResponse.md)
2882
+ [**SandboxInfoResponse**](SandboxInfoResponse.md)
2224
2883
 
2225
2884
  ### Authorization
2226
2885
 
@@ -2235,21 +2894,20 @@ example().catch(console.error);
2235
2894
  ### HTTP response details
2236
2895
  | Status code | Description | Response headers |
2237
2896
  |-------------|-------------|------------------|
2238
- | **200** | The agent\'s work on the sandbox (prompts, responses), not sandbox lifecycle. A sandbox that was never prompted returns an empty list even though it started, stopped and resumed. | - |
2897
+ | **200** | Boat details. | - |
2239
2898
  | **401** | Missing or invalid bearer token. | - |
2240
- | **402** | Account cannot currently create or operate sandboxes. The error body may include a dashboard billing URL, but billing actions are not part of the v1 API. | - |
2241
2899
  | **404** | Resource not found. | - |
2242
2900
 
2243
2901
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2244
2902
 
2245
2903
 
2246
- ## fork
2904
+ ## getAiProxy
2247
2905
 
2248
- > SandboxActionResponse fork(sandboxId, idempotencyKey, forkRequest)
2906
+ > AiProxySettings getAiProxy(org, xBoatOrg)
2249
2907
 
2250
- Fork sandbox
2908
+ Get AI credentials proxy
2251
2909
 
2252
- Provision a new sandbox from an existing one. Send an `Idempotency-Key` header to make this call safe to retry after a lost response without creating a second billable fork.
2910
+ Returns the AI credentials proxy switch of the account in scope, a person or an organization, with its price. Needs an API key with `account.admin`.
2253
2911
 
2254
2912
  ### Example
2255
2913
 
@@ -2258,7 +2916,7 @@ import {
2258
2916
  Configuration,
2259
2917
  BoatApi,
2260
2918
  } from '@boatdev/sdk';
2261
- import type { ForkOperationRequest } from '@boatdev/sdk';
2919
+ import type { GetAiProxyRequest } from '@boatdev/sdk';
2262
2920
 
2263
2921
  async function example() {
2264
2922
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -2269,16 +2927,14 @@ async function example() {
2269
2927
  const api = new BoatApi(config);
2270
2928
 
2271
2929
  const body = {
2272
- // string | Public Sandbox id returned by create/list/get sandbox calls.
2273
- sandboxId: sandboxId_example,
2274
- // string | Optional exactly-once key for creating a sandbox. Send your own opaque, account-unique value (a UUID) to make `POST /sandboxes` safe to retry when the response is lost (network timeout, 5xx): the first request creates the sandbox and binds it to the key; every later request with the **same account, key, and request body** returns that same sandbox instead of creating a second, billable one. Behavior: keys are retained for **24 hours**; a concurrent or early retry while the first sandbox is still being minted returns `409` `idempotency_in_progress` (retry shortly, same key); reusing a key with a **different body** returns `409` `idempotency_key_reused`; timeouts and 5xx are safe to retry with the same key; a create that fails before the sandbox exists releases the key within ~2 minutes so a retry can create the sandbox. Omit the header to keep the default (non-idempotent) behavior. (optional)
2275
- idempotencyKey: idempotencyKey_example,
2276
- // ForkRequest (optional)
2277
- forkRequest: ...,
2278
- } satisfies ForkOperationRequest;
2930
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
2931
+ org: org_example,
2932
+ // string | Same as the `org` query parameter. Query wins when both are set. (optional)
2933
+ xBoatOrg: xBoatOrg_example,
2934
+ } satisfies GetAiProxyRequest;
2279
2935
 
2280
2936
  try {
2281
- const data = await api.fork(body);
2937
+ const data = await api.getAiProxy(body);
2282
2938
  console.log(data);
2283
2939
  } catch (error) {
2284
2940
  console.error(error);
@@ -2294,13 +2950,12 @@ example().catch(console.error);
2294
2950
 
2295
2951
  | Name | Type | Description | Notes |
2296
2952
  |------------- | ------------- | ------------- | -------------|
2297
- | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
2298
- | **idempotencyKey** | `string` | Optional exactly-once key for creating a sandbox. Send your own opaque, account-unique value (a UUID) to make `POST /sandboxes` safe to retry when the response is lost (network timeout, 5xx): the first request creates the sandbox and binds it to the key; every later request with the **same account, key, and request body** returns that same sandbox instead of creating a second, billable one. Behavior: keys are retained for **24 hours**; a concurrent or early retry while the first sandbox is still being minted returns `409` `idempotency_in_progress` (retry shortly, same key); reusing a key with a **different body** returns `409` `idempotency_key_reused`; timeouts and 5xx are safe to retry with the same key; a create that fails before the sandbox exists releases the key within ~2 minutes so a retry can create the sandbox. Omit the header to keep the default (non-idempotent) behavior. | [Optional] [Defaults to `undefined`] |
2299
- | **forkRequest** | [ForkRequest](ForkRequest.md) | | [Optional] |
2953
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
2954
+ | **xBoatOrg** | `string` | Same as the `org` query parameter. Query wins when both are set. | [Optional] [Defaults to `undefined`] |
2300
2955
 
2301
2956
  ### Return type
2302
2957
 
2303
- [**SandboxActionResponse**](SandboxActionResponse.md)
2958
+ [**AiProxySettings**](AiProxySettings.md)
2304
2959
 
2305
2960
  ### Authorization
2306
2961
 
@@ -2308,31 +2963,26 @@ example().catch(console.error);
2308
2963
 
2309
2964
  ### HTTP request headers
2310
2965
 
2311
- - **Content-Type**: `application/json`
2966
+ - **Content-Type**: Not defined
2312
2967
  - **Accept**: `application/json`
2313
2968
 
2314
2969
 
2315
2970
  ### HTTP response details
2316
2971
  | Status code | Description | Response headers |
2317
2972
  |-------------|-------------|------------------|
2318
- | **202** | Fork started. The response `id` is the new forked sandbox id. | - |
2973
+ | **200** | The switch and its price. | - |
2319
2974
  | **401** | Missing or invalid bearer token. | - |
2320
- | **402** | Account cannot currently create or operate sandboxes. The error body may include a dashboard billing URL, but billing actions are not part of the v1 API. | - |
2321
- | **404** | Resource not found. | - |
2322
- | **409** | Request conflicts with current account or sandbox state. | - |
2323
- | **429** | Machine start or concurrent-sandbox limit reached. Create, fork and resume each count as one machine start against your plan\'s start limits (see the Billing guide; `rate_limited`, naming the window you hit). A sandbox that would exceed your plan\'s concurrent-sandbox cap is refused with `limit_reached`, or `member_limit_reached` when an organization owner has capped you below the plan. | - |
2324
- | **503** | No capacity. `no_ready_machine`: a `failFast` create, fork or resume found no ready machine of that type; nothing was started, billed, or counted, and a resumed sandbox stays stopped. `out_of_capacity`: creates and forks are paused until the provisioning queue drains. | - |
2325
2975
 
2326
2976
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2327
2977
 
2328
2978
 
2329
- ## get
2979
+ ## getAiUsage
2330
2980
 
2331
- > SandboxInfoResponse get(sandboxId)
2981
+ > AccountAiUsageResponse getAiUsage(days, profile, org, xBoatOrg)
2332
2982
 
2333
- Get sandbox
2983
+ Get AI usage
2334
2984
 
2335
- Poll this endpoint after create, stop, resume, or fork operations.
2985
+ Proxied AI usage, per sandbox and in total, per UTC day, credential and model. Without `profile`, the usage charged to the wallet in scope. With `profile`, the requests made with that profile\'s credentials, whoever pays; only its managers can read it. Needs an API key with `account.read`.
2336
2986
 
2337
2987
  ### Example
2338
2988
 
@@ -2341,7 +2991,7 @@ import {
2341
2991
  Configuration,
2342
2992
  BoatApi,
2343
2993
  } from '@boatdev/sdk';
2344
- import type { GetRequest } from '@boatdev/sdk';
2994
+ import type { GetAiUsageRequest } from '@boatdev/sdk';
2345
2995
 
2346
2996
  async function example() {
2347
2997
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -2352,12 +3002,18 @@ async function example() {
2352
3002
  const api = new BoatApi(config);
2353
3003
 
2354
3004
  const body = {
2355
- // string | Public Sandbox id returned by create/list/get sandbox calls.
2356
- sandboxId: sandboxId_example,
2357
- } satisfies GetRequest;
3005
+ // number | Days of history, today included. (optional)
3006
+ days: 56,
3007
+ // string | A credential profile id. Counts that profile\'s requests instead of a wallet\'s. (optional)
3008
+ profile: profile_example,
3009
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
3010
+ org: org_example,
3011
+ // string | Same as the `org` query parameter. Query wins when both are set. (optional)
3012
+ xBoatOrg: xBoatOrg_example,
3013
+ } satisfies GetAiUsageRequest;
2358
3014
 
2359
3015
  try {
2360
- const data = await api.get(body);
3016
+ const data = await api.getAiUsage(body);
2361
3017
  console.log(data);
2362
3018
  } catch (error) {
2363
3019
  console.error(error);
@@ -2373,11 +3029,14 @@ example().catch(console.error);
2373
3029
 
2374
3030
  | Name | Type | Description | Notes |
2375
3031
  |------------- | ------------- | ------------- | -------------|
2376
- | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
3032
+ | **days** | `number` | Days of history, today included. | [Optional] [Defaults to `30`] |
3033
+ | **profile** | `string` | A credential profile id. Counts that profile\'s requests instead of a wallet\'s. | [Optional] [Defaults to `undefined`] |
3034
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
3035
+ | **xBoatOrg** | `string` | Same as the `org` query parameter. Query wins when both are set. | [Optional] [Defaults to `undefined`] |
2377
3036
 
2378
3037
  ### Return type
2379
3038
 
2380
- [**SandboxInfoResponse**](SandboxInfoResponse.md)
3039
+ [**AccountAiUsageResponse**](AccountAiUsageResponse.md)
2381
3040
 
2382
3041
  ### Authorization
2383
3042
 
@@ -2392,9 +3051,8 @@ example().catch(console.error);
2392
3051
  ### HTTP response details
2393
3052
  | Status code | Description | Response headers |
2394
3053
  |-------------|-------------|------------------|
2395
- | **200** | Boat details. | - |
3054
+ | **200** | The usage. | - |
2396
3055
  | **401** | Missing or invalid bearer token. | - |
2397
- | **404** | Resource not found. | - |
2398
3056
 
2399
3057
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2400
3058
 
@@ -2755,6 +3413,82 @@ example().catch(console.error);
2755
3413
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
2756
3414
 
2757
3415
 
3416
+ ## getSandboxAiUsage
3417
+
3418
+ > SandboxAiUsageResponse getSandboxAiUsage(sandboxId, days)
3419
+
3420
+ Get sandbox AI usage
3421
+
3422
+ One sandbox\'s proxied AI usage per UTC day, credential and model, and whether it is blocked. Needs an API key with `box.read` on the sandbox.
3423
+
3424
+ ### Example
3425
+
3426
+ ```ts
3427
+ import {
3428
+ Configuration,
3429
+ BoatApi,
3430
+ } from '@boatdev/sdk';
3431
+ import type { GetSandboxAiUsageRequest } from '@boatdev/sdk';
3432
+
3433
+ async function example() {
3434
+ console.log("🚀 Testing @boatdev/sdk SDK...");
3435
+ const config = new Configuration({
3436
+ // Configure HTTP bearer authorization: BoatBearerAuth
3437
+ accessToken: "YOUR BEARER TOKEN",
3438
+ });
3439
+ const api = new BoatApi(config);
3440
+
3441
+ const body = {
3442
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
3443
+ sandboxId: sandboxId_example,
3444
+ // number | Days of history, today included. (optional)
3445
+ days: 56,
3446
+ } satisfies GetSandboxAiUsageRequest;
3447
+
3448
+ try {
3449
+ const data = await api.getSandboxAiUsage(body);
3450
+ console.log(data);
3451
+ } catch (error) {
3452
+ console.error(error);
3453
+ }
3454
+ }
3455
+
3456
+ // Run the test
3457
+ example().catch(console.error);
3458
+ ```
3459
+
3460
+ ### Parameters
3461
+
3462
+
3463
+ | Name | Type | Description | Notes |
3464
+ |------------- | ------------- | ------------- | -------------|
3465
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
3466
+ | **days** | `number` | Days of history, today included. | [Optional] [Defaults to `30`] |
3467
+
3468
+ ### Return type
3469
+
3470
+ [**SandboxAiUsageResponse**](SandboxAiUsageResponse.md)
3471
+
3472
+ ### Authorization
3473
+
3474
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
3475
+
3476
+ ### HTTP request headers
3477
+
3478
+ - **Content-Type**: Not defined
3479
+ - **Accept**: `application/json`
3480
+
3481
+
3482
+ ### HTTP response details
3483
+ | Status code | Description | Response headers |
3484
+ |-------------|-------------|------------------|
3485
+ | **200** | The usage. | - |
3486
+ | **401** | Missing or invalid bearer token. | - |
3487
+ | **404** | Resource not found. | - |
3488
+
3489
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
3490
+
3491
+
2758
3492
  ## getSnapshotDownload
2759
3493
 
2760
3494
  > SnapshotDownloadResponse getSnapshotDownload(snapshotId)
@@ -3302,7 +4036,87 @@ async function example() {
3302
4036
  } satisfies InterruptRequest;
3303
4037
 
3304
4038
  try {
3305
- const data = await api.interrupt(body);
4039
+ const data = await api.interrupt(body);
4040
+ console.log(data);
4041
+ } catch (error) {
4042
+ console.error(error);
4043
+ }
4044
+ }
4045
+
4046
+ // Run the test
4047
+ example().catch(console.error);
4048
+ ```
4049
+
4050
+ ### Parameters
4051
+
4052
+
4053
+ | Name | Type | Description | Notes |
4054
+ |------------- | ------------- | ------------- | -------------|
4055
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
4056
+ | **conversation** | `string` | Interrupt only this conversation id. Omit to interrupt the whole sandbox. | [Optional] [Defaults to `undefined`] |
4057
+
4058
+ ### Return type
4059
+
4060
+ [**SandboxActionResponse**](SandboxActionResponse.md)
4061
+
4062
+ ### Authorization
4063
+
4064
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
4065
+
4066
+ ### HTTP request headers
4067
+
4068
+ - **Content-Type**: Not defined
4069
+ - **Accept**: `application/json`
4070
+
4071
+
4072
+ ### HTTP response details
4073
+ | Status code | Description | Response headers |
4074
+ |-------------|-------------|------------------|
4075
+ | **200** | Interrupt requested. | - |
4076
+ | **401** | Missing or invalid bearer token. | - |
4077
+ | **402** | Account cannot currently create or operate sandboxes. The error body may include a dashboard billing URL, but billing actions are not part of the v1 API. | - |
4078
+ | **404** | Resource not found. | - |
4079
+ | **409** | Request conflicts with current account or sandbox state. | - |
4080
+
4081
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
4082
+
4083
+
4084
+ ## limits
4085
+
4086
+ > LimitsResponse limits(org, xBoatOrg, teamId)
4087
+
4088
+ Get Boat limits
4089
+
4090
+ Check remaining machine starts, compute time, credits, access readiness, and concurrent-sandbox capacity for the wallet a create would bill: the `org` / `X-Boat-Org` you pass (id or name), else the account\'s active wallet, else personal. The response carries `teamId` when an organization wallet was read.
4091
+
4092
+ ### Example
4093
+
4094
+ ```ts
4095
+ import {
4096
+ Configuration,
4097
+ BoatApi,
4098
+ } from '@boatdev/sdk';
4099
+ import type { LimitsRequest } from '@boatdev/sdk';
4100
+
4101
+ async function example() {
4102
+ console.log("🚀 Testing @boatdev/sdk SDK...");
4103
+ const config = new Configuration({
4104
+ // Configure HTTP bearer authorization: BoatBearerAuth
4105
+ accessToken: "YOUR BEARER TOKEN",
4106
+ });
4107
+ const api = new BoatApi(config);
4108
+
4109
+ const body = {
4110
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
4111
+ org: org_example,
4112
+ // string | Same as the `org` query parameter. Query wins when both are set. (optional)
4113
+ xBoatOrg: xBoatOrg_example,
4114
+ // string | Legacy alias for `org`. Takes precedence over `org` / `X-Boat-Org` when set. (optional)
4115
+ teamId: teamId_example,
4116
+ } satisfies LimitsRequest;
4117
+
4118
+ try {
4119
+ const data = await api.limits(body);
3306
4120
  console.log(data);
3307
4121
  } catch (error) {
3308
4122
  console.error(error);
@@ -3318,12 +4132,13 @@ example().catch(console.error);
3318
4132
 
3319
4133
  | Name | Type | Description | Notes |
3320
4134
  |------------- | ------------- | ------------- | -------------|
3321
- | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
3322
- | **conversation** | `string` | Interrupt only this conversation id. Omit to interrupt the whole sandbox. | [Optional] [Defaults to `undefined`] |
4135
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
4136
+ | **xBoatOrg** | `string` | Same as the `org` query parameter. Query wins when both are set. | [Optional] [Defaults to `undefined`] |
4137
+ | **teamId** | `string` | Legacy alias for `org`. Takes precedence over `org` / `X-Boat-Org` when set. | [Optional] [Defaults to `undefined`] |
3323
4138
 
3324
4139
  ### Return type
3325
4140
 
3326
- [**SandboxActionResponse**](SandboxActionResponse.md)
4141
+ [**LimitsResponse**](LimitsResponse.md)
3327
4142
 
3328
4143
  ### Authorization
3329
4144
 
@@ -3338,22 +4153,19 @@ example().catch(console.error);
3338
4153
  ### HTTP response details
3339
4154
  | Status code | Description | Response headers |
3340
4155
  |-------------|-------------|------------------|
3341
- | **200** | Interrupt requested. | - |
4156
+ | **200** | Current creation and concurrent-boat limits. | - |
3342
4157
  | **401** | Missing or invalid bearer token. | - |
3343
- | **402** | Account cannot currently create or operate sandboxes. The error body may include a dashboard billing URL, but billing actions are not part of the v1 API. | - |
3344
- | **404** | Resource not found. | - |
3345
- | **409** | Request conflicts with current account or sandbox state. | - |
3346
4158
 
3347
4159
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
3348
4160
 
3349
4161
 
3350
- ## limits
4162
+ ## listCredentialProfiles
3351
4163
 
3352
- > LimitsResponse limits(org, xBoatOrg, teamId)
4164
+ > CredentialProfileListResponse listCredentialProfiles()
3353
4165
 
3354
- Get Boat limits
4166
+ List credential profiles
3355
4167
 
3356
- Check remaining machine starts, compute time, credits, access readiness, and concurrent-sandbox capacity for the wallet a create would bill: the `org` / `X-Boat-Org` you pass (id or name), else the account\'s active wallet, else personal. The response carries `teamId` when an organization wallet was read.
4168
+ Returns every AI credential profile you can use, yours and your organizations\'. Secret values are never returned. Needs an API key with `account.admin`.
3357
4169
 
3358
4170
  ### Example
3359
4171
 
@@ -3362,7 +4174,7 @@ import {
3362
4174
  Configuration,
3363
4175
  BoatApi,
3364
4176
  } from '@boatdev/sdk';
3365
- import type { LimitsRequest } from '@boatdev/sdk';
4177
+ import type { ListCredentialProfilesRequest } from '@boatdev/sdk';
3366
4178
 
3367
4179
  async function example() {
3368
4180
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -3372,17 +4184,8 @@ async function example() {
3372
4184
  });
3373
4185
  const api = new BoatApi(config);
3374
4186
 
3375
- const body = {
3376
- // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes, snapshots, and environments stay creator-private. (optional)
3377
- org: org_example,
3378
- // string | Same as the `org` query parameter. Query wins when both are set. (optional)
3379
- xBoatOrg: xBoatOrg_example,
3380
- // string | Legacy alias for `org`. Takes precedence over `org` / `X-Boat-Org` when set. (optional)
3381
- teamId: teamId_example,
3382
- } satisfies LimitsRequest;
3383
-
3384
4187
  try {
3385
- const data = await api.limits(body);
4188
+ const data = await api.listCredentialProfiles();
3386
4189
  console.log(data);
3387
4190
  } catch (error) {
3388
4191
  console.error(error);
@@ -3395,16 +4198,11 @@ example().catch(console.error);
3395
4198
 
3396
4199
  ### Parameters
3397
4200
 
3398
-
3399
- | Name | Type | Description | Notes |
3400
- |------------- | ------------- | ------------- | -------------|
3401
- | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes, snapshots, and environments stay creator-private. | [Optional] [Defaults to `undefined`] |
3402
- | **xBoatOrg** | `string` | Same as the `org` query parameter. Query wins when both are set. | [Optional] [Defaults to `undefined`] |
3403
- | **teamId** | `string` | Legacy alias for `org`. Takes precedence over `org` / `X-Boat-Org` when set. | [Optional] [Defaults to `undefined`] |
4201
+ This endpoint does not need any parameter.
3404
4202
 
3405
4203
  ### Return type
3406
4204
 
3407
- [**LimitsResponse**](LimitsResponse.md)
4205
+ [**CredentialProfileListResponse**](CredentialProfileListResponse.md)
3408
4206
 
3409
4207
  ### Authorization
3410
4208
 
@@ -3419,7 +4217,7 @@ example().catch(console.error);
3419
4217
  ### HTTP response details
3420
4218
  | Status code | Description | Response headers |
3421
4219
  |-------------|-------------|------------------|
3422
- | **200** | Current creation and concurrent-boat limits. | - |
4220
+ | **200** | The profiles. | - |
3423
4221
  | **401** | Missing or invalid bearer token. | - |
3424
4222
 
3425
4223
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
@@ -4150,7 +4948,7 @@ example().catch(console.error);
4150
4948
 
4151
4949
  Read a file from a sandbox
4152
4950
 
4153
- Files up to 5 MiB. Use `GET /sandboxes/{sandboxId}/artifacts` for files up to 50 MiB, and SCP over SSH for larger ones.
4951
+ Files up to 5 MiB. For a larger file, use `POST /sandboxes/{sandboxId}/files/download-url`.
4154
4952
 
4155
4953
  ### Example
4156
4954
 
@@ -4786,7 +5584,7 @@ async function example() {
4786
5584
  const api = new BoatApi(config);
4787
5585
 
4788
5586
  const body = {
4789
- // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes, snapshots, and environments stay creator-private. (optional)
5587
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
4790
5588
  org: org_example,
4791
5589
  // string | Same as the `org` query parameter. Query wins when both are set. (optional)
4792
5590
  xBoatOrg: xBoatOrg_example,
@@ -4817,7 +5615,7 @@ example().catch(console.error);
4817
5615
 
4818
5616
  | Name | Type | Description | Notes |
4819
5617
  |------------- | ------------- | ------------- | -------------|
4820
- | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes, snapshots, and environments stay creator-private. | [Optional] [Defaults to `undefined`] |
5618
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
4821
5619
  | **xBoatOrg** | `string` | Same as the `org` query parameter. Query wins when both are set. | [Optional] [Defaults to `undefined`] |
4822
5620
  | **limit** | `number` | Maximum items to return. | [Optional] [Defaults to `100`] |
4823
5621
  | **cursor** | `string` | Opaque pagination cursor returned as `pageInfo.nextCursor`. | [Optional] [Defaults to `undefined`] |
@@ -4878,7 +5676,221 @@ async function example() {
4878
5676
  } satisfies SaveNamedSnapshotRequest;
4879
5677
 
4880
5678
  try {
4881
- const data = await api.saveNamedSnapshot(body);
5679
+ const data = await api.saveNamedSnapshot(body);
5680
+ console.log(data);
5681
+ } catch (error) {
5682
+ console.error(error);
5683
+ }
5684
+ }
5685
+
5686
+ // Run the test
5687
+ example().catch(console.error);
5688
+ ```
5689
+
5690
+ ### Parameters
5691
+
5692
+
5693
+ | Name | Type | Description | Notes |
5694
+ |------------- | ------------- | ------------- | -------------|
5695
+ | **namedSnapshotSaveRequest** | [NamedSnapshotSaveRequest](NamedSnapshotSaveRequest.md) | | |
5696
+
5697
+ ### Return type
5698
+
5699
+ [**NamedSnapshotSavingResponse**](NamedSnapshotSavingResponse.md)
5700
+
5701
+ ### Authorization
5702
+
5703
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
5704
+
5705
+ ### HTTP request headers
5706
+
5707
+ - **Content-Type**: `application/json`
5708
+ - **Accept**: `application/json`
5709
+
5710
+
5711
+ ### HTTP response details
5712
+ | Status code | Description | Response headers |
5713
+ |-------------|-------------|------------------|
5714
+ | **202** | Save accepted and running in the background. | - |
5715
+ | **400** | Invalid request body or parameters. | - |
5716
+ | **401** | Missing or invalid bearer token. | - |
5717
+ | **404** | Resource not found. | - |
5718
+ | **402** | `credit_required`: the wallet already keeps 10 or more named snapshots and has no credit left. Each named snapshot above the free 10 costs $1.70 a month, charged daily. Add credit or remove one. | - |
5719
+ | **409** | `save_in_progress` when a save under this name is already running; wait for it to settle rather than retrying immediately. | - |
5720
+
5721
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
5722
+
5723
+
5724
+ ## secrets
5725
+
5726
+ > SecretsResponse secrets()
5727
+
5728
+ Get Boat secrets setup
5729
+
5730
+ Returns the environment variables and secret files configured for sandboxes.
5731
+
5732
+ ### Example
5733
+
5734
+ ```ts
5735
+ import {
5736
+ Configuration,
5737
+ BoatApi,
5738
+ } from '@boatdev/sdk';
5739
+ import type { SecretsRequest } from '@boatdev/sdk';
5740
+
5741
+ async function example() {
5742
+ console.log("🚀 Testing @boatdev/sdk SDK...");
5743
+ const config = new Configuration({
5744
+ // Configure HTTP bearer authorization: BoatBearerAuth
5745
+ accessToken: "YOUR BEARER TOKEN",
5746
+ });
5747
+ const api = new BoatApi(config);
5748
+
5749
+ try {
5750
+ const data = await api.secrets();
5751
+ console.log(data);
5752
+ } catch (error) {
5753
+ console.error(error);
5754
+ }
5755
+ }
5756
+
5757
+ // Run the test
5758
+ example().catch(console.error);
5759
+ ```
5760
+
5761
+ ### Parameters
5762
+
5763
+ This endpoint does not need any parameter.
5764
+
5765
+ ### Return type
5766
+
5767
+ [**SecretsResponse**](SecretsResponse.md)
5768
+
5769
+ ### Authorization
5770
+
5771
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
5772
+
5773
+ ### HTTP request headers
5774
+
5775
+ - **Content-Type**: Not defined
5776
+ - **Accept**: `application/json`
5777
+
5778
+
5779
+ ### HTTP response details
5780
+ | Status code | Description | Response headers |
5781
+ |-------------|-------------|------------------|
5782
+ | **200** | Current secret setup metadata. | - |
5783
+ | **401** | Missing or invalid bearer token. | - |
5784
+
5785
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
5786
+
5787
+
5788
+ ## selectRepo
5789
+
5790
+ > RepoSelectionResponse selectRepo(repoSelectionRequest)
5791
+
5792
+ Select repository for sandboxes
5793
+
5794
+ Idempotently selects one repository for the sandbox environment. Use `databaseId` from `GET /repos` as `repositoryId`; selecting an already-selected repository updates its `baseBranch`.
5795
+
5796
+ ### Example
5797
+
5798
+ ```ts
5799
+ import {
5800
+ Configuration,
5801
+ BoatApi,
5802
+ } from '@boatdev/sdk';
5803
+ import type { SelectRepoRequest } from '@boatdev/sdk';
5804
+
5805
+ async function example() {
5806
+ console.log("🚀 Testing @boatdev/sdk SDK...");
5807
+ const config = new Configuration({
5808
+ // Configure HTTP bearer authorization: BoatBearerAuth
5809
+ accessToken: "YOUR BEARER TOKEN",
5810
+ });
5811
+ const api = new BoatApi(config);
5812
+
5813
+ const body = {
5814
+ // RepoSelectionRequest
5815
+ repoSelectionRequest: ...,
5816
+ } satisfies SelectRepoRequest;
5817
+
5818
+ try {
5819
+ const data = await api.selectRepo(body);
5820
+ console.log(data);
5821
+ } catch (error) {
5822
+ console.error(error);
5823
+ }
5824
+ }
5825
+
5826
+ // Run the test
5827
+ example().catch(console.error);
5828
+ ```
5829
+
5830
+ ### Parameters
5831
+
5832
+
5833
+ | Name | Type | Description | Notes |
5834
+ |------------- | ------------- | ------------- | -------------|
5835
+ | **repoSelectionRequest** | [RepoSelectionRequest](RepoSelectionRequest.md) | | |
5836
+
5837
+ ### Return type
5838
+
5839
+ [**RepoSelectionResponse**](RepoSelectionResponse.md)
5840
+
5841
+ ### Authorization
5842
+
5843
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
5844
+
5845
+ ### HTTP request headers
5846
+
5847
+ - **Content-Type**: `application/json`
5848
+ - **Accept**: `application/json`
5849
+
5850
+
5851
+ ### HTTP response details
5852
+ | Status code | Description | Response headers |
5853
+ |-------------|-------------|------------------|
5854
+ | **200** | Updated repository selection. | - |
5855
+ | **400** | Invalid request body or parameters. | - |
5856
+ | **401** | Missing or invalid bearer token. | - |
5857
+ | **409** | Request conflicts with current account or sandbox state. | - |
5858
+
5859
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
5860
+
5861
+
5862
+ ## setActiveOrganization
5863
+
5864
+ > ActiveOrgResponse setActiveOrganization(activeOrgUpdateRequest)
5865
+
5866
+ Set the active organization
5867
+
5868
+ Set the wallet new sandboxes bill when a request names none, for this account on every client: the API, the CLI (`boat org switch` sets the same value) and the dashboard. Pass an organization id or name you belong to, or `personal` (or `null`) for your own account. `GET /limits` follows it. Sandboxes already running keep the wallet they were created with; leaving or deleting the organization resets the account to personal.
5869
+
5870
+ ### Example
5871
+
5872
+ ```ts
5873
+ import {
5874
+ Configuration,
5875
+ BoatApi,
5876
+ } from '@boatdev/sdk';
5877
+ import type { SetActiveOrganizationRequest } from '@boatdev/sdk';
5878
+
5879
+ async function example() {
5880
+ console.log("🚀 Testing @boatdev/sdk SDK...");
5881
+ const config = new Configuration({
5882
+ // Configure HTTP bearer authorization: BoatBearerAuth
5883
+ accessToken: "YOUR BEARER TOKEN",
5884
+ });
5885
+ const api = new BoatApi(config);
5886
+
5887
+ const body = {
5888
+ // ActiveOrgUpdateRequest
5889
+ activeOrgUpdateRequest: {"org":"acme"},
5890
+ } satisfies SetActiveOrganizationRequest;
5891
+
5892
+ try {
5893
+ const data = await api.setActiveOrganization(body);
4882
5894
  console.log(data);
4883
5895
  } catch (error) {
4884
5896
  console.error(error);
@@ -4894,11 +5906,11 @@ example().catch(console.error);
4894
5906
 
4895
5907
  | Name | Type | Description | Notes |
4896
5908
  |------------- | ------------- | ------------- | -------------|
4897
- | **namedSnapshotSaveRequest** | [NamedSnapshotSaveRequest](NamedSnapshotSaveRequest.md) | | |
5909
+ | **activeOrgUpdateRequest** | [ActiveOrgUpdateRequest](ActiveOrgUpdateRequest.md) | | |
4898
5910
 
4899
5911
  ### Return type
4900
5912
 
4901
- [**NamedSnapshotSavingResponse**](NamedSnapshotSavingResponse.md)
5913
+ [**ActiveOrgResponse**](ActiveOrgResponse.md)
4902
5914
 
4903
5915
  ### Authorization
4904
5916
 
@@ -4913,23 +5925,22 @@ example().catch(console.error);
4913
5925
  ### HTTP response details
4914
5926
  | Status code | Description | Response headers |
4915
5927
  |-------------|-------------|------------------|
4916
- | **202** | Save accepted and running in the background. | - |
5928
+ | **200** | The wallet now active. | - |
4917
5929
  | **400** | Invalid request body or parameters. | - |
4918
5930
  | **401** | Missing or invalid bearer token. | - |
4919
- | **404** | Resource not found. | - |
4920
- | **402** | `credit_required`: the wallet already keeps 10 or more named snapshots and has no credit left. Each named snapshot above the free 10 costs $1.70 a month, charged daily. Add credit or remove one. | - |
4921
- | **409** | `save_in_progress` when a save under this name is already running; wait for it to settle rather than retrying immediately. | - |
5931
+ | **403** | `not_org_member`: no organization with that id or name that you belong to. | - |
5932
+ | **409** | `ambiguous_org`: several of your organizations share that name; pass the id. | - |
4922
5933
 
4923
5934
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
4924
5935
 
4925
5936
 
4926
- ## secrets
5937
+ ## setCredentialProfileCustomApi
4927
5938
 
4928
- > SecretsResponse secrets()
5939
+ > CredentialProfileResponse setCredentialProfileCustomApi(profile, name, setCustomApiRequest)
4929
5940
 
4930
- Get Boat secrets setup
5941
+ Set a custom API
4931
5942
 
4932
- Returns the environment variables and secret files configured for sandboxes.
5943
+ Adds or replaces one custom API. The sandbox gets `<NAME>` and `<NAME>_BASE_URL`. Needs an API key with `account.admin`.
4933
5944
 
4934
5945
  ### Example
4935
5946
 
@@ -4938,7 +5949,7 @@ import {
4938
5949
  Configuration,
4939
5950
  BoatApi,
4940
5951
  } from '@boatdev/sdk';
4941
- import type { SecretsRequest } from '@boatdev/sdk';
5952
+ import type { SetCredentialProfileCustomApiRequest } from '@boatdev/sdk';
4942
5953
 
4943
5954
  async function example() {
4944
5955
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -4948,8 +5959,17 @@ async function example() {
4948
5959
  });
4949
5960
  const api = new BoatApi(config);
4950
5961
 
5962
+ const body = {
5963
+ // string | Profile id or name.
5964
+ profile: profile_example,
5965
+ // string | Environment variable name of the custom API, for example `STRIPE_KEY`. Provider names (`ANTHROPIC_*`, `OPENAI_*`, and so on) and names that end in `_BASE_URL` are reserved.
5966
+ name: name_example,
5967
+ // SetCustomApiRequest
5968
+ setCustomApiRequest: {"value":"sk_live_123","baseUrl":"https://api.stripe.com/v1"},
5969
+ } satisfies SetCredentialProfileCustomApiRequest;
5970
+
4951
5971
  try {
4952
- const data = await api.secrets();
5972
+ const data = await api.setCredentialProfileCustomApi(body);
4953
5973
  console.log(data);
4954
5974
  } catch (error) {
4955
5975
  console.error(error);
@@ -4962,11 +5982,16 @@ example().catch(console.error);
4962
5982
 
4963
5983
  ### Parameters
4964
5984
 
4965
- This endpoint does not need any parameter.
5985
+
5986
+ | Name | Type | Description | Notes |
5987
+ |------------- | ------------- | ------------- | -------------|
5988
+ | **profile** | `string` | Profile id or name. | [Defaults to `undefined`] |
5989
+ | **name** | `string` | Environment variable name of the custom API, for example `STRIPE_KEY`. Provider names (`ANTHROPIC_*`, `OPENAI_*`, and so on) and names that end in `_BASE_URL` are reserved. | [Defaults to `undefined`] |
5990
+ | **setCustomApiRequest** | [SetCustomApiRequest](SetCustomApiRequest.md) | | |
4966
5991
 
4967
5992
  ### Return type
4968
5993
 
4969
- [**SecretsResponse**](SecretsResponse.md)
5994
+ [**CredentialProfileResponse**](CredentialProfileResponse.md)
4970
5995
 
4971
5996
  ### Authorization
4972
5997
 
@@ -4974,26 +5999,29 @@ This endpoint does not need any parameter.
4974
5999
 
4975
6000
  ### HTTP request headers
4976
6001
 
4977
- - **Content-Type**: Not defined
6002
+ - **Content-Type**: `application/json`
4978
6003
  - **Accept**: `application/json`
4979
6004
 
4980
6005
 
4981
6006
  ### HTTP response details
4982
6007
  | Status code | Description | Response headers |
4983
6008
  |-------------|-------------|------------------|
4984
- | **200** | Current secret setup metadata. | - |
6009
+ | **200** | The updated profile. | - |
6010
+ | **400** | Invalid request body or parameters. | - |
4985
6011
  | **401** | Missing or invalid bearer token. | - |
6012
+ | **403** | Authenticated token is not allowed to perform this action. | - |
6013
+ | **404** | Resource not found. | - |
4986
6014
 
4987
6015
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
4988
6016
 
4989
6017
 
4990
- ## selectRepo
6018
+ ## setCredentialProfileKey
4991
6019
 
4992
- > RepoSelectionResponse selectRepo(repoSelectionRequest)
6020
+ > CredentialProfileResponse setCredentialProfileKey(profile, credential, setCredentialKeyRequest)
4993
6021
 
4994
- Select repository for sandboxes
6022
+ Set a credential profile API key
4995
6023
 
4996
- Idempotently selects one repository for the sandbox environment. Use `databaseId` from `GET /repos` as `repositoryId`; selecting an already-selected repository updates its `baseBranch`.
6024
+ Sets one API key. A sign-in id returns `400 not_an_api_key`; connect sign-ins on the dashboard Agents page. Running sandboxes that use the profile get the new key. Needs an API key with `account.admin`.
4997
6025
 
4998
6026
  ### Example
4999
6027
 
@@ -5002,7 +6030,7 @@ import {
5002
6030
  Configuration,
5003
6031
  BoatApi,
5004
6032
  } from '@boatdev/sdk';
5005
- import type { SelectRepoRequest } from '@boatdev/sdk';
6033
+ import type { SetCredentialProfileKeyRequest } from '@boatdev/sdk';
5006
6034
 
5007
6035
  async function example() {
5008
6036
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -5013,12 +6041,16 @@ async function example() {
5013
6041
  const api = new BoatApi(config);
5014
6042
 
5015
6043
  const body = {
5016
- // RepoSelectionRequest
5017
- repoSelectionRequest: ...,
5018
- } satisfies SelectRepoRequest;
6044
+ // string | Profile id or name.
6045
+ profile: profile_example,
6046
+ // CredentialId
6047
+ credential: ...,
6048
+ // SetCredentialKeyRequest
6049
+ setCredentialKeyRequest: ...,
6050
+ } satisfies SetCredentialProfileKeyRequest;
5019
6051
 
5020
6052
  try {
5021
- const data = await api.selectRepo(body);
6053
+ const data = await api.setCredentialProfileKey(body);
5022
6054
  console.log(data);
5023
6055
  } catch (error) {
5024
6056
  console.error(error);
@@ -5034,11 +6066,13 @@ example().catch(console.error);
5034
6066
 
5035
6067
  | Name | Type | Description | Notes |
5036
6068
  |------------- | ------------- | ------------- | -------------|
5037
- | **repoSelectionRequest** | [RepoSelectionRequest](RepoSelectionRequest.md) | | |
6069
+ | **profile** | `string` | Profile id or name. | [Defaults to `undefined`] |
6070
+ | **credential** | `CredentialId` | | [Defaults to `undefined`] [Enum: anthropic-api-key, openai-api-key, openrouter-api-key, llmgateway-api-key, deepseek-api-key, moonshot-api-key, mistral-api-key, claude-subscription, chatgpt-subscription, kimi-subscription, mistral-vibe-subscription, claude-bedrock, codex-bedrock] |
6071
+ | **setCredentialKeyRequest** | [SetCredentialKeyRequest](SetCredentialKeyRequest.md) | | |
5038
6072
 
5039
6073
  ### Return type
5040
6074
 
5041
- [**RepoSelectionResponse**](RepoSelectionResponse.md)
6075
+ [**CredentialProfileResponse**](CredentialProfileResponse.md)
5042
6076
 
5043
6077
  ### Authorization
5044
6078
 
@@ -5053,21 +6087,22 @@ example().catch(console.error);
5053
6087
  ### HTTP response details
5054
6088
  | Status code | Description | Response headers |
5055
6089
  |-------------|-------------|------------------|
5056
- | **200** | Updated repository selection. | - |
6090
+ | **200** | The updated profile. | - |
5057
6091
  | **400** | Invalid request body or parameters. | - |
5058
6092
  | **401** | Missing or invalid bearer token. | - |
5059
- | **409** | Request conflicts with current account or sandbox state. | - |
6093
+ | **403** | Authenticated token is not allowed to perform this action. | - |
6094
+ | **404** | Resource not found. | - |
5060
6095
 
5061
6096
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
5062
6097
 
5063
6098
 
5064
- ## setActiveOrganization
6099
+ ## setEnvironmentSecretFile
5065
6100
 
5066
- > ActiveOrgResponse setActiveOrganization(activeOrgUpdateRequest)
6101
+ > EnvironmentItemChangeResponse setEnvironmentSecretFile(environmentId, setEnvironmentSecretFileRequest, org)
5067
6102
 
5068
- Set the active organization
6103
+ Write one secret file
5069
6104
 
5070
- Set the wallet new sandboxes bill when a request names none, for this account on every client: the API, the CLI (`boat org switch` sets the same value) and the dashboard. Pass an organization id or name you belong to, or `personal` (or `null`) for your own account. `GET /limits` follows it. Sandboxes already running keep the wallet they were created with; leaving or deleting the organization resets the account to personal.
6105
+ Adds or replaces a single secret file by path. Mints a new immutable version.
5071
6106
 
5072
6107
  ### Example
5073
6108
 
@@ -5076,7 +6111,7 @@ import {
5076
6111
  Configuration,
5077
6112
  BoatApi,
5078
6113
  } from '@boatdev/sdk';
5079
- import type { SetActiveOrganizationRequest } from '@boatdev/sdk';
6114
+ import type { SetEnvironmentSecretFileOperationRequest } from '@boatdev/sdk';
5080
6115
 
5081
6116
  async function example() {
5082
6117
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -5087,12 +6122,16 @@ async function example() {
5087
6122
  const api = new BoatApi(config);
5088
6123
 
5089
6124
  const body = {
5090
- // ActiveOrgUpdateRequest
5091
- activeOrgUpdateRequest: {"org":"acme"},
5092
- } satisfies SetActiveOrganizationRequest;
6125
+ // string
6126
+ environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
6127
+ // SetEnvironmentSecretFileRequest
6128
+ setEnvironmentSecretFileRequest: ...,
6129
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
6130
+ org: org_example,
6131
+ } satisfies SetEnvironmentSecretFileOperationRequest;
5093
6132
 
5094
6133
  try {
5095
- const data = await api.setActiveOrganization(body);
6134
+ const data = await api.setEnvironmentSecretFile(body);
5096
6135
  console.log(data);
5097
6136
  } catch (error) {
5098
6137
  console.error(error);
@@ -5108,11 +6147,13 @@ example().catch(console.error);
5108
6147
 
5109
6148
  | Name | Type | Description | Notes |
5110
6149
  |------------- | ------------- | ------------- | -------------|
5111
- | **activeOrgUpdateRequest** | [ActiveOrgUpdateRequest](ActiveOrgUpdateRequest.md) | | |
6150
+ | **environmentId** | `string` | | [Defaults to `undefined`] |
6151
+ | **setEnvironmentSecretFileRequest** | [SetEnvironmentSecretFileRequest](SetEnvironmentSecretFileRequest.md) | | |
6152
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
5112
6153
 
5113
6154
  ### Return type
5114
6155
 
5115
- [**ActiveOrgResponse**](ActiveOrgResponse.md)
6156
+ [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
5116
6157
 
5117
6158
  ### Authorization
5118
6159
 
@@ -5127,22 +6168,21 @@ example().catch(console.error);
5127
6168
  ### HTTP response details
5128
6169
  | Status code | Description | Response headers |
5129
6170
  |-------------|-------------|------------------|
5130
- | **200** | The wallet now active. | - |
6171
+ | **200** | New version minted. | - |
5131
6172
  | **400** | Invalid request body or parameters. | - |
5132
6173
  | **401** | Missing or invalid bearer token. | - |
5133
- | **403** | `not_org_member`: no organization with that id or name that you belong to. | - |
5134
- | **409** | `ambiguous_org`: several of your organizations share that name; pass the id. | - |
6174
+ | **404** | Resource not found. | - |
5135
6175
 
5136
6176
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
5137
6177
 
5138
6178
 
5139
- ## setEnvironmentSecretFile
6179
+ ## setEnvironmentVar
5140
6180
 
5141
- > EnvironmentItemChangeResponse setEnvironmentSecretFile(environmentId, setEnvironmentSecretFileRequest)
6181
+ > EnvironmentItemChangeResponse setEnvironmentVar(environmentId, key, setEnvironmentVarRequest, org)
5142
6182
 
5143
- Write one secret file
6183
+ Set one environment variable
5144
6184
 
5145
- Adds or replaces a single secret file by path. Mints a new immutable version.
6185
+ Sets or replaces a single variable without reading or rewriting the rest. Mints a new immutable version.
5146
6186
 
5147
6187
  ### Example
5148
6188
 
@@ -5151,7 +6191,7 @@ import {
5151
6191
  Configuration,
5152
6192
  BoatApi,
5153
6193
  } from '@boatdev/sdk';
5154
- import type { SetEnvironmentSecretFileOperationRequest } from '@boatdev/sdk';
6194
+ import type { SetEnvironmentVarOperationRequest } from '@boatdev/sdk';
5155
6195
 
5156
6196
  async function example() {
5157
6197
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -5164,12 +6204,16 @@ async function example() {
5164
6204
  const body = {
5165
6205
  // string
5166
6206
  environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
5167
- // SetEnvironmentSecretFileRequest
5168
- setEnvironmentSecretFileRequest: ...,
5169
- } satisfies SetEnvironmentSecretFileOperationRequest;
6207
+ // string | Environment variable name.
6208
+ key: key_example,
6209
+ // SetEnvironmentVarRequest
6210
+ setEnvironmentVarRequest: ...,
6211
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
6212
+ org: org_example,
6213
+ } satisfies SetEnvironmentVarOperationRequest;
5170
6214
 
5171
6215
  try {
5172
- const data = await api.setEnvironmentSecretFile(body);
6216
+ const data = await api.setEnvironmentVar(body);
5173
6217
  console.log(data);
5174
6218
  } catch (error) {
5175
6219
  console.error(error);
@@ -5186,7 +6230,9 @@ example().catch(console.error);
5186
6230
  | Name | Type | Description | Notes |
5187
6231
  |------------- | ------------- | ------------- | -------------|
5188
6232
  | **environmentId** | `string` | | [Defaults to `undefined`] |
5189
- | **setEnvironmentSecretFileRequest** | [SetEnvironmentSecretFileRequest](SetEnvironmentSecretFileRequest.md) | | |
6233
+ | **key** | `string` | Environment variable name. | [Defaults to `undefined`] |
6234
+ | **setEnvironmentVarRequest** | [SetEnvironmentVarRequest](SetEnvironmentVarRequest.md) | | |
6235
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
5190
6236
 
5191
6237
  ### Return type
5192
6238
 
@@ -5213,13 +6259,13 @@ example().catch(console.error);
5213
6259
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
5214
6260
 
5215
6261
 
5216
- ## setEnvironmentVar
6262
+ ## setSandboxAiAccess
5217
6263
 
5218
- > EnvironmentItemChangeResponse setEnvironmentVar(environmentId, key, setEnvironmentVarRequest)
6264
+ > SandboxAiAccessResponse setSandboxAiAccess(sandboxId, setSandboxAiAccessRequest)
5219
6265
 
5220
- Set one environment variable
6266
+ Block or unblock sandbox AI access
5221
6267
 
5222
- Sets or replaces a single variable without reading or rewriting the rest. Mints a new immutable version.
6268
+ Blocks or unblocks the sandbox\'s AI placeholders, running or stopped. The proxy refuses a blocked sandbox\'s requests with `403`. It has no effect on a sandbox that holds real keys. The sandbox creator, or a manager of its credential profile, can call it. Needs an API key with `account.admin`.
5223
6269
 
5224
6270
  ### Example
5225
6271
 
@@ -5228,7 +6274,7 @@ import {
5228
6274
  Configuration,
5229
6275
  BoatApi,
5230
6276
  } from '@boatdev/sdk';
5231
- import type { SetEnvironmentVarOperationRequest } from '@boatdev/sdk';
6277
+ import type { SetSandboxAiAccessOperationRequest } from '@boatdev/sdk';
5232
6278
 
5233
6279
  async function example() {
5234
6280
  console.log("🚀 Testing @boatdev/sdk SDK...");
@@ -5239,16 +6285,14 @@ async function example() {
5239
6285
  const api = new BoatApi(config);
5240
6286
 
5241
6287
  const body = {
5242
- // string
5243
- environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
5244
- // string | Environment variable name.
5245
- key: key_example,
5246
- // SetEnvironmentVarRequest
5247
- setEnvironmentVarRequest: ...,
5248
- } satisfies SetEnvironmentVarOperationRequest;
6288
+ // string | Public Sandbox id returned by create/list/get sandbox calls.
6289
+ sandboxId: sandboxId_example,
6290
+ // SetSandboxAiAccessRequest
6291
+ setSandboxAiAccessRequest: ...,
6292
+ } satisfies SetSandboxAiAccessOperationRequest;
5249
6293
 
5250
6294
  try {
5251
- const data = await api.setEnvironmentVar(body);
6295
+ const data = await api.setSandboxAiAccess(body);
5252
6296
  console.log(data);
5253
6297
  } catch (error) {
5254
6298
  console.error(error);
@@ -5264,13 +6308,12 @@ example().catch(console.error);
5264
6308
 
5265
6309
  | Name | Type | Description | Notes |
5266
6310
  |------------- | ------------- | ------------- | -------------|
5267
- | **environmentId** | `string` | | [Defaults to `undefined`] |
5268
- | **key** | `string` | Environment variable name. | [Defaults to `undefined`] |
5269
- | **setEnvironmentVarRequest** | [SetEnvironmentVarRequest](SetEnvironmentVarRequest.md) | | |
6311
+ | **sandboxId** | `string` | Public Sandbox id returned by create/list/get sandbox calls. | [Defaults to `undefined`] |
6312
+ | **setSandboxAiAccessRequest** | [SetSandboxAiAccessRequest](SetSandboxAiAccessRequest.md) | | |
5270
6313
 
5271
6314
  ### Return type
5272
6315
 
5273
- [**EnvironmentItemChangeResponse**](EnvironmentItemChangeResponse.md)
6316
+ [**SandboxAiAccessResponse**](SandboxAiAccessResponse.md)
5274
6317
 
5275
6318
  ### Authorization
5276
6319
 
@@ -5285,9 +6328,10 @@ example().catch(console.error);
5285
6328
  ### HTTP response details
5286
6329
  | Status code | Description | Response headers |
5287
6330
  |-------------|-------------|------------------|
5288
- | **200** | New version minted. | - |
6331
+ | **200** | The new state. | - |
5289
6332
  | **400** | Invalid request body or parameters. | - |
5290
6333
  | **401** | Missing or invalid bearer token. | - |
6334
+ | **403** | Authenticated token is not allowed to perform this action. | - |
5291
6335
  | **404** | Resource not found. | - |
5292
6336
 
5293
6337
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
@@ -5831,6 +6875,165 @@ example().catch(console.error);
5831
6875
  [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
5832
6876
 
5833
6877
 
6878
+ ## updateAiProxy
6879
+
6880
+ > AiProxySettings updateAiProxy(updateAiProxyRequest, org, xBoatOrg)
6881
+
6882
+ Turn the AI credentials proxy on or off
6883
+
6884
+ With the proxy on, sandboxes get placeholder keys and base URLs that point at Boat. Boat swaps in the real key on each request. Real keys never enter the sandbox. Running sandboxes switch at their next start. While on, the account pays $1 of Boat time for each UTC day, plus $1 per 1,000 proxied requests, charged to the wallet each sandbox bills. For an organization, only its owner can change the switch. Needs an API key with `account.admin`.
6885
+
6886
+ ### Example
6887
+
6888
+ ```ts
6889
+ import {
6890
+ Configuration,
6891
+ BoatApi,
6892
+ } from '@boatdev/sdk';
6893
+ import type { UpdateAiProxyOperationRequest } from '@boatdev/sdk';
6894
+
6895
+ async function example() {
6896
+ console.log("🚀 Testing @boatdev/sdk SDK...");
6897
+ const config = new Configuration({
6898
+ // Configure HTTP bearer authorization: BoatBearerAuth
6899
+ accessToken: "YOUR BEARER TOKEN",
6900
+ });
6901
+ const api = new BoatApi(config);
6902
+
6903
+ const body = {
6904
+ // UpdateAiProxyRequest
6905
+ updateAiProxyRequest: ...,
6906
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
6907
+ org: org_example,
6908
+ // string | Same as the `org` query parameter. Query wins when both are set. (optional)
6909
+ xBoatOrg: xBoatOrg_example,
6910
+ } satisfies UpdateAiProxyOperationRequest;
6911
+
6912
+ try {
6913
+ const data = await api.updateAiProxy(body);
6914
+ console.log(data);
6915
+ } catch (error) {
6916
+ console.error(error);
6917
+ }
6918
+ }
6919
+
6920
+ // Run the test
6921
+ example().catch(console.error);
6922
+ ```
6923
+
6924
+ ### Parameters
6925
+
6926
+
6927
+ | Name | Type | Description | Notes |
6928
+ |------------- | ------------- | ------------- | -------------|
6929
+ | **updateAiProxyRequest** | [UpdateAiProxyRequest](UpdateAiProxyRequest.md) | | |
6930
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
6931
+ | **xBoatOrg** | `string` | Same as the `org` query parameter. Query wins when both are set. | [Optional] [Defaults to `undefined`] |
6932
+
6933
+ ### Return type
6934
+
6935
+ [**AiProxySettings**](AiProxySettings.md)
6936
+
6937
+ ### Authorization
6938
+
6939
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
6940
+
6941
+ ### HTTP request headers
6942
+
6943
+ - **Content-Type**: `application/json`
6944
+ - **Accept**: `application/json`
6945
+
6946
+
6947
+ ### HTTP response details
6948
+ | Status code | Description | Response headers |
6949
+ |-------------|-------------|------------------|
6950
+ | **200** | The new state. | - |
6951
+ | **400** | Invalid request body or parameters. | - |
6952
+ | **401** | Missing or invalid bearer token. | - |
6953
+ | **403** | Authenticated token is not allowed to perform this action. | - |
6954
+
6955
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
6956
+
6957
+
6958
+ ## updateCredentialProfile
6959
+
6960
+ > CredentialProfileResponse updateCredentialProfile(profile, updateCredentialProfileRequest)
6961
+
6962
+ Update a credential profile
6963
+
6964
+ Renames the profile, or makes it its owner\'s default. Sandboxes that use the owner\'s default switch to the new default at their next start. Needs an API key with `account.admin`.
6965
+
6966
+ ### Example
6967
+
6968
+ ```ts
6969
+ import {
6970
+ Configuration,
6971
+ BoatApi,
6972
+ } from '@boatdev/sdk';
6973
+ import type { UpdateCredentialProfileOperationRequest } from '@boatdev/sdk';
6974
+
6975
+ async function example() {
6976
+ console.log("🚀 Testing @boatdev/sdk SDK...");
6977
+ const config = new Configuration({
6978
+ // Configure HTTP bearer authorization: BoatBearerAuth
6979
+ accessToken: "YOUR BEARER TOKEN",
6980
+ });
6981
+ const api = new BoatApi(config);
6982
+
6983
+ const body = {
6984
+ // string | Profile id or name.
6985
+ profile: profile_example,
6986
+ // UpdateCredentialProfileRequest
6987
+ updateCredentialProfileRequest: {"isDefault":true},
6988
+ } satisfies UpdateCredentialProfileOperationRequest;
6989
+
6990
+ try {
6991
+ const data = await api.updateCredentialProfile(body);
6992
+ console.log(data);
6993
+ } catch (error) {
6994
+ console.error(error);
6995
+ }
6996
+ }
6997
+
6998
+ // Run the test
6999
+ example().catch(console.error);
7000
+ ```
7001
+
7002
+ ### Parameters
7003
+
7004
+
7005
+ | Name | Type | Description | Notes |
7006
+ |------------- | ------------- | ------------- | -------------|
7007
+ | **profile** | `string` | Profile id or name. | [Defaults to `undefined`] |
7008
+ | **updateCredentialProfileRequest** | [UpdateCredentialProfileRequest](UpdateCredentialProfileRequest.md) | | |
7009
+
7010
+ ### Return type
7011
+
7012
+ [**CredentialProfileResponse**](CredentialProfileResponse.md)
7013
+
7014
+ ### Authorization
7015
+
7016
+ [BoatBearerAuth](../README.md#BoatBearerAuth)
7017
+
7018
+ ### HTTP request headers
7019
+
7020
+ - **Content-Type**: `application/json`
7021
+ - **Accept**: `application/json`
7022
+
7023
+
7024
+ ### HTTP response details
7025
+ | Status code | Description | Response headers |
7026
+ |-------------|-------------|------------------|
7027
+ | **200** | The updated profile. | - |
7028
+ | **400** | Invalid request body or parameters. | - |
7029
+ | **401** | Missing or invalid bearer token. | - |
7030
+ | **403** | Authenticated token is not allowed to perform this action. | - |
7031
+ | **404** | Resource not found. | - |
7032
+ | **409** | Request conflicts with current account or sandbox state. | - |
7033
+
7034
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
7035
+
7036
+
5834
7037
  ## updateDataRetention
5835
7038
 
5836
7039
  > DataRetentionPolicyResponse updateDataRetention(dataRetentionUpdateRequest)
@@ -5908,7 +7111,7 @@ example().catch(console.error);
5908
7111
 
5909
7112
  ## updateEnvironment
5910
7113
 
5911
- > SandboxEnvironmentResponse updateEnvironment(environmentId, updateSandboxEnvironmentRequest)
7114
+ > SandboxEnvironmentResponse updateEnvironment(environmentId, updateSandboxEnvironmentRequest, org)
5912
7115
 
5913
7116
  Update a sandbox environment
5914
7117
 
@@ -5936,6 +7139,8 @@ async function example() {
5936
7139
  environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
5937
7140
  // UpdateSandboxEnvironmentRequest
5938
7141
  updateSandboxEnvironmentRequest: ...,
7142
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
7143
+ org: org_example,
5939
7144
  } satisfies UpdateEnvironmentRequest;
5940
7145
 
5941
7146
  try {
@@ -5957,6 +7162,7 @@ example().catch(console.error);
5957
7162
  |------------- | ------------- | ------------- | -------------|
5958
7163
  | **environmentId** | `string` | Environment id returned by `GET /environments`. | [Defaults to `undefined`] |
5959
7164
  | **updateSandboxEnvironmentRequest** | [UpdateSandboxEnvironmentRequest](UpdateSandboxEnvironmentRequest.md) | | |
7165
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
5960
7166
 
5961
7167
  ### Return type
5962
7168
 
@@ -6133,7 +7339,7 @@ example().catch(console.error);
6133
7339
 
6134
7340
  ## upgradeEnvironment
6135
7341
 
6136
- > UpgradeSandboxEnvironmentResponse upgradeEnvironment(environmentId, upgradeSandboxEnvironmentRequest)
7342
+ > UpgradeSandboxEnvironmentResponse upgradeEnvironment(environmentId, org, upgradeSandboxEnvironmentRequest)
6137
7343
 
6138
7344
  Upgrade sandboxes to an environment\'s latest version
6139
7345
 
@@ -6159,6 +7365,8 @@ async function example() {
6159
7365
  const body = {
6160
7366
  // string
6161
7367
  environmentId: 38400000-8cf0-11bd-b23e-10b96e4ef00d,
7368
+ // string | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. (optional)
7369
+ org: org_example,
6162
7370
  // UpgradeSandboxEnvironmentRequest (optional)
6163
7371
  upgradeSandboxEnvironmentRequest: ...,
6164
7372
  } satisfies UpgradeEnvironmentRequest;
@@ -6181,6 +7389,7 @@ example().catch(console.error);
6181
7389
  | Name | Type | Description | Notes |
6182
7390
  |------------- | ------------- | ------------- | -------------|
6183
7391
  | **environmentId** | `string` | | [Defaults to `undefined`] |
7392
+ | **org** | `string` | Billing wallet for this request: an organization you belong to, by id (`team_…`) or by name as `GET /orgs` lists it (case-insensitive), or `personal`. Omitted, the account\'s active wallet applies (`PATCH /orgs/active`; personal until set). Two organizations sharing the name answer `409 ambiguous_org` and need the id. Sandboxes and snapshots stay creator-private. On `/environments` routes, only this query parameter selects the organization\'s shared environments; the `X-Boat-Org` header and the active wallet do not apply there. Members read them, owners and admins change them. | [Optional] [Defaults to `undefined`] |
6184
7393
  | **upgradeSandboxEnvironmentRequest** | [UpgradeSandboxEnvironmentRequest](UpgradeSandboxEnvironmentRequest.md) | | [Optional] |
6185
7394
 
6186
7395
  ### Return type
@@ -6293,7 +7502,7 @@ example().catch(console.error);
6293
7502
 
6294
7503
  Write a file in a sandbox
6295
7504
 
6296
- Files up to 5 MiB after decoding. Use SCP over SSH for larger files.
7505
+ Files up to 5 MiB after decoding. For a larger file, use `POST /sandboxes/{sandboxId}/files/upload-url`.
6297
7506
 
6298
7507
  ### Example
6299
7508