@1claw/openapi-spec 0.59.8 → 0.59.9

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 +3077 -96
  2. package/openapi.yaml +2040 -123
  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.9",
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": [
@@ -12540,6 +12540,7 @@
12540
12540
  {
12541
12541
  "in": "query",
12542
12542
  "name": "agent_id",
12543
+ "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
12544
  "required": false,
12544
12545
  "schema": {
12545
12546
  "type": "string",
@@ -12802,8 +12803,9 @@
12802
12803
  "tags": [
12803
12804
  "Platform"
12804
12805
  ],
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",
12806
+ "summary": "Begin passkey enrollment for a connected user (always 403)",
12807
+ "deprecated": true,
12808
+ "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
12809
  "operationId": "connectionPasskeyEnrollBegin",
12808
12810
  "security": [
12809
12811
  {
@@ -12821,30 +12823,147 @@
12821
12823
  }
12822
12824
  }
12823
12825
  ],
12826
+ "responses": {
12827
+ "403": {
12828
+ "description": "Always. Platform apps cannot enroll login passkeys for\nconnected users.\n",
12829
+ "content": {
12830
+ "application/json": {
12831
+ "schema": {
12832
+ "$ref": "#/components/schemas/ProblemDetails"
12833
+ }
12834
+ }
12835
+ }
12836
+ }
12837
+ }
12838
+ }
12839
+ },
12840
+ "/v1/platform/connections/{connectionId}/passkeys/enroll/complete": {
12841
+ "post": {
12842
+ "tags": [
12843
+ "Platform"
12844
+ ],
12845
+ "summary": "Complete passkey enrollment for a connected user (always 403)",
12846
+ "deprecated": true,
12847
+ "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",
12848
+ "operationId": "connectionPasskeyEnrollComplete",
12849
+ "security": [
12850
+ {
12851
+ "BearerAuth": []
12852
+ }
12853
+ ],
12854
+ "parameters": [
12855
+ {
12856
+ "in": "path",
12857
+ "name": "connectionId",
12858
+ "required": true,
12859
+ "schema": {
12860
+ "type": "string",
12861
+ "format": "uuid"
12862
+ }
12863
+ }
12864
+ ],
12865
+ "requestBody": {
12866
+ "required": true,
12867
+ "content": {
12868
+ "application/json": {
12869
+ "schema": {
12870
+ "$ref": "#/components/schemas/PasskeyRegisterCompleteRequest"
12871
+ }
12872
+ }
12873
+ }
12874
+ },
12875
+ "responses": {
12876
+ "403": {
12877
+ "description": "Always. Platform apps cannot enroll login passkeys for\nconnected users.\n",
12878
+ "content": {
12879
+ "application/json": {
12880
+ "schema": {
12881
+ "$ref": "#/components/schemas/ProblemDetails"
12882
+ }
12883
+ }
12884
+ }
12885
+ }
12886
+ }
12887
+ }
12888
+ },
12889
+ "/v1/platform/connections/{connectionId}/passkeys": {
12890
+ "get": {
12891
+ "tags": [
12892
+ "Platform"
12893
+ ],
12894
+ "summary": "Whether a connected user can be asked for a passkey touch",
12895
+ "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",
12896
+ "operationId": "listConnectionPasskeys",
12897
+ "security": [
12898
+ {
12899
+ "BearerAuth": []
12900
+ }
12901
+ ],
12902
+ "parameters": [
12903
+ {
12904
+ "in": "path",
12905
+ "name": "connectionId",
12906
+ "required": true,
12907
+ "schema": {
12908
+ "type": "string",
12909
+ "format": "uuid"
12910
+ }
12911
+ }
12912
+ ],
12824
12913
  "responses": {
12825
12914
  "200": {
12826
- "description": "WebAuthn registration ceremony options",
12915
+ "description": "Passkey availability for this connection",
12827
12916
  "content": {
12828
12917
  "application/json": {
12829
12918
  "schema": {
12830
- "$ref": "#/components/schemas/PasskeyRegisterBeginResponse"
12919
+ "type": "object",
12920
+ "required": [
12921
+ "has_passkey",
12922
+ "count",
12923
+ "registered_count",
12924
+ "rp_id"
12925
+ ],
12926
+ "properties": {
12927
+ "has_passkey": {
12928
+ "type": "boolean",
12929
+ "description": "True when count > 0."
12930
+ },
12931
+ "count": {
12932
+ "type": "integer",
12933
+ "format": "int64",
12934
+ "description": "Passkeys usable on rp_id."
12935
+ },
12936
+ "registered_count": {
12937
+ "type": "integer",
12938
+ "format": "int64",
12939
+ "description": "All passkeys on the account, including any\nbound to a different domain.\n"
12940
+ },
12941
+ "rp_id": {
12942
+ "type": "string",
12943
+ "description": "The domain these counts are measured against."
12944
+ }
12945
+ }
12831
12946
  }
12832
12947
  }
12833
12948
  }
12834
12949
  },
12950
+ "403": {
12951
+ "$ref": "#/components/responses/Forbidden"
12952
+ },
12835
12953
  "404": {
12836
12954
  "$ref": "#/components/responses/NotFound"
12837
12955
  }
12838
12956
  }
12839
12957
  }
12840
12958
  },
