@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.yaml CHANGED
@@ -2,7 +2,7 @@ openapi: 3.1.0
2
2
 
3
3
  info:
4
4
  title: 1Claw API
5
- version: "0.59.8"
5
+ version: "0.59.10"
6
6
  description: |
7
7
  Secure secret management for AI agents. Provides vaults, secrets,
8
8
  policy-based access control, agent identity, Intents API,
@@ -29,7 +29,7 @@ info:
29
29
  All endpoints require JWT Bearer authentication unless marked with
30
30
  `security: []`.
31
31
  contact:
32
- email: ops@1claw.xyz
32
+ email: ops@1claw.co
33
33
 
34
34
  servers:
35
35
  - url: https://api.1claw.co
@@ -1649,7 +1649,17 @@ paths:
1649
1649
  schema:
1650
1650
  $ref: "#/components/schemas/VaultResponse"
1651
1651
  "400":
1652
- $ref: "#/components/responses/BadRequest"
1652
+ 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.
1653
+ content:
1654
+ application/json:
1655
+ schema:
1656
+ $ref: "#/components/schemas/ProblemDetails"
1657
+ "409":
1658
+ description: A vault with that name already exists in this organization. Names are unique per org; this previously surfaced as a 500.
1659
+ content:
1660
+ application/json:
1661
+ schema:
1662
+ $ref: "#/components/schemas/ProblemDetails"
1653
1663
  get:
1654
1664
  tags: [Vaults]
1655
1665
  summary: List vaults
@@ -7504,6 +7514,26 @@ paths:
7504
7514
  "404":
7505
7515
  $ref: "#/components/responses/NotFound"
7506
7516
 
7517
+ post:
7518
+ tags: [Platform]
7519
+ summary: Create an approval on a platform connection
7520
+ operationId: createConnectionApproval
7521
+ security:
7522
+ - BearerAuth: []
7523
+ parameters:
7524
+ - in: path
7525
+ name: connectionId
7526
+ required: true
7527
+ schema:
7528
+ type: string
7529
+ format: uuid
7530
+ responses:
7531
+ "201":
7532
+ description: Approval created
7533
+ "403":
7534
+ $ref: "#/components/responses/Forbidden"
7535
+ "404":
7536
+ $ref: "#/components/responses/NotFound"
7507
7537
  /v1/platform/connections/{connectionId}/approvals/{approvalId}:
7508
7538
  get:
7509
7539
  tags: [Platform]
@@ -7896,6 +7926,32 @@ paths:
7896
7926
  "404":
7897
7927
  $ref: "#/components/responses/NotFound"
7898
7928
 
7929
+ post:
7930
+ tags: [Platform]
7931
+ summary: "Alias for PATCH on this path — same handler, same limited settings. Present because some clients cannot send PATCH."
7932
+ operationId: postConnectionAgent
7933
+ security:
7934
+ - BearerAuth: []
7935
+ parameters:
7936
+ - in: path
7937
+ name: connectionId
7938
+ required: true
7939
+ schema:
7940
+ type: string
7941
+ format: uuid
7942
+ - in: path
7943
+ name: agentId
7944
+ required: true
7945
+ schema:
7946
+ type: string
7947
+ format: uuid
7948
+ responses:
7949
+ "200":
7950
+ description: Agent updated
7951
+ "403":
7952
+ $ref: "#/components/responses/Forbidden"
7953
+ "404":
7954
+ $ref: "#/components/responses/NotFound"
7899
7955
  /v1/platform/connections/{connectionId}/portfolio:
7900
7956
  get:
7901
7957
  tags: [Platform]
@@ -8074,6 +8130,10 @@ paths:
8074
8130
  type: string
8075
8131
  - in: query
8076
8132
  name: agent_id
8133
+ description: |
8134
+ Optional only while the connection has exactly one agent.
8135
+ With more than one it becomes required and the call answers
8136
+ 400 without it — the Fleet template provisions three.
8077
8137
  required: false
8078
8138
  schema:
8079
8139
  type: string
@@ -8238,10 +8298,30 @@ paths:
8238
8298
  /v1/platform/connections/{connectionId}/passkeys/enroll/begin:
8239
8299
  post:
8240
8300
  tags: [Platform]
8241
- summary: Begin passkey enrollment for a connected user
8301
+ summary: Begin passkey enrollment for a connected user (always 403)
8302
+ deprecated: true
8242
8303
  description: |
8243
- Starts WebAuthn registration for the end-user on this connection.
8244
- Platform apps use this instead of `POST /v1/auth/passkeys/register/begin` (user JWT only).
8304
+ **This endpoint always returns 403 and cannot be made to work.**
8305
+ The description here previously said platform apps should use it
8306
+ instead of `POST /v1/auth/passkeys/register/begin`, which was
8307
+ wrong and cost integrators a WebAuthn ceremony to discover.
8308
+
8309
+ A passkey enrolled this way is login-capable: it can be asserted
8310
+ through the public sign-in flow to mint a full, non-delegated
8311
+ user session, so an app that enrolled one would hold a credential
8312
+ stronger than the delegation boundary it operates under. The
8313
+ capability was removed for that reason and will not return.
8314
+
8315
+ **A passkey is enrolled by the user, in their own session**, via
8316
+ `POST /v1/auth/passkeys/register/begin`. For a connected user
8317
+ that means completing the claim flow on the connection first.
8318
+
8319
+ To *use* a passkey a connected user already has, see:
8320
+ - `GET /v1/platform/connections/{connectionId}/passkeys` —
8321
+ whether the confirm step can be offered at all.
8322
+ - `POST /v1/platform/connections/{connectionId}/passkeys/tx-assert/begin`
8323
+ and `.../complete` — ask that user to touch their
8324
+ authenticator over a specific digest.
8245
8325
  operationId: connectionPasskeyEnrollBegin
8246
8326
  security:
8247
8327
  - BearerAuth: []
@@ -8253,19 +8333,24 @@ paths:
8253
8333
  type: string
8254
8334
  format: uuid
8255
8335
  responses:
8256
- "200":
8257
- description: WebAuthn registration ceremony options
8336
+ "403":
8337
+ description: |
8338
+ Always. Platform apps cannot enroll login passkeys for
8339
+ connected users.
8258
8340
  content:
8259
8341
  application/json:
8260
8342
  schema:
8261
- $ref: "#/components/schemas/PasskeyRegisterBeginResponse"
8262
- "404":
8263
- $ref: "#/components/responses/NotFound"
8343
+ $ref: "#/components/schemas/ProblemDetails"
8264
8344
 
8265
8345
  /v1/platform/connections/{connectionId}/passkeys/enroll/complete:
8266
8346
  post:
8267
8347
  tags: [Platform]
8268
- summary: Complete passkey enrollment for a connected user
8348
+ summary: Complete passkey enrollment for a connected user (always 403)
8349
+ deprecated: true
8350
+ description: |
8351
+ **This endpoint always returns 403.** See
8352
+ `POST /v1/platform/connections/{connectionId}/passkeys/enroll/begin`
8353
+ for why, and for the paths that do work.
8269
8354
  operationId: connectionPasskeyEnrollComplete
8270
8355
  security:
8271
8356
  - BearerAuth: []
@@ -8283,14 +8368,197 @@ paths:
8283
8368
  schema:
8284
8369
  $ref: "#/components/schemas/PasskeyRegisterCompleteRequest"
8285
8370
  responses:
