@1claw/openapi-spec 0.59.8 → 0.59.10

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 (3) hide show
  1. package/openapi.json +3514 -270
  2. package/openapi.yaml +2227 -138
  3. package/package.json +1 -1
package/openapi.json CHANGED
@@ -2,10 +2,10 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "1Claw API",
5
- "version": "0.59.8",
5
+ "version": "0.59.10",
6
6
  "description": "Secure secret management for AI agents. Provides vaults, secrets,\npolicy-based access control, agent identity, Intents API,\nsharing, billing, and audit logging. Automations (workflow_spec,\nwebhook tokens, event triggers, Assist), cloud runtimes with\ninteractive shell sessions, agent memory, and discovery.\n\n## Domains\n\n`api.1claw.co` is canonical: it is the OIDC issuer, the `aud` the API\nmints, and the first entry in `servers` — a generated client takes its\nbase URL from there, and the previous ordering pointed every SDK at the\ndomain the issuer had already left. `api.1claw.xyz` still answers and is\nstill accepted on token validation, because tokens minted before the\nmove carry it; it is never minted now.\n\nOne deliberate exception: the Shroud attestation identity token is\nrequested from GCP with `audience: https://api.1claw.xyz`, so\n`/v1/shroud/attestation` reports that as its `expected_audience`. That\nis accurate rather than stale — the audience is a verification contract\nwith anyone already checking the token, and moving it is a breaking\nchange for them, not a rename.\n\nAll endpoints require JWT Bearer authentication unless marked with\n`security: []`.\n",
7
7
  "contact": {
8
- "email": "ops@1claw.xyz"
8
+ "email": "ops@1claw.co"
9
9
  }
10
10
  },
11
11
  "servers": [
@@ -2442,7 +2442,24 @@
2442
2442
  }
2443
2443
  },
2444
2444
  "400": {
2445
- "$ref": "#/components/responses/BadRequest"
2445
+ "description": "The name is empty or longer than 255 characters. Checked before the consensus gate and the quota, so a malformed request consumes neither an approval nor a rate-limit slot.",
2446
+ "content": {
2447
+ "application/json": {
2448
+ "schema": {
2449
+ "$ref": "#/components/schemas/ProblemDetails"
2450
+ }
2451
+ }
2452
+ }
2453
+ },
2454
+ "409": {
2455
+ "description": "A vault with that name already exists in this organization. Names are unique per org; this previously surfaced as a 500.",
2456
+ "content": {
2457
+ "application/json": {
2458
+ "schema": {
2459
+ "$ref": "#/components/schemas/ProblemDetails"
2460
+ }
2461
+ }
2462
+ }
2446
2463
  }
2447
2464
  }
2448
2465
  },
@@ -11651,6 +11668,40 @@
11651
11668
  "$ref": "#/components/responses/NotFound"
11652
11669
  }
11653
11670
  }
11671
+ },
11672
+ "post": {
11673
+ "tags": [
11674
+ "Platform"
11675
+ ],
11676
+ "summary": "Create an approval on a platform connection",
11677
+ "operationId": "createConnectionApproval",
11678
+ "security": [
11679
+ {
11680
+ "BearerAuth": []
11681
+ }
11682
+ ],
11683
+ "parameters": [
11684
+ {
11685
+ "in": "path",
11686
+ "name": "connectionId",
11687
+ "required": true,
11688
+ "schema": {
11689
+ "type": "string",
11690
+ "format": "uuid"
11691
+ }
11692
+ }
11693
+ ],
11694
+ "responses": {
11695
+ "201": {
11696
+ "description": "Approval created"
11697
+ },
11698
+ "403": {
11699
+ "$ref": "#/components/responses/Forbidden"
11700
+ },
11701
+ "404": {
11702
+ "$ref": "#/components/responses/NotFound"
11703
+ }
11704
+ }
11654
11705
  }
11655
11706
  },
11656
11707
  "/v1/platform/connections/{connectionId}/approvals/{approvalId}": {
@@ -12250,6 +12301,49 @@
12250
12301
  "$ref": "#/components/responses/NotFound"
12251
12302
  }
12252
12303
  }
12304
+ },
12305
+ "post": {
12306
+ "tags": [
12307
+ "Platform"
12308
+ ],
12309
+ "summary": "Alias for PATCH on this path — same handler, same limited settings. Present because some clients cannot send PATCH.",
12310
+ "operationId": "postConnectionAgent",
12311
+ "security": [
12312
+ {
12313
+ "BearerAuth": []
12314
+ }
12315
+ ],
12316
+ "parameters": [
12317
+ {
12318
+ "in": "path",
12319
+ "name": "connectionId",
12320
+ "required": true,
12321
+ "schema": {
12322
+ "type": "string",
12323
+ "format": "uuid"
12324
+ }
12325
+ },
12326
+ {
12327
+ "in": "path",
12328
+ "name": "agentId",
12329
+ "required": true,
12330
+ "schema": {
12331
+ "type": "string",
12332
+ "format": "uuid"
12333
+ }
12334
+ }
12335
+ ],
12336
+ "responses": {
12337
+ "200": {
12338
+ "description": "Agent updated"
12339
+ },
12340
+ "403": {
12341
+ "$ref": "#/components/responses/Forbidden"
12342
+ },
12343
+ "404": {
12344
+ "$ref": "#/components/responses/NotFound"
12345
+ }
12346
+ }
12253
12347
  }
12254
12348
  },