12841
- "/v1/platform/connections/{connectionId}/passkeys/enroll/complete": {
12959
+ "/v1/platform/connections/{connectionId}/passkeys/tx-assert/begin": {
12842
12960
  "post": {
12843
12961
  "tags": [
12844
12962
  "Platform"
12845
12963
  ],
12846
- "summary": "Complete passkey enrollment for a connected user",
12847
- "operationId": "connectionPasskeyEnrollComplete",
12964
+ "summary": "Ask a connected user to touch their authenticator",
12965
+ "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",
12966
+ "operationId": "connectionPasskeyTxAssertBegin",
12848
12967
  "security": [
12849
12968
  {
12850
12969
  "BearerAuth": []
@@ -12866,18 +12985,133 @@
12866
12985
  "content": {
12867
12986
  "application/json": {
12868
12987
  "schema": {
12869
- "$ref": "#/components/schemas/PasskeyRegisterCompleteRequest"
12988
+ "type": "object",
12989
+ "required": [
12990
+ "tx_digest"
12991
+ ],
12992
+ "properties": {
12993
+ "tx_digest": {
12994
+ "type": "string",
12995
+ "description": "SHA-256 hex of the exact text being confirmed."
12996
+ },
12997
+ "action": {
12998
+ "type": "string",
12999
+ "enum": [
13000
+ "send",
13001
+ "swap"
13002
+ ],
13003
+ "default": "send"
13004
+ }
13005
+ }
12870
13006
  }
12871
13007
  }
12872
13008
  }
12873
13009
  },
12874
13010
  "responses": {
12875
- "201": {
12876
- "description": "Passkey registered",
13011
+ "200": {
13012
+ "description": "WebAuthn assertion ceremony options",
13013
+ "content": {
13014
+ "application/json": {
13015
+ "schema": {
13016
+ "$ref": "#/components/schemas/PasskeyAssertBeginResponse"
13017
+ }
13018
+ }
13019
+ }
13020
+ },
13021
+ "400": {
13022
+ "$ref": "#/components/responses/BadRequest"
13023
+ },
13024
+ "403": {
13025
+ "$ref": "#/components/responses/Forbidden"
13026
+ },
13027
+ "404": {
13028
+ "description": "This user has no passkey registered.",
12877
13029
  "content": {
12878
13030
  "application/json": {
12879
13031
  "schema": {
12880
- "$ref": "#/components/schemas/PasskeyRegisterCompleteResponse"
13032
+ "$ref": "#/components/schemas/ProblemDetails"
13033
+ }
13034
+ }
13035
+ }
13036
+ }
13037
+ }
13038
+ }
13039
+ },
13040
+ "/v1/platform/connections/{connectionId}/passkeys/tx-assert/complete": {
13041
+ "post": {
13042
+ "tags": [
13043
+ "Platform"
13044
+ ],
13045
+ "summary": "Verify the touch and return proof of it",
13046
+ "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",
13047
+ "operationId": "connectionPasskeyTxAssertComplete",
13048
+ "security": [
13049
+ {
13050
+ "BearerAuth": []
13051
+ }
13052
+ ],
13053
+ "parameters": [
13054
+ {
13055
+ "in": "path",
13056
+ "name": "connectionId",
13057
+ "required": true,
13058
+ "schema": {
13059
+ "type": "string",
13060
+ "format": "uuid"
13061
+ }
13062
+ }
13063
+ ],
13064
+ "requestBody": {
13065
+ "required": true,
13066
+ "content": {
13067
+ "application/json": {
13068
+ "schema": {
13069
+ "type": "object",
13070
+ "required": [
13071
+ "credential_id",
13072
+ "authenticator_data",
13073
+ "client_data_json",
13074
+ "signature"
13075
+ ],
13076
+ "properties": {
13077
+ "credential_id": {
13078
+ "type": "string"
13079
+ },
13080
+ "authenticator_data": {
13081
+ "type": "string"
13082
+ },
13083
+ "client_data_json": {
13084
+ "type": "string"
13085
+ },
13086
+ "signature": {
13087
+ "type": "string"
13088
+ }
13089
+ }
13090
+ }
13091
+ }
13092
+ }
13093
+ },
13094
+ "responses": {
13095
+ "200": {
13096
+ "description": "Assertion verified",
13097
+ "content": {
13098
+ "application/json": {
13099
+ "schema": {
13100
+ "type": "object",
13101
+ "required": [
13102
+ "passkey_token",
13103
+ "expires_in"
13104
+ ],
13105
+ "properties": {
13106
+ "passkey_token": {
13107
+ "type": "string",
13108
+ "description": "Single-use proof of the touch, bound to the\ndigest and to this user.\n"
13109
+ },
13110
+ "expires_in": {
13111
+ "type": "integer",
13112
+ "description": "Seconds until the token expires."
13113
+ }
13114
+ }
12881
13115
  }
12882
13116
  }
12883
13117
  }
@@ -12885,6 +13119,9 @@
12885
13119
  "400": {
12886
13120
  "$ref": "#/components/responses/BadRequest"
12887
13121
  },
13122
+ "403": {
13123
+ "$ref": "#/components/responses/Forbidden"
13124
+ },
12888
13125
  "404": {
12889
13126
  "$ref": "#/components/responses/NotFound"
12890
13127
  }
@@ -19535,93 +19772,2592 @@
19535
19772
  }
19536
19773
  }
19537
19774
  },
19538
- "/v1/org/shamir-kek/setup": {
19775
+ "/v1/agents/batch-delete": {
19539
19776
  "post": {
19540
19777
  "tags": [
19541
- "Shamir KEK"
19778
+ "Agents"
19542
19779
  ],
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": [
19547
- {
19548
- "BearerAuth": []
19780
+ "summary": "batch delete agents",
19781
+ "operationId": "batch_delete_agents",
19782
+ "responses": {
19783
+ "200": {
19784
+ "description": "Success"
19785
+ },
19786
+ "401": {
19787
+ "description": "Unauthenticated"
19788
+ },
19789
+ "403": {
19790
+ "description": "Forbidden, or the plan does not include this"
19791
+ },
19792
+ "404": {
19793
+ "description": "Not found"
19549
19794
  }
19795
+ }
19796
+ }
19797
+ },
19798
+ "/v1/agents/enroll/approve": {
19799
+ "post": {
19800
+ "tags": [
19801
+ "Agents"
19550
19802
  ],
19803
+ "summary": "Authenticated: consume token, create agent, return API key once. **Email-bound pending:** caller must belong to the same org and match `human_email`.",
19804
+ "operationId": "approve_enrollment",
19551
19805
  "requestBody": {
19552
19806
  "required": true,
19553
19807
  "content": {
19554
19808
  "application/json": {
19555
19809
  "schema": {
19556
- "$ref": "#/components/schemas/ShamirKekSetupRequest"
19810
+ "type": "object",
19811
+ "required": [
19812
+ "token"
19813
+ ],
19814
+ "properties": {
19815
+ "token": {
19816
+ "type": "string"
19817
+ },
19818
+ "approval_id": {
19819
+ "type": "string",
19820
+ "format": "uuid",
19821
+ "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"
19822
+ }
19823
+ }
19557
19824
  }
19558
19825
  }
19559
19826
  }
19560
19827
  },
19561
19828
  "responses": {
19562
- "201": {
19563
- "description": "Shamir KEK configured (shares returned one-time)",
19564
- "content": {
19565
- "application/json": {
19566
- "schema": {
19567
- "$ref": "#/components/schemas/ShamirKekSetupResponse"
19568
- }
19569
- }
19570
- }
19571
- },
19572
- "400": {
19573
- "$ref": "#/components/responses/BadRequest"
19829
+ "200": {
19830
+ "description": "Success"
19574
19831
  },
19575
19832
  "401": {
19576
- "$ref": "#/components/responses/Unauthorized"
19833
+ "description": "Unauthenticated"
19577
19834
  },
19578
19835
  "403": {
19579
- "$ref": "#/components/responses/Forbidden"
19836
+ "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"
19837
+ },
19838
+ "404": {
19839
+ "description": "Not found"
19580
19840
  }
19581
19841
  }
19582
19842
  }
19583
19843
  },
19584
- "/v1/org/shamir-kek": {
19585
- "get": {
19844
+ "/v1/agents/enroll/deny": {
19845
+ "post": {
19586
19846
  "tags": [
19587
- "Shamir KEK"
19847
+ "Agents"
19588
19848
  ],
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": []
19849
+ "summary": "Authenticated: consume token and delete pending enrollment (deny). **Email-bound:** caller org and email must match the pending row. **Link-only:** ",
19850
+ "operationId": "deny_enrollment",
19851
+ "requestBody": {
19852
+ "required": true,
19853
+ "content": {
19854
+ "application/json": {
19855
+ "schema": {
19856
+ "type": "object",
19857
+ "required": [
19858
+ "token"
19859
+ ],
19860
+ "properties": {
19861
+ "token": {
19862
+ "type": "string"
19863
+ }
19864
+ }
19865
+ }
19866
+ }
19867
+ }
19868
+ },
19869
+ "responses": {
19870
+ "200": {
19871
+ "description": "Success"
19872
+ },
19873
+ "401": {
19874
+ "description": "Unauthenticated"
19875
+ },
19876
+ "403": {
19877
+ "description": "Forbidden, or the plan does not include this"
19878
+ },
19879
+ "404": {
19880
+ "description": "Not found"
19881
+ }
19882
+ }
19883
+ }
19884
+ },
19885
+ "/v1/agents/enroll/pending": {
19886
+ "get": {
19887
+ "tags": [
19888
+ "Agents"
19889
+ ],
19890
+ "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",
19891
+ "operationId": "get_enrollment_pending",
19892
+ "security": [],
19893
+ "responses": {
19894
+ "200": {
19895
+ "description": "Success"
19896
+ },
19897
+ "404": {
19898
+ "description": "Not found"
19899
+ }
19900
+ }
19901
+ }
19902
+ },
19903
+ "/v1/agents/{agent_id}/channels/{channel_id}/refresh-webhook": {
19904
+ "parameters": [
19905
+ {
19906
+ "name": "agent_id",
19907
+ "in": "path",
19908
+ "required": true,
19909
+ "schema": {
19910
+ "type": "string"
19911
+ }
19912
+ },
19913
+ {
19914
+ "name": "channel_id",
19915
+ "in": "path",
19916
+ "required": true,
19917
+ "schema": {
19918
+ "type": "string"
19919
+ }
19920
+ }
19921
+ ],
19922
+ "post": {
19923
+ "tags": [
19924
+ "Agents"
19925
+ ],
19926
+ "summary": "Re-register the provider webhook for this channel (repairs a stale or revoked subscription).",
19927
+ "operationId": "refresh_channel_webhook",
19928
+ "responses": {
19929
+ "200": {
19930
+ "description": "Success"
19931
+ },
19932
+ "401": {
19933
+ "description": "Unauthenticated"
19934
+ },
19935
+ "403": {
19936
+ "description": "Forbidden, or the plan does not include this"
19937
+ },
19938
+ "404": {
19939
+ "description": "Not found"
19940
+ }
19941
+ }
19942
+ }
19943
+ },
19944
+ "/v1/agents/{agent_id}/channels/{channel_id}/repair": {
19945
+ "parameters": [
19946
+ {
19947
+ "name": "agent_id",
19948
+ "in": "path",
19949
+ "required": true,
19950
+ "schema": {
19951
+ "type": "string"
19952
+ }
19953
+ },
19954
+ {
19955
+ "name": "channel_id",
19956
+ "in": "path",
19957
+ "required": true,
19958
+ "schema": {
19959
+ "type": "string"
19960
+ }
19961
+ }
19962
+ ],
19963
+ "post": {
19964
+ "tags": [
19965
+ "Agents"
19966
+ ],
19967
+ "summary": "Repair a channel: alias of refresh-webhook, re-registers the provider webhook for this channel.",
19968
+ "operationId": "repair_channel_webhook",
19969
+ "responses": {
19970
+ "200": {
19971
+ "description": "Success"
19972
+ },
19973
+ "401": {
19974
+ "description": "Unauthenticated"
19975
+ },
19976
+ "403": {
19977
+ "description": "Forbidden, or the plan does not include this"
19978
+ },
19979
+ "404": {
19980
+ "description": "Not found"
19981
+ }
19982
+ }
19983
+ }
19984
+ },
19985
+ "/v1/agents/{agent_id}/eoa": {
19986
+ "parameters": [
19987
+ {
19988
+ "name": "agent_id",
19989
+ "in": "path",
19990
+ "required": true,
19991
+ "schema": {
19992
+ "type": "string"
19993
+ }
19994
+ }
19995
+ ],
19996
+ "get": {
19997
+ "tags": [
19998
+ "Agents"
19999
+ ],
20000
+ "summary": "Get the agent's EVM address (no private key exposure).",
20001
+ "operationId": "get_agent_eoa",
20002
+ "responses": {
20003
+ "200": {
20004
+ "description": "Success"
20005
+ },
20006
+ "401": {
20007
+ "description": "Unauthenticated"
20008
+ },
20009
+ "403": {
20010
+ "description": "Forbidden, or the plan does not include this"
20011
+ },
20012
+ "404": {
20013
+ "description": "Not found"
20014
+ }
20015
+ }
20016
+ },
20017
+ "post": {
20018
+ "tags": [
20019
+ "Agents"
20020
+ ],
20021
+ "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.",
20022
+ "operationId": "generate_agent_eoa",
20023
+ "responses": {
20024
+ "200": {
20025
+ "description": "Success"
20026
+ },
20027
+ "401": {
20028
+ "description": "Unauthenticated"
20029
+ },
20030
+ "403": {
20031
+ "description": "Forbidden, or the plan does not include this"
20032
+ },
20033
+ "404": {
20034
+ "description": "Not found"
20035
+ }
20036
+ }
20037
+ }
20038
+ },
20039
+ "/v1/agents/{agent_id}/rotate-signer-key": {
20040
+ "parameters": [
20041
+ {
20042
+ "name": "agent_id",
20043
+ "in": "path",
20044
+ "required": true,
20045
+ "schema": {
20046
+ "type": "string"
20047
+ }
20048
+ }
20049
+ ],
20050
+ "post": {
20051
+ "tags": [
20052
+ "Agents"
20053
+ ],
20054
+ "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",
20055
+ "operationId": "rotate_signer_key",
20056
+ "responses": {
20057
+ "200": {
20058
+ "description": "Success"
20059
+ },
20060
+ "401": {
20061
+ "description": "Unauthenticated"
20062
+ },
20063
+ "403": {
20064
+ "description": "Forbidden, or the plan does not include this"
20065
+ },
20066
+ "404": {
20067
+ "description": "Not found"
20068
+ }
20069
+ }
20070
+ }
20071
+ },
20072
+ "/v1/agents/{agent_id}/smart-accounts/{chain_id}": {
20073
+ "parameters": [
20074
+ {
20075
+ "name": "agent_id",
20076
+ "in": "path",
20077
+ "required": true,
20078
+ "schema": {
20079
+ "type": "string"
20080
+ }
20081
+ },
20082
+ {
20083
+ "name": "chain_id",
20084
+ "in": "path",
20085
+ "required": true,
20086
+ "schema": {
20087
+ "type": "string"
20088
+ }
20089
+ }
20090
+ ],
20091
+ "delete": {
20092
+ "tags": [
20093
+ "Agents"
20094
+ ],
20095
+ "summary": "delete smart account",
20096
+ "operationId": "delete_smart_account",
20097
+ "responses": {
20098
+ "200": {
20099
+ "description": "Success"
20100
+ },
20101
+ "401": {
20102
+ "description": "Unauthenticated"
20103
+ },
20104
+ "403": {
20105
+ "description": "Forbidden, or the plan does not include this"
20106
+ },
20107
+ "404": {
20108
+ "description": "Not found"
20109
+ }
20110
+ }
20111
+ }
20112
+ },
20113
+ "/v1/agents/{agent_id}/unlock-platform": {
20114
+ "parameters": [
20115
+ {
20116
+ "name": "agent_id",
20117
+ "in": "path",
20118
+ "required": true,
20119
+ "schema": {
20120
+ "type": "string"
20121
+ }
20122
+ }
20123
+ ],
20124
+ "post": {
20125
+ "tags": [
20126
+ "Agents"
20127
+ ],
20128
+ "summary": "User-only. Clears platform_locked when the app is no longer actively connected.",
20129
+ "operationId": "unlock_agent_platform",
20130
+ "responses": {
20131
+ "200": {
20132
+ "description": "Success"
20133
+ },
20134
+ "401": {
20135
+ "description": "Unauthenticated"
20136
+ },
20137
+ "403": {
20138
+ "description": "Forbidden, or the plan does not include this"
20139
+ },
20140
+ "404": {
20141
+ "description": "Not found"
20142
+ }
20143
+ }
20144
+ }
20145
+ },
20146
+ "/v1/audit/export": {
20147
+ "get": {
20148
+ "tags": [
20149
+ "Audit"
20150
+ ],
20151
+ "summary": "export audit events",
20152
+ "operationId": "export_audit_events",
20153
+ "responses": {
20154
+ "200": {
20155
+ "description": "Success"
20156
+ },
20157
+ "401": {
20158
+ "description": "Unauthenticated"
20159
+ },
20160
+ "403": {
20161
+ "description": "Forbidden, or the plan does not include this"
20162
+ },
20163
+ "404": {
20164
+ "description": "Not found"
20165
+ }
20166
+ }
20167
+ }
20168
+ },
20169
+ "/v1/auth/credential-recovery/requests/{id}/cancel": {
20170
+ "parameters": [
20171
+ {
20172
+ "name": "id",
20173
+ "in": "path",
20174
+ "required": true,
20175
+ "schema": {
20176
+ "type": "string"
20177
+ }
20178
+ }
20179
+ ],
20180
+ "post": {
20181
+ "tags": [
20182
+ "Auth"
20183
+ ],
20184
+ "summary": "cancel request",
20185
+ "operationId": "cancel_request",
20186
+ "responses": {
20187
+ "200": {
20188
+ "description": "Success"
20189
+ },
20190
+ "401": {
20191
+ "description": "Unauthenticated"
20192
+ },
20193
+ "403": {
20194
+ "description": "Forbidden, or the plan does not include this"
20195
+ },
20196
+ "404": {
20197
+ "description": "Not found"
20198
+ }
20199
+ }
20200
+ }
20201
+ },
20202
+ "/v1/auth/migration-status": {
20203
+ "get": {
20204
+ "tags": [
20205
+ "Auth"
20206
+ ],
20207
+ "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",
20208
+ "operationId": "migration_status",
20209
+ "responses": {
20210
+ "200": {
20211
+ "description": "Success"
20212
+ },
20213
+ "401": {
20214
+ "description": "Unauthenticated"
20215
+ },
20216
+ "403": {
20217
+ "description": "Forbidden, or the plan does not include this"
20218
+ },
20219
+ "404": {
20220
+ "description": "Not found"
20221
+ }
20222
+ }
20223
+ }
20224
+ },
20225
+ "/v1/auth/passkeys/vault-assert/begin": {
20226
+ "post": {
20227
+ "tags": [
20228
+ "Auth"
20229
+ ],
20230
+ "summary": "Begin a passkey assertion that unlocks vault secret reads for users who have `require_passkey_for_vaults` enabled.",
20231
+ "operationId": "vault_assert_begin",
20232
+ "responses": {
20233
+ "200": {
20234
+ "description": "Success"
20235
+ },
20236
+ "401": {
20237
+ "description": "Unauthenticated"
20238
+ },
20239
+ "403": {
20240
+ "description": "Forbidden, or the plan does not include this"
20241
+ },
20242
+ "404": {
20243
+ "description": "Not found"
20244
+ }
20245
+ }
20246
+ }
20247
+ },
20248
+ "/v1/auth/passkeys/vault-assert/complete": {
20249
+ "post": {
20250
+ "tags": [
20251
+ "Auth"
20252
+ ],
20253
+ "summary": "Returns a short-lived `passkey_token` for the `X-Passkey-Token` header on secret reads.",
20254
+ "operationId": "vault_assert_complete",
20255
+ "requestBody": {
20256
+ "required": true,
20257
+ "content": {
20258
+ "application/json": {
20259
+ "schema": {
20260
+ "type": "object",
20261
+ "required": [
20262
+ "credential_id",
20263
+ "authenticator_data",
20264
+ "client_data_json",
20265
+ "signature"
20266
+ ],
20267
+ "properties": {
20268
+ "credential_id": {
20269
+ "type": "string"
20270
+ },
20271
+ "authenticator_data": {
20272
+ "type": "string"
20273
+ },
20274
+ "client_data_json": {
20275
+ "type": "string"
20276
+ },
20277
+ "signature": {
20278
+ "type": "string"
20279
+ }
20280
+ }
20281
+ }
20282
+ }
20283
+ }
20284
+ },
20285
+ "responses": {
20286
+ "200": {
20287
+ "description": "Success"
20288
+ },
20289
+ "401": {
20290
+ "description": "Unauthenticated"
20291
+ },
20292
+ "403": {
20293
+ "description": "Forbidden, or the plan does not include this"
20294
+ },
20295
+ "404": {
20296
+ "description": "Not found"
20297
+ }
20298
+ }
20299
+ }
20300
+ },
20301
+ "/v1/auth/reauth/begin": {
20302
+ "post": {
20303
+ "tags": [
20304
+ "Auth"
20305
+ ],
20306
+ "summary": "start a re-authentication ceremony. For passkey: returns a WebAuthn challenge. For password: returns immediately (no challenge needed).",
20307
+ "operationId": "reauth_begin",
20308
+ "requestBody": {
20309
+ "required": true,
20310
+ "content": {
20311
+ "application/json": {
20312
+ "schema": {
20313
+ "type": "object",
20314
+ "required": [
20315
+ "method"
20316
+ ],
20317
+ "properties": {
20318
+ "method": {
20319
+ "type": "string"
20320
+ },
20321
+ "purpose": {
20322
+ "type": "string"
20323
+ }
20324
+ }
20325
+ }
20326
+ }
20327
+ }
20328
+ },
20329
+ "responses": {
20330
+ "200": {
20331
+ "description": "Success"
20332
+ },
20333
+ "401": {
20334
+ "description": "Unauthenticated"
20335
+ },
20336
+ "403": {
20337
+ "description": "Forbidden, or the plan does not include this"
20338
+ },
20339
+ "404": {
20340
+ "description": "Not found"
20341
+ }
20342
+ }
20343
+ }
20344
+ },
20345
+ "/v1/auth/reauth/complete": {
20346
+ "post": {
20347
+ "tags": [
20348
+ "Auth"
20349
+ ],
20350
+ "summary": "verify re-authentication and issue a single-use token.",
20351
+ "operationId": "reauth_complete",
20352
+ "requestBody": {
20353
+ "required": true,
20354
+ "content": {
20355
+ "application/json": {
20356
+ "schema": {
20357
+ "type": "object",
20358
+ "required": [
20359
+ "method"
20360
+ ],
20361
+ "properties": {
20362
+ "method": {
20363
+ "type": "string"
20364
+ },
20365
+ "purpose": {
20366
+ "type": "string"
20367
+ },
20368
+ "password": {
20369
+ "type": "string"
20370
+ },
20371
+ "credential_id": {
20372
+ "type": "string"
20373
+ },
20374
+ "authenticator_data": {
20375
+ "type": "string"
20376
+ },
20377
+ "client_data_json": {
20378
+ "type": "string"
20379
+ },
20380
+ "signature": {
20381
+ "type": "string"
20382
+ }
20383
+ }
20384
+ }
20385
+ }
20386
+ }
20387
+ },
20388
+ "responses": {
20389
+ "200": {
20390
+ "description": "Success"
20391
+ },
20392
+ "401": {
20393
+ "description": "Unauthenticated"
20394
+ },
20395
+ "403": {
20396
+ "description": "Forbidden, or the plan does not include this"
20397
+ },
20398
+ "404": {
20399
+ "description": "Not found"
20400
+ }
20401
+ }
20402
+ }
20403
+ },
20404
+ "/v1/auth/social/disconnect": {
20405
+ "post": {
20406
+ "tags": [
20407
+ "Auth"
20408
+ ],
20409
+ "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",
20410
+ "operationId": "disconnect_social",
20411
+ "responses": {
20412
+ "200": {
20413
+ "description": "Success"
20414
+ },
20415
+ "401": {
20416
+ "description": "Unauthenticated"
20417
+ },
20418
+ "403": {
20419
+ "description": "Forbidden, or the plan does not include this"
20420
+ },
20421
+ "404": {
20422
+ "description": "Not found"
20423
+ }
20424
+ }
20425
+ }
20426
+ },
20427
+ "/v1/auth/sso/authorize": {
20428
+ "get": {
20429
+ "tags": [
20430
+ "Auth"
20431
+ ],
20432
+ "summary": "returns JSON with authorization_url for WorkOS Hosted Auth.",
20433
+ "operationId": "sso_authorize",
20434
+ "responses": {
20435
+ "200": {
20436
+ "description": "Success"
20437
+ },
20438
+ "401": {
20439
+ "description": "Unauthenticated"
20440
+ },
20441
+ "403": {
20442
+ "description": "Forbidden, or the plan does not include this"
20443
+ },
20444
+ "404": {
20445
+ "description": "Not found"
20446
+ }
20447
+ }
20448
+ }
20449
+ },
20450
+ "/v1/auth/sso/callback": {
20451
+ "get": {
20452
+ "tags": [
20453
+ "Auth"
20454
+ ],
20455
+ "summary": "exchange code for profile, find/create user, redirect to dashboard with token.",
20456
+ "operationId": "sso_callback",
20457
+ "responses": {
20458
+ "200": {
20459
+ "description": "Success"
20460
+ },
20461
+ "401": {
20462
+ "description": "Unauthenticated"
20463
+ },
20464
+ "403": {
20465
+ "description": "Forbidden, or the plan does not include this"
20466
+ },
20467
+ "404": {
20468
+ "description": "Not found"
20469
+ }
20470
+ }
20471
+ }
20472
+ },
20473
+ "/v1/auth/sso/status": {
20474
+ "get": {
20475
+ "tags": [
20476
+ "Auth"
20477
+ ],
20478
+ "summary": "returns whether SSO is configured (for dashboard to show/hide SSO button).",
20479
+ "operationId": "sso_status",
20480
+ "responses": {
20481
+ "200": {
20482
+ "description": "Success"
20483
+ },
20484
+ "401": {
20485
+ "description": "Unauthenticated"
20486
+ },
20487
+ "403": {
20488
+ "description": "Forbidden, or the plan does not include this"
20489
+ },
20490
+ "404": {
20491
+ "description": "Not found"
20492
+ }
20493
+ }
20494
+ }
20495
+ },
20496
+ "/v1/billing/llm-models": {
20497
+ "get": {
20498
+ "tags": [
20499
+ "Billing"
20500
+ ],
20501
+ "summary": "get llm models",
20502
+ "operationId": "get_llm_models",
20503
+ "responses": {
20504
+ "200": {
20505
+ "description": "Success"
20506
+ },
20507
+ "401": {
20508
+ "description": "Unauthenticated"
20509
+ },
20510
+ "403": {
20511
+ "description": "Forbidden, or the plan does not include this"
20512
+ },
20513
+ "404": {
20514
+ "description": "Not found"
20515
+ }
20516
+ }
20517
+ }
20518
+ },
20519
+ "/v1/billing/llm-pricing": {
20520
+ "get": {
20521
+ "tags": [
20522
+ "Billing"
20523
+ ],
20524
+ "summary": "get llm pricing",
20525
+ "operationId": "get_llm_pricing",
20526
+ "responses": {
20527
+ "200": {
20528
+ "description": "Success"
20529
+ },
20530
+ "401": {
20531
+ "description": "Unauthenticated"
20532
+ },
20533
+ "403": {
20534
+ "description": "Forbidden, or the plan does not include this"
20535
+ },
20536
+ "404": {
20537
+ "description": "Not found"
20538
+ }
20539
+ }
20540
+ }
20541
+ },
20542
+ "/v1/billing/promo/redeem": {
20543
+ "get": {
20544
+ "tags": [
20545
+ "Billing"
20546
+ ],
20547
+ "summary": "get llm billing status",
20548
+ "operationId": "get_llm_billing_status",
20549
+ "responses": {
20550
+ "200": {
20551
+ "description": "Success"
20552
+ },
20553
+ "401": {
20554
+ "description": "Unauthenticated"
20555
+ },
20556
+ "403": {
20557
+ "description": "Forbidden, or the plan does not include this"
20558
+ },
20559
+ "404": {
20560
+ "description": "Not found"
20561
+ }
20562
+ }
20563
+ },
20564
+ "post": {
20565
+ "tags": [
20566
+ "Billing"
20567
+ ],
20568
+ "summary": "redeem promo",
20569
+ "operationId": "redeem_promo",
20570
+ "requestBody": {
20571
+ "required": true,
20572
+ "content": {
20573
+ "application/json": {
20574
+ "schema": {
20575
+ "type": "object",
20576
+ "required": [
20577
+ "code"
20578
+ ],
20579
+ "properties": {
20580
+ "code": {
20581
+ "type": "string"
20582
+ }
20583
+ }
20584
+ }
20585
+ }
20586
+ }
20587
+ },
20588
+ "responses": {
20589
+ "200": {
20590
+ "description": "Success"
20591
+ },
20592
+ "401": {
20593
+ "description": "Unauthenticated"
20594
+ },
20595
+ "403": {
20596
+ "description": "Forbidden, or the plan does not include this"
20597
+ },
20598
+ "404": {
20599
+ "description": "Not found"
20600
+ }
20601
+ }
20602
+ }
20603
+ },
20604
+ "/v1/billing/promo/validate": {
20605
+ "get": {
20606
+ "tags": [
20607
+ "Billing"
20608
+ ],
20609
+ "summary": "validate promo",
20610
+ "operationId": "validate_promo",
20611
+ "responses": {
20612
+ "200": {
20613
+ "description": "Success"
20614
+ },
20615
+ "401": {
20616
+ "description": "Unauthenticated"
20617
+ },
20618
+ "403": {
20619
+ "description": "Forbidden, or the plan does not include this"
20620
+ },
20621
+ "404": {
20622
+ "description": "Not found"
20623
+ }
20624
+ }
20625
+ }
20626
+ },
20627
+ "/v1/chains/rpc": {
20628
+ "post": {
20629
+ "tags": [
20630
+ "Chains"
20631
+ ],
20632
+ "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",
20633
+ "operationId": "chain_rpc_proxy",
20634
+ "requestBody": {
20635
+ "required": true,
20636
+ "content": {
20637
+ "application/json": {
20638
+ "schema": {
20639
+ "type": "object",
20640
+ "required": [
20641
+ "chain_id",
20642
+ "method",
20643
+ "params"
20644
+ ],
20645
+ "properties": {
20646
+ "chain_id": {
20647
+ "type": "integer"
20648
+ },
20649
+ "method": {
20650
+ "type": "string"
20651
+ },
20652
+ "params": {
20653
+ "type": "array",
20654
+ "items": {
20655
+ "type": "object",
20656
+ "additionalProperties": true
20657
+ }
20658
+ }
20659
+ }
20660
+ }
20661
+ }
20662
+ }
20663
+ },
20664
+ "responses": {
20665
+ "200": {
20666
+ "description": "Success"
20667
+ },
20668
+ "401": {
20669
+ "description": "Unauthenticated"
20670
+ },
20671
+ "403": {
20672
+ "description": "Forbidden, or the plan does not include this"
20673
+ },
20674
+ "404": {
20675
+ "description": "Not found"
20676
+ }
20677
+ }
20678
+ }
20679
+ },
20680
+ "/v1/fiat/webhooks": {
20681
+ "post": {
20682
+ "tags": [
20683
+ "Fiat"
20684
+ ],
20685
+ "summary": "Receive completion events from fiat partners (MoonPay signed body or generic JSON).",
20686
+ "operationId": "fiat_webhook",
20687
+ "responses": {
20688
+ "200": {
20689
+ "description": "Success"
20690
+ },
20691
+ "401": {
20692
+ "description": "Unauthenticated"
20693
+ },
20694
+ "403": {
20695
+ "description": "Forbidden, or the plan does not include this"
20696
+ },
20697
+ "404": {
20698
+ "description": "Not found"
20699
+ }
20700
+ }
20701
+ }
20702
+ },
20703
+ "/v1/memory/shared-namespaces": {
20704
+ "get": {
20705
+ "tags": [
20706
+ "Memory"
20707
+ ],
20708
+ "summary": "list shared namespaces",
20709
+ "operationId": "list_shared_namespaces",
20710
+ "responses": {
20711
+ "200": {
20712
+ "description": "Success"
20713
+ },
20714
+ "401": {
20715
+ "description": "Unauthenticated"
20716
+ },
20717
+ "403": {
20718
+ "description": "Forbidden, or the plan does not include this"
20719
+ },
20720
+ "404": {
20721
+ "description": "Not found"
20722
+ }
20723
+ }
20724
+ },
20725
+ "post": {
20726
+ "tags": [
20727
+ "Memory"
20728
+ ],
20729
+ "summary": "create shared namespace",
20730
+ "operationId": "create_shared_namespace",
20731
+ "requestBody": {
20732
+ "required": true,
20733
+ "content": {
20734
+ "application/json": {
20735
+ "schema": {
20736
+ "type": "object",
20737
+ "required": [
20738
+ "namespace",
20739
+ "agent_ids"
20740
+ ],
20741
+ "properties": {
20742
+ "namespace": {
20743
+ "type": "string"
20744
+ },
20745
+ "agent_ids": {
20746
+ "type": "array",
20747
+ "items": {
20748
+ "type": "string",
20749
+ "format": "uuid"
20750
+ }
20751
+ }
20752
+ }
20753
+ }
20754
+ }
20755
+ }
20756
+ },
20757
+ "responses": {
20758
+ "200": {
20759
+ "description": "Success"
20760
+ },
20761
+ "401": {
20762
+ "description": "Unauthenticated"
20763
+ },
20764
+ "403": {
20765
+ "description": "Forbidden, or the plan does not include this"
20766
+ },
20767
+ "404": {
20768
+ "description": "Not found"
20769
+ }
20770
+ }
20771
+ }
20772
+ },
20773
+ "/v1/memory/shared-namespaces/{id}": {
20774
+ "parameters": [
20775
+ {
20776
+ "name": "id",
20777
+ "in": "path",
20778
+ "required": true,
20779
+ "schema": {
20780
+ "type": "string"
20781
+ }
20782
+ }
20783
+ ],
20784
+ "delete": {
20785
+ "tags": [
20786
+ "Memory"
20787
+ ],
20788
+ "summary": "delete shared namespace",
20789
+ "operationId": "delete_shared_namespace",
20790
+ "responses": {
20791
+ "200": {
20792
+ "description": "Success"
20793
+ },
20794
+ "401": {
20795
+ "description": "Unauthenticated"
20796
+ },
20797
+ "403": {
20798
+ "description": "Forbidden, or the plan does not include this"
20799
+ },
20800
+ "404": {
20801
+ "description": "Not found"
20802
+ }
20803
+ }
20804
+ },
20805
+ "patch": {
20806
+ "tags": [
20807
+ "Memory"
20808
+ ],
20809
+ "summary": "update shared namespace",
20810
+ "operationId": "update_shared_namespace",
20811
+ "requestBody": {
20812
+ "required": true,
20813
+ "content": {
20814
+ "application/json": {
20815
+ "schema": {
20816
+ "type": "object",
20817
+ "required": [
20818
+ "agent_ids"
20819
+ ],
20820
+ "properties": {
20821
+ "agent_ids": {
20822
+ "type": "array",
20823
+ "items": {
20824
+ "type": "string",
20825
+ "format": "uuid"
20826
+ }
20827
+ }
20828
+ }
20829
+ }
20830
+ }
20831
+ }
20832
+ },
20833
+ "responses": {
20834
+ "200": {
20835
+ "description": "Success"
20836
+ },
20837
+ "401": {
20838
+ "description": "Unauthenticated"
20839
+ },
20840
+ "403": {
20841
+ "description": "Forbidden, or the plan does not include this"
20842
+ },
20843
+ "404": {
20844
+ "description": "Not found"
20845
+ }
20846
+ }
20847
+ }
20848
+ },
20849
+ "/v1/onboarding/journey": {
20850
+ "post": {
20851
+ "tags": [
20852
+ "Onboarding"
20853
+ ],
20854
+ "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 ",
20855
+ "operationId": "record_journey",
20856
+ "requestBody": {
20857
+ "required": true,
20858
+ "content": {
20859
+ "application/json": {
20860
+ "schema": {
20861
+ "type": "object",
20862
+ "required": [
20863
+ "journey"
20864
+ ],
20865
+ "properties": {
20866
+ "journey": {
20867
+ "type": "string"
20868
+ },
20869
+ "step": {
20870
+ "type": "string"
20871
+ }
20872
+ }
20873
+ }
20874
+ }
20875
+ }
20876
+ },
20877
+ "responses": {
20878
+ "200": {
20879
+ "description": "Success"
20880
+ },
20881
+ "401": {
20882
+ "description": "Unauthenticated"
20883
+ },
20884
+ "403": {
20885
+ "description": "Forbidden, or the plan does not include this"
20886
+ },
20887
+ "404": {
20888
+ "description": "Not found"
20889
+ }
20890
+ }
20891
+ }
20892
+ },
20893
+ "/v1/org/env-vars/{id}/delete": {
20894
+ "parameters": [
20895
+ {
20896
+ "name": "id",
20897
+ "in": "path",
20898
+ "required": true,
20899
+ "schema": {
20900
+ "type": "string"
20901
+ }
20902
+ }
20903
+ ],
20904
+ "post": {
20905
+ "tags": [
20906
+ "Org"
20907
+ ],
20908
+ "summary": "delete org env var",
20909
+ "operationId": "delete_org_env_var",
20910
+ "responses": {
20911
+ "200": {
20912
+ "description": "Success"
20913
+ },
20914
+ "401": {
20915
+ "description": "Unauthenticated"
20916
+ },
20917
+ "403": {
20918
+ "description": "Forbidden, or the plan does not include this"
20919
+ },
20920
+ "404": {
20921
+ "description": "Not found"
20922
+ }
20923
+ }
20924
+ }
20925
+ },
20926
+ "/v1/org/kek-custody": {
20927
+ "get": {
20928
+ "tags": [
20929
+ "Org"
20930
+ ],
20931
+ "summary": "Get current custody mode and share metadata",
20932
+ "operationId": "get_custody",
20933
+ "responses": {
20934
+ "200": {
20935
+ "description": "Success"
20936
+ },
20937
+ "401": {
20938
+ "description": "Unauthenticated"
20939
+ },
20940
+ "403": {
20941
+ "description": "Forbidden, or the plan does not include this"
20942
+ },
20943
+ "404": {
20944
+ "description": "Not found"
20945
+ }
20946
+ }
20947
+ },
20948
+ "post": {
20949
+ "tags": [
20950
+ "Org"
20951
+ ],
20952
+ "summary": "Setup Shamir key custody",
20953
+ "operationId": "setup_custody",
20954
+ "requestBody": {
20955
+ "required": true,
20956
+ "content": {
20957
+ "application/json": {
20958
+ "schema": {
20959
+ "type": "object",
20960
+ "required": [
20961
+ "custody_mode"
20962
+ ],
20963
+ "properties": {
20964
+ "custody_mode": {
20965
+ "type": "string"
20966
+ }
20967
+ }
20968
+ }
20969
+ }
20970
+ }
20971
+ },
20972
+ "responses": {
20973
+ "200": {
20974
+ "description": "Success"
20975
+ },
20976
+ "401": {
20977
+ "description": "Unauthenticated"
20978
+ },
20979
+ "403": {
20980
+ "description": "Forbidden, or the plan does not include this"
20981
+ },
20982
+ "404": {
20983
+ "description": "Not found"
20984
+ }
20985
+ }
20986
+ }
20987
+ },
20988
+ "/v1/org/kek-custody/reconstruct": {
20989
+ "get": {
20990
+ "tags": [
20991
+ "Org"
20992
+ ],
20993
+ "summary": "list org env vars",
20994
+ "operationId": "list_org_env_vars",
20995
+ "responses": {
20996
+ "200": {
20997
+ "description": "Success"
20998
+ },
20999
+ "401": {
21000
+ "description": "Unauthenticated"
21001
+ },
21002
+ "403": {
21003
+ "description": "Forbidden, or the plan does not include this"
21004
+ },
21005
+ "404": {
21006
+ "description": "Not found"
21007
+ }
21008
+ }
21009
+ },
21010
+ "post": {
21011
+ "tags": [
21012
+ "Org"
21013
+ ],
21014
+ "summary": "TEE-bound reconstruction request",
21015
+ "operationId": "reconstruct",
21016
+ "requestBody": {
21017
+ "required": true,
21018
+ "content": {
21019
+ "application/json": {
21020
+ "schema": {
21021
+ "type": "object",
21022
+ "required": [
21023
+ "approval_id",
21024
+ "action"
21025
+ ],
21026
+ "properties": {
21027
+ "approval_id": {
21028
+ "type": "object"
21029
+ },
21030
+ "client_share": {
21031
+ "type": "string"
21032
+ },
21033
+ "action": {
21034
+ "type": "object",
21035
+ "additionalProperties": true
21036
+ }
21037
+ }
21038
+ }
21039
+ }
21040
+ }
21041
+ },
21042
+ "responses": {
21043
+ "200": {
21044
+ "description": "Success"
21045
+ },
21046
+ "401": {
21047
+ "description": "Unauthenticated"
21048
+ },
21049
+ "403": {
21050
+ "description": "Forbidden, or the plan does not include this"
21051
+ },
21052
+ "404": {
21053
+ "description": "Not found"
21054
+ }
21055
+ }
21056
+ }
21057
+ },
21058
+ "/v1/org/settings": {
21059
+ "get": {
21060
+ "tags": [
21061
+ "Org"
21062
+ ],
21063
+ "summary": "list org settings",
21064
+ "operationId": "list_org_settings",
21065
+ "responses": {
21066
+ "200": {
21067
+ "description": "Success"
21068
+ },
21069
+ "401": {
21070
+ "description": "Unauthenticated"
21071
+ },
21072
+ "403": {
21073
+ "description": "Forbidden, or the plan does not include this"
21074
+ },
21075
+ "404": {
21076
+ "description": "Not found"
21077
+ }
21078
+ }
21079
+ },
21080
+ "patch": {
21081
+ "tags": [
21082
+ "Org"
21083
+ ],
21084
+ "summary": "update org setting",
21085
+ "operationId": "update_org_setting",
21086
+ "requestBody": {
21087
+ "required": true,
21088
+ "content": {
21089
+ "application/json": {
21090
+ "schema": {
21091
+ "type": "object",
21092
+ "required": [
21093
+ "key",
21094
+ "value"
21095
+ ],
21096
+ "properties": {
21097
+ "key": {
21098
+ "type": "string"
21099
+ },
21100
+ "value": {
21101
+ "type": "string"
21102
+ },
21103
+ "approval_id": {
21104
+ "type": "string",
21105
+ "format": "uuid"
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/platform/apps/by-slug/{slug}/branding": {
21129
+ "parameters": [
21130
+ {
21131
+ "name": "slug",
21132
+ "in": "path",
21133
+ "required": true,
21134
+ "schema": {
21135
+ "type": "string"
21136
+ }
21137
+ }
21138
+ ],
21139
+ "get": {
21140
+ "tags": [
21141
+ "Platform"
21142
+ ],
21143
+ "summary": "Public, returns app name + logo.",
21144
+ "operationId": "app_branding",
21145
+ "security": [],
21146
+ "responses": {
21147
+ "200": {
21148
+ "description": "Success"
21149
+ },
21150
+ "404": {
21151
+ "description": "Not found"
21152
+ }
21153
+ }
21154
+ }
21155
+ },
21156
+ "/v1/platform/apps/{app_id}/automations": {
21157
+ "parameters": [
21158
+ {
21159
+ "name": "app_id",
21160
+ "in": "path",
21161
+ "required": true,
21162
+ "schema": {
21163
+ "type": "string"
21164
+ }
21165
+ }
21166
+ ],
21167
+ "get": {
21168
+ "tags": [
21169
+ "Platform"
21170
+ ],
21171
+ "summary": "list platform automations",
21172
+ "operationId": "list_platform_automations",
21173
+ "responses": {
21174
+ "200": {
21175
+ "description": "Success"
21176
+ },
21177
+ "401": {
21178
+ "description": "Unauthenticated"
21179
+ },
21180
+ "403": {
21181
+ "description": "Forbidden, or the plan does not include this"
21182
+ },
21183
+ "404": {
21184
+ "description": "Not found"
21185
+ }
21186
+ }
21187
+ },
21188
+ "post": {
21189
+ "tags": [
21190
+ "Platform"
21191
+ ],
21192
+ "summary": "upsert user",
21193
+ "operationId": "upsert_user",
21194
+ "requestBody": {
21195
+ "required": true,
21196
+ "content": {
21197
+ "application/json": {
21198
+ "schema": {
21199
+ "type": "object",
21200
+ "properties": {
21201
+ "subject_token": {
21202
+ "type": "string"
21203
+ },
21204
+ "subject_token_type": {
21205
+ "type": "string"
21206
+ },
21207
+ "email": {
21208
+ "type": "string"
21209
+ },
21210
+ "display_name": {
21211
+ "type": "string"
21212
+ },
21213
+ "siwe_message": {
21214
+ "type": "string"
21215
+ },
21216
+ "siwe_signature": {
21217
+ "type": "string"
21218
+ },
21219
+ "return_to": {
21220
+ "type": "string"
21221
+ },
21222
+ "create_sub_org": {
21223
+ "type": "boolean"
21224
+ },
21225
+ "app_id": {
21226
+ "type": "object"
21227
+ }
21228
+ }
21229
+ }
21230
+ }
21231
+ }
21232
+ },
21233
+ "responses": {
21234
+ "200": {
21235
+ "description": "Success"
21236
+ },
21237
+ "401": {
21238
+ "description": "Unauthenticated"
21239
+ },
21240
+ "403": {
21241
+ "description": "Forbidden, or the plan does not include this"
21242
+ },
21243
+ "404": {
21244
+ "description": "Not found"
21245
+ }
21246
+ }
21247
+ }
21248
+ },
21249
+ "/v1/platform/connected-apps/{connection_id}/unlock-resources": {
21250
+ "parameters": [
21251
+ {
21252
+ "name": "connection_id",
21253
+ "in": "path",
21254
+ "required": true,
21255
+ "schema": {
21256
+ "type": "string"
21257
+ }
21258
+ }
21259
+ ],
21260
+ "post": {
21261
+ "tags": [
21262
+ "Platform"
21263
+ ],
21264
+ "summary": "Unlocks platform-locked resources for a disconnected (or active) connection the user owns.",
21265
+ "operationId": "unlock_connection_resources",
21266
+ "responses": {
21267
+ "200": {
21268
+ "description": "Success"
21269
+ },
21270
+ "401": {
21271
+ "description": "Unauthenticated"
21272
+ },
21273
+ "403": {
21274
+ "description": "Forbidden, or the plan does not include this"
21275
+ },
21276
+ "404": {
21277
+ "description": "Not found"
21278
+ }
21279
+ }
21280
+ }
21281
+ },
21282
+ "/v1/platform/connections/{connection_id}/memory": {
21283
+ "parameters": [
21284
+ {
21285
+ "name": "connection_id",
21286
+ "in": "path",
21287
+ "required": true,
21288
+ "schema": {
21289
+ "type": "string"
21290
+ }
21291
+ }
21292
+ ],
21293
+ "get": {
21294
+ "tags": [
21295
+ "Platform"
21296
+ ],
21297
+ "summary": "list connection memory namespaces",
21298
+ "operationId": "list_connection_memory_namespaces",
21299
+ "responses": {
21300
+ "200": {
21301
+ "description": "Success"
21302
+ },
21303
+ "401": {
21304
+ "description": "Unauthenticated"
21305
+ },
21306
+ "403": {
21307
+ "description": "Forbidden, or the plan does not include this"
21308
+ },
21309
+ "404": {
21310
+ "description": "Not found"
21311
+ }
21312
+ }
21313
+ }
21314
+ },
21315
+ "/v1/platform/connections/{connection_id}/memory/{namespace}": {
21316
+ "parameters": [
21317
+ {
21318
+ "name": "connection_id",
21319
+ "in": "path",
21320
+ "required": true,
21321
+ "schema": {
21322
+ "type": "string"
21323
+ }
21324
+ },
21325
+ {
21326
+ "name": "namespace",
21327
+ "in": "path",
21328
+ "required": true,
21329
+ "schema": {
21330
+ "type": "string"
21331
+ }
21332
+ }
21333
+ ],
21334
+ "get": {
21335
+ "tags": [
21336
+ "Platform"
21337
+ ],
21338
+ "summary": "list connection memory entries",
21339
+ "operationId": "list_connection_memory_entries",
21340
+ "responses": {
21341
+ "200": {
21342
+ "description": "Success"
21343
+ },
21344
+ "401": {
21345
+ "description": "Unauthenticated"
21346
+ },
21347
+ "403": {
21348
+ "description": "Forbidden, or the plan does not include this"
21349
+ },
21350
+ "404": {
21351
+ "description": "Not found"
21352
+ }
21353
+ }
21354
+ }
21355
+ },
21356
+ "/v1/platform/connections/{connection_id}/resources": {
21357
+ "parameters": [
21358
+ {
21359
+ "name": "connection_id",
21360
+ "in": "path",
21361
+ "required": true,
21362
+ "schema": {
21363
+ "type": "string"
21364
+ }
21365
+ }
21366
+ ],
21367
+ "get": {
21368
+ "tags": [
21369
+ "Platform"
21370
+ ],
21371
+ "summary": "list connection resources",
21372
+ "operationId": "list_connection_resources",
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
+ "post": {
21389
+ "tags": [
21390
+ "Platform"
21391
+ ],
21392
+ "summary": "create app policy",
21393
+ "operationId": "create_app_policy",
21394
+ "requestBody": {
21395
+ "required": true,
21396
+ "content": {
21397
+ "application/json": {
21398
+ "schema": {
21399
+ "type": "object",
21400
+ "properties": {
21401
+ "user_id": {
21402
+ "type": "object"
21403
+ },
21404
+ "to_allowlist": {
21405
+ "type": "array",
21406
+ "items": {
21407
+ "type": "string"
21408
+ }
21409
+ },
21410
+ "to_denylist": {
21411
+ "type": "array",
21412
+ "items": {
21413
+ "type": "string"
21414
+ }
21415
+ },
21416
+ "max_value_per_tx_eth": {
21417
+ "type": "string"
21418
+ },
21419
+ "daily_limit_eth": {
21420
+ "type": "string"
21421
+ },
21422
+ "allowed_chains": {
21423
+ "type": "array",
21424
+ "items": {
21425
+ "type": "string"
21426
+ }
21427
+ },
21428
+ "allowed_tokens": {
21429
+ "type": "array",
21430
+ "items": {
21431
+ "type": "string"
21432
+ }
21433
+ },
21434
+ "max_transactions_per_day": {
21435
+ "type": "integer"
21436
+ },
21437
+ "human_factor_auth": {
21438
+ "type": "object",
21439
+ "additionalProperties": true
21440
+ }
21441
+ }
21442
+ }
21443
+ }
21444
+ }
21445
+ },
21446
+ "responses": {
21447
+ "200": {
21448
+ "description": "Success"
21449
+ },
21450
+ "401": {
21451
+ "description": "Unauthenticated"
21452
+ },
21453
+ "403": {
21454
+ "description": "Forbidden, or the plan does not include this"
21455
+ },
21456
+ "404": {
21457
+ "description": "Not found"
21458
+ }
21459
+ }
21460
+ }
21461
+ },
21462
+ "/v1/platform/link-account": {
21463
+ "post": {
21464
+ "tags": [
21465
+ "Platform"
21466
+ ],
21467
+ "summary": "Authenticated user links their account to a platform app. Used by the dashboard `/connect/{slug}/link` consent flow for cross-org users.",
21468
+ "operationId": "link_account",
21469
+ "requestBody": {
21470
+ "required": true,
21471
+ "content": {
21472
+ "application/json": {
21473
+ "schema": {
21474
+ "type": "object",
21475
+ "required": [
21476
+ "client_id"
21477
+ ],
21478
+ "properties": {
21479
+ "client_id": {
21480
+ "type": "string"
21481
+ }
21482
+ }
21483
+ }
21484
+ }
21485
+ }
21486
+ },
21487
+ "responses": {
21488
+ "200": {
21489
+ "description": "Success"
21490
+ },
21491
+ "401": {
21492
+ "description": "Unauthenticated"
21493
+ },
21494
+ "403": {
21495
+ "description": "Forbidden, or the plan does not include this"
21496
+ },
21497
+ "404": {
21498
+ "description": "Not found"
21499
+ }
21500
+ }
21501
+ }
21502
+ },
21503
+ "/v1/platform/orphaned-resources": {
21504
+ "get": {
21505
+ "tags": [
21506
+ "Platform"
21507
+ ],
21508
+ "summary": "platform-locked agents/vaults with no active connection.",
21509
+ "operationId": "list_orphaned_platform_resources",
21510
+ "responses": {
21511
+ "200": {
21512
+ "description": "Success"
21513
+ },
21514
+ "401": {
21515
+ "description": "Unauthenticated"
21516
+ },
21517
+ "403": {
21518
+ "description": "Forbidden, or the plan does not include this"
21519
+ },
21520
+ "404": {
21521
+ "description": "Not found"
21522
+ }
21523
+ }
21524
+ }
21525
+ },
21526
+ "/v1/reports/request": {
21527
+ "post": {
21528
+ "tags": [
21529
+ "Reports"
21530
+ ],
21531
+ "summary": "Public (no auth). Submits lead info, sends email with download link.",
21532
+ "operationId": "request_report",
21533
+ "security": [],
21534
+ "requestBody": {
21535
+ "required": true,
21536
+ "content": {
21537
+ "application/json": {
21538
+ "schema": {
21539
+ "type": "object",
21540
+ "required": [
21541
+ "first_name",
21542
+ "last_name",
21543
+ "email",
21544
+ "company"
21545
+ ],
21546
+ "properties": {
21547
+ "first_name": {
21548
+ "type": "string"
21549
+ },
21550
+ "last_name": {
21551
+ "type": "string"
21552
+ },
21553
+ "email": {
21554
+ "type": "string"
21555
+ },
21556
+ "company": {
21557
+ "type": "string"
21558
+ },
21559
+ "job_title": {
21560
+ "type": "string"
21561
+ },
21562
+ "report_slug": {
21563
+ "type": "string"
21564
+ },
21565
+ "marketing_consent": {
21566
+ "type": "boolean"
21567
+ }
21568
+ }
21569
+ }
21570
+ }
21571
+ }
21572
+ },
21573
+ "responses": {
21574
+ "200": {
21575
+ "description": "Success"
21576
+ },
21577
+ "404": {
21578
+ "description": "Not found"
21579
+ }
21580
+ }
21581
+ }
21582
+ },
21583
+ "/v1/runtimes/{runtime_id}/chat/conversations": {
21584
+ "parameters": [
21585
+ {
21586
+ "name": "runtime_id",
21587
+ "in": "path",
21588
+ "required": true,
21589
+ "schema": {
21590
+ "type": "string"
21591
+ }
21592
+ }
21593
+ ],
21594
+ "get": {
21595
+ "tags": [
21596
+ "Runtimes"
21597
+ ],
21598
+ "summary": "list runtime chat conversations",
21599
+ "operationId": "list_runtime_chat_conversations",
21600
+ "responses": {
21601
+ "200": {
21602
+ "description": "Success"
21603
+ },
21604
+ "401": {
21605
+ "description": "Unauthenticated"
21606
+ },
21607
+ "403": {
21608
+ "description": "Forbidden, or the plan does not include this"
21609
+ },
21610
+ "404": {
21611
+ "description": "Not found"
21612
+ }
21613
+ }
21614
+ }
21615
+ },
21616
+ "/v1/runtimes/{runtime_id}/chat/conversations/{conversation_id}": {
21617
+ "parameters": [
21618
+ {
21619
+ "name": "runtime_id",
21620
+ "in": "path",
21621
+ "required": true,
21622
+ "schema": {
21623
+ "type": "string"
21624
+ }
21625
+ },
21626
+ {
21627
+ "name": "conversation_id",
21628
+ "in": "path",
21629
+ "required": true,
21630
+ "schema": {
21631
+ "type": "string"
21632
+ }
21633
+ }
21634
+ ],
21635
+ "delete": {
21636
+ "tags": [
21637
+ "Runtimes"
21638
+ ],
21639
+ "summary": "Archives a runtime chat session so the next message starts a fresh conversation.",
21640
+ "operationId": "archive_runtime_chat_conversation",
21641
+ "responses": {
21642
+ "200": {
21643
+ "description": "Success"
21644
+ },
21645
+ "401": {
21646
+ "description": "Unauthenticated"
21647
+ },
21648
+ "403": {
21649
+ "description": "Forbidden, or the plan does not include this"
21650
+ },
21651
+ "404": {
21652
+ "description": "Not found"
21653
+ }
21654
+ }
21655
+ },
21656
+ "get": {
21657
+ "tags": [
21658
+ "Runtimes"
21659
+ ],
21660
+ "summary": "get runtime chat conversation",
21661
+ "operationId": "get_runtime_chat_conversation",
21662
+ "responses": {
21663
+ "200": {
21664
+ "description": "Success"
21665
+ },
21666
+ "401": {
21667
+ "description": "Unauthenticated"
21668
+ },
21669
+ "403": {
21670
+ "description": "Forbidden, or the plan does not include this"
21671
+ },
21672
+ "404": {
21673
+ "description": "Not found"
21674
+ }
21675
+ }
21676
+ }
21677
+ },
21678
+ "/v1/runtimes/{runtime_id}/chat/diagnostics": {
21679
+ "parameters": [
21680
+ {
21681
+ "name": "runtime_id",
21682
+ "in": "path",
21683
+ "required": true,
21684
+ "schema": {
21685
+ "type": "string"
21686
+ }
21687
+ }
21688
+ ],
21689
+ "get": {
21690
+ "tags": [
21691
+ "Runtimes"
21692
+ ],
21693
+ "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.",
21694
+ "operationId": "runtime_chat_diagnostics",
21695
+ "responses": {
21696
+ "200": {
21697
+ "description": "Success"
21698
+ },
21699
+ "401": {
21700
+ "description": "Unauthenticated"
21701
+ },
21702
+ "403": {
21703
+ "description": "Forbidden, or the plan does not include this"
21704
+ },
21705
+ "404": {
21706
+ "description": "Not found"
21707
+ }
21708
+ }
21709
+ }
21710
+ },
21711
+ "/v1/runtimes/{runtime_id}/chat/unlock": {
21712
+ "parameters": [
21713
+ {
21714
+ "name": "runtime_id",
21715
+ "in": "path",
21716
+ "required": true,
21717
+ "schema": {
21718
+ "type": "string"
21719
+ }
21720
+ }
21721
+ ],
21722
+ "post": {
21723
+ "tags": [
21724
+ "Runtimes"
21725
+ ],
21726
+ "summary": "Step-up (password or passkey reauth token, purpose=`runtime_chat`) unlocks dashboard runtime chat for 15 minutes — same trust bar as Shell/Logs.",
21727
+ "operationId": "unlock_runtime_chat",
21728
+ "responses": {
21729
+ "200": {
21730
+ "description": "Success"
21731
+ },
21732
+ "401": {
21733
+ "description": "Unauthenticated"
21734
+ },
21735
+ "403": {
21736
+ "description": "Forbidden, or the plan does not include this"
21737
+ },
21738
+ "404": {
21739
+ "description": "Not found"
21740
+ }
21741
+ }
21742
+ }
21743
+ },
21744
+ "/v1/runtimes/{runtime_id}/logs/stream": {
21745
+ "parameters": [
21746
+ {
21747
+ "name": "runtime_id",
21748
+ "in": "path",
21749
+ "required": true,
21750
+ "schema": {
21751
+ "type": "string"
21752
+ }
21753
+ }
21754
+ ],
21755
+ "get": {
21756
+ "tags": [
21757
+ "Runtimes"
21758
+ ],
21759
+ "summary": "SSE live log streaming",
21760
+ "operationId": "stream_runtime_logs",
21761
+ "responses": {
21762
+ "200": {
21763
+ "description": "Success"
21764
+ },
21765
+ "401": {
21766
+ "description": "Unauthenticated"
21767
+ },
21768
+ "403": {
21769
+ "description": "Forbidden, or the plan does not include this"
21770
+ },
21771
+ "404": {
21772
+ "description": "Not found"
21773
+ }
21774
+ }
21775
+ }
21776
+ },
21777
+ "/v1/runtimes/{runtime_id}/logs/unlock": {
21778
+ "parameters": [
21779
+ {
21780
+ "name": "runtime_id",
21781
+ "in": "path",
21782
+ "required": true,
21783
+ "schema": {
21784
+ "type": "string"
21785
+ }
21786
+ }
21787
+ ],
21788
+ "post": {
21789
+ "tags": [
21790
+ "Runtimes"
21791
+ ],
21792
+ "summary": "Step-up (password or passkey reauth token) unlocks log fetch/stream for 15 minutes.",
21793
+ "operationId": "unlock_runtime_logs",
21794
+ "responses": {
21795
+ "200": {
21796
+ "description": "Success"
21797
+ },
21798
+ "401": {
21799
+ "description": "Unauthenticated"
21800
+ },
21801
+ "403": {
21802
+ "description": "Forbidden, or the plan does not include this"
21803
+ },
21804
+ "404": {
21805
+ "description": "Not found"
21806
+ }
21807
+ }
21808
+ }
21809
+ },
21810
+ "/v1/runtimes/{runtime_id}/rebuild": {
21811
+ "parameters": [
21812
+ {
21813
+ "name": "runtime_id",
21814
+ "in": "path",
21815
+ "required": true,
21816
+ "schema": {
21817
+ "type": "string"
21818
+ }
21819
+ }
21820
+ ],
21821
+ "post": {
21822
+ "tags": [
21823
+ "Runtimes"
21824
+ ],
21825
+ "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",
21826
+ "operationId": "rebuild_runtime",
21827
+ "responses": {
21828
+ "200": {
21829
+ "description": "Success"
21830
+ },
21831
+ "401": {
21832
+ "description": "Unauthenticated"
21833
+ },
21834
+ "403": {
21835
+ "description": "Forbidden, or the plan does not include this"
21836
+ },
21837
+ "404": {
21838
+ "description": "Not found"
21839
+ }
21840
+ }
21841
+ }
21842
+ },
21843
+ "/v1/runtimes/{runtime_id}/restart": {
21844
+ "parameters": [
21845
+ {
21846
+ "name": "runtime_id",
21847
+ "in": "path",
21848
+ "required": true,
21849
+ "schema": {
21850
+ "type": "string"
21851
+ }
21852
+ }
21853
+ ],
21854
+ "post": {
21855
+ "tags": [
21856
+ "Runtimes"
21857
+ ],
21858
+ "summary": "Force stop (best-effort) then start. Recovers stale `running` rows and proxy timeouts where the client never received the start response.",
21859
+ "operationId": "restart_runtime",
21860
+ "responses": {
21861
+ "200": {
21862
+ "description": "Success"
21863
+ },
21864
+ "401": {
21865
+ "description": "Unauthenticated"
21866
+ },
21867
+ "403": {
21868
+ "description": "Forbidden, or the plan does not include this"
21869
+ },
21870
+ "404": {
21871
+ "description": "Not found"
21872
+ }
21873
+ }
21874
+ }
21875
+ },
21876
+ "/v1/vaults/{vault_id}/secret-version-disable/{*path_and_version}": {
21877
+ "parameters": [
21878
+ {
21879
+ "name": "vault_id",
21880
+ "in": "path",
21881
+ "required": true,
21882
+ "schema": {
21883
+ "type": "string"
21884
+ }
21885
+ }
21886
+ ],
21887
+ "post": {
21888
+ "tags": [
21889
+ "Vaults"
21890
+ ],
21891
+ "summary": "Disable a specific version so it can no longer be read (but is retained for audit).",
21892
+ "operationId": "disable_version",
21893
+ "responses": {
21894
+ "200": {
21895
+ "description": "Success"
21896
+ },
21897
+ "401": {
21898
+ "description": "Unauthenticated"
21899
+ },
21900
+ "403": {
21901
+ "description": "Forbidden, or the plan does not include this"
21902
+ },
21903
+ "404": {
21904
+ "description": "Not found"
21905
+ }
21906
+ }
21907
+ }
21908
+ },
21909
+ "/v1/vaults/{vault_id}/secret-version/{*path_and_version}": {
21910
+ "parameters": [
21911
+ {
21912
+ "name": "vault_id",
21913
+ "in": "path",
21914
+ "required": true,
21915
+ "schema": {
21916
+ "type": "string"
21917
+ }
21918
+ }
21919
+ ],
21920
+ "get": {
21921
+ "tags": [
21922
+ "Vaults"
21923
+ ],
21924
+ "summary": "get secret version",
21925
+ "operationId": "get_secret_version",
21926
+ "responses": {
21927
+ "200": {
21928
+ "description": "Success"
21929
+ },
21930
+ "401": {
21931
+ "description": "Unauthenticated"
21932
+ },
21933
+ "403": {
21934
+ "description": "Forbidden, or the plan does not include this"
21935
+ },
21936
+ "404": {
21937
+ "description": "Not found"
21938
+ }
21939
+ }
21940
+ }
21941
+ },
21942
+ "/v1/vaults/{vault_id}/unlock-platform": {
21943
+ "parameters": [
21944
+ {
21945
+ "name": "vault_id",
21946
+ "in": "path",
21947
+ "required": true,
21948
+ "schema": {
21949
+ "type": "string"
21950
+ }
21951
+ }
21952
+ ],
21953
+ "post": {
21954
+ "tags": [
21955
+ "Vaults"
21956
+ ],
21957
+ "summary": "unlock vault platform",
21958
+ "operationId": "unlock_vault_platform",
21959
+ "responses": {
21960
+ "200": {
21961
+ "description": "Success"
21962
+ },
21963
+ "401": {
21964
+ "description": "Unauthenticated"
21965
+ },
21966
+ "403": {
21967
+ "description": "Forbidden, or the plan does not include this"
21968
+ },
21969
+ "404": {
21970
+ "description": "Not found"
21971
+ }
21972
+ }
21973
+ }
21974
+ },
21975
+ "/v1/webinars/register": {
21976
+ "post": {
21977
+ "tags": [
21978
+ "Webinars"
21979
+ ],
21980
+ "summary": "Public (no auth). Registers for a webinar, sends confirmation + calendar invite.",
21981
+ "operationId": "register_webinar",
21982
+ "security": [],
21983
+ "requestBody": {
21984
+ "required": true,
21985
+ "content": {
21986
+ "application/json": {
21987
+ "schema": {
21988
+ "type": "object",
21989
+ "required": [
21990
+ "first_name",
21991
+ "last_name",
21992
+ "email",
21993
+ "company"
21994
+ ],
21995
+ "properties": {
21996
+ "first_name": {
21997
+ "type": "string"
21998
+ },
21999
+ "last_name": {
22000
+ "type": "string"
22001
+ },
22002
+ "email": {
22003
+ "type": "string"
22004
+ },
22005
+ "company": {
22006
+ "type": "string"
22007
+ },
22008
+ "job_title": {
22009
+ "type": "string"
22010
+ },
22011
+ "webinar_slug": {
22012
+ "type": "string"
22013
+ },
22014
+ "marketing_consent": {
22015
+ "type": "boolean"
22016
+ }
22017
+ }
22018
+ }
22019
+ }
22020
+ }
22021
+ },
22022
+ "responses": {
22023
+ "200": {
22024
+ "description": "Success"
22025
+ },
22026
+ "404": {
22027
+ "description": "Not found"
22028
+ }
22029
+ }
22030
+ }
22031
+ },
22032
+ "/v1/runtimes/templates": {
22033
+ "get": {
22034
+ "tags": [
22035
+ "Runtimes"
22036
+ ],
22037
+ "summary": "The provisionable runtime templates, with licence and whether the agent needs its own vendor account",
22038
+ "operationId": "list_runtime_templates",
22039
+ "responses": {
22040
+ "200": {
22041
+ "description": "The template catalogue",
22042
+ "content": {
22043
+ "application/json": {
22044
+ "schema": {
22045
+ "type": "object",
22046
+ "properties": {
22047
+ "templates": {
22048
+ "type": "array",
22049
+ "items": {
22050
+ "type": "object",
22051
+ "properties": {
22052
+ "id": {
22053
+ "type": "string"
22054
+ },
22055
+ "description": {
22056
+ "type": "string"
22057
+ },
22058
+ "chat_capable": {
22059
+ "type": "boolean"
22060
+ },
22061
+ "license": {
22062
+ "type": "string",
22063
+ "nullable": true,
22064
+ "description": "SPDX id, or null when the agent is proprietary"
22065
+ },
22066
+ "requires_vendor_subscription": {
22067
+ "type": "boolean",
22068
+ "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."
22069
+ },
22070
+ "vendor_credential_env": {
22071
+ "type": "string",
22072
+ "nullable": true
22073
+ }
22074
+ }
22075
+ }
22076
+ }
22077
+ }
22078
+ }
22079
+ }
22080
+ }
22081
+ },
22082
+ "401": {
22083
+ "description": "Unauthenticated"
22084
+ }
22085
+ }
22086
+ }
22087
+ },
22088
+ "/v1/automations/step-types": {
22089
+ "get": {
22090
+ "tags": [
22091
+ "Automations"
22092
+ ],
22093
+ "summary": "The automation step vocabulary an automation may use",
22094
+ "operationId": "list_automation_step_types",
22095
+ "responses": {
22096
+ "200": {
22097
+ "description": "Supported step types"
22098
+ },
22099
+ "401": {
22100
+ "description": "Unauthenticated"
22101
+ }
22102
+ }
22103
+ }
22104
+ },
22105
+ "/v1/platform/apps/{app_id}/runtimes": {
22106
+ "parameters": [
22107
+ {
22108
+ "name": "app_id",
22109
+ "in": "path",
22110
+ "required": true,
22111
+ "schema": {
22112
+ "type": "string",
22113
+ "format": "uuid"
22114
+ }
22115
+ }
22116
+ ],
22117
+ "get": {
22118
+ "tags": [
22119
+ "Platform"
22120
+ ],
22121
+ "summary": "Runtimes belonging to a platform app",
22122
+ "operationId": "list_platform_runtimes",
22123
+ "responses": {
22124
+ "200": {
22125
+ "description": "Success"
22126
+ },
22127
+ "401": {
22128
+ "description": "Unauthenticated"
22129
+ },
22130
+ "403": {
22131
+ "description": "Forbidden"
22132
+ }
22133
+ }
22134
+ }
22135
+ },
22136
+ "/v1/browser/devices": {
22137
+ "post": {
22138
+ "tags": [
22139
+ "Browser Bridge"
22140
+ ],
22141
+ "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.",
22142
+ "operationId": "pair_browser_device",
22143
+ "requestBody": {
22144
+ "required": true,
22145
+ "content": {
22146
+ "application/json": {
22147
+ "schema": {
22148
+ "type": "object",
22149
+ "required": [
22150
+ "label",
22151
+ "public_key_pin"
22152
+ ],
22153
+ "properties": {
22154
+ "label": {
22155
+ "type": "string",
22156
+ "description": "Name for this device. Re-pairing an existing label must present the same key."
22157
+ },
22158
+ "public_key_pin": {
22159
+ "type": "string",
22160
+ "description": "The bridge's public key, pinned on first use for this label."
22161
+ },
22162
+ "bridge_version": {
22163
+ "type": "string"
22164
+ },
22165
+ "platform": {
22166
+ "type": "string"
22167
+ }
22168
+ }
22169
+ }
22170
+ }
22171
+ }
22172
+ },
22173
+ "responses": {
22174
+ "201": {
22175
+ "description": "Paired. The credential is returned once and there is no endpoint that returns it again.",
22176
+ "content": {
22177
+ "application/json": {
22178
+ "schema": {
22179
+ "type": "object",
22180
+ "properties": {
22181
+ "device_id": {
22182
+ "type": "string",
22183
+ "format": "uuid"
22184
+ },
22185
+ "label": {
22186
+ "type": "string"
22187
+ },
22188
+ "credential": {
22189
+ "type": "string",
22190
+ "description": "The bb_ bridge credential. Shown once."
22191
+ }
22192
+ }
22193
+ }
22194
+ }
22195
+ }
22196
+ },
22197
+ "401": {
22198
+ "description": "Unauthenticated, or step-up re-auth not satisfied"
22199
+ },
22200
+ "403": {
22201
+ "description": "Not a human caller — agents and platform keys cannot pair a device"
22202
+ },
22203
+ "409": {
22204
+ "description": "That label is already pinned to a different key"
22205
+ }
22206
+ }
22207
+ }
22208
+ },
22209
+ "/v1/browser/credentials": {
22210
+ "post": {
22211
+ "tags": [
22212
+ "Browser Bridge"
22213
+ ],
22214
+ "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.",
22215
+ "operationId": "create_browser_credential",
22216
+ "requestBody": {
22217
+ "required": true,
22218
+ "content": {
22219
+ "application/json": {
22220
+ "schema": {
22221
+ "type": "object",
22222
+ "required": [
22223
+ "label",
22224
+ "vault_id",
22225
+ "secret_path",
22226
+ "login_url",
22227
+ "allowed_hosts"
22228
+ ],
22229
+ "properties": {
22230
+ "label": {
22231
+ "type": "string"
22232
+ },
22233
+ "vault_id": {
22234
+ "type": "string",
22235
+ "format": "uuid",
22236
+ "description": "Must belong to the caller's org."
22237
+ },
22238
+ "secret_path": {
22239
+ "type": "string",
22240
+ "description": "Path of the secret inside that vault. The value never lands in the binding."
22241
+ },
22242
+ "login_url": {
22243
+ "type": "string",
22244
+ "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."
22245
+ },
22246
+ "allowed_hosts": {
22247
+ "type": "array",
22248
+ "minItems": 1,
22249
+ "items": {
22250
+ "type": "string"
22251
+ },
22252
+ "description": "Bare hostnames, compared exactly. URLs, ports and wildcards are refused: a wildcard would match nothing while looking like it allowed something."
22253
+ },
22254
+ "sso_hosts": {
22255
+ "type": "array",
22256
+ "items": {
22257
+ "type": "string"
22258
+ },
22259
+ "description": "Identity-provider hosts the login legitimately bounces through."
22260
+ }
22261
+ }
22262
+ }
22263
+ }
22264
+ }
22265
+ },
22266
+ "responses": {
22267
+ "201": {
22268
+ "description": "Created. Every field is a pointer or a policy; none is secret."
22269
+ },
22270
+ "400": {
22271
+ "description": "A host is not a bare hostname, allowed_hosts is empty, or login_url is http or outside the allowlist"
22272
+ },
22273
+ "403": {
22274
+ "description": "Not a human caller, step-up not satisfied, or the vault belongs to another org"
22275
+ },
22276
+ "404": {
22277
+ "description": "Vault not found"
19595
22278
  }
22279
+ }
22280
+ },
22281
+ "get": {
22282
+ "tags": [
22283
+ "Browser Bridge"
19596
22284
  ],
22285
+ "summary": "List this org's browser credential bindings",
22286
+ "operationId": "list_browser_credentials",
19597
22287
  "responses": {
19598
22288
  "200": {
19599
- "description": "Shamir KEK status",
19600
- "content": {
19601
- "application/json": {
19602
- "schema": {
19603
- "$ref": "#/components/schemas/ShamirKekStatusResponse"
19604
- }
19605
- }
19606
- }
22289
+ "description": "The bindings"
22290
+ }
22291
+ }
22292
+ }
22293
+ },
22294
+ "/v1/browser/credentials/{id}": {
22295
+ "parameters": [
22296
+ {
22297
+ "name": "id",
22298
+ "in": "path",
22299
+ "required": true,
22300
+ "schema": {
22301
+ "type": "string",
22302
+ "format": "uuid"
22303
+ }
22304
+ }
22305
+ ],
22306
+ "delete": {
22307
+ "tags": [
22308
+ "Browser Bridge"
22309
+ ],
22310
+ "summary": "Remove a browser credential binding",
22311
+ "operationId": "delete_browser_credential",
22312
+ "responses": {
22313
+ "204": {
22314
+ "description": "Deleted"
19607
22315
  },
19608
- "401": {
19609
- "$ref": "#/components/responses/Unauthorized"
22316
+ "403": {
22317
+ "description": "Not a human caller"
22318
+ },
22319
+ "404": {
22320
+ "description": "Binding not found"
19610
22321
  }
19611
22322
  }
19612
22323
  }
19613
22324
  },
19614
- "/v1/org/shamir-kek/reconstruct": {
22325
+ "/v1/agents/{id}/browser/sessions": {
22326
+ "parameters": [
22327
+ {
22328
+ "name": "id",
22329
+ "in": "path",
22330
+ "required": true,
22331
+ "schema": {
22332
+ "type": "string",
22333
+ "format": "uuid"
22334
+ }
22335
+ }
22336
+ ],
19615
22337
  "post": {
19616
22338
  "tags": [
19617
- "Shamir KEK"
22339
+ "Browser Bridge"
19618
22340
  ],
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": [
22341
+ "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.",
22342
+ "operationId": "create_browser_session",
22343
+ "parameters": [
19623
22344
  {
19624
- "BearerAuth": []
22345
+ "name": "x-1claw-bridge-credential",
22346
+ "in": "header",
22347
+ "required": true,
22348
+ "schema": {
22349
+ "type": "string"
22350
+ },
22351
+ "description": "The bb_ credential from `1claw browser-bridge login`"
22352
+ },
22353
+ {
22354
+ "name": "x-1claw-bridge-version",
22355
+ "in": "header",
22356
+ "required": true,
22357
+ "schema": {
22358
+ "type": "string"
22359
+ },
22360
+ "description": "Bridge build. Versions below the server minimum are refused."
19625
22361
  }
19626
22362
  ],
19627
22363
  "requestBody": {
@@ -19629,81 +22365,245 @@
19629
22365
  "content": {
19630
22366
  "application/json": {
19631
22367
  "schema": {
19632
- "$ref": "#/components/schemas/ShamirKekReconstructRequest"
22368
+ "type": "object",
22369
+ "required": [
22370
+ "agent_id",
22371
+ "client_id"
22372
+ ],
22373
+ "properties": {
22374
+ "agent_id": {
22375
+ "type": "string",
22376
+ "format": "uuid",
22377
+ "description": "Must belong to the same org as the paired device."
22378
+ },
22379
+ "client_id": {
22380
+ "type": "string"
22381
+ },
22382
+ "bridge_version": {
22383
+ "type": "string"
22384
+ },
22385
+ "protocol_version": {
22386
+ "type": "string"
22387
+ }
22388
+ }
19633
22389
  }
19634
22390
  }
19635
22391
  }
19636
22392
  },
19637
22393
  "responses": {
19638
22394
  "200": {
19639
- "description": "Reconstruction result",
22395
+ "description": "Session created",
19640
22396
  "content": {
19641
22397
  "application/json": {
19642
22398
  "schema": {
19643
- "$ref": "#/components/schemas/ShamirKekReconstructResponse"
22399
+ "type": "object",
22400
+ "properties": {
22401
+ "session_id": {
22402
+ "type": "string",
22403
+ "format": "uuid"
22404
+ },
22405
+ "session_token": {
22406
+ "type": "string",
22407
+ "description": "bs_ prefixed. Only its hash is stored."
22408
+ },
22409
+ "expires_at": {
22410
+ "type": "string",
22411
+ "format": "date-time"
22412
+ }
22413
+ }
19644
22414
  }
19645
22415
  }
19646
22416
  }
19647
22417
  },
19648
22418
  "400": {
19649
- "$ref": "#/components/responses/BadRequest"
22419
+ "description": "Missing or unsupported bridge version"
19650
22420
  },
19651
22421
  "401": {
19652
- "$ref": "#/components/responses/Unauthorized"
22422
+ "description": "Not a paired bridge, or an agent token was presented"
19653
22423
  },
19654
22424
  "403": {
19655
- "$ref": "#/components/responses/Forbidden"
22425
+ "description": "The device and the agent are not in the same org"
19656
22426
  }
19657
22427
  }
19658
22428
  }
19659
22429
  },
19660
- "/v1/org/shamir-kek/recovery-codes": {
19661
- "get": {
22430
+ "/v1/agents/{id}/browser/fills": {
22431
+ "parameters": [
22432
+ {
22433
+ "name": "id",
22434
+ "in": "path",
22435
+ "required": true,
22436
+ "schema": {
22437
+ "type": "string",
22438
+ "format": "uuid"
22439
+ }
22440
+ }
22441
+ ],
22442
+ "post": {
19662
22443
  "tags": [
19663
- "Shamir KEK"
22444
+ "Browser Bridge"
19664
22445
  ],
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": [
22446
+ "summary": "Authorise one credential fill. Requires the bridge credential *and* an agent JWT — neither alone is sufficient.",
22447
+ "operationId": "authorize_browser_fill",
22448
+ "parameters": [
19669
22449
  {
19670
- "BearerAuth": []
22450
+ "name": "x-1claw-bridge-credential",
22451
+ "in": "header",
22452
+ "required": true,
22453
+ "schema": {
22454
+ "type": "string"
22455
+ }
22456
+ },
22457
+ {
22458
+ "name": "x-1claw-bridge-version",
22459
+ "in": "header",
22460
+ "required": true,
22461
+ "schema": {
22462
+ "type": "string"
22463
+ }
19671
22464
  }
19672
22465
  ],
22466
+ "requestBody": {
22467
+ "required": true,
22468
+ "content": {
22469
+ "application/json": {
22470
+ "schema": {
22471
+ "type": "object",
22472
+ "required": [
22473
+ "session_id",
22474
+ "binding_id",
22475
+ "tab_origin",
22476
+ "frame_origin",
22477
+ "frame_id",
22478
+ "generation"
22479
+ ],
22480
+ "properties": {
22481
+ "session_id": {
22482
+ "type": "string",
22483
+ "format": "uuid",
22484
+ "description": "Must match the session the presented bs_ token opened."
22485
+ },
22486
+ "binding_id": {
22487
+ "type": "string",
22488
+ "format": "uuid"
22489
+ },
22490
+ "frame_id": {
22491
+ "type": "string",
22492
+ "description": "The target the fill is for. Recorded on the grant."
22493
+ },
22494
+ "generation": {
22495
+ "type": "integer",
22496
+ "format": "int64",
22497
+ "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."
22498
+ },
22499
+ "form_action_origin": {
22500
+ "type": "string",
22501
+ "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."
22502
+ },
22503
+ "tab_origin": {
22504
+ "type": "string",
22505
+ "description": "Origin of the tab being driven. Checked against the binding's allowed and sso hosts by exact host match."
22506
+ },
22507
+ "frame_origin": {
22508
+ "type": "string",
22509
+ "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."
22510
+ }
22511
+ }
22512
+ }
22513
+ }
22514
+ }
22515
+ },
19673
22516
  "responses": {
19674
22517
  "200": {
19675
- "description": "Recovery codes (one-time)",
22518
+ "description": "A grant, a denial, or a pending approval. Never a secret.",
19676
22519
  "content": {
19677
22520
  "application/json": {
19678
22521
  "schema": {
19679
- "$ref": "#/components/schemas/ShamirKekRecoveryCodesResponse"
22522
+ "type": "object",
22523
+ "properties": {
22524
+ "kind": {
22525
+ "type": "string",
22526
+ "enum": [
22527
+ "grant"
22528
+ ]
22529
+ },
22530
+ "grant_id": {
22531
+ "type": "string",
22532
+ "format": "uuid",
22533
+ "description": "Single-use, short-lived, redeemable only by the session it was issued to."
22534
+ },
22535
+ "binding_id": {
22536
+ "type": "string",
22537
+ "format": "uuid"
22538
+ },
22539
+ "expires_at": {
22540
+ "type": "string",
22541
+ "format": "date-time"
22542
+ },
22543
+ "login_url": {
22544
+ "type": "string",
22545
+ "description": "The bridge navigates here itself. An agent-supplied URL would be the agent choosing who receives the password."
22546
+ }
22547
+ }
19680
22548
  }
19681
22549
  }
19682
22550
  }
19683
22551
  },
19684
- "401": {
19685
- "$ref": "#/components/responses/Unauthorized"
22552
+ "400": {
22553
+ "description": "Missing or unsupported bridge version"
19686
22554
  },
19687
22555
  "403": {
19688
- "$ref": "#/components/responses/Forbidden"
22556
+ "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"
19689
22557
  },
19690
- "410": {
19691
- "description": "Codes already retrieved"
22558
+ "404": {
22559
+ "description": "No such binding for this org"
19692
22560
  }
19693
22561
  }
19694
22562
  }
19695
22563
  },
19696
- "/v1/org/shamir-kek/verify-recovery-code": {
22564
+ "/v1/agents/{id}/browser/fills/consume": {
22565
+ "parameters": [
22566
+ {
22567
+ "name": "id",
22568
+ "in": "path",
22569
+ "required": true,
22570
+ "schema": {
22571
+ "type": "string",
22572
+ "format": "uuid"
22573
+ }
22574
+ }
22575
+ ],
19697
22576
  "post": {
19698
22577
  "tags": [
19699
- "Shamir KEK"
22578
+ "Browser Bridge"
19700
22579
  ],
19701
- "summary": "Verify a Shamir recovery code",
19702
- "description": "Check whether a recovery code is valid without consuming it.",
19703
- "operationId": "verifyShamirKekRecoveryCode",
19704
- "security": [
22580
+ "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.",
22581
+ "operationId": "consume_browser_fill",
22582
+ "parameters": [
19705
22583
  {
19706
- "BearerAuth": []
22584
+ "name": "x-1claw-bridge-credential",
22585
+ "in": "header",
22586
+ "required": true,
22587
+ "schema": {
22588
+ "type": "string"
22589
+ }
22590
+ },
22591
+ {
22592
+ "name": "x-1claw-bridge-session",
22593
+ "in": "header",
22594
+ "required": true,
22595
+ "schema": {
22596
+ "type": "string"
22597
+ },
22598
+ "description": "The bs_ session token. Proof the redemption belongs to a session this bridge opened."
22599
+ },
22600
+ {
22601
+ "name": "x-1claw-bridge-version",
22602
+ "in": "header",
22603
+ "required": true,
22604
+ "schema": {
22605
+ "type": "string"
22606
+ }
19707
22607
  }
19708
22608
  ],
19709
22609
  "requestBody": {
@@ -19711,27 +22611,100 @@
19711
22611
  "content": {
19712
22612
  "application/json": {
19713
22613
  "schema": {
19714
- "$ref": "#/components/schemas/ShamirKekVerifyCodeRequest"
22614
+ "type": "object",
22615
+ "required": [
22616
+ "session_id",
22617
+ "grant_id",
22618
+ "generation"
22619
+ ],
22620
+ "properties": {
22621
+ "session_id": {
22622
+ "type": "string",
22623
+ "format": "uuid"
22624
+ },
22625
+ "grant_id": {
22626
+ "type": "string",
22627
+ "format": "uuid"
22628
+ },
22629
+ "generation": {
22630
+ "type": "integer",
22631
+ "format": "int64",
22632
+ "description": "The bridge's navigation counter now. A mismatch means the page moved after the decision."
22633
+ }
22634
+ }
19715
22635
  }
19716
22636
  }
19717
22637
  }
19718
22638
  },
19719
22639
  "responses": {
19720
22640
  "200": {
19721
- "description": "Verification result",
22641
+ "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`.",
22642
+ "headers": {
22643
+ "x-1claw-binding-id": {
22644
+ "schema": {
22645
+ "type": "string",
22646
+ "format": "uuid"
22647
+ }
22648
+ },
22649
+ "x-1claw-form-fingerprint": {
22650
+ "schema": {
22651
+ "type": "string",
22652
+ "format": "byte"
22653
+ },
22654
+ "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."
22655
+ }
22656
+ },
19722
22657
  "content": {
19723
- "application/json": {
22658
+ "application/octet-stream": {
19724
22659
  "schema": {
19725
- "$ref": "#/components/schemas/ShamirKekVerifyCodeResponse"
22660
+ "type": "string",
22661
+ "format": "binary"
19726
22662
  }
19727
22663
  }
19728
22664
  }
19729
22665
  },
19730
22666
  "400": {
19731
- "$ref": "#/components/responses/BadRequest"
22667
+ "description": "Missing or unsupported bridge version"
22668
+ },
22669
+ "403": {
22670
+ "description": "Grant expired, already used, issued to another session or device; the page navigated after authorisation; or an agent principal was presented"
22671
+ },
22672
+ "404": {
22673
+ "description": "The binding or the secret behind it is missing"
22674
+ }
22675
+ }
22676
+ }
22677
+ },
22678
+ "/v1/agents/{agent_id}/chat/unlock": {
22679
+ "parameters": [
22680
+ {
22681
+ "name": "agent_id",
22682
+ "in": "path",
22683
+ "required": true,
22684
+ "schema": {
22685
+ "type": "string",
22686
+ "format": "uuid"
22687
+ }
22688
+ }
22689
+ ],
22690
+ "post": {
22691
+ "tags": [
22692
+ "Chat"
22693
+ ],
22694
+ "summary": "Unlock an agent's chat history for reading",
22695
+ "operationId": "unlock_agent_chat",
22696
+ "responses": {
22697
+ "200": {
22698
+ "description": "Unlocked"
19732
22699
  },
19733
22700
  "401": {
19734
- "$ref": "#/components/responses/Unauthorized"
22701
+ "description": "Unauthenticated"
22702
+ },
22703
+ "403": {
22704
+ "description": "Forbidden"
22705
+ },
22706
+ "404": {
22707
+ "description": "Agent not found"
19735
22708
  }
19736
22709
  }
19737
22710
  }
@@ -23638,6 +26611,7 @@
23638
26611
  },
23639
26612
  "PatchConnectionAgentRequest": {
23640
26613
  "type": "object",
26614
+ "description": "At least one field is required.\n",
23641
26615
  "properties": {
23642
26616
  "intents_api_enabled": {
23643
26617
  "type": "boolean"
@@ -23645,6 +26619,10 @@
23645
26619
  "execution_intents_enabled": {
23646
26620
  "type": "boolean"
23647
26621
  },
26622
+ "memory_enabled": {
26623
+ "type": "boolean",
26624
+ "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"
26625
+ },
23648
26626
  "system_prompt": {
23649
26627
  "type": "string",
23650
26628
  "nullable": true
@@ -23664,6 +26642,9 @@
23664
26642
  "execution_intents_enabled": {
23665
26643
  "type": "boolean"
23666
26644
  },
26645
+ "memory_enabled": {
26646
+ "type": "boolean"
26647
+ },
23667
26648
  "system_prompt": {
23668
26649
  "type": "string",
23669
26650
  "nullable": true