8286
- "201":
8287
- description: Passkey registered
8371
+ "403":
8372
+ description: |
8373
+ Always. Platform apps cannot enroll login passkeys for
8374
+ connected users.
8375
+ content:
8376
+ application/json:
8377
+ schema:
8378
+ $ref: "#/components/schemas/ProblemDetails"
8379
+
8380
+ /v1/platform/connections/{connectionId}/passkeys:
8381
+ get:
8382
+ tags: [Platform]
8383
+ summary: Whether a connected user can be asked for a passkey touch
8384
+ description: |
8385
+ Answers one question: can this app offer the passkey confirm
8386
+ step to this user? No credential material is returned — not
8387
+ credential ids, not public keys, not enrolment times.
8388
+
8389
+ `count` is what matters. Passkeys are bound to the domain they
8390
+ were registered on, so an account can hold credentials that this
8391
+ domain cannot offer; `count` reports only those usable on
8392
+ `rp_id`, while `registered_count` is the raw total. Branch on
8393
+ `has_passkey`.
8394
+ operationId: listConnectionPasskeys
8395
+ security:
8396
+ - BearerAuth: []
8397
+ parameters:
8398
+ - in: path
8399
+ name: connectionId
8400
+ required: true
8401
+ schema:
8402
+ type: string
8403
+ format: uuid
8404
+ responses:
8405
+ "200":
8406
+ description: Passkey availability for this connection
8407
+ content:
8408
+ application/json:
8409
+ schema:
8410
+ type: object
8411
+ required: [has_passkey, count, registered_count, rp_id]
8412
+ properties:
8413
+ has_passkey:
8414
+ type: boolean
8415
+ description: True when count > 0.
8416
+ count:
8417
+ type: integer
8418
+ format: int64
8419
+ description: Passkeys usable on rp_id.
8420
+ registered_count:
8421
+ type: integer
8422
+ format: int64
8423
+ description: |
8424
+ All passkeys on the account, including any
8425
+ bound to a different domain.
8426
+ rp_id:
8427
+ type: string
8428
+ description: The domain these counts are measured against.
8429
+ "403":
8430
+ $ref: "#/components/responses/Forbidden"
8431
+ "404":
8432
+ $ref: "#/components/responses/NotFound"
8433
+
8434
+ /v1/platform/connections/{connectionId}/passkeys/tx-assert/begin:
8435
+ post:
8436
+ tags: [Platform]
8437
+ summary: Ask a connected user to touch their authenticator
8438
+ description: |
8439
+ Begins a WebAuthn assertion bound to `tx_digest`, for the user on
8440
+ this connection. The connection in the path is the addressing
8441
+ that `POST /v1/auth/passkeys/tx-assert/begin` lacks: that route
8442
+ resolves the *calling* principal, so with a `plt_` key it looks
8443
+ up the app itself and reports no passkeys. An app never needs to
8444
+ hold an email to name one of its users.
8445
+
8446
+ Returns 404 when the user has no passkey usable on this domain —
8447
+ check `GET /v1/platform/connections/{connectionId}/passkeys`
8448
+ first and only offer the step when `has_passkey` is true.
8449
+ operationId: connectionPasskeyTxAssertBegin
8450
+ security:
8451
+ - BearerAuth: []
8452
+ parameters:
8453
+ - in: path
8454
+ name: connectionId
8455
+ required: true
8456
+ schema:
8457
+ type: string
8458
+ format: uuid
8459
+ requestBody:
8460
+ required: true
8461
+ content:
8462
+ application/json:
8463
+ schema:
8464
+ type: object
8465
+ required: [tx_digest]
8466
+ properties:
8467
+ tx_digest:
8468
+ type: string
8469
+ description: SHA-256 hex of the exact text being confirmed.
8470
+ action:
8471
+ type: string
8472
+ enum: [send, swap]
8473
+ default: send
8474
+ responses:
8475
+ "200":
8476
+ description: WebAuthn assertion ceremony options
8477
+ content:
8478
+ application/json:
8479
+ schema:
8480
+ $ref: "#/components/schemas/PasskeyAssertBeginResponse"
8481
+ "400":
8482
+ $ref: "#/components/responses/BadRequest"
8483
+ "403":
8484
+ $ref: "#/components/responses/Forbidden"
8485
+ "404":
8486
+ description: This user has no passkey registered.
8487
+ content:
8488
+ application/json:
8489
+ schema:
8490
+ $ref: "#/components/schemas/ProblemDetails"
8491
+
8492
+ /v1/platform/connections/{connectionId}/passkeys/tx-assert/complete:
8493
+ post:
8494
+ tags: [Platform]
8495
+ summary: Verify the touch and return proof of it
8496
+ description: |
8497
+ Verifies the assertion — origin, rpIdHash, the user-verified
8498
+ flag, the signature, and a sign count that must increase, which
8499
+ is what catches a cloned authenticator — and returns a
8500
+ short-lived token proving this user touched their authenticator
8501
+ over that digest.
8502
+
8503
+ The token records that a platform app requested it. That
8504
+ provenance is deliberate: it proves the touch to your
8505
+ application, and it is **refused** as authorization for a
8506
+ 1Claw treasury transfer. A user consenting to your action has
8507
+ not consented to moving funds, and those remain a separate
8508
+ assertion from the user's own session.
8509
+ operationId: connectionPasskeyTxAssertComplete
8510
+ security:
8511
+ - BearerAuth: []
8512
+ parameters:
8513
+ - in: path
8514
+ name: connectionId
8515
+ required: true
8516
+ schema:
8517
+ type: string
8518
+ format: uuid
8519
+ requestBody:
8520
+ required: true
8521
+ content:
8522
+ application/json:
8523
+ schema:
8524
+ type: object
8525
+ required:
8526
+ [
8527
+ credential_id,
8528
+ authenticator_data,
8529
+ client_data_json,
8530
+ signature,
8531
+ ]
8532
+ properties:
8533
+ credential_id:
8534
+ type: string
8535
+ authenticator_data:
8536
+ type: string
8537
+ client_data_json:
8538
+ type: string
8539
+ signature:
8540
+ type: string
8541
+ responses:
8542
+ "200":
8543
+ description: Assertion verified
8288
8544
  content:
8289
8545
  application/json:
8290
8546
  schema:
8291
- $ref: "#/components/schemas/PasskeyRegisterCompleteResponse"
8547
+ type: object
8548
+ required: [passkey_token, expires_in]
8549
+ properties:
8550
+ passkey_token:
8551
+ type: string
8552
+ description: |
8553
+ Single-use proof of the touch, bound to the
8554
+ digest and to this user.
8555
+ expires_in:
8556
+ type: integer
8557
+ description: Seconds until the token expires.
8292
8558
  "400":
8293
8559
  $ref: "#/components/responses/BadRequest"
8560
+ "403":
8561
+ $ref: "#/components/responses/Forbidden"
8294
8562
  "404":
8295
8563
  $ref: "#/components/responses/NotFound"
8296
8564
 
@@ -8501,6 +8769,30 @@ paths:
8501
8769
  "409":
8502
8770
  $ref: "#/components/responses/Conflict"
8503
8771
 
8772
+ post:
8773
+ tags: [Approvals]
8774
+ 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."
8775
+ operationId: quickDecide
8776
+ requestBody:
8777
+ required: true
8778
+ content:
8779
+ application/json:
8780
+ schema:
8781
+ type: object
8782
+ required: [token, decision]
8783
+ properties:
8784
+ token:
8785
+ type: string
8786
+ decision:
8787
+ type: string
8788
+ enum: [approve, deny]
8789
+ responses:
8790
+ "200":
8791
+ description: Decision recorded
8792
+ "400":
8793
+ description: Malformed or expired token
8794
+ "404":
8795
+ $ref: "#/components/responses/NotFound"
8504
8796
  /v1/deposit-destinations:
8505
8797
  post:
8506
8798
  tags: [Treasury]
@@ -10304,6 +10596,17 @@ paths:
10304
10596
  $ref: "#/components/responses/Forbidden"
10305
10597
  "404":
10306
10598
  $ref: "#/components/responses/NotFound"
10599
+ "503":
10600
+ description: |
10601
+ The runtime's last start failed less than 120 seconds ago and is not
10602
+ being retried yet. Chat starts a stopped runtime, so a client that
10603
+ retries on failure turns every attempt into another deploy — one
10604
+ polling client did exactly that every 8 seconds for days. Wait out
10605
+ the cooldown, or call the start endpoint to see the underlying error.
10606
+ content:
10607
+ application/json:
10608
+ schema:
10609
+ $ref: "#/components/schemas/ProblemDetails"
10307
10610
 
10308
10611
  # ---------------------------------------------------------------------------
10309
10612
  # Agent Memory
@@ -10351,6 +10654,24 @@ paths:
10351
10654
  $ref: "#/components/responses/Unauthorized"
10352
10655
  "404":
10353
10656
  $ref: "#/components/responses/NotFound"
10657
+ delete:
10658
+ tags: [Agent Memory]
10659
+ summary: "Delete a memory namespace and every entry in it. Destructive and not reversible; there is no per-entry confirmation."
10660
+ operationId: deleteMemoryNamespace
10661
+ parameters:
10662
+ - $ref: "#/components/parameters/AgentId"
10663
+ - name: namespace
10664
+ in: path
10665
+ required: true
10666
+ schema:
10667
+ type: string
10668
+ responses:
10669
+ "204":
10670
+ description: Namespace deleted
10671
+ "401":
10672
+ $ref: "#/components/responses/Unauthorized"
10673
+ "404":
10674
+ $ref: "#/components/responses/NotFound"
10354
10675
 
10355
10676
  /v1/agents/{agent_id}/memory/{namespace}/{key}:
10356
10677
  put:
@@ -12444,30 +12765,6 @@ paths:
12444
12765
  "404":
12445
12766
  $ref: "#/components/responses/NotFound"
12446
12767
 
12447
- /v1/auth/credential-recovery/requests/{id}:
12448
- delete:
12449
- tags: [Credential Recovery]
12450
- summary: Cancel or reject a recovery request
12451
- operationId: cancelCredentialRecovery
12452
- security:
12453
- - BearerAuth: []
12454
- parameters:
12455
- - name: id
12456
- in: path
12457
- required: true
12458
- schema:
12459
- type: string
12460
- format: uuid
12461
- responses:
12462
- "204":
12463
- description: Request cancelled
12464
- "401":
12465
- $ref: "#/components/responses/Unauthorized"
12466
- "403":
12467
- $ref: "#/components/responses/Forbidden"
12468
- "404":
12469
- $ref: "#/components/responses/NotFound"
12470
-
12471
12768
  # ---------------------------------------------------------------------------
12472
12769
  # Org Credential Recovery Policy
12473
12770
  # ---------------------------------------------------------------------------
@@ -12518,139 +12815,1916 @@ paths:
12518
12815
  # Shamir KEK
12519
12816
  # ---------------------------------------------------------------------------
12520
12817
 
12521
- /v1/org/shamir-kek/setup:
12818
+ /v1/agents/batch-delete:
12522
12819
  post:
12523
- tags: [Shamir KEK]
12524
- summary: Set up Shamir KEK for the org
12525
- description: |
12526
- Initialize a Shamir secret-sharing KEK for the org. Splits the master
12527
- key into shares distributed to custodians. Shares are returned one-time
12528
- only and must be stored securely by each custodian.
12529
- operationId: setupShamirKek
12530
- security:
12531
- - BearerAuth: []
12820
+ tags: [Agents]
12821
+ summary: "batch delete agents"
12822
+ operationId: batch_delete_agents
12823
+ responses:
12824
+ '200':
12825
+ description: Success
12826
+ '401':
12827
+ description: Unauthenticated
12828
+ '403':
12829
+ description: Forbidden, or the plan does not include this
12830
+ '404':
12831
+ description: Not found
12832
+ /v1/agents/enroll/approve:
12833
+ post:
12834
+ tags: [Agents]
12835
+ summary: "Authenticated: consume token, create agent, return API key once. **Email-bound pending:** caller must belong to the same org and match `human_email`."
12836
+ operationId: approve_enrollment
12532
12837
  requestBody:
12533
12838
  required: true
12534
12839
  content:
12535
12840
  application/json:
12536
12841
  schema:
12537
- $ref: "#/components/schemas/ShamirKekSetupRequest"
12538
- responses:
12539
- "201":
12540
- description: Shamir KEK configured (shares returned one-time)
12541
- content:
12542
- application/json:
12543
- schema:
12544
- $ref: "#/components/schemas/ShamirKekSetupResponse"
12545
- "400":
12546
- $ref: "#/components/responses/BadRequest"
12547
- "401":
12548
- $ref: "#/components/responses/Unauthorized"
12549
- "403":
12550
- $ref: "#/components/responses/Forbidden"
12551
-
12552
- /v1/org/shamir-kek:
12553
- get:
12554
- tags: [Shamir KEK]
12555
- summary: Get Shamir KEK status
12556
- description: Returns the current Shamir KEK configuration status for the org.
12557
- operationId: getShamirKekStatus
12558
- security:
12559
- - BearerAuth: []
12560
- responses:
12561
- "200":
12562
- description: Shamir KEK status
12842
+ type: object
12843
+ required:
12844
+ - token
12845
+ properties:
12846
+ token:
12847
+ type: string
12848
+ approval_id:
12849
+ type: string
12850
+ format: uuid
12851
+ description: |
12852
+ Consensus approval to spend on this creation.
12853
+ Approving an enrollment creates an agent, so it is
12854
+ gated on `agent.create` exactly as POST /v1/agents
12855
+ is. Orgs without a control-plane consensus policy
12856
+ never need this.
12857
+ responses:
12858
+ '200':
12859
+ description: Success
12860
+ '401':
12861
+ description: Unauthenticated
12862
+ '403':
12863
+ description: |
12864
+ Forbidden, the plan does not include this, or the org requires
12865
+ M-of-N consensus for `agent.create` and no approval was supplied.
12866
+ '404':
12867
+ description: Not found
12868
+ /v1/agents/enroll/deny:
12869
+ post:
12870
+ tags: [Agents]
12871
+ summary: "Authenticated: consume token and delete pending enrollment (deny). **Email-bound:** caller org and email must match the pending row. **Link-only:** "
12872
+ operationId: deny_enrollment
12873
+ requestBody:
12874
+ required: true
12875
+ content:
12876
+ application/json:
12877
+ schema:
12878
+ type: object
12879
+ required:
12880
+ - token
12881
+ properties:
12882
+ token:
12883
+ type: string
12884
+ responses:
12885
+ '200':
12886
+ description: Success
12887
+ '401':
12888
+ description: Unauthenticated
12889
+ '403':
12890
+ description: Forbidden, or the plan does not include this
12891
+ '404':
12892
+ description: Not found
12893
+ /v1/agents/enroll/pending:
12894
+ get:
12895
+ tags: [Agents]
12896
+ 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"
12897
+ operationId: get_enrollment_pending
12898
+ security: []
12899
+ responses:
12900
+ '200':
12901
+ description: Success
12902
+ '404':
12903
+ description: Not found
12904
+ /v1/agents/{agent_id}/channels/{channel_id}/refresh-webhook:
12905
+ parameters:
12906
+ - name: agent_id
12907
+ in: path
12908
+ required: true
12909
+ schema:
12910
+ type: string
12911
+ - name: channel_id
12912
+ in: path
12913
+ required: true
12914
+ schema:
12915
+ type: string
12916
+ post:
12917
+ tags: [Agents]
12918
+ summary: "Re-register the provider webhook for this channel (repairs a stale or revoked subscription)."
12919
+ operationId: refresh_channel_webhook
12920
+ responses:
12921
+ '200':
12922
+ description: Success
12923
+ '401':
12924
+ description: Unauthenticated
12925
+ '403':
12926
+ description: Forbidden, or the plan does not include this
12927
+ '404':
12928
+ description: Not found
12929
+ /v1/agents/{agent_id}/channels/{channel_id}/repair:
12930
+ parameters:
12931
+ - name: agent_id
12932
+ in: path
12933
+ required: true
12934
+ schema:
12935
+ type: string
12936
+ - name: channel_id
12937
+ in: path
12938
+ required: true
12939
+ schema:
12940
+ type: string
12941
+ post:
12942
+ tags: [Agents]
12943
+ summary: "Repair a channel: alias of refresh-webhook, re-registers the provider webhook for this channel."
12944
+ operationId: repair_channel_webhook
12945
+ responses:
12946
+ '200':
12947
+ description: Success
12948
+ '401':
12949
+ description: Unauthenticated
12950
+ '403':
12951
+ description: Forbidden, or the plan does not include this
12952
+ '404':
12953
+ description: Not found
12954
+ /v1/agents/{agent_id}/eoa:
12955
+ parameters:
12956
+ - name: agent_id
12957
+ in: path
12958
+ required: true
12959
+ schema:
12960
+ type: string
12961
+ get:
12962
+ tags: [Agents]
12963
+ summary: "Get the agent's EVM address (no private key exposure)."
12964
+ operationId: get_agent_eoa
12965
+ responses:
12966
+ '200':
12967
+ description: Success
12968
+ '401':
12969
+ description: Unauthenticated
12970
+ '403':
12971
+ description: Forbidden, or the plan does not include this
12972
+ '404':
12973
+ description: Not found
12974
+ post:
12975
+ tags: [Agents]
12976
+ 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."
12977
+ operationId: generate_agent_eoa
12978
+ responses:
12979
+ '200':
12980
+ description: Success
12981
+ '401':
12982
+ description: Unauthenticated
12983
+ '403':
12984
+ description: Forbidden, or the plan does not include this
12985
+ '404':
12986
+ description: Not found
12987
+ /v1/agents/{agent_id}/rotate-signer-key:
12988
+ parameters:
12989
+ - name: agent_id
12990
+ in: path
12991
+ required: true
12992
+ schema:
12993
+ type: string
12994
+ post:
12995
+ tags: [Agents]
12996
+ 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"
12997
+ operationId: rotate_signer_key
12998
+ responses:
12999
+ '200':
13000
+ description: Success
13001
+ '401':
13002
+ description: Unauthenticated
13003
+ '403':
13004
+ description: Forbidden, or the plan does not include this
13005
+ '404':
13006
+ description: Not found
13007
+ /v1/agents/{agent_id}/smart-accounts/{chain_id}:
13008
+ parameters:
13009
+ - name: agent_id
13010
+ in: path
13011
+ required: true
13012
+ schema:
13013
+ type: string
13014
+ - name: chain_id
13015
+ in: path
13016
+ required: true
13017
+ schema:
13018
+ type: string
13019
+ delete:
13020
+ tags: [Agents]
13021
+ summary: "delete smart account"
13022
+ operationId: delete_smart_account
13023
+ responses:
13024
+ '200':
13025
+ description: Success
13026
+ '401':
13027
+ description: Unauthenticated
13028
+ '403':
13029
+ description: Forbidden, or the plan does not include this
13030
+ '404':
13031
+ description: Not found
13032
+ /v1/agents/{agent_id}/unlock-platform:
13033
+ parameters:
13034
+ - name: agent_id
13035
+ in: path
13036
+ required: true
13037
+ schema:
13038
+ type: string
13039
+ post:
13040
+ tags: [Agents]
13041
+ summary: "User-only. Clears platform_locked when the app is no longer actively connected."
13042
+ operationId: unlock_agent_platform
13043
+ responses:
13044
+ '200':
13045
+ description: Success
13046
+ '401':
13047
+ description: Unauthenticated
13048
+ '403':
13049
+ description: Forbidden, or the plan does not include this
13050
+ '404':
13051
+ description: Not found
13052
+ /v1/audit/export:
13053
+ get:
13054
+ tags: [Audit]
13055
+ summary: "export audit events"
13056
+ operationId: export_audit_events
13057
+ responses:
13058
+ '200':
13059
+ description: Success
13060
+ '401':
13061
+ description: Unauthenticated
13062
+ '403':
13063
+ description: Forbidden, or the plan does not include this
13064
+ '404':
13065
+ description: Not found
13066
+ /v1/auth/credential-recovery/requests/{id}/cancel:
13067
+ parameters:
13068
+ - name: id
13069
+ in: path
13070
+ required: true
13071
+ schema:
13072
+ type: string
13073
+ post:
13074
+ tags: [Auth]
13075
+ summary: "cancel request"
13076
+ operationId: cancel_request
13077
+ responses:
13078
+ '200':
13079
+ description: Success
13080
+ '401':
13081
+ description: Unauthenticated
13082
+ '403':
13083
+ description: Forbidden, or the plan does not include this
13084
+ '404':
13085
+ description: Not found
13086
+ /v1/auth/migration-status:
13087
+ get:
13088
+ tags: [Auth]
13089
+ 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"
13090
+ operationId: migration_status
13091
+ responses:
13092
+ '200':
13093
+ description: Success
13094
+ '401':
13095
+ description: Unauthenticated
13096
+ '403':
13097
+ description: Forbidden, or the plan does not include this
13098
+ '404':
13099
+ description: Not found
13100
+ /v1/auth/passkeys/vault-assert/begin:
13101
+ post:
13102
+ tags: [Auth]
13103
+ summary: "Begin a passkey assertion that unlocks vault secret reads for users who have `require_passkey_for_vaults` enabled."
13104
+ operationId: vault_assert_begin
13105
+ responses:
13106
+ '200':
13107
+ description: Success
13108
+ '401':
13109
+ description: Unauthenticated
13110
+ '403':
13111
+ description: Forbidden, or the plan does not include this
13112
+ '404':
13113
+ description: Not found
13114
+ /v1/auth/passkeys/vault-assert/complete:
13115
+ post:
13116
+ tags: [Auth]
13117
+ summary: "Returns a short-lived `passkey_token` for the `X-Passkey-Token` header on secret reads."
13118
+ operationId: vault_assert_complete
13119
+ requestBody:
13120
+ required: true
13121
+ content:
13122
+ application/json:
13123
+ schema:
13124
+ type: object
13125
+ required:
13126
+ - credential_id
13127
+ - authenticator_data
13128
+ - client_data_json
13129
+ - signature
13130
+ properties:
13131
+ credential_id:
13132
+ type: string
13133
+ authenticator_data:
13134
+ type: string
13135
+ client_data_json:
13136
+ type: string
13137
+ signature:
13138
+ type: string
13139
+ responses:
13140
+ '200':
13141
+ description: Success
13142
+ '401':
13143
+ description: Unauthenticated
13144
+ '403':
13145
+ description: Forbidden, or the plan does not include this
13146
+ '404':
13147
+ description: Not found
13148
+ /v1/auth/reauth/begin:
13149
+ post:
13150
+ tags: [Auth]
13151
+ summary: "start a re-authentication ceremony. For passkey: returns a WebAuthn challenge. For password: returns immediately (no challenge needed)."
13152
+ operationId: reauth_begin
13153
+ requestBody:
13154
+ required: true
13155
+ content:
13156
+ application/json:
13157
+ schema:
13158
+ type: object
13159
+ required:
13160
+ - method
13161
+ properties:
13162
+ method:
13163
+ type: string
13164
+ purpose:
13165
+ type: string
13166
+ responses:
13167
+ '200':
13168
+ description: Success
13169
+ '401':
13170
+ description: Unauthenticated
13171
+ '403':
13172
+ description: Forbidden, or the plan does not include this
13173
+ '404':
13174
+ description: Not found
13175
+ /v1/auth/reauth/complete:
13176
+ post:
13177
+ tags: [Auth]
13178
+ summary: "verify re-authentication and issue a single-use token."
13179
+ operationId: reauth_complete
13180
+ requestBody:
13181
+ required: true
13182
+ content:
13183
+ application/json:
13184
+ schema:
13185
+ type: object
13186
+ required:
13187
+ - method
13188
+ properties:
13189
+ method:
13190
+ type: string
13191
+ purpose:
13192
+ type: string
13193
+ password:
13194
+ type: string
13195
+ credential_id:
13196
+ type: string
13197
+ authenticator_data:
13198
+ type: string
13199
+ client_data_json:
13200
+ type: string
13201
+ signature:
13202
+ type: string
13203
+ responses:
13204
+ '200':
13205
+ description: Success
13206
+ '401':
13207
+ description: Unauthenticated
13208
+ '403':
13209
+ description: Forbidden, or the plan does not include this
13210
+ '404':
13211
+ description: Not found
13212
+ /v1/auth/social/disconnect:
13213
+ post:
13214
+ tags: [Auth]
13215
+ 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"
13216
+ operationId: disconnect_social
13217
+ responses:
13218
+ '200':
13219
+ description: Success
13220
+ '401':
13221
+ description: Unauthenticated
13222
+ '403':
13223
+ description: Forbidden, or the plan does not include this
13224
+ '404':
13225
+ description: Not found
13226
+ /v1/auth/sso/authorize:
13227
+ get:
13228
+ tags: [Auth]
13229
+ summary: "returns JSON with authorization_url for WorkOS Hosted Auth."
13230
+ operationId: sso_authorize
13231
+ responses:
13232
+ '200':
13233
+ description: Success
13234
+ '401':
13235
+ description: Unauthenticated
13236
+ '403':
13237
+ description: Forbidden, or the plan does not include this
13238
+ '404':
13239
+ description: Not found
13240
+ /v1/auth/sso/callback:
13241
+ get:
13242
+ tags: [Auth]
13243
+ summary: "exchange code for profile, find/create user, redirect to dashboard with token."
13244
+ operationId: sso_callback
13245
+ responses:
13246
+ '200':
13247
+ description: Success
13248
+ '401':
13249
+ description: Unauthenticated
13250
+ '403':
13251
+ description: Forbidden, or the plan does not include this
13252
+ '404':
13253
+ description: Not found
13254
+ /v1/auth/sso/status:
13255
+ get:
13256
+ tags: [Auth]
13257
+ summary: "returns whether SSO is configured (for dashboard to show/hide SSO button)."
13258
+ operationId: sso_status
13259
+ responses:
13260
+ '200':
13261
+ description: Success
13262
+ '401':
13263
+ description: Unauthenticated
13264
+ '403':
13265
+ description: Forbidden, or the plan does not include this
13266
+ '404':
13267
+ description: Not found
13268
+ /v1/billing/llm-models:
13269
+ get:
13270
+ tags: [Billing]
13271
+ summary: "get llm models"
13272
+ operationId: get_llm_models
13273
+ responses:
13274
+ '200':
13275
+ description: Success
13276
+ '401':
13277
+ description: Unauthenticated
13278
+ '403':
13279
+ description: Forbidden, or the plan does not include this
13280
+ '404':
13281
+ description: Not found
13282
+ /v1/billing/llm-pricing:
13283
+ get:
13284
+ tags: [Billing]
13285
+ summary: "get llm pricing"
13286
+ operationId: get_llm_pricing
13287
+ responses:
13288
+ '200':
13289
+ description: Success
13290
+ '401':
13291
+ description: Unauthenticated
13292
+ '403':
13293
+ description: Forbidden, or the plan does not include this
13294
+ '404':
13295
+ description: Not found
13296
+ /v1/billing/promo/redeem:
13297
+ get:
13298
+ tags: [Billing]
13299
+ summary: "get llm billing status"
13300
+ operationId: get_llm_billing_status
13301
+ responses:
13302
+ '200':
13303
+ description: Success
13304
+ '401':
13305
+ description: Unauthenticated
13306
+ '403':
13307
+ description: Forbidden, or the plan does not include this
13308
+ '404':
13309
+ description: Not found
13310
+ post:
13311
+ tags: [Billing]
13312
+ summary: "redeem promo"
13313
+ operationId: redeem_promo
13314
+ requestBody:
13315
+ required: true
13316
+ content:
13317
+ application/json:
13318
+ schema:
13319
+ type: object
13320
+ required:
13321
+ - code
13322
+ properties:
13323
+ code:
13324
+ type: string
13325
+ responses:
13326
+ '200':
13327
+ description: Success
13328
+ '401':
13329
+ description: Unauthenticated
13330
+ '403':
13331
+ description: Forbidden, or the plan does not include this
13332
+ '404':
13333
+ description: Not found
13334
+ /v1/billing/promo/validate:
13335
+ get:
13336
+ tags: [Billing]
13337
+ summary: "validate promo"
13338
+ operationId: validate_promo
13339
+ responses:
13340
+ '200':
13341
+ description: Success
13342
+ '401':
13343
+ description: Unauthenticated
13344
+ '403':
13345
+ description: Forbidden, or the plan does not include this
13346
+ '404':
13347
+ description: Not found
13348
+ /v1/chains/rpc:
13349
+ post:
13350
+ tags: [Chains]
13351
+ 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"
13352
+ operationId: chain_rpc_proxy
13353
+ requestBody:
13354
+ required: true
13355
+ content:
13356
+ application/json:
13357
+ schema:
13358
+ type: object
13359
+ required:
13360
+ - chain_id
13361
+ - method
13362
+ - params
13363
+ properties:
13364
+ chain_id:
13365
+ type: integer
13366
+ method:
13367
+ type: string
13368
+ params:
13369
+ type: array
13370
+ items:
13371
+ type: object
13372
+ additionalProperties: true
13373
+ responses:
13374
+ '200':
13375
+ description: Success
13376
+ '401':
13377
+ description: Unauthenticated
13378
+ '403':
13379
+ description: Forbidden, or the plan does not include this
13380
+ '404':
13381
+ description: Not found
13382
+ /v1/fiat/webhooks:
13383
+ post:
13384
+ tags: [Fiat]
13385
+ summary: "Receive completion events from fiat partners (MoonPay signed body or generic JSON)."
13386
+ operationId: fiat_webhook
13387
+ responses:
13388
+ '200':
13389
+ description: Success
13390
+ '401':
13391
+ description: Unauthenticated
13392
+ '403':
13393
+ description: Forbidden, or the plan does not include this
13394
+ '404':
13395
+ description: Not found
13396
+ /v1/memory/shared-namespaces:
13397
+ get:
13398
+ tags: [Memory]
13399
+ summary: "list shared namespaces"
13400
+ operationId: list_shared_namespaces
13401
+ responses:
13402
+ '200':
13403
+ description: Success
13404
+ '401':
13405
+ description: Unauthenticated
13406
+ '403':
13407
+ description: Forbidden, or the plan does not include this
13408
+ '404':
13409
+ description: Not found
13410
+ post:
13411
+ tags: [Memory]
13412
+ summary: "create shared namespace"
13413
+ operationId: create_shared_namespace
13414
+ requestBody:
13415
+ required: true
13416
+ content:
13417
+ application/json:
13418
+ schema:
13419
+ type: object
13420
+ required:
13421
+ - namespace
13422
+ - agent_ids
13423
+ properties:
13424
+ namespace:
13425
+ type: string
13426
+ agent_ids:
13427
+ type: array
13428
+ items:
13429
+ type: string
13430
+ format: uuid
13431
+ responses:
13432
+ '200':
13433
+ description: Success
13434
+ '401':
13435
+ description: Unauthenticated
13436
+ '403':
13437
+ description: Forbidden, or the plan does not include this
13438
+ '404':
13439
+ description: Not found
13440
+ /v1/memory/shared-namespaces/{id}:
13441
+ parameters:
13442
+ - name: id
13443
+ in: path
13444
+ required: true
13445
+ schema:
13446
+ type: string
13447
+ delete:
13448
+ tags: [Memory]
13449
+ summary: "delete shared namespace"
13450
+ operationId: delete_shared_namespace
13451
+ responses:
13452
+ '200':
13453
+ description: Success
13454
+ '401':
13455
+ description: Unauthenticated
13456
+ '403':
13457
+ description: Forbidden, or the plan does not include this
13458
+ '404':
13459
+ description: Not found
13460
+ patch:
13461
+ tags: [Memory]
13462
+ summary: "update shared namespace"
13463
+ operationId: update_shared_namespace
13464
+ requestBody:
13465
+ required: true
13466
+ content:
13467
+ application/json:
13468
+ schema:
13469
+ type: object
13470
+ required:
13471
+ - agent_ids
13472
+ properties:
13473
+ agent_ids:
13474
+ type: array
13475
+ items:
13476
+ type: string
13477
+ format: uuid
13478
+ responses:
13479
+ '200':
13480
+ description: Success
13481
+ '401':
13482
+ description: Unauthenticated
13483
+ '403':
13484
+ description: Forbidden, or the plan does not include this
13485
+ '404':
13486
+ description: Not found
13487
+ /v1/onboarding/journey:
13488
+ post:
13489
+ tags: [Onboarding]
13490
+ 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 "
13491
+ operationId: record_journey
13492
+ requestBody:
13493
+ required: true
13494
+ content:
13495
+ application/json:
13496
+ schema:
13497
+ type: object
13498
+ required:
13499
+ - journey
13500
+ properties:
13501
+ journey:
13502
+ type: string
13503
+ step:
13504
+ type: string
13505
+ responses:
13506
+ '200':
13507
+ description: Success
13508
+ '401':
13509
+ description: Unauthenticated
13510
+ '403':
13511
+ description: Forbidden, or the plan does not include this
13512
+ '404':
13513
+ description: Not found
13514
+ /v1/org/env-vars/{id}/delete:
13515
+ parameters:
13516
+ - name: id
13517
+ in: path
13518
+ required: true
13519
+ schema:
13520
+ type: string
13521
+ post:
13522
+ tags: [Org]
13523
+ summary: "delete org env var"
13524
+ operationId: delete_org_env_var
13525
+ responses:
13526
+ '200':
13527
+ description: Success
13528
+ '401':
13529
+ description: Unauthenticated
13530
+ '403':
13531
+ description: Forbidden, or the plan does not include this
13532
+ '404':
13533
+ description: Not found
13534
+ /v1/org/kek-custody:
13535
+ get:
13536
+ tags: [Org]
13537
+ summary: "Get current custody mode and share metadata"
13538
+ operationId: get_custody
13539
+ responses:
13540
+ '200':
13541
+ description: Success
13542
+ '401':
13543
+ description: Unauthenticated
13544
+ '403':
13545
+ description: Forbidden, or the plan does not include this
13546
+ '404':
13547
+ description: Not found
13548
+ post:
13549
+ tags: [Org]
13550
+ summary: "Setup Shamir key custody"
13551
+ operationId: setup_custody
13552
+ requestBody:
13553
+ required: true
13554
+ content:
13555
+ application/json:
13556
+ schema:
13557
+ type: object
13558
+ required:
13559
+ - custody_mode
13560
+ properties:
13561
+ custody_mode:
13562
+ type: string
13563
+ responses:
13564
+ '200':
13565
+ description: Success
13566
+ '401':
13567
+ description: Unauthenticated
13568
+ '403':
13569
+ description: Forbidden, or the plan does not include this
13570
+ '404':
13571
+ description: Not found
13572
+ /v1/org/kek-custody/reconstruct:
13573
+ get:
13574
+ tags: [Org]
13575
+ summary: "list org env vars"
13576
+ operationId: list_org_env_vars
13577
+ responses:
13578
+ '200':
13579
+ description: Success
13580
+ '401':
13581
+ description: Unauthenticated
13582
+ '403':
13583
+ description: Forbidden, or the plan does not include this
13584
+ '404':
13585
+ description: Not found
13586
+ post:
13587
+ tags: [Org]
13588
+ summary: "TEE-bound reconstruction request"
13589
+ operationId: reconstruct
13590
+ requestBody:
13591
+ required: true
13592
+ content:
13593
+ application/json:
13594
+ schema:
13595
+ type: object
13596
+ required:
13597
+ - approval_id
13598
+ - action
13599
+ properties:
13600
+ approval_id:
13601
+ type: object
13602
+ client_share:
13603
+ type: string
13604
+ action:
13605
+ type: object
13606
+ additionalProperties: true
13607
+ responses:
13608
+ '200':
13609
+ description: Success
13610
+ '401':
13611
+ description: Unauthenticated
13612
+ '403':
13613
+ description: Forbidden, or the plan does not include this
13614
+ '404':
13615
+ description: Not found
13616
+ /v1/org/settings:
13617
+ get:
13618
+ tags: [Org]
13619
+ summary: "list org settings"
13620
+ operationId: list_org_settings
13621
+ responses:
13622
+ '200':
13623
+ description: Success
13624
+ '401':
13625
+ description: Unauthenticated
13626
+ '403':
13627
+ description: Forbidden, or the plan does not include this
13628
+ '404':
13629
+ description: Not found
13630
+ patch:
13631
+ tags: [Org]
13632
+ summary: "update org setting"
13633
+ operationId: update_org_setting
13634
+ requestBody:
13635
+ required: true
13636
+ content:
13637
+ application/json:
13638
+ schema:
13639
+ type: object
13640
+ required:
13641
+ - key
13642
+ - value
13643
+ properties:
13644
+ key:
13645
+ type: string
13646
+ value:
13647
+ type: string
13648
+ approval_id:
13649
+ type: string
13650
+ format: uuid
13651
+ responses:
13652
+ '200':
13653
+ description: Success
13654
+ '401':
13655
+ description: Unauthenticated
13656
+ '403':
13657
+ description: Forbidden, or the plan does not include this
13658
+ '404':
13659
+ description: Not found
13660
+ /v1/platform/apps/by-slug/{slug}/branding:
13661
+ parameters:
13662
+ - name: slug
13663
+ in: path
13664
+ required: true
13665
+ schema:
13666
+ type: string
13667
+ get:
13668
+ tags: [Platform]
13669
+ summary: "Public, returns app name + logo."
13670
+ operationId: app_branding
13671
+ security: []
13672
+ responses:
13673
+ '200':
13674
+ description: Success
13675
+ '404':
13676
+ description: Not found
13677
+ /v1/platform/apps/{app_id}/automations:
13678
+ parameters:
13679
+ - name: app_id
13680
+ in: path
13681
+ required: true
13682
+ schema:
13683
+ type: string
13684
+ get:
13685
+ tags: [Platform]
13686
+ summary: "list platform automations"
13687
+ operationId: list_platform_automations
13688
+ responses:
13689
+ '200':
13690
+ description: Success
13691
+ '401':
13692
+ description: Unauthenticated
13693
+ '403':
13694
+ description: Forbidden, or the plan does not include this
13695
+ '404':
13696
+ description: Not found
13697
+ post:
13698
+ tags: [Platform]
13699
+ summary: "upsert user"
13700
+ operationId: upsert_user
13701
+ requestBody:
13702
+ required: true
13703
+ content:
13704
+ application/json:
13705
+ schema:
13706
+ type: object
13707
+ properties:
13708
+ subject_token:
13709
+ type: string
13710
+ subject_token_type:
13711
+ type: string
13712
+ email:
13713
+ type: string
13714
+ display_name:
13715
+ type: string
13716
+ siwe_message:
13717
+ type: string
13718
+ siwe_signature:
13719
+ type: string
13720
+ return_to:
13721
+ type: string
13722
+ create_sub_org:
13723
+ type: boolean
13724
+ app_id:
13725
+ type: object
13726
+ responses:
13727
+ '200':
13728
+ description: Success
13729
+ '401':
13730
+ description: Unauthenticated
13731
+ '403':
13732
+ description: Forbidden, or the plan does not include this
13733
+ '404':
13734
+ description: Not found
13735
+ /v1/platform/connected-apps/{connection_id}/unlock-resources:
13736
+ parameters:
13737
+ - name: connection_id
13738
+ in: path
13739
+ required: true
13740
+ schema:
13741
+ type: string
13742
+ post:
13743
+ tags: [Platform]
13744
+ summary: "Unlocks platform-locked resources for a disconnected (or active) connection the user owns."
13745
+ operationId: unlock_connection_resources
13746
+ responses:
13747
+ '200':
13748
+ description: Success
13749
+ '401':
13750
+ description: Unauthenticated
13751
+ '403':
13752
+ description: Forbidden, or the plan does not include this
13753
+ '404':
13754
+ description: Not found
13755
+ /v1/platform/connections/{connection_id}/memory:
13756
+ parameters:
13757
+ - name: connection_id
13758
+ in: path
13759
+ required: true
13760
+ schema:
13761
+ type: string
13762
+ get:
13763
+ tags: [Platform]
13764
+ summary: "list connection memory namespaces"
13765
+ operationId: list_connection_memory_namespaces
13766
+ responses:
13767
+ '200':
13768
+ description: Success
13769
+ '401':
13770
+ description: Unauthenticated
13771
+ '403':
13772
+ description: Forbidden, or the plan does not include this
13773
+ '404':
13774
+ description: Not found
13775
+ /v1/platform/connections/{connection_id}/memory/{namespace}:
13776
+ parameters:
13777
+ - name: connection_id
13778
+ in: path
13779
+ required: true
13780
+ schema:
13781
+ type: string
13782
+ - name: namespace
13783
+ in: path
13784
+ required: true
13785
+ schema:
13786
+ type: string
13787
+ get:
13788
+ tags: [Platform]
13789
+ summary: "list connection memory entries"
13790
+ operationId: list_connection_memory_entries
13791
+ responses:
13792
+ '200':
13793
+ description: Success
13794
+ '401':
13795
+ description: Unauthenticated
13796
+ '403':
13797
+ description: Forbidden, or the plan does not include this
13798
+ '404':
13799
+ description: Not found
13800
+ /v1/platform/connections/{connection_id}/resources:
13801
+ parameters:
13802
+ - name: connection_id
13803
+ in: path
13804
+ required: true
13805
+ schema:
13806
+ type: string
13807
+ get:
13808
+ tags: [Platform]
13809
+ summary: "list connection resources"
13810
+ operationId: list_connection_resources
13811
+ responses:
13812
+ '200':
13813
+ description: Success
13814
+ '401':
13815
+ description: Unauthenticated
13816
+ '403':
13817
+ description: Forbidden, or the plan does not include this
13818
+ '404':
13819
+ description: Not found
13820
+ post:
13821
+ tags: [Platform]
13822
+ summary: "create app policy"
13823
+ operationId: create_app_policy
13824
+ requestBody:
13825
+ required: true
13826
+ content:
13827
+ application/json:
13828
+ schema:
13829
+ type: object
13830
+ properties:
13831
+ user_id:
13832
+ type: object
13833
+ to_allowlist:
13834
+ type: array
13835
+ items:
13836
+ type: string
13837
+ to_denylist:
13838
+ type: array
13839
+ items:
13840
+ type: string
13841
+ max_value_per_tx_eth:
13842
+ type: string
13843
+ daily_limit_eth:
13844
+ type: string
13845
+ allowed_chains:
13846
+ type: array
13847
+ items:
13848
+ type: string
13849
+ allowed_tokens:
13850
+ type: array
13851
+ items:
13852
+ type: string
13853
+ max_transactions_per_day:
13854
+ type: integer
13855
+ human_factor_auth:
13856
+ type: object
13857
+ additionalProperties: true
13858
+ responses:
13859
+ '200':
13860
+ description: Success
13861
+ '401':
13862
+ description: Unauthenticated
13863
+ '403':
13864
+ description: Forbidden, or the plan does not include this
13865
+ '404':
13866
+ description: Not found
13867
+ /v1/platform/link-account:
13868
+ post:
13869
+ tags: [Platform]
13870
+ summary: "Authenticated user links their account to a platform app. Used by the dashboard `/connect/{slug}/link` consent flow for cross-org users."
13871
+ operationId: link_account
13872
+ requestBody:
13873
+ required: true
13874
+ content:
13875
+ application/json:
13876
+ schema:
13877
+ type: object
13878
+ required:
13879
+ - client_id
13880
+ properties:
13881
+ client_id:
13882
+ type: string
13883
+ responses:
13884
+ '200':
13885
+ description: Success
13886
+ '401':
13887
+ description: Unauthenticated
13888
+ '403':
13889
+ description: Forbidden, or the plan does not include this
13890
+ '404':
13891
+ description: Not found
13892
+ /v1/platform/orphaned-resources:
13893
+ get:
13894
+ tags: [Platform]
13895
+ summary: "platform-locked agents/vaults with no active connection."
13896
+ operationId: list_orphaned_platform_resources
13897
+ responses:
13898
+ '200':
13899
+ description: Success
13900
+ '401':
13901
+ description: Unauthenticated
13902
+ '403':
13903
+ description: Forbidden, or the plan does not include this
13904
+ '404':
13905
+ description: Not found
13906
+ /v1/reports/request:
13907
+ post:
13908
+ tags: [Reports]
13909
+ summary: "Public (no auth). Submits lead info, sends email with download link."
13910
+ operationId: request_report
13911
+ security: []
13912
+ requestBody:
13913
+ required: true
13914
+ content:
13915
+ application/json:
13916
+ schema:
13917
+ type: object
13918
+ required:
13919
+ - first_name
13920
+ - last_name
13921
+ - email
13922
+ - company
13923
+ properties:
13924
+ first_name:
13925
+ type: string
13926
+ last_name:
13927
+ type: string
13928
+ email:
13929
+ type: string
13930
+ company:
13931
+ type: string
13932
+ job_title:
13933
+ type: string
13934
+ report_slug:
13935
+ type: string
13936
+ marketing_consent:
13937
+ type: boolean
13938
+ responses:
13939
+ '200':
13940
+ description: Success
13941
+ '404':
13942
+ description: Not found
13943
+ /v1/runtimes/{runtime_id}/chat/conversations:
13944
+ parameters:
13945
+ - name: runtime_id
13946
+ in: path
13947
+ required: true
13948
+ schema:
13949
+ type: string
13950
+ get:
13951
+ tags: [Runtimes]
13952
+ summary: "list runtime chat conversations"
13953
+ operationId: list_runtime_chat_conversations
13954
+ responses:
13955
+ '200':
13956
+ description: Success
13957
+ '401':
13958
+ description: Unauthenticated
13959
+ '403':
13960
+ description: Forbidden, or the plan does not include this
13961
+ '404':
13962
+ description: Not found
13963
+ /v1/runtimes/{runtime_id}/chat/conversations/{conversation_id}:
13964
+ parameters:
13965
+ - name: runtime_id
13966
+ in: path
13967
+ required: true
13968
+ schema:
13969
+ type: string
13970
+ - name: conversation_id
13971
+ in: path
13972
+ required: true
13973
+ schema:
13974
+ type: string
13975
+ delete:
13976
+ tags: [Runtimes]
13977
+ summary: "Archives a runtime chat session so the next message starts a fresh conversation."
13978
+ operationId: archive_runtime_chat_conversation
13979
+ responses:
13980
+ '200':
13981
+ description: Success
13982
+ '401':
13983
+ description: Unauthenticated
13984
+ '403':
13985
+ description: Forbidden, or the plan does not include this
13986
+ '404':
13987
+ description: Not found
13988
+ get:
13989
+ tags: [Runtimes]
13990
+ summary: "get runtime chat conversation"
13991
+ operationId: get_runtime_chat_conversation
13992
+ responses:
13993
+ '200':
13994
+ description: Success
13995
+ '401':
13996
+ description: Unauthenticated
13997
+ '403':
13998
+ description: Forbidden, or the plan does not include this
13999
+ '404':
14000
+ description: Not found
14001
+ /v1/runtimes/{runtime_id}/chat/diagnostics:
14002
+ parameters:
14003
+ - name: runtime_id
14004
+ in: path
14005
+ required: true
14006
+ schema:
14007
+ type: string
14008
+ get:
14009
+ tags: [Runtimes]
14010
+ 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."
14011
+ operationId: runtime_chat_diagnostics
14012
+ responses:
14013
+ '200':
14014
+ description: Success
14015
+ '401':
14016
+ description: Unauthenticated
14017
+ '403':
14018
+ description: Forbidden, or the plan does not include this
14019
+ '404':
14020
+ description: Not found
14021
+ /v1/runtimes/{runtime_id}/chat/unlock:
14022
+ parameters:
14023
+ - name: runtime_id
14024
+ in: path
14025
+ required: true
14026
+ schema:
14027
+ type: string
14028
+ post:
14029
+ tags: [Runtimes]
14030
+ summary: "Step-up (password or passkey reauth token, purpose=`runtime_chat`) unlocks dashboard runtime chat for 15 minutes — same trust bar as Shell/Logs."
14031
+ operationId: unlock_runtime_chat
14032
+ responses:
14033
+ '200':
14034
+ description: Success
14035
+ '401':
14036
+ description: Unauthenticated
14037
+ '403':
14038
+ description: Forbidden, or the plan does not include this
14039
+ '404':
14040
+ description: Not found
14041
+ /v1/runtimes/{runtime_id}/logs/stream:
14042
+ parameters:
14043
+ - name: runtime_id
14044
+ in: path
14045
+ required: true
14046
+ schema:
14047
+ type: string
14048
+ get:
14049
+ tags: [Runtimes]
14050
+ summary: "SSE live log streaming"
14051
+ operationId: stream_runtime_logs
14052
+ responses:
14053
+ '200':
14054
+ description: Success
14055
+ '401':
14056
+ description: Unauthenticated
14057
+ '403':
14058
+ description: Forbidden, or the plan does not include this
14059
+ '404':
14060
+ description: Not found
14061
+ /v1/runtimes/{runtime_id}/logs/unlock:
14062
+ parameters:
14063
+ - name: runtime_id
14064
+ in: path
14065
+ required: true
14066
+ schema:
14067
+ type: string
14068
+ post:
14069
+ tags: [Runtimes]
14070
+ summary: "Step-up (password or passkey reauth token) unlocks log fetch/stream for 15 minutes."
14071
+ operationId: unlock_runtime_logs
14072
+ responses:
14073
+ '200':
14074
+ description: Success
14075
+ '401':
14076
+ description: Unauthenticated
14077
+ '403':
14078
+ description: Forbidden, or the plan does not include this
14079
+ '404':
14080
+ description: Not found
14081
+ /v1/runtimes/{runtime_id}/rebuild:
14082
+ parameters:
14083
+ - name: runtime_id
14084
+ in: path
14085
+ required: true
14086
+ schema:
14087
+ type: string
14088
+ post:
14089
+ tags: [Runtimes]
14090
+ 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"
14091
+ operationId: rebuild_runtime
14092
+ responses:
14093
+ '200':
14094
+ description: Success
14095
+ '401':
14096
+ description: Unauthenticated
14097
+ '403':
14098
+ description: Forbidden, or the plan does not include this
14099
+ '404':
14100
+ description: Not found
14101
+ /v1/runtimes/{runtime_id}/restart:
14102
+ parameters:
14103
+ - name: runtime_id
14104
+ in: path
14105
+ required: true
14106
+ schema:
14107
+ type: string
14108
+ post:
14109
+ tags: [Runtimes]
14110
+ summary: "Force stop (best-effort) then start. Recovers stale `running` rows and proxy timeouts where the client never received the start response."
14111
+ operationId: restart_runtime
14112
+ responses:
14113
+ '200':
14114
+ description: Success
14115
+ '401':
14116
+ description: Unauthenticated
14117
+ '403':
14118
+ description: Forbidden, or the plan does not include this
14119
+ '404':
14120
+ description: Not found
14121
+ /v1/vaults/{vault_id}/secret-version-disable/{*path_and_version}:
14122
+ parameters:
14123
+ - name: vault_id
14124
+ in: path
14125
+ required: true
14126
+ schema:
14127
+ type: string
14128
+ post:
14129
+ tags: [Vaults]
14130
+ summary: "Disable a specific version so it can no longer be read (but is retained for audit)."
14131
+ operationId: disable_version
14132
+ responses:
14133
+ '200':
14134
+ description: Success
14135
+ '401':
14136
+ description: Unauthenticated
14137
+ '403':
14138
+ description: Forbidden, or the plan does not include this
14139
+ '404':
14140
+ description: Not found
14141
+ /v1/vaults/{vault_id}/secret-version/{*path_and_version}:
14142
+ parameters:
14143
+ - name: vault_id
14144
+ in: path
14145
+ required: true
14146
+ schema:
14147
+ type: string
14148
+ get:
14149
+ tags: [Vaults]
14150
+ summary: "get secret version"
14151
+ operationId: get_secret_version
14152
+ responses:
14153
+ '200':
14154
+ description: Success
14155
+ '401':
14156
+ description: Unauthenticated
14157
+ '403':
14158
+ description: Forbidden, or the plan does not include this
14159
+ '404':
14160
+ description: Not found
14161
+ /v1/vaults/{vault_id}/unlock-platform:
14162
+ parameters:
14163
+ - name: vault_id
14164
+ in: path
14165
+ required: true
14166
+ schema:
14167
+ type: string
14168
+ post:
14169
+ tags: [Vaults]
14170
+ summary: "unlock vault platform"
14171
+ operationId: unlock_vault_platform
14172
+ responses:
14173
+ '200':
14174
+ description: Success
14175
+ '401':
14176
+ description: Unauthenticated
14177
+ '403':
14178
+ description: Forbidden, or the plan does not include this
14179
+ '404':
14180
+ description: Not found
14181
+ /v1/webinars/register:
14182
+ post:
14183
+ tags: [Webinars]
14184
+ summary: "Public (no auth). Registers for a webinar, sends confirmation + calendar invite."
14185
+ operationId: register_webinar
14186
+ security: []
14187
+ requestBody:
14188
+ required: true
14189
+ content:
14190
+ application/json:
14191
+ schema:
14192
+ type: object
14193
+ required:
14194
+ - first_name
14195
+ - last_name
14196
+ - email
14197
+ - company
14198
+ properties:
14199
+ first_name:
14200
+ type: string
14201
+ last_name:
14202
+ type: string
14203
+ email:
14204
+ type: string
14205
+ company:
14206
+ type: string
14207
+ job_title:
14208
+ type: string
14209
+ webinar_slug:
14210
+ type: string
14211
+ marketing_consent:
14212
+ type: boolean
14213
+ responses:
14214
+ '200':
14215
+ description: Success
14216
+ '404':
14217
+ description: Not found
14218
+
14219
+ /v1/runtimes/templates:
14220
+ get:
14221
+ tags: [Runtimes]
14222
+ summary: "The provisionable runtime templates, with licence and whether the agent needs its own vendor account"
14223
+ operationId: list_runtime_templates
14224
+ responses:
14225
+ '200':
14226
+ description: The template catalogue
12563
14227
  content:
12564
14228
  application/json:
12565
14229
  schema:
12566
- $ref: "#/components/schemas/ShamirKekStatusResponse"
12567
- "401":
12568
- $ref: "#/components/responses/Unauthorized"
12569
-
12570
- /v1/org/shamir-kek/reconstruct:
14230
+ type: object
14231
+ properties:
14232
+ templates:
14233
+ type: array
14234
+ items:
14235
+ type: object
14236
+ properties:
14237
+ id:
14238
+ type: string
14239
+ description:
14240
+ type: string
14241
+ chat_capable:
14242
+ type: boolean
14243
+ license:
14244
+ type: string
14245
+ nullable: true
14246
+ description: SPDX id, or null when the agent is proprietary
14247
+ requires_vendor_subscription:
14248
+ type: boolean
14249
+ 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.
14250
+ vendor_credential_env:
14251
+ type: string
14252
+ nullable: true
14253
+ '401':
14254
+ description: Unauthenticated
14255
+ /v1/automations/step-types:
14256
+ get:
14257
+ tags: [Automations]
14258
+ summary: "The automation step vocabulary an automation may use"
14259
+ operationId: list_automation_step_types
14260
+ responses:
14261
+ '200':
14262
+ description: Supported step types
14263
+ '401':
14264
+ description: Unauthenticated
14265
+ /v1/platform/apps/{app_id}/runtimes:
14266
+ parameters:
14267
+ - name: app_id
14268
+ in: path
14269
+ required: true
14270
+ schema:
14271
+ type: string
14272
+ format: uuid
14273
+ get:
14274
+ tags: [Platform]
14275
+ summary: "Runtimes belonging to a platform app"
14276
+ operationId: list_platform_runtimes
14277
+ responses:
14278
+ '200':
14279
+ description: Success
14280
+ '401':
14281
+ description: Unauthenticated
14282
+ '403':
14283
+ description: Forbidden
14284
+ /v1/browser/devices:
12571
14285
  post:
12572
- tags: [Shamir KEK]
12573
- summary: Reconstruct KEK from shares
12574
- description: |
12575
- Submit Shamir shares to reconstruct the org KEK. Requires at least
12576
- `threshold` valid shares. Used during disaster recovery.
12577
- operationId: reconstructShamirKek
12578
- security:
12579
- - BearerAuth: []
14286
+ tags: [Browser Bridge]
14287
+ 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."
14288
+ operationId: pair_browser_device
12580
14289
  requestBody:
12581
14290
  required: true
12582
14291
  content:
12583
14292
  application/json:
12584
14293
  schema:
12585
- $ref: "#/components/schemas/ShamirKekReconstructRequest"
14294
+ type: object
14295
+ required: [label, public_key_pin]
14296
+ properties:
14297
+ label:
14298
+ type: string
14299
+ description: Name for this device. Re-pairing an existing label must present the same key.
14300
+ public_key_pin:
14301
+ type: string
14302
+ description: The bridge's public key, pinned on first use for this label.
14303
+ bridge_version:
14304
+ type: string
14305
+ platform:
14306
+ type: string
12586
14307
  responses:
12587
- "200":
12588
- description: Reconstruction result
14308
+ '201':
14309
+ description: "Paired. The credential is returned once and there is no endpoint that returns it again."
12589
14310
  content:
12590
14311
  application/json:
12591
14312
  schema:
12592
- $ref: "#/components/schemas/ShamirKekReconstructResponse"
12593
- "400":
12594
- $ref: "#/components/responses/BadRequest"
12595
- "401":
12596
- $ref: "#/components/responses/Unauthorized"
12597
- "403":
12598
- $ref: "#/components/responses/Forbidden"
12599
-
12600
- /v1/org/shamir-kek/recovery-codes:
14313
+ type: object
14314
+ properties:
14315
+ device_id:
14316
+ type: string
14317
+ format: uuid
14318
+ label:
14319
+ type: string
14320
+ credential:
14321
+ type: string
14322
+ description: The bb_ bridge credential. Shown once.
14323
+ '401':
14324
+ description: Unauthenticated, or step-up re-auth not satisfied
14325
+ '403':
14326
+ description: Not a human caller — agents and platform keys cannot pair a device
14327
+ '409':
14328
+ description: That label is already pinned to a different key
12601
14329
  get:
12602
- tags: [Shamir KEK]
12603
- summary: Get Shamir recovery codes (one-time)
12604
- description: |
12605
- Returns the one-time recovery codes for the Shamir KEK. These codes
12606
- can be used as an emergency fallback if custodian shares are lost.
12607
- Codes are only returned once — subsequent calls return 410.
12608
- operationId: getShamirKekRecoveryCodes
12609
- security:
12610
- - BearerAuth: []
14330
+ tags: [Browser Bridge]
14331
+ 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."
14332
+ operationId: list_browser_devices
12611
14333
  responses:
12612
- "200":
12613
- description: Recovery codes (one-time)
14334
+ '200':
14335
+ description: The paired devices. No credential material is returned — the row holds an Argon2 hash and a prefix, and neither is exposed.
12614
14336
  content:
12615
14337
  application/json:
12616
14338
  schema:
12617
- $ref: "#/components/schemas/ShamirKekRecoveryCodesResponse"
12618
- "401":
12619
- $ref: "#/components/responses/Unauthorized"
12620
- "403":
12621
- $ref: "#/components/responses/Forbidden"
12622
- "410":
12623
- description: Codes already retrieved
12624
-
12625
- /v1/org/shamir-kek/verify-recovery-code:
14339
+ type: object
14340
+ properties:
14341
+ devices:
14342
+ type: array
14343
+ items:
14344
+ type: object
14345
+ properties:
14346
+ id:
14347
+ type: string
14348
+ format: uuid
14349
+ label:
14350
+ type: string
14351
+ platform:
14352
+ type: string
14353
+ nullable: true
14354
+ bridge_version:
14355
+ type: string
14356
+ nullable: true
14357
+ last_seen_at:
14358
+ type: string
14359
+ format: date-time
14360
+ nullable: true
14361
+ revoked_at:
14362
+ type: string
14363
+ format: date-time
14364
+ nullable: true
14365
+ description: Set once revoked. A revoked credential stops resolving.
14366
+ created_at:
14367
+ type: string
14368
+ format: date-time
14369
+ '401':
14370
+ description: Unauthenticated
14371
+ /v1/browser/devices/{id}:
14372
+ delete:
14373
+ tags: [Browser Bridge]
14374
+ summary: "Revoke a paired bridge. This is what makes a leaked bb_ credential stop working."
14375
+ operationId: revoke_browser_device
14376
+ parameters:
14377
+ - name: id
14378
+ in: path
14379
+ required: true
14380
+ schema:
14381
+ type: string
14382
+ format: uuid
14383
+ responses:
14384
+ '204':
14385
+ description: Revoked. Subsequent use of that credential resolves to nothing.
14386
+ '401':
14387
+ description: Unauthenticated
14388
+ '404':
14389
+ description: No such device in this organization
14390
+ /v1/browser/credentials:
12626
14391
  post:
12627
- tags: [Shamir KEK]
12628
- summary: Verify a Shamir recovery code
12629
- description: Check whether a recovery code is valid without consuming it.
12630
- operationId: verifyShamirKekRecoveryCode
12631
- security:
12632
- - BearerAuth: []
14392
+ tags: [Browser Bridge]
14393
+ 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."
14394
+ operationId: create_browser_credential
12633
14395
  requestBody:
12634
14396
  required: true
12635
14397
  content:
12636
14398
  application/json:
12637
14399
  schema:
12638
- $ref: "#/components/schemas/ShamirKekVerifyCodeRequest"
14400
+ type: object
14401
+ required: [label, vault_id, secret_path, login_url, allowed_hosts]
14402
+ properties:
14403
+ label:
14404
+ type: string
14405
+ vault_id:
14406
+ type: string
14407
+ format: uuid
14408
+ description: Must belong to the caller's org.
14409
+ secret_path:
14410
+ type: string
14411
+ description: Path of the secret inside that vault. The value never lands in the binding.
14412
+ login_url:
14413
+ type: string
14414
+ 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."
14415
+ allowed_hosts:
14416
+ type: array
14417
+ minItems: 1
14418
+ items:
14419
+ type: string
14420
+ 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."
14421
+ sso_hosts:
14422
+ type: array
14423
+ items:
14424
+ type: string
14425
+ description: Identity-provider hosts the login legitimately bounces through.
14426
+ responses:
14427
+ '201':
14428
+ description: Created. Every field is a pointer or a policy; none is secret.
14429
+ '400':
14430
+ description: A host is not a bare hostname, allowed_hosts is empty, or login_url is http or outside the allowlist
14431
+ '403':
14432
+ description: Not a human caller, step-up not satisfied, or the vault belongs to another org
14433
+ '404':
14434
+ description: Vault not found
14435
+ get:
14436
+ tags: [Browser Bridge]
14437
+ summary: List this org's browser credential bindings
14438
+ operationId: list_browser_credentials
14439
+ responses:
14440
+ '200':
14441
+ description: The bindings
14442
+ /v1/browser/credentials/{id}:
14443
+ parameters:
14444
+ - name: id
14445
+ in: path
14446
+ required: true
14447
+ schema:
14448
+ type: string
14449
+ format: uuid
14450
+ delete:
14451
+ tags: [Browser Bridge]
14452
+ summary: Remove a browser credential binding
14453
+ operationId: delete_browser_credential
12639
14454
  responses:
12640
- "200":
12641
- description: Verification result
14455
+ '204':
14456
+ description: Deleted
14457
+ '403':
14458
+ description: Not a human caller
14459
+ '404':
14460
+ description: Binding not found
14461
+ /v1/agents/{id}/browser/sessions:
14462
+ parameters:
14463
+ - name: id
14464
+ in: path
14465
+ required: true
14466
+ schema:
14467
+ type: string
14468
+ format: uuid
14469
+ post:
14470
+ tags: [Browser Bridge]
14471
+ 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."
14472
+ operationId: create_browser_session
14473
+ parameters:
14474
+ - name: x-1claw-bridge-credential
14475
+ in: header
14476
+ required: true
14477
+ schema:
14478
+ type: string
14479
+ description: The bb_ credential from `1claw browser-bridge login`
14480
+ - name: x-1claw-bridge-version
14481
+ in: header
14482
+ required: true
14483
+ schema:
14484
+ type: string
14485
+ description: Bridge build. Versions below the server minimum are refused.
14486
+ requestBody:
14487
+ required: true
14488
+ content:
14489
+ application/json:
14490
+ schema:
14491
+ type: object
14492
+ required: [agent_id, client_id]
14493
+ properties:
14494
+ agent_id:
14495
+ type: string
14496
+ format: uuid
14497
+ description: Must belong to the same org as the paired device.
14498
+ client_id:
14499
+ type: string
14500
+ bridge_version:
14501
+ type: string
14502
+ protocol_version:
14503
+ type: string
14504
+ responses:
14505
+ '200':
14506
+ description: Session created
12642
14507
  content:
12643
14508
  application/json:
12644
14509
  schema:
12645
- $ref: "#/components/schemas/ShamirKekVerifyCodeResponse"
12646
- "400":
12647
- $ref: "#/components/responses/BadRequest"
12648
- "401":
12649
- $ref: "#/components/responses/Unauthorized"
12650
-
12651
- # =============================================================================
12652
- # COMPONENTS
12653
- # =============================================================================
14510
+ type: object
14511
+ properties:
14512
+ session_id:
14513
+ type: string
14514
+ format: uuid
14515
+ session_token:
14516
+ type: string
14517
+ description: bs_ prefixed. Only its hash is stored.
14518
+ expires_at:
14519
+ type: string
14520
+ format: date-time
14521
+ '400':
14522
+ description: Missing or unsupported bridge version
14523
+ '401':
14524
+ description: Not a paired bridge, or an agent token was presented
14525
+ '403':
14526
+ description: The device and the agent are not in the same org
14527
+ /v1/agents/{id}/browser/fills:
14528
+ parameters:
14529
+ - name: id
14530
+ in: path
14531
+ required: true
14532
+ schema:
14533
+ type: string
14534
+ format: uuid
14535
+ post:
14536
+ tags: [Browser Bridge]
14537
+ summary: "Authorise one credential fill. Requires the bridge credential *and* an agent JWT — neither alone is sufficient."
14538
+ operationId: authorize_browser_fill
14539
+ parameters:
14540
+ - name: x-1claw-bridge-credential
14541
+ in: header
14542
+ required: true
14543
+ schema:
14544
+ type: string
14545
+ - name: x-1claw-bridge-version
14546
+ in: header
14547
+ required: true
14548
+ schema:
14549
+ type: string
14550
+ requestBody:
14551
+ required: true
14552
+ content:
14553
+ application/json:
14554
+ schema:
14555
+ type: object
14556
+ # form_path, field_names, redirect_chain and current_generation are
14557
+ # required, not optional. They were accepted as absent and defaulted
14558
+ # server-side, which turned three of the policy's checks off: the
14559
+ # redirect loop never ran, current_generation was compared against
14560
+ # itself, and form_path defaulted to "", matching no fingerprint
14561
+ # pattern and denying every binding that carried one.
14562
+ required: [session_id, binding_id, tab_origin, frame_origin, frame_id, generation, form_path, field_names, redirect_chain, current_generation]
14563
+ properties:
14564
+ session_id:
14565
+ type: string
14566
+ format: uuid
14567
+ description: Must match the session the presented bs_ token opened.
14568
+ binding_id:
14569
+ type: string
14570
+ format: uuid
14571
+ frame_id:
14572
+ type: string
14573
+ description: The target the fill is for. Recorded on the grant.
14574
+ generation:
14575
+ type: integer
14576
+ format: int64
14577
+ 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."
14578
+ form_action_origin:
14579
+ type: string
14580
+ 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."
14581
+ form_path:
14582
+ type: string
14583
+ description: Path of the form being filled, checked against the binding's fingerprint.
14584
+ field_names:
14585
+ type: array
14586
+ items:
14587
+ type: string
14588
+ description: "Field names on that form. Every field the fingerprint expects must be present; extra fields are fine, since sites add hidden inputs."
14589
+ redirect_chain:
14590
+ type: array
14591
+ items:
14592
+ type: string
14593
+ description: "Hosts the login has redirected through, in order. Each is checked against the binding's allowed hosts union its sso hosts."
14594
+ current_generation:
14595
+ type: integer
14596
+ format: int64
14597
+ description: The target's generation now. A mismatch with `generation` means the page moved and the fill is denied.
14598
+ tab_origin:
14599
+ type: string
14600
+ description: "Origin of the tab being driven. Checked against the binding's allowed and sso hosts by exact host match."
14601
+ frame_origin:
14602
+ type: string
14603
+ 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."
14604
+ responses:
14605
+ '200':
14606
+ description: A grant, a denial, or a pending approval. Never a secret.
14607
+ content:
14608
+ application/json:
14609
+ schema:
14610
+ type: object
14611
+ properties:
14612
+ kind:
14613
+ type: string
14614
+ enum: [grant]
14615
+ grant_id:
14616
+ type: string
14617
+ format: uuid
14618
+ description: Single-use, short-lived, redeemable only by the session it was issued to.
14619
+ binding_id:
14620
+ type: string
14621
+ format: uuid
14622
+ expires_at:
14623
+ type: string
14624
+ format: date-time
14625
+ login_url:
14626
+ type: string
14627
+ description: "The bridge navigates here itself. An agent-supplied URL would be the agent choosing who receives the password."
14628
+ '400':
14629
+ description: Missing or unsupported bridge version
14630
+ '403':
14631
+ 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"
14632
+ '404':
14633
+ description: No such binding for this org
14634
+
14635
+ /v1/agents/{id}/browser/fills/consume:
14636
+ parameters:
14637
+ - name: id
14638
+ in: path
14639
+ required: true
14640
+ schema:
14641
+ type: string
14642
+ format: uuid
14643
+ post:
14644
+ tags: [Browser Bridge]
14645
+ 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."
14646
+ operationId: consume_browser_fill
14647
+ parameters:
14648
+ - name: x-1claw-bridge-credential
14649
+ in: header
14650
+ required: true
14651
+ schema:
14652
+ type: string
14653
+ - name: x-1claw-bridge-session
14654
+ in: header
14655
+ required: true
14656
+ schema:
14657
+ type: string
14658
+ description: The bs_ session token. Proof the redemption belongs to a session this bridge opened.
14659
+ - name: x-1claw-bridge-version
14660
+ in: header
14661
+ required: true
14662
+ schema:
14663
+ type: string
14664
+ requestBody:
14665
+ required: true
14666
+ content:
14667
+ application/json:
14668
+ schema:
14669
+ type: object
14670
+ required: [session_id, grant_id, generation]
14671
+ properties:
14672
+ session_id:
14673
+ type: string
14674
+ format: uuid
14675
+ grant_id:
14676
+ type: string
14677
+ format: uuid
14678
+ generation:
14679
+ type: integer
14680
+ format: int64
14681
+ description: The bridge's navigation counter now. A mismatch means the page moved after the decision.
14682
+ responses:
14683
+ '200':
14684
+ 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`."
14685
+ headers:
14686
+ x-1claw-binding-id:
14687
+ schema:
14688
+ type: string
14689
+ format: uuid
14690
+ x-1claw-form-fingerprint:
14691
+ schema:
14692
+ type: string
14693
+ format: byte
14694
+ 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."
14695
+ content:
14696
+ application/octet-stream:
14697
+ schema:
14698
+ type: string
14699
+ format: binary
14700
+ '400':
14701
+ description: Missing or unsupported bridge version
14702
+ '403':
14703
+ description: "Grant expired, already used, issued to another session or device; the page navigated after authorisation; or an agent principal was presented"
14704
+ '404':
14705
+ description: The binding or the secret behind it is missing
14706
+
14707
+ /v1/agents/{agent_id}/chat/unlock:
14708
+ parameters:
14709
+ - name: agent_id
14710
+ in: path
14711
+ required: true
14712
+ schema:
14713
+ type: string
14714
+ format: uuid
14715
+ post:
14716
+ tags: [Chat]
14717
+ summary: "Unlock an agent's chat history for reading"
14718
+ operationId: unlock_agent_chat
14719
+ responses:
14720
+ '200':
14721
+ description: Unlocked
14722
+ '401':
14723
+ description: Unauthenticated
14724
+ '403':
14725
+ description: Forbidden
14726
+ '404':
14727
+ description: Agent not found
12654
14728
 
12655
14729
  components:
12656
14730
  securitySchemes:
@@ -13365,6 +15439,9 @@ components:
13365
15439
  properties:
13366
15440
  name:
13367
15441
  type: string
15442
+ minLength: 1
15443
+ maxLength: 255
15444
+ description: Unique within the organization. Trimmed before it is stored, and the trimmed value is what must be unique. Counted in characters, not bytes.
13368
15445
  description:
13369
15446
  type: string
13370
15447
  mpc_custody:
@@ -15424,11 +17501,21 @@ components:
15424
17501
 
15425
17502
  PatchConnectionAgentRequest:
15426
17503
  type: object
17504
+ description: |
17505
+ At least one field is required.
15427
17506
  properties:
15428
17507
  intents_api_enabled:
15429
17508
  type: boolean
15430
17509
  execution_intents_enabled:
15431
17510
  type: boolean
17511
+ memory_enabled:
17512
+ type: boolean
17513
+ description: |
17514
+ Agent memory, off by default. Until this field existed a
17515
+ platform app had no way to turn it on: a bootstrap template
17516
+ accepted `memory_enabled` in its spec and never read it, so
17517
+ the capability was reachable only from the end user's own
17518
+ dashboard. Templates now honour the flag too.
15432
17519
  system_prompt:
15433
17520
  type: string
15434
17521
  nullable: true
@@ -15443,6 +17530,8 @@ components:
15443
17530
  type: boolean
15444
17531
  execution_intents_enabled:
15445
17532
  type: boolean
17533
+ memory_enabled:
17534
+ type: boolean
15446
17535
  system_prompt:
15447
17536
  type: string
15448
17537
  nullable: true