12255
12349
  "/v1/platform/connections/{connectionId}/portfolio": {
@@ -12540,6 +12634,7 @@
12540
12634
  {
12541
12635
  "in": "query",
12542
12636
  "name": "agent_id",
12637
+ "description": "Optional only while the connection has exactly one agent.\nWith more than one it becomes required and the call answers\n400 without it — the Fleet template provisions three.\n",
12543
12638
  "required": false,
12544
12639
  "schema": {
12545
12640
  "type": "string",
@@ -12802,8 +12897,9 @@
12802
12897
  "tags": [
12803
12898
  "Platform"
12804
12899
  ],
12805
- "summary": "Begin passkey enrollment for a connected user",
12806
- "description": "Starts WebAuthn registration for the end-user on this connection.\nPlatform apps use this instead of `POST /v1/auth/passkeys/register/begin` (user JWT only).\n",
12900
+ "summary": "Begin passkey enrollment for a connected user (always 403)",
12901
+ "deprecated": true,
12902
+ "description": "**This endpoint always returns 403 and cannot be made to work.**\nThe description here previously said platform apps should use it\ninstead of `POST /v1/auth/passkeys/register/begin`, which was\nwrong and cost integrators a WebAuthn ceremony to discover.\n\nA passkey enrolled this way is login-capable: it can be asserted\nthrough the public sign-in flow to mint a full, non-delegated\nuser session, so an app that enrolled one would hold a credential\nstronger than the delegation boundary it operates under. The\ncapability was removed for that reason and will not return.\n\n**A passkey is enrolled by the user, in their own session**, via\n`POST /v1/auth/passkeys/register/begin`. For a connected user\nthat means completing the claim flow on the connection first.\n\nTo *use* a passkey a connected user already has, see:\n - `GET /v1/platform/connections/{connectionId}/passkeys` —\n whether the confirm step can be offered at all.\n - `POST /v1/platform/connections/{connectionId}/passkeys/tx-assert/begin`\n and `.../complete` — ask that user to touch their\n authenticator over a specific digest.\n",
12807
12903
  "operationId": "connectionPasskeyEnrollBegin",
12808
12904
  "security": [
12809
12905
  {
@@ -12822,18 +12918,15 @@
12822
12918
  }
12823
12919
  ],
12824
12920
  "responses": {
12825
- "200": {
12826
- "description": "WebAuthn registration ceremony options",
12921
+ "403": {
12922
+ "description": "Always. Platform apps cannot enroll login passkeys for\nconnected users.\n",
12827
12923
  "content": {
12828
12924
  "application/json": {
12829
12925
  "schema": {
12830
- "$ref": "#/components/schemas/PasskeyRegisterBeginResponse"
12926
+ "$ref": "#/components/schemas/ProblemDetails"
12831
12927
  }
12832
12928
  }
12833
12929
  }
12834
- },
12835
- "404": {
12836
- "$ref": "#/components/responses/NotFound"
12837
12930
  }
12838
12931
  }
12839
12932
  }
@@ -12843,7 +12936,9 @@
12843
12936
  "tags": [
12844
12937
  "Platform"
12845
12938
  ],
12846
- "summary": "Complete passkey enrollment for a connected user",
12939
+ "summary": "Complete passkey enrollment for a connected user (always 403)",
12940
+ "deprecated": true,
12941
+ "description": "**This endpoint always returns 403.** See\n`POST /v1/platform/connections/{connectionId}/passkeys/enroll/begin`\nfor why, and for the paths that do work.\n",
12847
12942
  "operationId": "connectionPasskeyEnrollComplete",
12848
12943
  "security": [
12849
12944
  {
@@ -12872,33 +12967,27 @@
12872
12967
  }
12873
12968
  },
12874
12969
  "responses": {
12875
- "201": {
12876
- "description": "Passkey registered",
12970
+ "403": {
12971
+ "description": "Always. Platform apps cannot enroll login passkeys for\nconnected users.\n",
12877
12972
  "content": {
12878
12973
  "application/json": {
12879
12974
  "schema": {
12880
- "$ref": "#/components/schemas/PasskeyRegisterCompleteResponse"
12975
+ "$ref": "#/components/schemas/ProblemDetails"
12881
12976
  }
12882
12977
  }
12883
12978
  }
12884
- },
12885
- "400": {
12886
- "$ref": "#/components/responses/BadRequest"
12887
- },
12888
- "404": {
12889
- "$ref": "#/components/responses/NotFound"
12890
12979
  }
12891
12980
  }
12892
12981
  }
12893
12982
  },
12894
- "/v1/platform/connections/{connectionId}/agents/{agentId}/chat": {
12895
- "post": {
12983
+ "/v1/platform/connections/{connectionId}/passkeys": {
12984
+ "get": {
12896
12985
  "tags": [
12897
12986
  "Platform"
12898
12987
  ],
12899
- "summary": "Chat with a connection agent (plt_ scoped)",
12900
- "description": "Send a chat message to an agent provisioned on this connection, acting as the\nconnected end-user. Use instead of `POST /v1/agents/{id}/chat` with a plt_ key.\n",
12901
- "operationId": "connectionAgentChat",
12988
+ "summary": "Whether a connected user can be asked for a passkey touch",
12989
+ "description": "Answers one question: can this app offer the passkey confirm\nstep to this user? No credential material is returned — not\ncredential ids, not public keys, not enrolment times.\n\n`count` is what matters. Passkeys are bound to the domain they\nwere registered on, so an account can hold credentials that this\ndomain cannot offer; `count` reports only those usable on\n`rp_id`, while `registered_count` is the raw total. Branch on\n`has_passkey`.\n",
12990
+ "operationId": "listConnectionPasskeys",
12902
12991
  "security": [
12903
12992
  {
12904
12993
  "BearerAuth": []
@@ -12913,123 +13002,71 @@
12913
13002
  "type": "string",
12914
13003
  "format": "uuid"
12915
13004
  }
12916
- },
12917
- {
12918
- "in": "path",
12919
- "name": "agentId",
12920
- "required": true,
12921
- "schema": {
12922
- "type": "string",
12923
- "format": "uuid"
12924
- }
12925
- }
12926
- ],
12927
- "requestBody": {
12928
- "required": true,
12929
- "content": {
12930
- "application/json": {
12931
- "schema": {
12932
- "$ref": "#/components/schemas/SendChatMessageRequest"
12933
- }
12934
- }
12935
- }
12936
- },
12937
- "responses": {
12938
- "200": {
12939
- "description": "Message sent (JSON or SSE stream)"
12940
- },
12941
- "402": {
12942
- "description": "Payment required (LLM billing / inference allowance)"
12943
- },
12944
- "403": {
12945
- "$ref": "#/components/responses/Forbidden"
12946
- },
12947
- "404": {
12948
- "$ref": "#/components/responses/NotFound"
12949
- }
12950
- }
12951
- }
12952
- },
12953
- "/v1/approvals": {
12954
- "get": {
12955
- "tags": [
12956
- "Approvals"
12957
- ],
12958
- "summary": "List pending approvals",
12959
- "description": "Returns approvals for the authenticated user's organization.\nHuman-only. Supports filtering by status and pagination.\n",
12960
- "operationId": "listApprovals",
12961
- "parameters": [
12962
- {
12963
- "name": "status",
12964
- "in": "query",
12965
- "required": false,
12966
- "schema": {
12967
- "type": "string",
12968
- "enum": [
12969
- "pending",
12970
- "approved",
12971
- "rejected",
12972
- "expired"
12973
- ]
12974
- },
12975
- "description": "Filter by approval status"
12976
- },
12977
- {
12978
- "name": "limit",
12979
- "in": "query",
12980
- "required": false,
12981
- "schema": {
12982
- "type": "integer",
12983
- "default": 50
12984
- }
12985
- },
12986
- {
12987
- "name": "offset",
12988
- "in": "query",
12989
- "required": false,
12990
- "schema": {
12991
- "type": "integer",
12992
- "default": 0
12993
- }
12994
13005
  }
12995
13006
  ],
12996
13007
  "responses": {
12997
13008
  "200": {
12998
- "description": "Approval list",
13009
+ "description": "Passkey availability for this connection",
12999
13010
  "content": {
13000
13011
  "application/json": {
13001
13012
  "schema": {
13002
13013
  "type": "object",
13003
13014
  "required": [
13004
- "approvals"
13015
+ "has_passkey",
13016
+ "count",
13017
+ "registered_count",
13018
+ "rp_id"
13005
13019
  ],
13006
13020
  "properties": {
13007
- "approvals": {
13008
- "type": "array",
13009
- "items": {
13010
- "$ref": "#/components/schemas/ApprovalResponse"
13011
- }
13021
+ "has_passkey": {
13022
+ "type": "boolean",
13023
+ "description": "True when count > 0."
13024
+ },
13025
+ "count": {
13026
+ "type": "integer",
13027
+ "format": "int64",
13028
+ "description": "Passkeys usable on rp_id."
13029
+ },
13030
+ "registered_count": {
13031
+ "type": "integer",
13032
+ "format": "int64",
13033
+ "description": "All passkeys on the account, including any\nbound to a different domain.\n"
13034
+ },
13035
+ "rp_id": {
13036
+ "type": "string",
13037
+ "description": "The domain these counts are measured against."
13012
13038
  }
13013
13039
  }
13014
13040
  }
13015
13041
  }
13016
13042
  }
13043
+ },
13044
+ "403": {
13045
+ "$ref": "#/components/responses/Forbidden"
13046
+ },
13047
+ "404": {
13048
+ "$ref": "#/components/responses/NotFound"
13017
13049
  }
13018
13050
  }
13019
13051
  }
13020
13052
  },
13021
- "/v1/approvals/{approval_id}": {
13022
- "get": {
13053
+ "/v1/platform/connections/{connectionId}/passkeys/tx-assert/begin": {
13054
+ "post": {
13023
13055
  "tags": [
13024
- "Approvals"
13056
+ "Platform"
13057
+ ],
13058
+ "summary": "Ask a connected user to touch their authenticator",
13059
+ "description": "Begins a WebAuthn assertion bound to `tx_digest`, for the user on\nthis connection. The connection in the path is the addressing\nthat `POST /v1/auth/passkeys/tx-assert/begin` lacks: that route\nresolves the *calling* principal, so with a `plt_` key it looks\nup the app itself and reports no passkeys. An app never needs to\nhold an email to name one of its users.\n\nReturns 404 when the user has no passkey usable on this domain —\ncheck `GET /v1/platform/connections/{connectionId}/passkeys`\nfirst and only offer the step when `has_passkey` is true.\n",
13060
+ "operationId": "connectionPasskeyTxAssertBegin",
13061
+ "security": [
13062
+ {
13063
+ "BearerAuth": []
13064
+ }
13025
13065
  ],
13026
- "summary": "Get approval details",
13027
- "description": "Returns details for a single approval by ID.",
13028
- "operationId": "getApproval",
13029
13066
  "parameters": [
13030
13067
  {
13031
- "name": "approval_id",
13032
13068
  "in": "path",
13069
+ "name": "connectionId",
13033
13070
  "required": true,
13034
13071
  "schema": {
13035
13072
  "type": "string",
@@ -13037,20 +13074,314 @@
13037
13074
  }
13038
13075
  }
13039
13076
  ],
13077
+ "requestBody": {
13078
+ "required": true,
13079
+ "content": {
13080
+ "application/json": {
13081
+ "schema": {
13082
+ "type": "object",
13083
+ "required": [
13084
+ "tx_digest"
13085
+ ],
13086
+ "properties": {
13087
+ "tx_digest": {
13088
+ "type": "string",
13089
+ "description": "SHA-256 hex of the exact text being confirmed."
13090
+ },
13091
+ "action": {
13092
+ "type": "string",
13093
+ "enum": [
13094
+ "send",
13095
+ "swap"
13096
+ ],
13097
+ "default": "send"
13098
+ }
13099
+ }
13100
+ }
13101
+ }
13102
+ }
13103
+ },
13040
13104
  "responses": {
13041
13105
  "200": {
13042
- "description": "Approval details",
13106
+ "description": "WebAuthn assertion ceremony options",
13043
13107
  "content": {
13044
13108
  "application/json": {
13045
13109
  "schema": {
13046
- "$ref": "#/components/schemas/ApprovalResponse"
13110
+ "$ref": "#/components/schemas/PasskeyAssertBeginResponse"
13047
13111
  }
13048
13112
  }
13049
13113
  }
13050
13114
  },
13115
+ "400": {
13116
+ "$ref": "#/components/responses/BadRequest"
13117
+ },
13118
+ "403": {
13119
+ "$ref": "#/components/responses/Forbidden"
13120
+ },
13051
13121
  "404": {
13052
- "$ref": "#/components/responses/NotFound"
13053
- }
13122
+ "description": "This user has no passkey registered.",
13123
+ "content": {
13124
+ "application/json": {
13125
+ "schema": {
13126
+ "$ref": "#/components/schemas/ProblemDetails"
13127
+ }
13128
+ }
13129
+ }
13130
+ }
13131
+ }
13132
+ }
13133
+ },
13134
+ "/v1/platform/connections/{connectionId}/passkeys/tx-assert/complete": {
13135
+ "post": {
13136
+ "tags": [
13137
+ "Platform"
13138
+ ],
13139
+ "summary": "Verify the touch and return proof of it",
13140
+ "description": "Verifies the assertion — origin, rpIdHash, the user-verified\nflag, the signature, and a sign count that must increase, which\nis what catches a cloned authenticator — and returns a\nshort-lived token proving this user touched their authenticator\nover that digest.\n\nThe token records that a platform app requested it. That\nprovenance is deliberate: it proves the touch to your\napplication, and it is **refused** as authorization for a\n1Claw treasury transfer. A user consenting to your action has\nnot consented to moving funds, and those remain a separate\nassertion from the user's own session.\n",
13141
+ "operationId": "connectionPasskeyTxAssertComplete",
13142
+ "security": [
13143
+ {
13144
+ "BearerAuth": []
13145
+ }
13146
+ ],
13147
+ "parameters": [
13148
+ {
13149
+ "in": "path",
13150
+ "name": "connectionId",
13151
+ "required": true,
13152
+ "schema": {
13153
+ "type": "string",
13154
+ "format": "uuid"
13155
+ }
13156
+ }
13157
+ ],
13158
+ "requestBody": {
13159
+ "required": true,
13160
+ "content": {
13161
+ "application/json": {
13162
+ "schema": {
13163
+ "type": "object",
13164
+ "required": [
13165
+ "credential_id",
13166
+ "authenticator_data",
13167
+ "client_data_json",
13168
+ "signature"
13169
+ ],
13170
+ "properties": {
13171
+ "credential_id": {
13172
+ "type": "string"
13173
+ },
13174
+ "authenticator_data": {
13175
+ "type": "string"
13176
+ },
13177
+ "client_data_json": {
13178
+ "type": "string"
13179
+ },
13180
+ "signature": {
13181
+ "type": "string"
13182
+ }
13183
+ }
13184
+ }
13185
+ }
13186
+ }
13187
+ },
13188
+ "responses": {
13189
+ "200": {
13190
+ "description": "Assertion verified",
13191
+ "content": {
13192
+ "application/json": {
13193
+ "schema": {
13194
+ "type": "object",
13195
+ "required": [
13196
+ "passkey_token",
13197
+ "expires_in"
13198
+ ],
13199
+ "properties": {
13200
+ "passkey_token": {
13201
+ "type": "string",
13202
+ "description": "Single-use proof of the touch, bound to the\ndigest and to this user.\n"
13203
+ },
13204
+ "expires_in": {
13205
+ "type": "integer",
13206
+ "description": "Seconds until the token expires."
13207
+ }
13208
+ }
13209
+ }
13210
+ }
13211
+ }
13212
+ },
13213
+ "400": {
13214
+ "$ref": "#/components/responses/BadRequest"
13215
+ },
13216
+ "403": {
13217
+ "$ref": "#/components/responses/Forbidden"
13218
+ },
13219
+ "404": {
13220
+ "$ref": "#/components/responses/NotFound"
13221
+ }
13222
+ }
13223
+ }
13224
+ },
13225
+ "/v1/platform/connections/{connectionId}/agents/{agentId}/chat": {
13226
+ "post": {
13227
+ "tags": [
13228
+ "Platform"
13229
+ ],
13230
+ "summary": "Chat with a connection agent (plt_ scoped)",
13231
+ "description": "Send a chat message to an agent provisioned on this connection, acting as the\nconnected end-user. Use instead of `POST /v1/agents/{id}/chat` with a plt_ key.\n",
13232
+ "operationId": "connectionAgentChat",
13233
+ "security": [
13234
+ {
13235
+ "BearerAuth": []
13236
+ }
13237
+ ],
13238
+ "parameters": [
13239
+ {
13240
+ "in": "path",
13241
+ "name": "connectionId",
13242
+ "required": true,
13243
+ "schema": {
13244
+ "type": "string",
13245
+ "format": "uuid"
13246
+ }
13247
+ },
13248
+ {
13249
+ "in": "path",
13250
+ "name": "agentId",
13251
+ "required": true,
13252
+ "schema": {
13253
+ "type": "string",
13254
+ "format": "uuid"
13255
+ }
13256
+ }
13257
+ ],
13258
+ "requestBody": {
13259
+ "required": true,
13260
+ "content": {
13261
+ "application/json": {
13262
+ "schema": {
13263
+ "$ref": "#/components/schemas/SendChatMessageRequest"
13264
+ }
13265
+ }
13266
+ }
13267
+ },
13268
+ "responses": {
13269
+ "200": {
13270
+ "description": "Message sent (JSON or SSE stream)"
13271
+ },
13272
+ "402": {
13273
+ "description": "Payment required (LLM billing / inference allowance)"
13274
+ },
13275
+ "403": {
13276
+ "$ref": "#/components/responses/Forbidden"
13277
+ },
13278
+ "404": {
13279
+ "$ref": "#/components/responses/NotFound"
13280
+ }
13281
+ }
13282
+ }
13283
+ },
13284
+ "/v1/approvals": {
13285
+ "get": {
13286
+ "tags": [
13287
+ "Approvals"
13288
+ ],
13289
+ "summary": "List pending approvals",
13290
+ "description": "Returns approvals for the authenticated user's organization.\nHuman-only. Supports filtering by status and pagination.\n",
13291
+ "operationId": "listApprovals",
13292
+ "parameters": [
13293
+ {
13294
+ "name": "status",
13295
+ "in": "query",
13296
+ "required": false,
13297
+ "schema": {
13298
+ "type": "string",
13299
+ "enum": [
13300
+ "pending",
13301
+ "approved",
13302
+ "rejected",
13303
+ "expired"
13304
+ ]
13305
+ },
13306
+ "description": "Filter by approval status"
13307
+ },
13308
+ {
13309
+ "name": "limit",
13310
+ "in": "query",
13311
+ "required": false,
13312
+ "schema": {
13313
+ "type": "integer",
13314
+ "default": 50
13315
+ }
13316
+ },
13317
+ {
13318
+ "name": "offset",
13319
+ "in": "query",
13320
+ "required": false,
13321
+ "schema": {
13322
+ "type": "integer",
13323
+ "default": 0
13324
+ }
13325
+ }
13326
+ ],
13327
+ "responses": {
13328
+ "200": {
13329
+ "description": "Approval list",
13330
+ "content": {
13331
+ "application/json": {
13332
+ "schema": {
13333
+ "type": "object",
13334
+ "required": [
13335
+ "approvals"
13336
+ ],
13337
+ "properties": {
13338
+ "approvals": {
13339
+ "type": "array",
13340
+ "items": {
13341
+ "$ref": "#/components/schemas/ApprovalResponse"
13342
+ }
13343
+ }
13344
+ }
13345
+ }
13346
+ }
13347
+ }
13348
+ }
13349
+ }
13350
+ }
13351
+ },
13352
+ "/v1/approvals/{approval_id}": {
13353
+ "get": {
13354
+ "tags": [
13355
+ "Approvals"
13356
+ ],
13357
+ "summary": "Get approval details",
13358
+ "description": "Returns details for a single approval by ID.",
13359
+ "operationId": "getApproval",
13360
+ "parameters": [
13361
+ {
13362
+ "name": "approval_id",
13363
+ "in": "path",
13364
+ "required": true,
13365
+ "schema": {
13366
+ "type": "string",
13367
+ "format": "uuid"
13368
+ }
13369
+ }
13370
+ ],
13371
+ "responses": {
13372
+ "200": {
13373
+ "description": "Approval details",
13374
+ "content": {
13375
+ "application/json": {
13376
+ "schema": {
13377
+ "$ref": "#/components/schemas/ApprovalResponse"
13378
+ }
13379
+ }
13380
+ }
13381
+ },
13382
+ "404": {
13383
+ "$ref": "#/components/responses/NotFound"
13384
+ }
13054
13385
  }
13055
13386
  }
13056
13387
  },
@@ -13189,9 +13520,53 @@
13189
13520
  "$ref": "#/components/responses/Conflict"
13190
13521
  }
13191
13522
  }
13192
- }
13193
- },
13194
- "/v1/deposit-destinations": {
13523
+ },
13524
+ "post": {
13525
+ "tags": [
13526
+ "Approvals"
13527
+ ],
13528
+ "summary": "One-click approve or deny, as an API call. The GET on this path is the preview an email link opens; this is the decision itself.",
13529
+ "operationId": "quickDecide",
13530
+ "requestBody": {
13531
+ "required": true,
13532
+ "content": {
13533
+ "application/json": {
13534
+ "schema": {
13535
+ "type": "object",
13536
+ "required": [
13537
+ "token",
13538
+ "decision"
13539
+ ],
13540
+ "properties": {
13541
+ "token": {
13542
+ "type": "string"
13543
+ },
13544
+ "decision": {
13545
+ "type": "string",
13546
+ "enum": [
13547
+ "approve",
13548
+ "deny"
13549
+ ]
13550
+ }
13551
+ }
13552
+ }
13553
+ }
13554
+ }
13555
+ },
13556
+ "responses": {
13557
+ "200": {
13558
+ "description": "Decision recorded"
13559
+ },
13560
+ "400": {
13561
+ "description": "Malformed or expired token"
13562
+ },
13563
+ "404": {
13564
+ "$ref": "#/components/responses/NotFound"
13565
+ }
13566
+ }
13567
+ }
13568
+ },
13569
+ "/v1/deposit-destinations": {
13195
13570
  "post": {
13196
13571
  "tags": [
13197
13572
  "Treasury"
@@ -16080,6 +16455,16 @@
16080
16455
  },
16081
16456
  "404": {
16082
16457
  "$ref": "#/components/responses/NotFound"
16458
+ },
16459
+ "503": {
16460
+ "description": "The runtime's last start failed less than 120 seconds ago and is not\nbeing retried yet. Chat starts a stopped runtime, so a client that\nretries on failure turns every attempt into another deploy — one\npolling client did exactly that every 8 seconds for days. Wait out\nthe cooldown, or call the start endpoint to see the underlying error.\n",
16461
+ "content": {
16462
+ "application/json": {
16463
+ "schema": {
16464
+ "$ref": "#/components/schemas/ProblemDetails"
16465
+ }
16466
+ }
16467
+ }
16083
16468
  }
16084
16469
  }
16085
16470
  }
@@ -16154,6 +16539,37 @@
16154
16539
  "$ref": "#/components/responses/NotFound"
16155
16540
  }
16156
16541
  }
16542
+ },
16543
+ "delete": {
16544
+ "tags": [
16545
+ "Agent Memory"
16546
+ ],
16547
+ "summary": "Delete a memory namespace and every entry in it. Destructive and not reversible; there is no per-entry confirmation.",
16548
+ "operationId": "deleteMemoryNamespace",
16549
+ "parameters": [
16550
+ {
16551
+ "$ref": "#/components/parameters/AgentId"
16552
+ },
16553
+ {
16554
+ "name": "namespace",
16555
+ "in": "path",
16556
+ "required": true,
16557
+ "schema": {
16558
+ "type": "string"
16559
+ }
16560
+ }
16561
+ ],
16562
+ "responses": {
16563
+ "204": {
16564
+ "description": "Namespace deleted"
16565
+ },
16566
+ "401": {
16567
+ "$ref": "#/components/responses/Unauthorized"
16568
+ },
16569
+ "404": {
16570
+ "$ref": "#/components/responses/NotFound"
16571
+ }
16572
+ }
16157
16573
  }
16158
16574
  },
16159
16575
  "/v1/agents/{agent_id}/memory/{namespace}/{key}": {
@@ -19424,45 +19840,6 @@
19424
19840
  }
19425
19841
  }
19426
19842
  },
19427
- "/v1/auth/credential-recovery/requests/{id}": {
19428
- "delete": {
19429
- "tags": [
19430
- "Credential Recovery"
19431
- ],
19432
- "summary": "Cancel or reject a recovery request",
19433
- "operationId": "cancelCredentialRecovery",
19434
- "security": [
19435
- {
19436
- "BearerAuth": []
19437
- }
19438
- ],
19439
- "parameters": [
19440
- {
19441
- "name": "id",
19442
- "in": "path",
19443
- "required": true,
19444
- "schema": {
19445
- "type": "string",
19446
- "format": "uuid"
19447
- }
19448
- }
19449
- ],
19450
- "responses": {
19451
- "204": {
19452
- "description": "Request cancelled"
19453
- },
19454
- "401": {
19455
- "$ref": "#/components/responses/Unauthorized"
19456
- },
19457
- "403": {
19458
- "$ref": "#/components/responses/Forbidden"
19459
- },
19460
- "404": {
19461
- "$ref": "#/components/responses/NotFound"
19462
- }
19463
- }
19464
- }
19465
- },
19466
19843
  "/v1/org/credential-recovery-policy": {
19467
19844
  "get": {
19468
19845
  "tags": [
@@ -19533,19 +19910,2687 @@
19533
19910
  "$ref": "#/components/responses/Forbidden"
19534
19911
  }
19535
19912
  }
19536
- }
19537
- },
19538
- "/v1/org/shamir-kek/setup": {
19913
+ }
19914
+ },
19915
+ "/v1/agents/batch-delete": {
19916
+ "post": {
19917
+ "tags": [
19918
+ "Agents"
19919
+ ],
19920
+ "summary": "batch delete agents",
19921
+ "operationId": "batch_delete_agents",
19922
+ "responses": {
19923
+ "200": {
19924
+ "description": "Success"
19925
+ },
19926
+ "401": {
19927
+ "description": "Unauthenticated"
19928
+ },
19929
+ "403": {
19930
+ "description": "Forbidden, or the plan does not include this"
19931
+ },
19932
+ "404": {
19933
+ "description": "Not found"
19934
+ }
19935
+ }
19936
+ }
19937
+ },
19938
+ "/v1/agents/enroll/approve": {
19939
+ "post": {
19940
+ "tags": [
19941
+ "Agents"
19942
+ ],
19943
+ "summary": "Authenticated: consume token, create agent, return API key once. **Email-bound pending:** caller must belong to the same org and match `human_email`.",
19944
+ "operationId": "approve_enrollment",
19945
+ "requestBody": {
19946
+ "required": true,
19947
+ "content": {
19948
+ "application/json": {
19949
+ "schema": {
19950
+ "type": "object",
19951
+ "required": [
19952
+ "token"
19953
+ ],
19954
+ "properties": {
19955
+ "token": {
19956
+ "type": "string"
19957
+ },
19958
+ "approval_id": {
19959
+ "type": "string",
19960
+ "format": "uuid",
19961
+ "description": "Consensus approval to spend on this creation.\nApproving an enrollment creates an agent, so it is\ngated on `agent.create` exactly as POST /v1/agents\nis. Orgs without a control-plane consensus policy\nnever need this.\n"
19962
+ }
19963
+ }
19964
+ }
19965
+ }
19966
+ }
19967
+ },
19968
+ "responses": {
19969
+ "200": {
19970
+ "description": "Success"
19971
+ },
19972
+ "401": {
19973
+ "description": "Unauthenticated"
19974
+ },
19975
+ "403": {
19976
+ "description": "Forbidden, the plan does not include this, or the org requires\nM-of-N consensus for `agent.create` and no approval was supplied.\n"
19977
+ },
19978
+ "404": {
19979
+ "description": "Not found"
19980
+ }
19981
+ }
19982
+ }
19983
+ },
19984
+ "/v1/agents/enroll/deny": {
19985
+ "post": {
19986
+ "tags": [
19987
+ "Agents"
19988
+ ],
19989
+ "summary": "Authenticated: consume token and delete pending enrollment (deny). **Email-bound:** caller org and email must match the pending row. **Link-only:** ",
19990
+ "operationId": "deny_enrollment",
19991
+ "requestBody": {
19992
+ "required": true,
19993
+ "content": {
19994
+ "application/json": {
19995
+ "schema": {
19996
+ "type": "object",
19997
+ "required": [
19998
+ "token"
19999
+ ],
20000
+ "properties": {
20001
+ "token": {
20002
+ "type": "string"
20003
+ }
20004
+ }
20005
+ }
20006
+ }
20007
+ }
20008
+ },
20009
+ "responses": {
20010
+ "200": {
20011
+ "description": "Success"
20012
+ },
20013
+ "401": {
20014
+ "description": "Unauthenticated"
20015
+ },
20016
+ "403": {
20017
+ "description": "Forbidden, or the plan does not include this"
20018
+ },
20019
+ "404": {
20020
+ "description": "Not found"
20021
+ }
20022
+ }
20023
+ }
20024
+ },
20025
+ "/v1/agents/enroll/pending": {
20026
+ "get": {
20027
+ "tags": [
20028
+ "Agents"
20029
+ ],
20030
+ "summary": "Public: validate enrollment token and return pending info for the dashboard (agent name, expires_at). Used so the UI can show 'Approve agent X?' witho",
20031
+ "operationId": "get_enrollment_pending",
20032
+ "security": [],
20033
+ "responses": {
20034
+ "200": {
20035
+ "description": "Success"
20036
+ },
20037
+ "404": {
20038
+ "description": "Not found"
20039
+ }
20040
+ }
20041
+ }
20042
+ },
20043
+ "/v1/agents/{agent_id}/channels/{channel_id}/refresh-webhook": {
20044
+ "parameters": [
20045
+ {
20046
+ "name": "agent_id",
20047
+ "in": "path",
20048
+ "required": true,
20049
+ "schema": {
20050
+ "type": "string"
20051
+ }
20052
+ },
20053
+ {
20054
+ "name": "channel_id",
20055
+ "in": "path",
20056
+ "required": true,
20057
+ "schema": {
20058
+ "type": "string"
20059
+ }
20060
+ }
20061
+ ],
20062
+ "post": {
20063
+ "tags": [
20064
+ "Agents"
20065
+ ],
20066
+ "summary": "Re-register the provider webhook for this channel (repairs a stale or revoked subscription).",
20067
+ "operationId": "refresh_channel_webhook",
20068
+ "responses": {
20069
+ "200": {
20070
+ "description": "Success"
20071
+ },
20072
+ "401": {
20073
+ "description": "Unauthenticated"
20074
+ },
20075
+ "403": {
20076
+ "description": "Forbidden, or the plan does not include this"
20077
+ },
20078
+ "404": {
20079
+ "description": "Not found"
20080
+ }
20081
+ }
20082
+ }
20083
+ },
20084
+ "/v1/agents/{agent_id}/channels/{channel_id}/repair": {
20085
+ "parameters": [
20086
+ {
20087
+ "name": "agent_id",
20088
+ "in": "path",
20089
+ "required": true,
20090
+ "schema": {
20091
+ "type": "string"
20092
+ }
20093
+ },
20094
+ {
20095
+ "name": "channel_id",
20096
+ "in": "path",
20097
+ "required": true,
20098
+ "schema": {
20099
+ "type": "string"
20100
+ }
20101
+ }
20102
+ ],
20103
+ "post": {
20104
+ "tags": [
20105
+ "Agents"
20106
+ ],
20107
+ "summary": "Repair a channel: alias of refresh-webhook, re-registers the provider webhook for this channel.",
20108
+ "operationId": "repair_channel_webhook",
20109
+ "responses": {
20110
+ "200": {
20111
+ "description": "Success"
20112
+ },
20113
+ "401": {
20114
+ "description": "Unauthenticated"
20115
+ },
20116
+ "403": {
20117
+ "description": "Forbidden, or the plan does not include this"
20118
+ },
20119
+ "404": {
20120
+ "description": "Not found"
20121
+ }
20122
+ }
20123
+ }
20124
+ },
20125
+ "/v1/agents/{agent_id}/eoa": {
20126
+ "parameters": [
20127
+ {
20128
+ "name": "agent_id",
20129
+ "in": "path",
20130
+ "required": true,
20131
+ "schema": {
20132
+ "type": "string"
20133
+ }
20134
+ }
20135
+ ],
20136
+ "get": {
20137
+ "tags": [
20138
+ "Agents"
20139
+ ],
20140
+ "summary": "Get the agent's EVM address (no private key exposure).",
20141
+ "operationId": "get_agent_eoa",
20142
+ "responses": {
20143
+ "200": {
20144
+ "description": "Success"
20145
+ },
20146
+ "401": {
20147
+ "description": "Unauthenticated"
20148
+ },
20149
+ "403": {
20150
+ "description": "Forbidden, or the plan does not include this"
20151
+ },
20152
+ "404": {
20153
+ "description": "Not found"
20154
+ }
20155
+ }
20156
+ },
20157
+ "post": {
20158
+ "tags": [
20159
+ "Agents"
20160
+ ],
20161
+ "summary": "Generate an EVM EOA for an agent. Creates a secp256k1 key, stores it in the __agent-keys vault, and records the derived address on the agent record.",
20162
+ "operationId": "generate_agent_eoa",
20163
+ "responses": {
20164
+ "200": {
20165
+ "description": "Success"
20166
+ },
20167
+ "401": {
20168
+ "description": "Unauthenticated"
20169
+ },
20170
+ "403": {
20171
+ "description": "Forbidden, or the plan does not include this"
20172
+ },
20173
+ "404": {
20174
+ "description": "Not found"
20175
+ }
20176
+ }
20177
+ }
20178
+ },
20179
+ "/v1/agents/{agent_id}/rotate-signer-key": {
20180
+ "parameters": [
20181
+ {
20182
+ "name": "agent_id",
20183
+ "in": "path",
20184
+ "required": true,
20185
+ "schema": {
20186
+ "type": "string"
20187
+ }
20188
+ }
20189
+ ],
20190
+ "post": {
20191
+ "tags": [
20192
+ "Agents"
20193
+ ],
20194
+ "summary": "Rotate the agent's EVM signer key. Generates a new secp256k1 key, builds a swapOwner UserOp on the Safe, signs with the old key, submits to bundler, a",
20195
+ "operationId": "rotate_signer_key",
20196
+ "responses": {
20197
+ "200": {
20198
+ "description": "Success"
20199
+ },
20200
+ "401": {
20201
+ "description": "Unauthenticated"
20202
+ },
20203
+ "403": {
20204
+ "description": "Forbidden, or the plan does not include this"
20205
+ },
20206
+ "404": {
20207
+ "description": "Not found"
20208
+ }
20209
+ }
20210
+ }
20211
+ },
20212
+ "/v1/agents/{agent_id}/smart-accounts/{chain_id}": {
20213
+ "parameters": [
20214
+ {
20215
+ "name": "agent_id",
20216
+ "in": "path",
20217
+ "required": true,
20218
+ "schema": {
20219
+ "type": "string"
20220
+ }
20221
+ },
20222
+ {
20223
+ "name": "chain_id",
20224
+ "in": "path",
20225
+ "required": true,
20226
+ "schema": {
20227
+ "type": "string"
20228
+ }
20229
+ }
20230
+ ],
20231
+ "delete": {
20232
+ "tags": [
20233
+ "Agents"
20234
+ ],
20235
+ "summary": "delete smart account",
20236
+ "operationId": "delete_smart_account",
20237
+ "responses": {
20238
+ "200": {
20239
+ "description": "Success"
20240
+ },
20241
+ "401": {
20242
+ "description": "Unauthenticated"
20243
+ },
20244
+ "403": {
20245
+ "description": "Forbidden, or the plan does not include this"
20246
+ },
20247
+ "404": {
20248
+ "description": "Not found"
20249
+ }
20250
+ }
20251
+ }
20252
+ },
20253
+ "/v1/agents/{agent_id}/unlock-platform": {
20254
+ "parameters": [
20255
+ {
20256
+ "name": "agent_id",
20257
+ "in": "path",
20258
+ "required": true,
20259
+ "schema": {
20260
+ "type": "string"
20261
+ }
20262
+ }
20263
+ ],
20264
+ "post": {
20265
+ "tags": [
20266
+ "Agents"
20267
+ ],
20268
+ "summary": "User-only. Clears platform_locked when the app is no longer actively connected.",
20269
+ "operationId": "unlock_agent_platform",
20270
+ "responses": {
20271
+ "200": {
20272
+ "description": "Success"
20273
+ },
20274
+ "401": {
20275
+ "description": "Unauthenticated"
20276
+ },
20277
+ "403": {
20278
+ "description": "Forbidden, or the plan does not include this"
20279
+ },
20280
+ "404": {
20281
+ "description": "Not found"
20282
+ }
20283
+ }
20284
+ }
20285
+ },
20286
+ "/v1/audit/export": {
20287
+ "get": {
20288
+ "tags": [
20289
+ "Audit"
20290
+ ],
20291
+ "summary": "export audit events",
20292
+ "operationId": "export_audit_events",
20293
+ "responses": {
20294
+ "200": {
20295
+ "description": "Success"
20296
+ },
20297
+ "401": {
20298
+ "description": "Unauthenticated"
20299
+ },
20300
+ "403": {
20301
+ "description": "Forbidden, or the plan does not include this"
20302
+ },
20303
+ "404": {
20304
+ "description": "Not found"
20305
+ }
20306
+ }
20307
+ }
20308
+ },
20309
+ "/v1/auth/credential-recovery/requests/{id}/cancel": {
20310
+ "parameters": [
20311
+ {
20312
+ "name": "id",
20313
+ "in": "path",
20314
+ "required": true,
20315
+ "schema": {
20316
+ "type": "string"
20317
+ }
20318
+ }
20319
+ ],
20320
+ "post": {
20321
+ "tags": [
20322
+ "Auth"
20323
+ ],
20324
+ "summary": "cancel request",
20325
+ "operationId": "cancel_request",
20326
+ "responses": {
20327
+ "200": {
20328
+ "description": "Success"
20329
+ },
20330
+ "401": {
20331
+ "description": "Unauthenticated"
20332
+ },
20333
+ "403": {
20334
+ "description": "Forbidden, or the plan does not include this"
20335
+ },
20336
+ "404": {
20337
+ "description": "Not found"
20338
+ }
20339
+ }
20340
+ }
20341
+ },
20342
+ "/v1/auth/migration-status": {
20343
+ "get": {
20344
+ "tags": [
20345
+ "Auth"
20346
+ ],
20347
+ "summary": "What the account is currently anchored on, and what has to happen next. The ordering is the part people get wrong, so it lives here rather than being",
20348
+ "operationId": "migration_status",
20349
+ "responses": {
20350
+ "200": {
20351
+ "description": "Success"
20352
+ },
20353
+ "401": {
20354
+ "description": "Unauthenticated"
20355
+ },
20356
+ "403": {
20357
+ "description": "Forbidden, or the plan does not include this"
20358
+ },
20359
+ "404": {
20360
+ "description": "Not found"
20361
+ }
20362
+ }
20363
+ }
20364
+ },
20365
+ "/v1/auth/passkeys/vault-assert/begin": {
20366
+ "post": {
20367
+ "tags": [
20368
+ "Auth"
20369
+ ],
20370
+ "summary": "Begin a passkey assertion that unlocks vault secret reads for users who have `require_passkey_for_vaults` enabled.",
20371
+ "operationId": "vault_assert_begin",
20372
+ "responses": {
20373
+ "200": {
20374
+ "description": "Success"
20375
+ },
20376
+ "401": {
20377
+ "description": "Unauthenticated"
20378
+ },
20379
+ "403": {
20380
+ "description": "Forbidden, or the plan does not include this"
20381
+ },
20382
+ "404": {
20383
+ "description": "Not found"
20384
+ }
20385
+ }
20386
+ }
20387
+ },
20388
+ "/v1/auth/passkeys/vault-assert/complete": {
20389
+ "post": {
20390
+ "tags": [
20391
+ "Auth"
20392
+ ],
20393
+ "summary": "Returns a short-lived `passkey_token` for the `X-Passkey-Token` header on secret reads.",
20394
+ "operationId": "vault_assert_complete",
20395
+ "requestBody": {
20396
+ "required": true,
20397
+ "content": {
20398
+ "application/json": {
20399
+ "schema": {
20400
+ "type": "object",
20401
+ "required": [
20402
+ "credential_id",
20403
+ "authenticator_data",
20404
+ "client_data_json",
20405
+ "signature"
20406
+ ],
20407
+ "properties": {
20408
+ "credential_id": {
20409
+ "type": "string"
20410
+ },
20411
+ "authenticator_data": {
20412
+ "type": "string"
20413
+ },
20414
+ "client_data_json": {
20415
+ "type": "string"
20416
+ },
20417
+ "signature": {
20418
+ "type": "string"
20419
+ }
20420
+ }
20421
+ }
20422
+ }
20423
+ }
20424
+ },
20425
+ "responses": {
20426
+ "200": {
20427
+ "description": "Success"
20428
+ },
20429
+ "401": {
20430
+ "description": "Unauthenticated"
20431
+ },
20432
+ "403": {
20433
+ "description": "Forbidden, or the plan does not include this"
20434
+ },
20435
+ "404": {
20436
+ "description": "Not found"
20437
+ }
20438
+ }
20439
+ }
20440
+ },
20441
+ "/v1/auth/reauth/begin": {
20442
+ "post": {
20443
+ "tags": [
20444
+ "Auth"
20445
+ ],
20446
+ "summary": "start a re-authentication ceremony. For passkey: returns a WebAuthn challenge. For password: returns immediately (no challenge needed).",
20447
+ "operationId": "reauth_begin",
20448
+ "requestBody": {
20449
+ "required": true,
20450
+ "content": {
20451
+ "application/json": {
20452
+ "schema": {
20453
+ "type": "object",
20454
+ "required": [
20455
+ "method"
20456
+ ],
20457
+ "properties": {
20458
+ "method": {
20459
+ "type": "string"
20460
+ },
20461
+ "purpose": {
20462
+ "type": "string"
20463
+ }
20464
+ }
20465
+ }
20466
+ }
20467
+ }
20468
+ },
20469
+ "responses": {
20470
+ "200": {
20471
+ "description": "Success"
20472
+ },
20473
+ "401": {
20474
+ "description": "Unauthenticated"
20475
+ },
20476
+ "403": {
20477
+ "description": "Forbidden, or the plan does not include this"
20478
+ },
20479
+ "404": {
20480
+ "description": "Not found"
20481
+ }
20482
+ }
20483
+ }
20484
+ },
20485
+ "/v1/auth/reauth/complete": {
20486
+ "post": {
20487
+ "tags": [
20488
+ "Auth"
20489
+ ],
20490
+ "summary": "verify re-authentication and issue a single-use token.",
20491
+ "operationId": "reauth_complete",
20492
+ "requestBody": {
20493
+ "required": true,
20494
+ "content": {
20495
+ "application/json": {
20496
+ "schema": {
20497
+ "type": "object",
20498
+ "required": [
20499
+ "method"
20500
+ ],
20501
+ "properties": {
20502
+ "method": {
20503
+ "type": "string"
20504
+ },
20505
+ "purpose": {
20506
+ "type": "string"
20507
+ },
20508
+ "password": {
20509
+ "type": "string"
20510
+ },
20511
+ "credential_id": {
20512
+ "type": "string"
20513
+ },
20514
+ "authenticator_data": {
20515
+ "type": "string"
20516
+ },
20517
+ "client_data_json": {
20518
+ "type": "string"
20519
+ },
20520
+ "signature": {
20521
+ "type": "string"
20522
+ }
20523
+ }
20524
+ }
20525
+ }
20526
+ }
20527
+ },
20528
+ "responses": {
20529
+ "200": {
20530
+ "description": "Success"
20531
+ },
20532
+ "401": {
20533
+ "description": "Unauthenticated"
20534
+ },
20535
+ "403": {
20536
+ "description": "Forbidden, or the plan does not include this"
20537
+ },
20538
+ "404": {
20539
+ "description": "Not found"
20540
+ }
20541
+ }
20542
+ }
20543
+ },
20544
+ "/v1/auth/social/disconnect": {
20545
+ "post": {
20546
+ "tags": [
20547
+ "Auth"
20548
+ ],
20549
+ "summary": "Sever every social identity link, so a social account that once owned this login can no longer reach it. The case this exists for: someone leaves a c",
20550
+ "operationId": "disconnect_social",
20551
+ "responses": {
20552
+ "200": {
20553
+ "description": "Success"
20554
+ },
20555
+ "401": {
20556
+ "description": "Unauthenticated"
20557
+ },
20558
+ "403": {
20559
+ "description": "Forbidden, or the plan does not include this"
20560
+ },
20561
+ "404": {
20562
+ "description": "Not found"
20563
+ }
20564
+ }
20565
+ }
20566
+ },
20567
+ "/v1/auth/sso/authorize": {
20568
+ "get": {
20569
+ "tags": [
20570
+ "Auth"
20571
+ ],
20572
+ "summary": "returns JSON with authorization_url for WorkOS Hosted Auth.",
20573
+ "operationId": "sso_authorize",
20574
+ "responses": {
20575
+ "200": {
20576
+ "description": "Success"
20577
+ },
20578
+ "401": {
20579
+ "description": "Unauthenticated"
20580
+ },
20581
+ "403": {
20582
+ "description": "Forbidden, or the plan does not include this"
20583
+ },
20584
+ "404": {
20585
+ "description": "Not found"
20586
+ }
20587
+ }
20588
+ }
20589
+ },
20590
+ "/v1/auth/sso/callback": {
20591
+ "get": {
20592
+ "tags": [
20593
+ "Auth"
20594
+ ],
20595
+ "summary": "exchange code for profile, find/create user, redirect to dashboard with token.",
20596
+ "operationId": "sso_callback",
20597
+ "responses": {
20598
+ "200": {
20599
+ "description": "Success"
20600
+ },
20601
+ "401": {
20602
+ "description": "Unauthenticated"
20603
+ },
20604
+ "403": {
20605
+ "description": "Forbidden, or the plan does not include this"
20606
+ },
20607
+ "404": {
20608
+ "description": "Not found"
20609
+ }
20610
+ }
20611
+ }
20612
+ },
20613
+ "/v1/auth/sso/status": {
20614
+ "get": {
20615
+ "tags": [
20616
+ "Auth"
20617
+ ],
20618
+ "summary": "returns whether SSO is configured (for dashboard to show/hide SSO button).",
20619
+ "operationId": "sso_status",
20620
+ "responses": {
20621
+ "200": {
20622
+ "description": "Success"
20623
+ },
20624
+ "401": {
20625
+ "description": "Unauthenticated"
20626
+ },
20627
+ "403": {
20628
+ "description": "Forbidden, or the plan does not include this"
20629
+ },
20630
+ "404": {
20631
+ "description": "Not found"
20632
+ }
20633
+ }
20634
+ }
20635
+ },
20636
+ "/v1/billing/llm-models": {
20637
+ "get": {
20638
+ "tags": [
20639
+ "Billing"
20640
+ ],
20641
+ "summary": "get llm models",
20642
+ "operationId": "get_llm_models",
20643
+ "responses": {
20644
+ "200": {
20645
+ "description": "Success"
20646
+ },
20647
+ "401": {
20648
+ "description": "Unauthenticated"
20649
+ },
20650
+ "403": {
20651
+ "description": "Forbidden, or the plan does not include this"
20652
+ },
20653
+ "404": {
20654
+ "description": "Not found"
20655
+ }
20656
+ }
20657
+ }
20658
+ },
20659
+ "/v1/billing/llm-pricing": {
20660
+ "get": {
20661
+ "tags": [
20662
+ "Billing"
20663
+ ],
20664
+ "summary": "get llm pricing",
20665
+ "operationId": "get_llm_pricing",
20666
+ "responses": {
20667
+ "200": {
20668
+ "description": "Success"
20669
+ },
20670
+ "401": {
20671
+ "description": "Unauthenticated"
20672
+ },
20673
+ "403": {
20674
+ "description": "Forbidden, or the plan does not include this"
20675
+ },
20676
+ "404": {
20677
+ "description": "Not found"
20678
+ }
20679
+ }
20680
+ }
20681
+ },
20682
+ "/v1/billing/promo/redeem": {
20683
+ "get": {
20684
+ "tags": [
20685
+ "Billing"
20686
+ ],
20687
+ "summary": "get llm billing status",
20688
+ "operationId": "get_llm_billing_status",
20689
+ "responses": {
20690
+ "200": {
20691
+ "description": "Success"
20692
+ },
20693
+ "401": {
20694
+ "description": "Unauthenticated"
20695
+ },
20696
+ "403": {
20697
+ "description": "Forbidden, or the plan does not include this"
20698
+ },
20699
+ "404": {
20700
+ "description": "Not found"
20701
+ }
20702
+ }
20703
+ },
20704
+ "post": {
20705
+ "tags": [
20706
+ "Billing"
20707
+ ],
20708
+ "summary": "redeem promo",
20709
+ "operationId": "redeem_promo",
20710
+ "requestBody": {
20711
+ "required": true,
20712
+ "content": {
20713
+ "application/json": {
20714
+ "schema": {
20715
+ "type": "object",
20716
+ "required": [
20717
+ "code"
20718
+ ],
20719
+ "properties": {
20720
+ "code": {
20721
+ "type": "string"
20722
+ }
20723
+ }
20724
+ }
20725
+ }
20726
+ }
20727
+ },
20728
+ "responses": {
20729
+ "200": {
20730
+ "description": "Success"
20731
+ },
20732
+ "401": {
20733
+ "description": "Unauthenticated"
20734
+ },
20735
+ "403": {
20736
+ "description": "Forbidden, or the plan does not include this"
20737
+ },
20738
+ "404": {
20739
+ "description": "Not found"
20740
+ }
20741
+ }
20742
+ }
20743
+ },
20744
+ "/v1/billing/promo/validate": {
20745
+ "get": {
20746
+ "tags": [
20747
+ "Billing"
20748
+ ],
20749
+ "summary": "validate promo",
20750
+ "operationId": "validate_promo",
20751
+ "responses": {
20752
+ "200": {
20753
+ "description": "Success"
20754
+ },
20755
+ "401": {
20756
+ "description": "Unauthenticated"
20757
+ },
20758
+ "403": {
20759
+ "description": "Forbidden, or the plan does not include this"
20760
+ },
20761
+ "404": {
20762
+ "description": "Not found"
20763
+ }
20764
+ }
20765
+ }
20766
+ },
20767
+ "/v1/chains/rpc": {
20768
+ "post": {
20769
+ "tags": [
20770
+ "Chains"
20771
+ ],
20772
+ "summary": "Proxy a single JSON-RPC call to the chain's RPC URL. Only read-only methods in ALLOWED_RPC_METHODS are allowed (Treasury balances, Safe deployment, et",
20773
+ "operationId": "chain_rpc_proxy",
20774
+ "requestBody": {
20775
+ "required": true,
20776
+ "content": {
20777
+ "application/json": {
20778
+ "schema": {
20779
+ "type": "object",
20780
+ "required": [
20781
+ "chain_id",
20782
+ "method",
20783
+ "params"
20784
+ ],
20785
+ "properties": {
20786
+ "chain_id": {
20787
+ "type": "integer"
20788
+ },
20789
+ "method": {
20790
+ "type": "string"
20791
+ },
20792
+ "params": {
20793
+ "type": "array",
20794
+ "items": {
20795
+ "type": "object",
20796
+ "additionalProperties": true
20797
+ }
20798
+ }
20799
+ }
20800
+ }
20801
+ }
20802
+ }
20803
+ },
20804
+ "responses": {
20805
+ "200": {
20806
+ "description": "Success"
20807
+ },
20808
+ "401": {
20809
+ "description": "Unauthenticated"
20810
+ },
20811
+ "403": {
20812
+ "description": "Forbidden, or the plan does not include this"
20813
+ },
20814
+ "404": {
20815
+ "description": "Not found"
20816
+ }
20817
+ }
20818
+ }
20819
+ },
20820
+ "/v1/fiat/webhooks": {
20821
+ "post": {
20822
+ "tags": [
20823
+ "Fiat"
20824
+ ],
20825
+ "summary": "Receive completion events from fiat partners (MoonPay signed body or generic JSON).",
20826
+ "operationId": "fiat_webhook",
20827
+ "responses": {
20828
+ "200": {
20829
+ "description": "Success"
20830
+ },
20831
+ "401": {
20832
+ "description": "Unauthenticated"
20833
+ },
20834
+ "403": {
20835
+ "description": "Forbidden, or the plan does not include this"
20836
+ },
20837
+ "404": {
20838
+ "description": "Not found"
20839
+ }
20840
+ }
20841
+ }
20842
+ },
20843
+ "/v1/memory/shared-namespaces": {
20844
+ "get": {
20845
+ "tags": [
20846
+ "Memory"
20847
+ ],
20848
+ "summary": "list shared namespaces",
20849
+ "operationId": "list_shared_namespaces",
20850
+ "responses": {
20851
+ "200": {
20852
+ "description": "Success"
20853
+ },
20854
+ "401": {
20855
+ "description": "Unauthenticated"
20856
+ },
20857
+ "403": {
20858
+ "description": "Forbidden, or the plan does not include this"
20859
+ },
20860
+ "404": {
20861
+ "description": "Not found"
20862
+ }
20863
+ }
20864
+ },
20865
+ "post": {
20866
+ "tags": [
20867
+ "Memory"
20868
+ ],
20869
+ "summary": "create shared namespace",
20870
+ "operationId": "create_shared_namespace",
20871
+ "requestBody": {
20872
+ "required": true,
20873
+ "content": {
20874
+ "application/json": {
20875
+ "schema": {
20876
+ "type": "object",
20877
+ "required": [
20878
+ "namespace",
20879
+ "agent_ids"
20880
+ ],
20881
+ "properties": {
20882
+ "namespace": {
20883
+ "type": "string"
20884
+ },
20885
+ "agent_ids": {
20886
+ "type": "array",
20887
+ "items": {
20888
+ "type": "string",
20889
+ "format": "uuid"
20890
+ }
20891
+ }
20892
+ }
20893
+ }
20894
+ }
20895
+ }
20896
+ },
20897
+ "responses": {
20898
+ "200": {
20899
+ "description": "Success"
20900
+ },
20901
+ "401": {
20902
+ "description": "Unauthenticated"
20903
+ },
20904
+ "403": {
20905
+ "description": "Forbidden, or the plan does not include this"
20906
+ },
20907
+ "404": {
20908
+ "description": "Not found"
20909
+ }
20910
+ }
20911
+ }
20912
+ },
20913
+ "/v1/memory/shared-namespaces/{id}": {
20914
+ "parameters": [
20915
+ {
20916
+ "name": "id",
20917
+ "in": "path",
20918
+ "required": true,
20919
+ "schema": {
20920
+ "type": "string"
20921
+ }
20922
+ }
20923
+ ],
20924
+ "delete": {
20925
+ "tags": [
20926
+ "Memory"
20927
+ ],
20928
+ "summary": "delete shared namespace",
20929
+ "operationId": "delete_shared_namespace",
20930
+ "responses": {
20931
+ "200": {
20932
+ "description": "Success"
20933
+ },
20934
+ "401": {
20935
+ "description": "Unauthenticated"
20936
+ },
20937
+ "403": {
20938
+ "description": "Forbidden, or the plan does not include this"
20939
+ },
20940
+ "404": {
20941
+ "description": "Not found"
20942
+ }
20943
+ }
20944
+ },
20945
+ "patch": {
20946
+ "tags": [
20947
+ "Memory"
20948
+ ],
20949
+ "summary": "update shared namespace",
20950
+ "operationId": "update_shared_namespace",
20951
+ "requestBody": {
20952
+ "required": true,
20953
+ "content": {
20954
+ "application/json": {
20955
+ "schema": {
20956
+ "type": "object",
20957
+ "required": [
20958
+ "agent_ids"
20959
+ ],
20960
+ "properties": {
20961
+ "agent_ids": {
20962
+ "type": "array",
20963
+ "items": {
20964
+ "type": "string",
20965
+ "format": "uuid"
20966
+ }
20967
+ }
20968
+ }
20969
+ }
20970
+ }
20971
+ }
20972
+ },
20973
+ "responses": {
20974
+ "200": {
20975
+ "description": "Success"
20976
+ },
20977
+ "401": {
20978
+ "description": "Unauthenticated"
20979
+ },
20980
+ "403": {
20981
+ "description": "Forbidden, or the plan does not include this"
20982
+ },
20983
+ "404": {
20984
+ "description": "Not found"
20985
+ }
20986
+ }
20987
+ }
20988
+ },
20989
+ "/v1/onboarding/journey": {
20990
+ "post": {
20991
+ "tags": [
20992
+ "Onboarding"
20993
+ ],
20994
+ "summary": "record which path a user chose. The dashboard already had `track()` calls for the wizard, but they POST to a dashboard route that does not exist, so ",
20995
+ "operationId": "record_journey",
20996
+ "requestBody": {
20997
+ "required": true,
20998
+ "content": {
20999
+ "application/json": {
21000
+ "schema": {
21001
+ "type": "object",
21002
+ "required": [
21003
+ "journey"
21004
+ ],
21005
+ "properties": {
21006
+ "journey": {
21007
+ "type": "string"
21008
+ },
21009
+ "step": {
21010
+ "type": "string"
21011
+ }
21012
+ }
21013
+ }
21014
+ }
21015
+ }
21016
+ },
21017
+ "responses": {
21018
+ "200": {
21019
+ "description": "Success"
21020
+ },
21021
+ "401": {
21022
+ "description": "Unauthenticated"
21023
+ },
21024
+ "403": {
21025
+ "description": "Forbidden, or the plan does not include this"
21026
+ },
21027
+ "404": {
21028
+ "description": "Not found"
21029
+ }
21030
+ }
21031
+ }
21032
+ },
21033
+ "/v1/org/env-vars/{id}/delete": {
21034
+ "parameters": [
21035
+ {
21036
+ "name": "id",
21037
+ "in": "path",
21038
+ "required": true,
21039
+ "schema": {
21040
+ "type": "string"
21041
+ }
21042
+ }
21043
+ ],
21044
+ "post": {
21045
+ "tags": [
21046
+ "Org"
21047
+ ],
21048
+ "summary": "delete org env var",
21049
+ "operationId": "delete_org_env_var",
21050
+ "responses": {
21051
+ "200": {
21052
+ "description": "Success"
21053
+ },
21054
+ "401": {
21055
+ "description": "Unauthenticated"
21056
+ },
21057
+ "403": {
21058
+ "description": "Forbidden, or the plan does not include this"
21059
+ },
21060
+ "404": {
21061
+ "description": "Not found"
21062
+ }
21063
+ }
21064
+ }
21065
+ },
21066
+ "/v1/org/kek-custody": {
21067
+ "get": {
21068
+ "tags": [
21069
+ "Org"
21070
+ ],
21071
+ "summary": "Get current custody mode and share metadata",
21072
+ "operationId": "get_custody",
21073
+ "responses": {
21074
+ "200": {
21075
+ "description": "Success"
21076
+ },
21077
+ "401": {
21078
+ "description": "Unauthenticated"
21079
+ },
21080
+ "403": {
21081
+ "description": "Forbidden, or the plan does not include this"
21082
+ },
21083
+ "404": {
21084
+ "description": "Not found"
21085
+ }
21086
+ }
21087
+ },
21088
+ "post": {
21089
+ "tags": [
21090
+ "Org"
21091
+ ],
21092
+ "summary": "Setup Shamir key custody",
21093
+ "operationId": "setup_custody",
21094
+ "requestBody": {
21095
+ "required": true,
21096
+ "content": {
21097
+ "application/json": {
21098
+ "schema": {
21099
+ "type": "object",
21100
+ "required": [
21101
+ "custody_mode"
21102
+ ],
21103
+ "properties": {
21104
+ "custody_mode": {
21105
+ "type": "string"
21106
+ }
21107
+ }
21108
+ }
21109
+ }
21110
+ }
21111
+ },
21112
+ "responses": {
21113
+ "200": {
21114
+ "description": "Success"
21115
+ },
21116
+ "401": {
21117
+ "description": "Unauthenticated"
21118
+ },
21119
+ "403": {
21120
+ "description": "Forbidden, or the plan does not include this"
21121
+ },
21122
+ "404": {
21123
+ "description": "Not found"
21124
+ }
21125
+ }
21126
+ }
21127
+ },
21128
+ "/v1/org/kek-custody/reconstruct": {
21129
+ "get": {
21130
+ "tags": [
21131
+ "Org"
21132
+ ],
21133
+ "summary": "list org env vars",
21134
+ "operationId": "list_org_env_vars",
21135
+ "responses": {
21136
+ "200": {
21137
+ "description": "Success"
21138
+ },
21139
+ "401": {
21140
+ "description": "Unauthenticated"
21141
+ },
21142
+ "403": {
21143
+ "description": "Forbidden, or the plan does not include this"
21144
+ },
21145
+ "404": {
21146
+ "description": "Not found"
21147
+ }
21148
+ }
21149
+ },
21150
+ "post": {
21151
+ "tags": [
21152
+ "Org"
21153
+ ],
21154
+ "summary": "TEE-bound reconstruction request",
21155
+ "operationId": "reconstruct",
21156
+ "requestBody": {
21157
+ "required": true,
21158
+ "content": {
21159
+ "application/json": {
21160
+ "schema": {
21161
+ "type": "object",
21162
+ "required": [
21163
+ "approval_id",
21164
+ "action"
21165
+ ],
21166
+ "properties": {
21167
+ "approval_id": {
21168
+ "type": "object"
21169
+ },
21170
+ "client_share": {
21171
+ "type": "string"
21172
+ },
21173
+ "action": {
21174
+ "type": "object",
21175
+ "additionalProperties": true
21176
+ }
21177
+ }
21178
+ }
21179
+ }
21180
+ }
21181
+ },
21182
+ "responses": {
21183
+ "200": {
21184
+ "description": "Success"
21185
+ },
21186
+ "401": {
21187
+ "description": "Unauthenticated"
21188
+ },
21189
+ "403": {
21190
+ "description": "Forbidden, or the plan does not include this"
21191
+ },
21192
+ "404": {
21193
+ "description": "Not found"
21194
+ }
21195
+ }
21196
+ }
21197
+ },
21198
+ "/v1/org/settings": {
21199
+ "get": {
21200
+ "tags": [
21201
+ "Org"
21202
+ ],
21203
+ "summary": "list org settings",
21204
+ "operationId": "list_org_settings",
21205
+ "responses": {
21206
+ "200": {
21207
+ "description": "Success"
21208
+ },
21209
+ "401": {
21210
+ "description": "Unauthenticated"
21211
+ },
21212
+ "403": {
21213
+ "description": "Forbidden, or the plan does not include this"
21214
+ },
21215
+ "404": {
21216
+ "description": "Not found"
21217
+ }
21218
+ }
21219
+ },
21220
+ "patch": {
21221
+ "tags": [
21222
+ "Org"
21223
+ ],
21224
+ "summary": "update org setting",
21225
+ "operationId": "update_org_setting",
21226
+ "requestBody": {
21227
+ "required": true,
21228
+ "content": {
21229
+ "application/json": {
21230
+ "schema": {
21231
+ "type": "object",
21232
+ "required": [
21233
+ "key",
21234
+ "value"
21235
+ ],
21236
+ "properties": {
21237
+ "key": {
21238
+ "type": "string"
21239
+ },
21240
+ "value": {
21241
+ "type": "string"
21242
+ },
21243
+ "approval_id": {
21244
+ "type": "string",
21245
+ "format": "uuid"
21246
+ }
21247
+ }
21248
+ }
21249
+ }
21250
+ }
21251
+ },
21252
+ "responses": {
21253
+ "200": {
21254
+ "description": "Success"
21255
+ },
21256
+ "401": {
21257
+ "description": "Unauthenticated"
21258
+ },
21259
+ "403": {
21260
+ "description": "Forbidden, or the plan does not include this"
21261
+ },
21262
+ "404": {
21263
+ "description": "Not found"
21264
+ }
21265
+ }
21266
+ }
21267
+ },
21268
+ "/v1/platform/apps/by-slug/{slug}/branding": {
21269
+ "parameters": [
21270
+ {
21271
+ "name": "slug",
21272
+ "in": "path",
21273
+ "required": true,
21274
+ "schema": {
21275
+ "type": "string"
21276
+ }
21277
+ }
21278
+ ],
21279
+ "get": {
21280
+ "tags": [
21281
+ "Platform"
21282
+ ],
21283
+ "summary": "Public, returns app name + logo.",
21284
+ "operationId": "app_branding",
21285
+ "security": [],
21286
+ "responses": {
21287
+ "200": {
21288
+ "description": "Success"
21289
+ },
21290
+ "404": {
21291
+ "description": "Not found"
21292
+ }
21293
+ }
21294
+ }
21295
+ },
21296
+ "/v1/platform/apps/{app_id}/automations": {
21297
+ "parameters": [
21298
+ {
21299
+ "name": "app_id",
21300
+ "in": "path",
21301
+ "required": true,
21302
+ "schema": {
21303
+ "type": "string"
21304
+ }
21305
+ }
21306
+ ],
21307
+ "get": {
21308
+ "tags": [
21309
+ "Platform"
21310
+ ],
21311
+ "summary": "list platform automations",
21312
+ "operationId": "list_platform_automations",
21313
+ "responses": {
21314
+ "200": {
21315
+ "description": "Success"
21316
+ },
21317
+ "401": {
21318
+ "description": "Unauthenticated"
21319
+ },
21320
+ "403": {
21321
+ "description": "Forbidden, or the plan does not include this"
21322
+ },
21323
+ "404": {
21324
+ "description": "Not found"
21325
+ }
21326
+ }
21327
+ },
21328
+ "post": {
21329
+ "tags": [
21330
+ "Platform"
21331
+ ],
21332
+ "summary": "upsert user",
21333
+ "operationId": "upsert_user",
21334
+ "requestBody": {
21335
+ "required": true,
21336
+ "content": {
21337
+ "application/json": {
21338
+ "schema": {
21339
+ "type": "object",
21340
+ "properties": {
21341
+ "subject_token": {
21342
+ "type": "string"
21343
+ },
21344
+ "subject_token_type": {
21345
+ "type": "string"
21346
+ },
21347
+ "email": {
21348
+ "type": "string"
21349
+ },
21350
+ "display_name": {
21351
+ "type": "string"
21352
+ },
21353
+ "siwe_message": {
21354
+ "type": "string"
21355
+ },
21356
+ "siwe_signature": {
21357
+ "type": "string"
21358
+ },
21359
+ "return_to": {
21360
+ "type": "string"
21361
+ },
21362
+ "create_sub_org": {
21363
+ "type": "boolean"
21364
+ },
21365
+ "app_id": {
21366
+ "type": "object"
21367
+ }
21368
+ }
21369
+ }
21370
+ }
21371
+ }
21372
+ },
21373
+ "responses": {
21374
+ "200": {
21375
+ "description": "Success"
21376
+ },
21377
+ "401": {
21378
+ "description": "Unauthenticated"
21379
+ },
21380
+ "403": {
21381
+ "description": "Forbidden, or the plan does not include this"
21382
+ },
21383
+ "404": {
21384
+ "description": "Not found"
21385
+ }
21386
+ }
21387
+ }
21388
+ },
21389
+ "/v1/platform/connected-apps/{connection_id}/unlock-resources": {
21390
+ "parameters": [
21391
+ {
21392
+ "name": "connection_id",
21393
+ "in": "path",
21394
+ "required": true,
21395
+ "schema": {
21396
+ "type": "string"
21397
+ }
21398
+ }
21399
+ ],
21400
+ "post": {
21401
+ "tags": [
21402
+ "Platform"
21403
+ ],
21404
+ "summary": "Unlocks platform-locked resources for a disconnected (or active) connection the user owns.",
21405
+ "operationId": "unlock_connection_resources",
21406
+ "responses": {
21407
+ "200": {
21408
+ "description": "Success"
21409
+ },
21410
+ "401": {
21411
+ "description": "Unauthenticated"
21412
+ },
21413
+ "403": {
21414
+ "description": "Forbidden, or the plan does not include this"
21415
+ },
21416
+ "404": {
21417
+ "description": "Not found"
21418
+ }
21419
+ }
21420
+ }
21421
+ },
21422
+ "/v1/platform/connections/{connection_id}/memory": {
21423
+ "parameters": [
21424
+ {
21425
+ "name": "connection_id",
21426
+ "in": "path",
21427
+ "required": true,
21428
+ "schema": {
21429
+ "type": "string"
21430
+ }
21431
+ }
21432
+ ],
21433
+ "get": {
21434
+ "tags": [
21435
+ "Platform"
21436
+ ],
21437
+ "summary": "list connection memory namespaces",
21438
+ "operationId": "list_connection_memory_namespaces",
21439
+ "responses": {
21440
+ "200": {
21441
+ "description": "Success"
21442
+ },
21443
+ "401": {
21444
+ "description": "Unauthenticated"
21445
+ },
21446
+ "403": {
21447
+ "description": "Forbidden, or the plan does not include this"
21448
+ },
21449
+ "404": {
21450
+ "description": "Not found"
21451
+ }
21452
+ }
21453
+ }
21454
+ },
21455
+ "/v1/platform/connections/{connection_id}/memory/{namespace}": {
21456
+ "parameters": [
21457
+ {
21458
+ "name": "connection_id",
21459
+ "in": "path",
21460
+ "required": true,
21461
+ "schema": {
21462
+ "type": "string"
21463
+ }
21464
+ },
21465
+ {
21466
+ "name": "namespace",
21467
+ "in": "path",
21468
+ "required": true,
21469
+ "schema": {
21470
+ "type": "string"
21471
+ }
21472
+ }
21473
+ ],
21474
+ "get": {
21475
+ "tags": [
21476
+ "Platform"
21477
+ ],
21478
+ "summary": "list connection memory entries",
21479
+ "operationId": "list_connection_memory_entries",
21480
+ "responses": {
21481
+ "200": {
21482
+ "description": "Success"
21483
+ },
21484
+ "401": {
21485
+ "description": "Unauthenticated"
21486
+ },
21487
+ "403": {
21488
+ "description": "Forbidden, or the plan does not include this"
21489
+ },
21490
+ "404": {
21491
+ "description": "Not found"
21492
+ }
21493
+ }
21494
+ }
21495
+ },
21496
+ "/v1/platform/connections/{connection_id}/resources": {
21497
+ "parameters": [
21498
+ {
21499
+ "name": "connection_id",
21500
+ "in": "path",
21501
+ "required": true,
21502
+ "schema": {
21503
+ "type": "string"
21504
+ }
21505
+ }
21506
+ ],
21507
+ "get": {
21508
+ "tags": [
21509
+ "Platform"
21510
+ ],
21511
+ "summary": "list connection resources",
21512
+ "operationId": "list_connection_resources",
21513
+ "responses": {
21514
+ "200": {
21515
+ "description": "Success"
21516
+ },
21517
+ "401": {
21518
+ "description": "Unauthenticated"
21519
+ },
21520
+ "403": {
21521
+ "description": "Forbidden, or the plan does not include this"
21522
+ },
21523
+ "404": {
21524
+ "description": "Not found"
21525
+ }
21526
+ }
21527
+ },
21528
+ "post": {
21529
+ "tags": [
21530
+ "Platform"
21531
+ ],
21532
+ "summary": "create app policy",
21533
+ "operationId": "create_app_policy",
21534
+ "requestBody": {
21535
+ "required": true,
21536
+ "content": {
21537
+ "application/json": {
21538
+ "schema": {
21539
+ "type": "object",
21540
+ "properties": {
21541
+ "user_id": {
21542
+ "type": "object"
21543
+ },
21544
+ "to_allowlist": {
21545
+ "type": "array",
21546
+ "items": {
21547
+ "type": "string"
21548
+ }
21549
+ },
21550
+ "to_denylist": {
21551
+ "type": "array",
21552
+ "items": {
21553
+ "type": "string"
21554
+ }
21555
+ },
21556
+ "max_value_per_tx_eth": {
21557
+ "type": "string"
21558
+ },
21559
+ "daily_limit_eth": {
21560
+ "type": "string"
21561
+ },
21562
+ "allowed_chains": {
21563
+ "type": "array",
21564
+ "items": {
21565
+ "type": "string"
21566
+ }
21567
+ },
21568
+ "allowed_tokens": {
21569
+ "type": "array",
21570
+ "items": {
21571
+ "type": "string"
21572
+ }
21573
+ },
21574
+ "max_transactions_per_day": {
21575
+ "type": "integer"
21576
+ },
21577
+ "human_factor_auth": {
21578
+ "type": "object",
21579
+ "additionalProperties": true
21580
+ }
21581
+ }
21582
+ }
21583
+ }
21584
+ }
21585
+ },
21586
+ "responses": {
21587
+ "200": {
21588
+ "description": "Success"
21589
+ },
21590
+ "401": {
21591
+ "description": "Unauthenticated"
21592
+ },
21593
+ "403": {
21594
+ "description": "Forbidden, or the plan does not include this"
21595
+ },
21596
+ "404": {
21597
+ "description": "Not found"
21598
+ }
21599
+ }
21600
+ }
21601
+ },
21602
+ "/v1/platform/link-account": {
21603
+ "post": {
21604
+ "tags": [
21605
+ "Platform"
21606
+ ],
21607
+ "summary": "Authenticated user links their account to a platform app. Used by the dashboard `/connect/{slug}/link` consent flow for cross-org users.",
21608
+ "operationId": "link_account",
21609
+ "requestBody": {
21610
+ "required": true,
21611
+ "content": {
21612
+ "application/json": {
21613
+ "schema": {
21614
+ "type": "object",
21615
+ "required": [
21616
+ "client_id"
21617
+ ],
21618
+ "properties": {
21619
+ "client_id": {
21620
+ "type": "string"
21621
+ }
21622
+ }
21623
+ }
21624
+ }
21625
+ }
21626
+ },
21627
+ "responses": {
21628
+ "200": {
21629
+ "description": "Success"
21630
+ },
21631
+ "401": {
21632
+ "description": "Unauthenticated"
21633
+ },
21634
+ "403": {
21635
+ "description": "Forbidden, or the plan does not include this"
21636
+ },
21637
+ "404": {
21638
+ "description": "Not found"
21639
+ }
21640
+ }
21641
+ }
21642
+ },
21643
+ "/v1/platform/orphaned-resources": {
21644
+ "get": {
21645
+ "tags": [
21646
+ "Platform"
21647
+ ],
21648
+ "summary": "platform-locked agents/vaults with no active connection.",
21649
+ "operationId": "list_orphaned_platform_resources",
21650
+ "responses": {
21651
+ "200": {
21652
+ "description": "Success"
21653
+ },
21654
+ "401": {
21655
+ "description": "Unauthenticated"
21656
+ },
21657
+ "403": {
21658
+ "description": "Forbidden, or the plan does not include this"
21659
+ },
21660
+ "404": {
21661
+ "description": "Not found"
21662
+ }
21663
+ }
21664
+ }
21665
+ },
21666
+ "/v1/reports/request": {
21667
+ "post": {
21668
+ "tags": [
21669
+ "Reports"
21670
+ ],
21671
+ "summary": "Public (no auth). Submits lead info, sends email with download link.",
21672
+ "operationId": "request_report",
21673
+ "security": [],
21674
+ "requestBody": {
21675
+ "required": true,
21676
+ "content": {
21677
+ "application/json": {
21678
+ "schema": {
21679
+ "type": "object",
21680
+ "required": [
21681
+ "first_name",
21682
+ "last_name",
21683
+ "email",
21684
+ "company"
21685
+ ],
21686
+ "properties": {
21687
+ "first_name": {
21688
+ "type": "string"
21689
+ },
21690
+ "last_name": {
21691
+ "type": "string"
21692
+ },
21693
+ "email": {
21694
+ "type": "string"
21695
+ },
21696
+ "company": {
21697
+ "type": "string"
21698
+ },
21699
+ "job_title": {
21700
+ "type": "string"
21701
+ },
21702
+ "report_slug": {
21703
+ "type": "string"
21704
+ },
21705
+ "marketing_consent": {
21706
+ "type": "boolean"
21707
+ }
21708
+ }
21709
+ }
21710
+ }
21711
+ }
21712
+ },
21713
+ "responses": {
21714
+ "200": {
21715
+ "description": "Success"
21716
+ },
21717
+ "404": {
21718
+ "description": "Not found"
21719
+ }
21720
+ }
21721
+ }
21722
+ },
21723
+ "/v1/runtimes/{runtime_id}/chat/conversations": {
21724
+ "parameters": [
21725
+ {
21726
+ "name": "runtime_id",
21727
+ "in": "path",
21728
+ "required": true,
21729
+ "schema": {
21730
+ "type": "string"
21731
+ }
21732
+ }
21733
+ ],
21734
+ "get": {
21735
+ "tags": [
21736
+ "Runtimes"
21737
+ ],
21738
+ "summary": "list runtime chat conversations",
21739
+ "operationId": "list_runtime_chat_conversations",
21740
+ "responses": {
21741
+ "200": {
21742
+ "description": "Success"
21743
+ },
21744
+ "401": {
21745
+ "description": "Unauthenticated"
21746
+ },
21747
+ "403": {
21748
+ "description": "Forbidden, or the plan does not include this"
21749
+ },
21750
+ "404": {
21751
+ "description": "Not found"
21752
+ }
21753
+ }
21754
+ }
21755
+ },
21756
+ "/v1/runtimes/{runtime_id}/chat/conversations/{conversation_id}": {
21757
+ "parameters": [
21758
+ {
21759
+ "name": "runtime_id",
21760
+ "in": "path",
21761
+ "required": true,
21762
+ "schema": {
21763
+ "type": "string"
21764
+ }
21765
+ },
21766
+ {
21767
+ "name": "conversation_id",
21768
+ "in": "path",
21769
+ "required": true,
21770
+ "schema": {
21771
+ "type": "string"
21772
+ }
21773
+ }
21774
+ ],
21775
+ "delete": {
21776
+ "tags": [
21777
+ "Runtimes"
21778
+ ],
21779
+ "summary": "Archives a runtime chat session so the next message starts a fresh conversation.",
21780
+ "operationId": "archive_runtime_chat_conversation",
21781
+ "responses": {
21782
+ "200": {
21783
+ "description": "Success"
21784
+ },
21785
+ "401": {
21786
+ "description": "Unauthenticated"
21787
+ },
21788
+ "403": {
21789
+ "description": "Forbidden, or the plan does not include this"
21790
+ },
21791
+ "404": {
21792
+ "description": "Not found"
21793
+ }
21794
+ }
21795
+ },
21796
+ "get": {
21797
+ "tags": [
21798
+ "Runtimes"
21799
+ ],
21800
+ "summary": "get runtime chat conversation",
21801
+ "operationId": "get_runtime_chat_conversation",
21802
+ "responses": {
21803
+ "200": {
21804
+ "description": "Success"
21805
+ },
21806
+ "401": {
21807
+ "description": "Unauthenticated"
21808
+ },
21809
+ "403": {
21810
+ "description": "Forbidden, or the plan does not include this"
21811
+ },
21812
+ "404": {
21813
+ "description": "Not found"
21814
+ }
21815
+ }
21816
+ }
21817
+ },
21818
+ "/v1/runtimes/{runtime_id}/chat/diagnostics": {
21819
+ "parameters": [
21820
+ {
21821
+ "name": "runtime_id",
21822
+ "in": "path",
21823
+ "required": true,
21824
+ "schema": {
21825
+ "type": "string"
21826
+ }
21827
+ }
21828
+ ],
21829
+ "get": {
21830
+ "tags": [
21831
+ "Runtimes"
21832
+ ],
21833
+ "summary": "Human-only snapshot of chat auth wiring: which platform env vars Vault will inject on the next Start and which upstream URL chat proxies to.",
21834
+ "operationId": "runtime_chat_diagnostics",
21835
+ "responses": {
21836
+ "200": {
21837
+ "description": "Success"
21838
+ },
21839
+ "401": {
21840
+ "description": "Unauthenticated"
21841
+ },
21842
+ "403": {
21843
+ "description": "Forbidden, or the plan does not include this"
21844
+ },
21845
+ "404": {
21846
+ "description": "Not found"
21847
+ }
21848
+ }
21849
+ }
21850
+ },
21851
+ "/v1/runtimes/{runtime_id}/chat/unlock": {
21852
+ "parameters": [
21853
+ {
21854
+ "name": "runtime_id",
21855
+ "in": "path",
21856
+ "required": true,
21857
+ "schema": {
21858
+ "type": "string"
21859
+ }
21860
+ }
21861
+ ],
21862
+ "post": {
21863
+ "tags": [
21864
+ "Runtimes"
21865
+ ],
21866
+ "summary": "Step-up (password or passkey reauth token, purpose=`runtime_chat`) unlocks dashboard runtime chat for 15 minutes — same trust bar as Shell/Logs.",
21867
+ "operationId": "unlock_runtime_chat",
21868
+ "responses": {
21869
+ "200": {
21870
+ "description": "Success"
21871
+ },
21872
+ "401": {
21873
+ "description": "Unauthenticated"
21874
+ },
21875
+ "403": {
21876
+ "description": "Forbidden, or the plan does not include this"
21877
+ },
21878
+ "404": {
21879
+ "description": "Not found"
21880
+ }
21881
+ }
21882
+ }
21883
+ },
21884
+ "/v1/runtimes/{runtime_id}/logs/stream": {
21885
+ "parameters": [
21886
+ {
21887
+ "name": "runtime_id",
21888
+ "in": "path",
21889
+ "required": true,
21890
+ "schema": {
21891
+ "type": "string"
21892
+ }
21893
+ }
21894
+ ],
21895
+ "get": {
21896
+ "tags": [
21897
+ "Runtimes"
21898
+ ],
21899
+ "summary": "SSE live log streaming",
21900
+ "operationId": "stream_runtime_logs",
21901
+ "responses": {
21902
+ "200": {
21903
+ "description": "Success"
21904
+ },
21905
+ "401": {
21906
+ "description": "Unauthenticated"
21907
+ },
21908
+ "403": {
21909
+ "description": "Forbidden, or the plan does not include this"
21910
+ },
21911
+ "404": {
21912
+ "description": "Not found"
21913
+ }
21914
+ }
21915
+ }
21916
+ },
21917
+ "/v1/runtimes/{runtime_id}/logs/unlock": {
21918
+ "parameters": [
21919
+ {
21920
+ "name": "runtime_id",
21921
+ "in": "path",
21922
+ "required": true,
21923
+ "schema": {
21924
+ "type": "string"
21925
+ }
21926
+ }
21927
+ ],
21928
+ "post": {
21929
+ "tags": [
21930
+ "Runtimes"
21931
+ ],
21932
+ "summary": "Step-up (password or passkey reauth token) unlocks log fetch/stream for 15 minutes.",
21933
+ "operationId": "unlock_runtime_logs",
21934
+ "responses": {
21935
+ "200": {
21936
+ "description": "Success"
21937
+ },
21938
+ "401": {
21939
+ "description": "Unauthenticated"
21940
+ },
21941
+ "403": {
21942
+ "description": "Forbidden, or the plan does not include this"
21943
+ },
21944
+ "404": {
21945
+ "description": "Not found"
21946
+ }
21947
+ }
21948
+ }
21949
+ },
21950
+ "/v1/runtimes/{runtime_id}/rebuild": {
21951
+ "parameters": [
21952
+ {
21953
+ "name": "runtime_id",
21954
+ "in": "path",
21955
+ "required": true,
21956
+ "schema": {
21957
+ "type": "string"
21958
+ }
21959
+ }
21960
+ ],
21961
+ "post": {
21962
+ "tags": [
21963
+ "Runtimes"
21964
+ ],
21965
+ "summary": "Phase 1: invalidate the cached image tag and return the runtime to `stopped`. Next `start` re-pulls the image; for `source_repo` runtimes the entrypoi",
21966
+ "operationId": "rebuild_runtime",
21967
+ "responses": {
21968
+ "200": {
21969
+ "description": "Success"
21970
+ },
21971
+ "401": {
21972
+ "description": "Unauthenticated"
21973
+ },
21974
+ "403": {
21975
+ "description": "Forbidden, or the plan does not include this"
21976
+ },
21977
+ "404": {
21978
+ "description": "Not found"
21979
+ }
21980
+ }
21981
+ }
21982
+ },
21983
+ "/v1/runtimes/{runtime_id}/restart": {
21984
+ "parameters": [
21985
+ {
21986
+ "name": "runtime_id",
21987
+ "in": "path",
21988
+ "required": true,
21989
+ "schema": {
21990
+ "type": "string"
21991
+ }
21992
+ }
21993
+ ],
21994
+ "post": {
21995
+ "tags": [
21996
+ "Runtimes"
21997
+ ],
21998
+ "summary": "Force stop (best-effort) then start. Recovers stale `running` rows and proxy timeouts where the client never received the start response.",
21999
+ "operationId": "restart_runtime",
22000
+ "responses": {
22001
+ "200": {
22002
+ "description": "Success"
22003
+ },
22004
+ "401": {
22005
+ "description": "Unauthenticated"
22006
+ },
22007
+ "403": {
22008
+ "description": "Forbidden, or the plan does not include this"
22009
+ },
22010
+ "404": {
22011
+ "description": "Not found"
22012
+ }
22013
+ }
22014
+ }
22015
+ },
22016
+ "/v1/vaults/{vault_id}/secret-version-disable/{*path_and_version}": {
22017
+ "parameters": [
22018
+ {
22019
+ "name": "vault_id",
22020
+ "in": "path",
22021
+ "required": true,
22022
+ "schema": {
22023
+ "type": "string"
22024
+ }
22025
+ }
22026
+ ],
22027
+ "post": {
22028
+ "tags": [
22029
+ "Vaults"
22030
+ ],
22031
+ "summary": "Disable a specific version so it can no longer be read (but is retained for audit).",
22032
+ "operationId": "disable_version",
22033
+ "responses": {
22034
+ "200": {
22035
+ "description": "Success"
22036
+ },
22037
+ "401": {
22038
+ "description": "Unauthenticated"
22039
+ },
22040
+ "403": {
22041
+ "description": "Forbidden, or the plan does not include this"
22042
+ },
22043
+ "404": {
22044
+ "description": "Not found"
22045
+ }
22046
+ }
22047
+ }
22048
+ },
22049
+ "/v1/vaults/{vault_id}/secret-version/{*path_and_version}": {
22050
+ "parameters": [
22051
+ {
22052
+ "name": "vault_id",
22053
+ "in": "path",
22054
+ "required": true,
22055
+ "schema": {
22056
+ "type": "string"
22057
+ }
22058
+ }
22059
+ ],
22060
+ "get": {
22061
+ "tags": [
22062
+ "Vaults"
22063
+ ],
22064
+ "summary": "get secret version",
22065
+ "operationId": "get_secret_version",
22066
+ "responses": {
22067
+ "200": {
22068
+ "description": "Success"
22069
+ },
22070
+ "401": {
22071
+ "description": "Unauthenticated"
22072
+ },
22073
+ "403": {
22074
+ "description": "Forbidden, or the plan does not include this"
22075
+ },
22076
+ "404": {
22077
+ "description": "Not found"
22078
+ }
22079
+ }
22080
+ }
22081
+ },
22082
+ "/v1/vaults/{vault_id}/unlock-platform": {
22083
+ "parameters": [
22084
+ {
22085
+ "name": "vault_id",
22086
+ "in": "path",
22087
+ "required": true,
22088
+ "schema": {
22089
+ "type": "string"
22090
+ }
22091
+ }
22092
+ ],
22093
+ "post": {
22094
+ "tags": [
22095
+ "Vaults"
22096
+ ],
22097
+ "summary": "unlock vault platform",
22098
+ "operationId": "unlock_vault_platform",
22099
+ "responses": {
22100
+ "200": {
22101
+ "description": "Success"
22102
+ },
22103
+ "401": {
22104
+ "description": "Unauthenticated"
22105
+ },
22106
+ "403": {
22107
+ "description": "Forbidden, or the plan does not include this"
22108
+ },
22109
+ "404": {
22110
+ "description": "Not found"
22111
+ }
22112
+ }
22113
+ }
22114
+ },
22115
+ "/v1/webinars/register": {
22116
+ "post": {
22117
+ "tags": [
22118
+ "Webinars"
22119
+ ],
22120
+ "summary": "Public (no auth). Registers for a webinar, sends confirmation + calendar invite.",
22121
+ "operationId": "register_webinar",
22122
+ "security": [],
22123
+ "requestBody": {
22124
+ "required": true,
22125
+ "content": {
22126
+ "application/json": {
22127
+ "schema": {
22128
+ "type": "object",
22129
+ "required": [
22130
+ "first_name",
22131
+ "last_name",
22132
+ "email",
22133
+ "company"
22134
+ ],
22135
+ "properties": {
22136
+ "first_name": {
22137
+ "type": "string"
22138
+ },
22139
+ "last_name": {
22140
+ "type": "string"
22141
+ },
22142
+ "email": {
22143
+ "type": "string"
22144
+ },
22145
+ "company": {
22146
+ "type": "string"
22147
+ },
22148
+ "job_title": {
22149
+ "type": "string"
22150
+ },
22151
+ "webinar_slug": {
22152
+ "type": "string"
22153
+ },
22154
+ "marketing_consent": {
22155
+ "type": "boolean"
22156
+ }
22157
+ }
22158
+ }
22159
+ }
22160
+ }
22161
+ },
22162
+ "responses": {
22163
+ "200": {
22164
+ "description": "Success"
22165
+ },
22166
+ "404": {
22167
+ "description": "Not found"
22168
+ }
22169
+ }
22170
+ }
22171
+ },
22172
+ "/v1/runtimes/templates": {
22173
+ "get": {
22174
+ "tags": [
22175
+ "Runtimes"
22176
+ ],
22177
+ "summary": "The provisionable runtime templates, with licence and whether the agent needs its own vendor account",
22178
+ "operationId": "list_runtime_templates",
22179
+ "responses": {
22180
+ "200": {
22181
+ "description": "The template catalogue",
22182
+ "content": {
22183
+ "application/json": {
22184
+ "schema": {
22185
+ "type": "object",
22186
+ "properties": {
22187
+ "templates": {
22188
+ "type": "array",
22189
+ "items": {
22190
+ "type": "object",
22191
+ "properties": {
22192
+ "id": {
22193
+ "type": "string"
22194
+ },
22195
+ "description": {
22196
+ "type": "string"
22197
+ },
22198
+ "chat_capable": {
22199
+ "type": "boolean"
22200
+ },
22201
+ "license": {
22202
+ "type": "string",
22203
+ "nullable": true,
22204
+ "description": "SPDX id, or null when the agent is proprietary"
22205
+ },
22206
+ "requires_vendor_subscription": {
22207
+ "type": "boolean",
22208
+ "description": "Whether the agent needs a paid account with its vendor. Independent of licence — the Codex CLI is Apache-2.0 and still requires a ChatGPT plan."
22209
+ },
22210
+ "vendor_credential_env": {
22211
+ "type": "string",
22212
+ "nullable": true
22213
+ }
22214
+ }
22215
+ }
22216
+ }
22217
+ }
22218
+ }
22219
+ }
22220
+ }
22221
+ },
22222
+ "401": {
22223
+ "description": "Unauthenticated"
22224
+ }
22225
+ }
22226
+ }
22227
+ },
22228
+ "/v1/automations/step-types": {
22229
+ "get": {
22230
+ "tags": [
22231
+ "Automations"
22232
+ ],
22233
+ "summary": "The automation step vocabulary an automation may use",
22234
+ "operationId": "list_automation_step_types",
22235
+ "responses": {
22236
+ "200": {
22237
+ "description": "Supported step types"
22238
+ },
22239
+ "401": {
22240
+ "description": "Unauthenticated"
22241
+ }
22242
+ }
22243
+ }
22244
+ },
22245
+ "/v1/platform/apps/{app_id}/runtimes": {
22246
+ "parameters": [
22247
+ {
22248
+ "name": "app_id",
22249
+ "in": "path",
22250
+ "required": true,
22251
+ "schema": {
22252
+ "type": "string",
22253
+ "format": "uuid"
22254
+ }
22255
+ }
22256
+ ],
22257
+ "get": {
22258
+ "tags": [
22259
+ "Platform"
22260
+ ],
22261
+ "summary": "Runtimes belonging to a platform app",
22262
+ "operationId": "list_platform_runtimes",
22263
+ "responses": {
22264
+ "200": {
22265
+ "description": "Success"
22266
+ },
22267
+ "401": {
22268
+ "description": "Unauthenticated"
22269
+ },
22270
+ "403": {
22271
+ "description": "Forbidden"
22272
+ }
22273
+ }
22274
+ }
22275
+ },
22276
+ "/v1/browser/devices": {
22277
+ "post": {
22278
+ "tags": [
22279
+ "Browser Bridge"
22280
+ ],
22281
+ "summary": "Pair a browser bridge and mint its credential. Human callers only, behind a step-up re-auth: pairing is what gives a browser the standing to ask for credentials later.",
22282
+ "operationId": "pair_browser_device",
22283
+ "requestBody": {
22284
+ "required": true,
22285
+ "content": {
22286
+ "application/json": {
22287
+ "schema": {
22288
+ "type": "object",
22289
+ "required": [
22290
+ "label",
22291
+ "public_key_pin"
22292
+ ],
22293
+ "properties": {
22294
+ "label": {
22295
+ "type": "string",
22296
+ "description": "Name for this device. Re-pairing an existing label must present the same key."
22297
+ },
22298
+ "public_key_pin": {
22299
+ "type": "string",
22300
+ "description": "The bridge's public key, pinned on first use for this label."
22301
+ },
22302
+ "bridge_version": {
22303
+ "type": "string"
22304
+ },
22305
+ "platform": {
22306
+ "type": "string"
22307
+ }
22308
+ }
22309
+ }
22310
+ }
22311
+ }
22312
+ },
22313
+ "responses": {
22314
+ "201": {
22315
+ "description": "Paired. The credential is returned once and there is no endpoint that returns it again.",
22316
+ "content": {
22317
+ "application/json": {
22318
+ "schema": {
22319
+ "type": "object",
22320
+ "properties": {
22321
+ "device_id": {
22322
+ "type": "string",
22323
+ "format": "uuid"
22324
+ },
22325
+ "label": {
22326
+ "type": "string"
22327
+ },
22328
+ "credential": {
22329
+ "type": "string",
22330
+ "description": "The bb_ bridge credential. Shown once."
22331
+ }
22332
+ }
22333
+ }
22334
+ }
22335
+ }
22336
+ },
22337
+ "401": {
22338
+ "description": "Unauthenticated, or step-up re-auth not satisfied"
22339
+ },
22340
+ "403": {
22341
+ "description": "Not a human caller — agents and platform keys cannot pair a device"
22342
+ },
22343
+ "409": {
22344
+ "description": "That label is already pinned to a different key"
22345
+ }
22346
+ }
22347
+ },
22348
+ "get": {
22349
+ "tags": [
22350
+ "Browser Bridge"
22351
+ ],
22352
+ "summary": "List the browser bridges paired to this organization. Revoked devices are included: 'was this machine ever paired' is the question asked after a laptop goes missing.",
22353
+ "operationId": "list_browser_devices",
22354
+ "responses": {
22355
+ "200": {
22356
+ "description": "The paired devices. No credential material is returned — the row holds an Argon2 hash and a prefix, and neither is exposed.",
22357
+ "content": {
22358
+ "application/json": {
22359
+ "schema": {
22360
+ "type": "object",
22361
+ "properties": {
22362
+ "devices": {
22363
+ "type": "array",
22364
+ "items": {
22365
+ "type": "object",
22366
+ "properties": {
22367
+ "id": {
22368
+ "type": "string",
22369
+ "format": "uuid"
22370
+ },
22371
+ "label": {
22372
+ "type": "string"
22373
+ },
22374
+ "platform": {
22375
+ "type": "string",
22376
+ "nullable": true
22377
+ },
22378
+ "bridge_version": {
22379
+ "type": "string",
22380
+ "nullable": true
22381
+ },
22382
+ "last_seen_at": {
22383
+ "type": "string",
22384
+ "format": "date-time",
22385
+ "nullable": true
22386
+ },
22387
+ "revoked_at": {
22388
+ "type": "string",
22389
+ "format": "date-time",
22390
+ "nullable": true,
22391
+ "description": "Set once revoked. A revoked credential stops resolving."
22392
+ },
22393
+ "created_at": {
22394
+ "type": "string",
22395
+ "format": "date-time"
22396
+ }
22397
+ }
22398
+ }
22399
+ }
22400
+ }
22401
+ }
22402
+ }
22403
+ }
22404
+ },
22405
+ "401": {
22406
+ "description": "Unauthenticated"
22407
+ }
22408
+ }
22409
+ }
22410
+ },
22411
+ "/v1/browser/devices/{id}": {
22412
+ "delete": {
22413
+ "tags": [
22414
+ "Browser Bridge"
22415
+ ],
22416
+ "summary": "Revoke a paired bridge. This is what makes a leaked bb_ credential stop working.",
22417
+ "operationId": "revoke_browser_device",
22418
+ "parameters": [
22419
+ {
22420
+ "name": "id",
22421
+ "in": "path",
22422
+ "required": true,
22423
+ "schema": {
22424
+ "type": "string",
22425
+ "format": "uuid"
22426
+ }
22427
+ }
22428
+ ],
22429
+ "responses": {
22430
+ "204": {
22431
+ "description": "Revoked. Subsequent use of that credential resolves to nothing."
22432
+ },
22433
+ "401": {
22434
+ "description": "Unauthenticated"
22435
+ },
22436
+ "404": {
22437
+ "description": "No such device in this organization"
22438
+ }
22439
+ }
22440
+ }
22441
+ },
22442
+ "/v1/browser/credentials": {
22443
+ "post": {
22444
+ "tags": [
22445
+ "Browser Bridge"
22446
+ ],
22447
+ "summary": "Define a binding: which secret may be typed, and into which hosts. Humans only, behind a step-up — an agent that could create one could nominate any path it liked as fillable.",
22448
+ "operationId": "create_browser_credential",
22449
+ "requestBody": {
22450
+ "required": true,
22451
+ "content": {
22452
+ "application/json": {
22453
+ "schema": {
22454
+ "type": "object",
22455
+ "required": [
22456
+ "label",
22457
+ "vault_id",
22458
+ "secret_path",
22459
+ "login_url",
22460
+ "allowed_hosts"
22461
+ ],
22462
+ "properties": {
22463
+ "label": {
22464
+ "type": "string"
22465
+ },
22466
+ "vault_id": {
22467
+ "type": "string",
22468
+ "format": "uuid",
22469
+ "description": "Must belong to the caller's org."
22470
+ },
22471
+ "secret_path": {
22472
+ "type": "string",
22473
+ "description": "Path of the secret inside that vault. The value never lands in the binding."
22474
+ },
22475
+ "login_url": {
22476
+ "type": "string",
22477
+ "description": "https only, and its host must be in allowed_hosts or sso_hosts — the bridge navigates here itself, one step before a password is typed."
22478
+ },
22479
+ "allowed_hosts": {
22480
+ "type": "array",
22481
+ "minItems": 1,
22482
+ "items": {
22483
+ "type": "string"
22484
+ },
22485
+ "description": "Hostnames. A bare entry matches only itself; a leading dot ('.example.com') matches that host and any subdomain. URLs, ports and '*' are refused — '*' has no meaning to the matcher, so it would be stored and then match nothing."
22486
+ },
22487
+ "sso_hosts": {
22488
+ "type": "array",
22489
+ "items": {
22490
+ "type": "string"
22491
+ },
22492
+ "description": "Identity-provider hosts the login legitimately bounces through."
22493
+ }
22494
+ }
22495
+ }
22496
+ }
22497
+ }
22498
+ },
22499
+ "responses": {
22500
+ "201": {
22501
+ "description": "Created. Every field is a pointer or a policy; none is secret."
22502
+ },
22503
+ "400": {
22504
+ "description": "A host is not a bare hostname, allowed_hosts is empty, or login_url is http or outside the allowlist"
22505
+ },
22506
+ "403": {
22507
+ "description": "Not a human caller, step-up not satisfied, or the vault belongs to another org"
22508
+ },
22509
+ "404": {
22510
+ "description": "Vault not found"
22511
+ }
22512
+ }
22513
+ },
22514
+ "get": {
22515
+ "tags": [
22516
+ "Browser Bridge"
22517
+ ],
22518
+ "summary": "List this org's browser credential bindings",
22519
+ "operationId": "list_browser_credentials",
22520
+ "responses": {
22521
+ "200": {
22522
+ "description": "The bindings"
22523
+ }
22524
+ }
22525
+ }
22526
+ },
22527
+ "/v1/browser/credentials/{id}": {
22528
+ "parameters": [
22529
+ {
22530
+ "name": "id",
22531
+ "in": "path",
22532
+ "required": true,
22533
+ "schema": {
22534
+ "type": "string",
22535
+ "format": "uuid"
22536
+ }
22537
+ }
22538
+ ],
22539
+ "delete": {
22540
+ "tags": [
22541
+ "Browser Bridge"
22542
+ ],
22543
+ "summary": "Remove a browser credential binding",
22544
+ "operationId": "delete_browser_credential",
22545
+ "responses": {
22546
+ "204": {
22547
+ "description": "Deleted"
22548
+ },
22549
+ "403": {
22550
+ "description": "Not a human caller"
22551
+ },
22552
+ "404": {
22553
+ "description": "Binding not found"
22554
+ }
22555
+ }
22556
+ }
22557
+ },
22558
+ "/v1/agents/{id}/browser/sessions": {
22559
+ "parameters": [
22560
+ {
22561
+ "name": "id",
22562
+ "in": "path",
22563
+ "required": true,
22564
+ "schema": {
22565
+ "type": "string",
22566
+ "format": "uuid"
22567
+ }
22568
+ }
22569
+ ],
19539
22570
  "post": {
19540
22571
  "tags": [
19541
- "Shamir KEK"
22572
+ "Browser Bridge"
19542
22573
  ],
19543
- "summary": "Set up Shamir KEK for the org",
19544
- "description": "Initialize a Shamir secret-sharing KEK for the org. Splits the master\nkey into shares distributed to custodians. Shares are returned one-time\nonly and must be stored securely by each custodian.\n",
19545
- "operationId": "setupShamirKek",
19546
- "security": [
22574
+ "summary": "Open a browser session. Accepts a paired bridge credential only — an agent token is refused, so a session cannot be bootstrapped on an unpaired machine.",
22575
+ "operationId": "create_browser_session",
22576
+ "parameters": [
19547
22577
  {
19548
- "BearerAuth": []
22578
+ "name": "x-1claw-bridge-credential",
22579
+ "in": "header",
22580
+ "required": true,
22581
+ "schema": {
22582
+ "type": "string"
22583
+ },
22584
+ "description": "The bb_ credential from `1claw browser-bridge login`"
22585
+ },
22586
+ {
22587
+ "name": "x-1claw-bridge-version",
22588
+ "in": "header",
22589
+ "required": true,
22590
+ "schema": {
22591
+ "type": "string"
22592
+ },
22593
+ "description": "Bridge build. Versions below the server minimum are refused."
19549
22594
  }
19550
22595
  ],
19551
22596
  "requestBody": {
@@ -19553,75 +22598,102 @@
19553
22598
  "content": {
19554
22599
  "application/json": {
19555
22600
  "schema": {
19556
- "$ref": "#/components/schemas/ShamirKekSetupRequest"
22601
+ "type": "object",
22602
+ "required": [
22603
+ "agent_id",
22604
+ "client_id"
22605
+ ],
22606
+ "properties": {
22607
+ "agent_id": {
22608
+ "type": "string",
22609
+ "format": "uuid",
22610
+ "description": "Must belong to the same org as the paired device."
22611
+ },
22612
+ "client_id": {
22613
+ "type": "string"
22614
+ },
22615
+ "bridge_version": {
22616
+ "type": "string"
22617
+ },
22618
+ "protocol_version": {
22619
+ "type": "string"
22620
+ }
22621
+ }
19557
22622
  }
19558
22623
  }
19559
22624
  }
19560
22625
  },
19561
22626
  "responses": {
19562
- "201": {
19563
- "description": "Shamir KEK configured (shares returned one-time)",
22627
+ "200": {
22628
+ "description": "Session created",
19564
22629
  "content": {
19565
22630
  "application/json": {
19566
22631
  "schema": {
19567
- "$ref": "#/components/schemas/ShamirKekSetupResponse"
22632
+ "type": "object",
22633
+ "properties": {
22634
+ "session_id": {
22635
+ "type": "string",
22636
+ "format": "uuid"
22637
+ },
22638
+ "session_token": {
22639
+ "type": "string",
22640
+ "description": "bs_ prefixed. Only its hash is stored."
22641
+ },
22642
+ "expires_at": {
22643
+ "type": "string",
22644
+ "format": "date-time"
22645
+ }
22646
+ }
19568
22647
  }
19569
22648
  }
19570
22649
  }
19571
22650
  },
19572
22651
  "400": {
19573
- "$ref": "#/components/responses/BadRequest"
22652
+ "description": "Missing or unsupported bridge version"
19574
22653
  },
19575
22654
  "401": {
19576
- "$ref": "#/components/responses/Unauthorized"
22655
+ "description": "Not a paired bridge, or an agent token was presented"
19577
22656
  },
19578
22657
  "403": {
19579
- "$ref": "#/components/responses/Forbidden"
22658
+ "description": "The device and the agent are not in the same org"
19580
22659
  }
19581
22660
  }
19582
22661
  }
19583
22662
  },
19584
- "/v1/org/shamir-kek": {
19585
- "get": {
19586
- "tags": [
19587
- "Shamir KEK"
19588
- ],
19589
- "summary": "Get Shamir KEK status",
19590
- "description": "Returns the current Shamir KEK configuration status for the org.",
19591
- "operationId": "getShamirKekStatus",
19592
- "security": [
19593
- {
19594
- "BearerAuth": []
19595
- }
19596
- ],
19597
- "responses": {
19598
- "200": {
19599
- "description": "Shamir KEK status",
19600
- "content": {
19601
- "application/json": {
19602
- "schema": {
19603
- "$ref": "#/components/schemas/ShamirKekStatusResponse"
19604
- }
19605
- }
19606
- }
19607
- },
19608
- "401": {
19609
- "$ref": "#/components/responses/Unauthorized"
22663
+ "/v1/agents/{id}/browser/fills": {
22664
+ "parameters": [
22665
+ {
22666
+ "name": "id",
22667
+ "in": "path",
22668
+ "required": true,
22669
+ "schema": {
22670
+ "type": "string",
22671
+ "format": "uuid"
19610
22672
  }
19611
22673
  }
19612
- }
19613
- },
19614
- "/v1/org/shamir-kek/reconstruct": {
22674
+ ],
19615
22675
  "post": {
19616
22676
  "tags": [
19617
- "Shamir KEK"
22677
+ "Browser Bridge"
19618
22678
  ],
19619
- "summary": "Reconstruct KEK from shares",
19620
- "description": "Submit Shamir shares to reconstruct the org KEK. Requires at least\n`threshold` valid shares. Used during disaster recovery.\n",
19621
- "operationId": "reconstructShamirKek",
19622
- "security": [
22679
+ "summary": "Authorise one credential fill. Requires the bridge credential *and* an agent JWT — neither alone is sufficient.",
22680
+ "operationId": "authorize_browser_fill",
22681
+ "parameters": [
19623
22682
  {
19624
- "BearerAuth": []
22683
+ "name": "x-1claw-bridge-credential",
22684
+ "in": "header",
22685
+ "required": true,
22686
+ "schema": {
22687
+ "type": "string"
22688
+ }
22689
+ },
22690
+ {
22691
+ "name": "x-1claw-bridge-version",
22692
+ "in": "header",
22693
+ "required": true,
22694
+ "schema": {
22695
+ "type": "string"
22696
+ }
19625
22697
  }
19626
22698
  ],
19627
22699
  "requestBody": {
@@ -19629,81 +22701,169 @@
19629
22701
  "content": {
19630
22702
  "application/json": {
19631
22703
  "schema": {
19632
- "$ref": "#/components/schemas/ShamirKekReconstructRequest"
22704
+ "type": "object",
22705
+ "required": [
22706
+ "session_id",
22707
+ "binding_id",
22708
+ "tab_origin",
22709
+ "frame_origin",
22710
+ "frame_id",
22711
+ "generation",
22712
+ "form_path",
22713
+ "field_names",
22714
+ "redirect_chain",
22715
+ "current_generation"
22716
+ ],
22717
+ "properties": {
22718
+ "session_id": {
22719
+ "type": "string",
22720
+ "format": "uuid",
22721
+ "description": "Must match the session the presented bs_ token opened."
22722
+ },
22723
+ "binding_id": {
22724
+ "type": "string",
22725
+ "format": "uuid"
22726
+ },
22727
+ "frame_id": {
22728
+ "type": "string",
22729
+ "description": "The target the fill is for. Recorded on the grant."
22730
+ },
22731
+ "generation": {
22732
+ "type": "integer",
22733
+ "format": "int64",
22734
+ "description": "The bridge's navigation counter. Compared again at consume: a navigation in between means the page decided about is no longer the page in front of the bridge."
22735
+ },
22736
+ "form_action_origin": {
22737
+ "type": "string",
22738
+ "description": "Where the form would POST. Checked as well as the two origins — a login form on an allowed page can still submit to somebody else's host. Absent is not treated as 'same as the tab'; it denies."
22739
+ },
22740
+ "form_path": {
22741
+ "type": "string",
22742
+ "description": "Path of the form being filled, checked against the binding's fingerprint."
22743
+ },
22744
+ "field_names": {
22745
+ "type": "array",
22746
+ "items": {
22747
+ "type": "string"
22748
+ },
22749
+ "description": "Field names on that form. Every field the fingerprint expects must be present; extra fields are fine, since sites add hidden inputs."
22750
+ },
22751
+ "redirect_chain": {
22752
+ "type": "array",
22753
+ "items": {
22754
+ "type": "string"
22755
+ },
22756
+ "description": "Hosts the login has redirected through, in order. Each is checked against the binding's allowed hosts union its sso hosts."
22757
+ },
22758
+ "current_generation": {
22759
+ "type": "integer",
22760
+ "format": "int64",
22761
+ "description": "The target's generation now. A mismatch with `generation` means the page moved and the fill is denied."
22762
+ },
22763
+ "tab_origin": {
22764
+ "type": "string",
22765
+ "description": "Origin of the tab being driven. Checked against the binding's allowed and sso hosts by exact host match."
22766
+ },
22767
+ "frame_origin": {
22768
+ "type": "string",
22769
+ "description": "Origin of the frame holding the form. Checked separately — a credential typed into an allowed tab can still land in an attacker's iframe."
22770
+ }
22771
+ }
19633
22772
  }
19634
22773
  }
19635
22774
  }
19636
22775
  },
19637
22776
  "responses": {
19638
22777
  "200": {
19639
- "description": "Reconstruction result",
22778
+ "description": "A grant, a denial, or a pending approval. Never a secret.",
19640
22779
  "content": {
19641
22780
  "application/json": {
19642
22781
  "schema": {
19643
- "$ref": "#/components/schemas/ShamirKekReconstructResponse"
22782
+ "type": "object",
22783
+ "properties": {
22784
+ "kind": {
22785
+ "type": "string",
22786
+ "enum": [
22787
+ "grant"
22788
+ ]
22789
+ },
22790
+ "grant_id": {
22791
+ "type": "string",
22792
+ "format": "uuid",
22793
+ "description": "Single-use, short-lived, redeemable only by the session it was issued to."
22794
+ },
22795
+ "binding_id": {
22796
+ "type": "string",
22797
+ "format": "uuid"
22798
+ },
22799
+ "expires_at": {
22800
+ "type": "string",
22801
+ "format": "date-time"
22802
+ },
22803
+ "login_url": {
22804
+ "type": "string",
22805
+ "description": "The bridge navigates here itself. An agent-supplied URL would be the agent choosing who receives the password."
22806
+ }
22807
+ }
19644
22808
  }
19645
22809
  }
19646
22810
  }
19647
22811
  },
19648
22812
  "400": {
19649
- "$ref": "#/components/responses/BadRequest"
19650
- },
19651
- "401": {
19652
- "$ref": "#/components/responses/Unauthorized"
22813
+ "description": "Missing or unsupported bridge version"
19653
22814
  },
19654
22815
  "403": {
19655
- "$ref": "#/components/responses/Forbidden"
22816
+ "description": "Only one of the two required credentials was presented, an origin is not on the binding's allowlist, or the fill velocity cap was hit"
22817
+ },
22818
+ "404": {
22819
+ "description": "No such binding for this org"
19656
22820
  }
19657
22821
  }
19658
22822
  }
19659
22823
  },
19660
- "/v1/org/shamir-kek/recovery-codes": {
19661
- "get": {
22824
+ "/v1/agents/{id}/browser/fills/consume": {
22825
+ "parameters": [
22826
+ {
22827
+ "name": "id",
22828
+ "in": "path",
22829
+ "required": true,
22830
+ "schema": {
22831
+ "type": "string",
22832
+ "format": "uuid"
22833
+ }
22834
+ }
22835
+ ],
22836
+ "post": {
19662
22837
  "tags": [
19663
- "Shamir KEK"
22838
+ "Browser Bridge"
19664
22839
  ],
19665
- "summary": "Get Shamir recovery codes (one-time)",
19666
- "description": "Returns the one-time recovery codes for the Shamir KEK. These codes\ncan be used as an emergency fallback if custodian shares are lost.\nCodes are only returned once — subsequent calls return 410.\n",
19667
- "operationId": "getShamirKekRecoveryCodes",
19668
- "security": [
22840
+ "summary": "Redeem a grant for the credential it authorised. Takes the browser session token and the bridge credential, and refuses an agent principal — the agent asks which binding, the bridge collects the answer.",
22841
+ "operationId": "consume_browser_fill",
22842
+ "parameters": [
19669
22843
  {
19670
- "BearerAuth": []
19671
- }
19672
- ],
19673
- "responses": {
19674
- "200": {
19675
- "description": "Recovery codes (one-time)",
19676
- "content": {
19677
- "application/json": {
19678
- "schema": {
19679
- "$ref": "#/components/schemas/ShamirKekRecoveryCodesResponse"
19680
- }
19681
- }
22844
+ "name": "x-1claw-bridge-credential",
22845
+ "in": "header",
22846
+ "required": true,
22847
+ "schema": {
22848
+ "type": "string"
19682
22849
  }
19683
22850
  },
19684
- "401": {
19685
- "$ref": "#/components/responses/Unauthorized"
19686
- },
19687
- "403": {
19688
- "$ref": "#/components/responses/Forbidden"
22851
+ {
22852
+ "name": "x-1claw-bridge-session",
22853
+ "in": "header",
22854
+ "required": true,
22855
+ "schema": {
22856
+ "type": "string"
22857
+ },
22858
+ "description": "The bs_ session token. Proof the redemption belongs to a session this bridge opened."
19689
22859
  },
19690
- "410": {
19691
- "description": "Codes already retrieved"
19692
- }
19693
- }
19694
- }
19695
- },
19696
- "/v1/org/shamir-kek/verify-recovery-code": {
19697
- "post": {
19698
- "tags": [
19699
- "Shamir KEK"
19700
- ],
19701
- "summary": "Verify a Shamir recovery code",
19702
- "description": "Check whether a recovery code is valid without consuming it.",
19703
- "operationId": "verifyShamirKekRecoveryCode",
19704
- "security": [
19705
22860
  {
19706
- "BearerAuth": []
22861
+ "name": "x-1claw-bridge-version",
22862
+ "in": "header",
22863
+ "required": true,
22864
+ "schema": {
22865
+ "type": "string"
22866
+ }
19707
22867
  }
19708
22868
  ],
19709
22869
  "requestBody": {
@@ -19711,27 +22871,100 @@
19711
22871
  "content": {
19712
22872
  "application/json": {
19713
22873
  "schema": {
19714
- "$ref": "#/components/schemas/ShamirKekVerifyCodeRequest"
22874
+ "type": "object",
22875
+ "required": [
22876
+ "session_id",
22877
+ "grant_id",
22878
+ "generation"
22879
+ ],
22880
+ "properties": {
22881
+ "session_id": {
22882
+ "type": "string",
22883
+ "format": "uuid"
22884
+ },
22885
+ "grant_id": {
22886
+ "type": "string",
22887
+ "format": "uuid"
22888
+ },
22889
+ "generation": {
22890
+ "type": "integer",
22891
+ "format": "int64",
22892
+ "description": "The bridge's navigation counter now. A mismatch means the page moved after the decision."
22893
+ }
22894
+ }
19715
22895
  }
19716
22896
  }
19717
22897
  }
19718
22898
  },
19719
22899
  "responses": {
19720
22900
  "200": {
19721
- "description": "Verification result",
22901
+ "description": "The credential itself, as raw bytes — the only route in the feature that returns secret material. Not a JSON envelope: the bridge adopts the body into a zeroable buffer, and a wrapper would force it to parse, interning the secret as a string that lives until GC. Metadata rides in `x-1claw-binding-id` and `x-1claw-form-fingerprint`; the response is `cache-control: no-store`.",
22902
+ "headers": {
22903
+ "x-1claw-binding-id": {
22904
+ "schema": {
22905
+ "type": "string",
22906
+ "format": "uuid"
22907
+ }
22908
+ },
22909
+ "x-1claw-form-fingerprint": {
22910
+ "schema": {
22911
+ "type": "string",
22912
+ "format": "byte"
22913
+ },
22914
+ "description": "The binding's form fingerprint, base64-encoded JSON, when it has one. Base64 because a fingerprint naming a non-ASCII field is not a legal header value as raw JSON."
22915
+ }
22916
+ },
19722
22917
  "content": {
19723
- "application/json": {
22918
+ "application/octet-stream": {
19724
22919
  "schema": {
19725
- "$ref": "#/components/schemas/ShamirKekVerifyCodeResponse"
22920
+ "type": "string",
22921
+ "format": "binary"
19726
22922
  }
19727
22923
  }
19728
22924
  }
19729
22925
  },
19730
22926
  "400": {
19731
- "$ref": "#/components/responses/BadRequest"
22927
+ "description": "Missing or unsupported bridge version"
22928
+ },
22929
+ "403": {
22930
+ "description": "Grant expired, already used, issued to another session or device; the page navigated after authorisation; or an agent principal was presented"
22931
+ },
22932
+ "404": {
22933
+ "description": "The binding or the secret behind it is missing"
22934
+ }
22935
+ }
22936
+ }
22937
+ },
22938
+ "/v1/agents/{agent_id}/chat/unlock": {
22939
+ "parameters": [
22940
+ {
22941
+ "name": "agent_id",
22942
+ "in": "path",
22943
+ "required": true,
22944
+ "schema": {
22945
+ "type": "string",
22946
+ "format": "uuid"
22947
+ }
22948
+ }
22949
+ ],
22950
+ "post": {
22951
+ "tags": [
22952
+ "Chat"
22953
+ ],
22954
+ "summary": "Unlock an agent's chat history for reading",
22955
+ "operationId": "unlock_agent_chat",
22956
+ "responses": {
22957
+ "200": {
22958
+ "description": "Unlocked"
19732
22959
  },
19733
22960
  "401": {
19734
- "$ref": "#/components/responses/Unauthorized"
22961
+ "description": "Unauthenticated"
22962
+ },
22963
+ "403": {
22964
+ "description": "Forbidden"
22965
+ },
22966
+ "404": {
22967
+ "description": "Agent not found"
19735
22968
  }
19736
22969
  }
19737
22970
  }
@@ -20796,7 +24029,10 @@
20796
24029
  ],
20797
24030
  "properties": {
20798
24031
  "name": {
20799
- "type": "string"
24032
+ "type": "string",
24033
+ "minLength": 1,
24034
+ "maxLength": 255,
24035
+ "description": "Unique within the organization. Trimmed before it is stored, and the trimmed value is what must be unique. Counted in characters, not bytes."
20800
24036
  },
20801
24037
  "description": {
20802
24038
  "type": "string"
@@ -23638,6 +26874,7 @@
23638
26874
  },
23639
26875
  "PatchConnectionAgentRequest": {
23640
26876
  "type": "object",
26877
+ "description": "At least one field is required.\n",
23641
26878
  "properties": {
23642
26879
  "intents_api_enabled": {
23643
26880
  "type": "boolean"
@@ -23645,6 +26882,10 @@
23645
26882
  "execution_intents_enabled": {
23646
26883
  "type": "boolean"
23647
26884
  },
26885
+ "memory_enabled": {
26886
+ "type": "boolean",
26887
+ "description": "Agent memory, off by default. Until this field existed a\nplatform app had no way to turn it on: a bootstrap template\naccepted `memory_enabled` in its spec and never read it, so\nthe capability was reachable only from the end user's own\ndashboard. Templates now honour the flag too.\n"
26888
+ },
23648
26889
  "system_prompt": {
23649
26890
  "type": "string",
23650
26891
  "nullable": true
@@ -23664,6 +26905,9 @@
23664
26905
  "execution_intents_enabled": {
23665
26906
  "type": "boolean"
23666
26907
  },
26908
+ "memory_enabled": {
26909
+ "type": "boolean"
26910
+ },
23667
26911
  "system_prompt": {
23668
26912
  "type": "string",
23669
26913
  "nullable": true