@1claw/openapi-spec 0.59.7 → 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 +3098 -104
  2. package/openapi.yaml +2074 -130
  3. package/package.json +2 -2
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.7"
5
+ version: "0.59.9"
6
6
  description: |
7
7
  Secure secret management for AI agents. Provides vaults, secrets,
8
8
  policy-based access control, agent identity, Intents API,
@@ -10,21 +10,41 @@ info:
10
10
  webhook tokens, event triggers, Assist), cloud runtimes with
11
11
  interactive shell sessions, agent memory, and discovery.
12
12
 
13
+ ## Domains
14
+
15
+ `api.1claw.co` is canonical: it is the OIDC issuer, the `aud` the API
16
+ mints, and the first entry in `servers` — a generated client takes its
17
+ base URL from there, and the previous ordering pointed every SDK at the
18
+ domain the issuer had already left. `api.1claw.xyz` still answers and is
19
+ still accepted on token validation, because tokens minted before the
20
+ move carry it; it is never minted now.
21
+
22
+ One deliberate exception: the Shroud attestation identity token is
23
+ requested from GCP with `audience: https://api.1claw.xyz`, so
24
+ `/v1/shroud/attestation` reports that as its `expected_audience`. That
25
+ is accurate rather than stale — the audience is a verification contract
26
+ with anyone already checking the token, and moving it is a breaking
27
+ change for them, not a rename.
28
+
13
29
  All endpoints require JWT Bearer authentication unless marked with
14
30
  `security: []`.
15
31
  contact:
16
- email: ops@1claw.xyz
32
+ email: ops@1claw.co
17
33
 
18
34
  servers:
19
- - url: http://localhost:8443
20
- description: Development
35
+ - url: https://api.1claw.co
36
+ description: Production (canonical)
37
+ - url: https://shroud.1claw.co
38
+ description: Shroud TEE Proxy (Intents API + LLM proxy)
21
39
  - url: https://api.1claw.xyz
22
- description: Production
40
+ description: Production (legacy domain; still answers, tokens minted before the move carry this issuer)
23
41
  - url: https://shroud.1claw.xyz
24
- description: Shroud TEE Proxy (Intents API + LLM proxy)
42
+ description: Shroud TEE Proxy (legacy domain)
43
+ - url: http://localhost:8443
44
+ description: Development
25
45
 
26
46
  x-agentcash-guidance:
27
- llmsTxtUrl: https://1claw.xyz/llms.txt
47
+ llmsTxtUrl: https://1claw.co/llms.txt
28
48
 
29
49
  security:
30
50
  - BearerAuth: []
@@ -8054,6 +8074,10 @@ paths:
8054
8074
  type: string
8055
8075
  - in: query
8056
8076
  name: agent_id
8077
+ description: |
8078
+ Optional only while the connection has exactly one agent.
8079
+ With more than one it becomes required and the call answers
8080
+ 400 without it — the Fleet template provisions three.
8057
8081
  required: false
8058
8082
  schema:
8059
8083
  type: string
@@ -8218,10 +8242,30 @@ paths:
8218
8242
  /v1/platform/connections/{connectionId}/passkeys/enroll/begin:
8219
8243
  post:
8220
8244
  tags: [Platform]
8221
- summary: Begin passkey enrollment for a connected user
8245
+ summary: Begin passkey enrollment for a connected user (always 403)
8246
+ deprecated: true
8222
8247
  description: |
8223
- Starts WebAuthn registration for the end-user on this connection.
8224
- Platform apps use this instead of `POST /v1/auth/passkeys/register/begin` (user JWT only).
8248
+ **This endpoint always returns 403 and cannot be made to work.**
8249
+ The description here previously said platform apps should use it
8250
+ instead of `POST /v1/auth/passkeys/register/begin`, which was
8251
+ wrong and cost integrators a WebAuthn ceremony to discover.
8252
+
8253
+ A passkey enrolled this way is login-capable: it can be asserted
8254
+ through the public sign-in flow to mint a full, non-delegated
8255
+ user session, so an app that enrolled one would hold a credential
8256
+ stronger than the delegation boundary it operates under. The
8257
+ capability was removed for that reason and will not return.
8258
+
8259
+ **A passkey is enrolled by the user, in their own session**, via
8260
+ `POST /v1/auth/passkeys/register/begin`. For a connected user
8261
+ that means completing the claim flow on the connection first.
8262
+
8263
+ To *use* a passkey a connected user already has, see:
8264
+ - `GET /v1/platform/connections/{connectionId}/passkeys` —
8265
+ whether the confirm step can be offered at all.
8266
+ - `POST /v1/platform/connections/{connectionId}/passkeys/tx-assert/begin`
8267
+ and `.../complete` — ask that user to touch their
8268
+ authenticator over a specific digest.
8225
8269
  operationId: connectionPasskeyEnrollBegin
8226
8270
  security:
8227
8271
  - BearerAuth: []
@@ -8233,19 +8277,24 @@ paths:
8233
8277
  type: string
8234
8278
  format: uuid
8235
8279
  responses:
8236
- "200":
8237
- description: WebAuthn registration ceremony options
8280
+ "403":
8281
+ description: |
8282
+ Always. Platform apps cannot enroll login passkeys for
8283
+ connected users.
8238
8284
  content:
8239
8285
  application/json:
8240
8286
  schema:
8241
- $ref: "#/components/schemas/PasskeyRegisterBeginResponse"
8242
- "404":
8243
- $ref: "#/components/responses/NotFound"
8287
+ $ref: "#/components/schemas/ProblemDetails"
8244
8288
 
8245
8289
  /v1/platform/connections/{connectionId}/passkeys/enroll/complete:
8246
8290
  post:
8247
8291
  tags: [Platform]
8248
- summary: Complete passkey enrollment for a connected user
8292
+ summary: Complete passkey enrollment for a connected user (always 403)
8293
+ deprecated: true
8294
+ description: |
8295
+ **This endpoint always returns 403.** See
8296
+ `POST /v1/platform/connections/{connectionId}/passkeys/enroll/begin`
8297
+ for why, and for the paths that do work.
8249
8298
  operationId: connectionPasskeyEnrollComplete
8250
8299
  security:
8251
8300
  - BearerAuth: []
@@ -8263,14 +8312,197 @@ paths:
8263
8312
  schema:
8264
8313
  $ref: "#/components/schemas/PasskeyRegisterCompleteRequest"
8265
8314
  responses:
8266
- "201":
8267
- description: Passkey registered
8315
+ "403":
8316
+ description: |
8317
+ Always. Platform apps cannot enroll login passkeys for
8318
+ connected users.
8319
+ content:
8320
+ application/json:
8321
+ schema:
8322
+ $ref: "#/components/schemas/ProblemDetails"
8323
+
8324
+ /v1/platform/connections/{connectionId}/passkeys:
8325
+ get:
8326
+ tags: [Platform]
8327
+ summary: Whether a connected user can be asked for a passkey touch
8328
+ description: |
8329
+ Answers one question: can this app offer the passkey confirm
8330
+ step to this user? No credential material is returned — not
8331
+ credential ids, not public keys, not enrolment times.
8332
+
8333
+ `count` is what matters. Passkeys are bound to the domain they
8334
+ were registered on, so an account can hold credentials that this
8335
+ domain cannot offer; `count` reports only those usable on
8336
+ `rp_id`, while `registered_count` is the raw total. Branch on
8337
+ `has_passkey`.
8338
+ operationId: listConnectionPasskeys
8339
+ security:
8340
+ - BearerAuth: []
8341
+ parameters:
8342
+ - in: path
8343
+ name: connectionId
8344
+ required: true
8345
+ schema:
8346
+ type: string
8347
+ format: uuid
8348
+ responses:
8349
+ "200":
8350
+ description: Passkey availability for this connection
8351
+ content:
8352
+ application/json:
8353
+ schema:
8354
+ type: object
8355
+ required: [has_passkey, count, registered_count, rp_id]
8356
+ properties:
8357
+ has_passkey:
8358
+ type: boolean
8359
+ description: True when count > 0.
8360
+ count:
8361
+ type: integer
8362
+ format: int64
8363
+ description: Passkeys usable on rp_id.
8364
+ registered_count:
8365
+ type: integer
8366
+ format: int64
8367
+ description: |
8368
+ All passkeys on the account, including any
8369
+ bound to a different domain.
8370
+ rp_id:
8371
+ type: string
8372
+ description: The domain these counts are measured against.
8373
+ "403":
8374
+ $ref: "#/components/responses/Forbidden"
8375
+ "404":
8376
+ $ref: "#/components/responses/NotFound"
8377
+
8378
+ /v1/platform/connections/{connectionId}/passkeys/tx-assert/begin:
8379
+ post:
8380
+ tags: [Platform]
8381
+ summary: Ask a connected user to touch their authenticator
8382
+ description: |
8383
+ Begins a WebAuthn assertion bound to `tx_digest`, for the user on
8384
+ this connection. The connection in the path is the addressing
8385
+ that `POST /v1/auth/passkeys/tx-assert/begin` lacks: that route
8386
+ resolves the *calling* principal, so with a `plt_` key it looks
8387
+ up the app itself and reports no passkeys. An app never needs to
8388
+ hold an email to name one of its users.
8389
+
8390
+ Returns 404 when the user has no passkey usable on this domain —
8391
+ check `GET /v1/platform/connections/{connectionId}/passkeys`
8392
+ first and only offer the step when `has_passkey` is true.
8393
+ operationId: connectionPasskeyTxAssertBegin
8394
+ security:
8395
+ - BearerAuth: []
8396
+ parameters:
8397
+ - in: path
8398
+ name: connectionId
8399
+ required: true
8400
+ schema:
8401
+ type: string
8402
+ format: uuid
8403
+ requestBody:
8404
+ required: true
8405
+ content:
8406
+ application/json:
8407
+ schema:
8408
+ type: object
8409
+ required: [tx_digest]
8410
+ properties:
8411
+ tx_digest:
8412
+ type: string
8413
+ description: SHA-256 hex of the exact text being confirmed.
8414
+ action:
8415
+ type: string
8416
+ enum: [send, swap]
8417
+ default: send
8418
+ responses:
8419
+ "200":
8420
+ description: WebAuthn assertion ceremony options
8421
+ content:
8422
+ application/json:
8423
+ schema:
8424
+ $ref: "#/components/schemas/PasskeyAssertBeginResponse"
8425
+ "400":
8426
+ $ref: "#/components/responses/BadRequest"
8427
+ "403":
8428
+ $ref: "#/components/responses/Forbidden"
8429
+ "404":
8430
+ description: This user has no passkey registered.
8431
+ content:
8432
+ application/json:
8433
+ schema:
8434
+ $ref: "#/components/schemas/ProblemDetails"
8435
+
8436
+ /v1/platform/connections/{connectionId}/passkeys/tx-assert/complete:
8437
+ post:
8438
+ tags: [Platform]
8439
+ summary: Verify the touch and return proof of it
8440
+ description: |
8441
+ Verifies the assertion — origin, rpIdHash, the user-verified
8442
+ flag, the signature, and a sign count that must increase, which
8443
+ is what catches a cloned authenticator — and returns a
8444
+ short-lived token proving this user touched their authenticator
8445
+ over that digest.
8446
+
8447
+ The token records that a platform app requested it. That
8448
+ provenance is deliberate: it proves the touch to your
8449
+ application, and it is **refused** as authorization for a
8450
+ 1Claw treasury transfer. A user consenting to your action has
8451
+ not consented to moving funds, and those remain a separate
8452
+ assertion from the user's own session.
8453
+ operationId: connectionPasskeyTxAssertComplete
8454
+ security:
8455
+ - BearerAuth: []
8456
+ parameters:
8457
+ - in: path
8458
+ name: connectionId
8459
+ required: true
8460
+ schema:
8461
+ type: string
8462
+ format: uuid
8463
+ requestBody:
8464
+ required: true
8465
+ content:
8466
+ application/json:
8467
+ schema:
8468
+ type: object
8469
+ required:
8470
+ [
8471
+ credential_id,
8472
+ authenticator_data,
8473
+ client_data_json,
8474
+ signature,
8475
+ ]
8476
+ properties:
8477
+ credential_id:
8478
+ type: string
8479
+ authenticator_data:
8480
+ type: string
8481
+ client_data_json:
8482
+ type: string
8483
+ signature:
8484
+ type: string
8485
+ responses:
8486
+ "200":
8487
+ description: Assertion verified
8268
8488
  content:
8269
8489
  application/json:
8270
8490
  schema:
8271
- $ref: "#/components/schemas/PasskeyRegisterCompleteResponse"
8491
+ type: object
8492
+ required: [passkey_token, expires_in]
8493
+ properties:
8494
+ passkey_token:
8495
+ type: string
8496
+ description: |
8497
+ Single-use proof of the touch, bound to the
8498
+ digest and to this user.
8499
+ expires_in:
8500
+ type: integer
8501
+ description: Seconds until the token expires.
8272
8502
  "400":
8273
8503
  $ref: "#/components/responses/BadRequest"
8504
+ "403":
8505
+ $ref: "#/components/responses/Forbidden"
8274
8506
  "404":
8275
8507
  $ref: "#/components/responses/NotFound"
8276
8508
 
@@ -12498,139 +12730,1832 @@ paths:
12498
12730
  # Shamir KEK
12499
12731
  # ---------------------------------------------------------------------------
12500
12732
 
12501
- /v1/org/shamir-kek/setup:
12733
+ /v1/agents/batch-delete:
12502
12734
  post:
12503
- tags: [Shamir KEK]
12504
- summary: Set up Shamir KEK for the org
12505
- description: |
12506
- Initialize a Shamir secret-sharing KEK for the org. Splits the master
12507
- key into shares distributed to custodians. Shares are returned one-time
12508
- only and must be stored securely by each custodian.
12509
- operationId: setupShamirKek
12510
- security:
12511
- - BearerAuth: []
12735
+ tags: [Agents]
12736
+ summary: "batch delete agents"
12737
+ operationId: batch_delete_agents
12738
+ responses:
12739
+ '200':
12740
+ description: Success
12741
+ '401':
12742
+ description: Unauthenticated
12743
+ '403':
12744
+ description: Forbidden, or the plan does not include this
12745
+ '404':
12746
+ description: Not found
12747
+ /v1/agents/enroll/approve:
12748
+ post:
12749
+ tags: [Agents]
12750
+ summary: "Authenticated: consume token, create agent, return API key once. **Email-bound pending:** caller must belong to the same org and match `human_email`."
12751
+ operationId: approve_enrollment
12512
12752
  requestBody:
12513
12753
  required: true
12514
12754
  content:
12515
12755
  application/json:
12516
12756
  schema:
12517
- $ref: "#/components/schemas/ShamirKekSetupRequest"
12518
- responses:
12519
- "201":
12520
- description: Shamir KEK configured (shares returned one-time)
12521
- content:
12522
- application/json:
12523
- schema:
12524
- $ref: "#/components/schemas/ShamirKekSetupResponse"
12525
- "400":
12526
- $ref: "#/components/responses/BadRequest"
12527
- "401":
12528
- $ref: "#/components/responses/Unauthorized"
12529
- "403":
12530
- $ref: "#/components/responses/Forbidden"
12531
-
12532
- /v1/org/shamir-kek:
12533
- get:
12534
- tags: [Shamir KEK]
12535
- summary: Get Shamir KEK status
12536
- description: Returns the current Shamir KEK configuration status for the org.
12537
- operationId: getShamirKekStatus
12538
- security:
12539
- - BearerAuth: []
12540
- responses:
12541
- "200":
12542
- description: Shamir KEK status
12543
- content:
12544
- application/json:
12545
- schema:
12546
- $ref: "#/components/schemas/ShamirKekStatusResponse"
12547
- "401":
12548
- $ref: "#/components/responses/Unauthorized"
12549
-
12550
- /v1/org/shamir-kek/reconstruct:
12757
+ type: object
12758
+ required:
12759
+ - token
12760
+ properties:
12761
+ token:
12762
+ type: string
12763
+ approval_id:
12764
+ type: string
12765
+ format: uuid
12766
+ description: |
12767
+ Consensus approval to spend on this creation.
12768
+ Approving an enrollment creates an agent, so it is
12769
+ gated on `agent.create` exactly as POST /v1/agents
12770
+ is. Orgs without a control-plane consensus policy
12771
+ never need this.
12772
+ responses:
12773
+ '200':
12774
+ description: Success
12775
+ '401':
12776
+ description: Unauthenticated
12777
+ '403':
12778
+ description: |
12779
+ Forbidden, the plan does not include this, or the org requires
12780
+ M-of-N consensus for `agent.create` and no approval was supplied.
12781
+ '404':
12782
+ description: Not found
12783
+ /v1/agents/enroll/deny:
12551
12784
  post:
12552
- tags: [Shamir KEK]
12553
- summary: Reconstruct KEK from shares
12554
- description: |
12555
- Submit Shamir shares to reconstruct the org KEK. Requires at least
12556
- `threshold` valid shares. Used during disaster recovery.
12557
- operationId: reconstructShamirKek
12558
- security:
12559
- - BearerAuth: []
12785
+ tags: [Agents]
12786
+ summary: "Authenticated: consume token and delete pending enrollment (deny). **Email-bound:** caller org and email must match the pending row. **Link-only:** "
12787
+ operationId: deny_enrollment
12560
12788
  requestBody:
12561
12789
  required: true
12562
12790
  content:
12563
12791
  application/json:
12564
12792
  schema:
12565
- $ref: "#/components/schemas/ShamirKekReconstructRequest"
12793
+ type: object
12794
+ required:
12795
+ - token
12796
+ properties:
12797
+ token:
12798
+ type: string
12566
12799
  responses:
12567
- "200":
12568
- description: Reconstruction result
12569
- content:
12570
- application/json:
12571
- schema:
12572
- $ref: "#/components/schemas/ShamirKekReconstructResponse"
12573
- "400":
12574
- $ref: "#/components/responses/BadRequest"
12575
- "401":
12576
- $ref: "#/components/responses/Unauthorized"
12577
- "403":
12578
- $ref: "#/components/responses/Forbidden"
12579
-
12580
- /v1/org/shamir-kek/recovery-codes:
12800
+ '200':
12801
+ description: Success
12802
+ '401':
12803
+ description: Unauthenticated
12804
+ '403':
12805
+ description: Forbidden, or the plan does not include this
12806
+ '404':
12807
+ description: Not found
12808
+ /v1/agents/enroll/pending:
12581
12809
  get:
12582
- tags: [Shamir KEK]
12583
- summary: Get Shamir recovery codes (one-time)
12584
- description: |
12585
- Returns the one-time recovery codes for the Shamir KEK. These codes
12586
- can be used as an emergency fallback if custodian shares are lost.
12587
- Codes are only returned once — subsequent calls return 410.
12588
- operationId: getShamirKekRecoveryCodes
12589
- security:
12590
- - BearerAuth: []
12810
+ tags: [Agents]
12811
+ 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"
12812
+ operationId: get_enrollment_pending
12813
+ security: []
12591
12814
  responses:
12592
- "200":
12593
- description: Recovery codes (one-time)
12594
- content:
12595
- application/json:
12596
- schema:
12597
- $ref: "#/components/schemas/ShamirKekRecoveryCodesResponse"
12598
- "401":
12599
- $ref: "#/components/responses/Unauthorized"
12600
- "403":
12601
- $ref: "#/components/responses/Forbidden"
12602
- "410":
12603
- description: Codes already retrieved
12604
-
12605
- /v1/org/shamir-kek/verify-recovery-code:
12815
+ '200':
12816
+ description: Success
12817
+ '404':
12818
+ description: Not found
12819
+ /v1/agents/{agent_id}/channels/{channel_id}/refresh-webhook:
12820
+ parameters:
12821
+ - name: agent_id
12822
+ in: path
12823
+ required: true
12824
+ schema:
12825
+ type: string
12826
+ - name: channel_id
12827
+ in: path
12828
+ required: true
12829
+ schema:
12830
+ type: string
12606
12831
  post:
12607
- tags: [Shamir KEK]
12608
- summary: Verify a Shamir recovery code
12609
- description: Check whether a recovery code is valid without consuming it.
12610
- operationId: verifyShamirKekRecoveryCode
12611
- security:
12612
- - BearerAuth: []
12832
+ tags: [Agents]
12833
+ summary: "Re-register the provider webhook for this channel (repairs a stale or revoked subscription)."
12834
+ operationId: refresh_channel_webhook
12835
+ responses:
12836
+ '200':
12837
+ description: Success
12838
+ '401':
12839
+ description: Unauthenticated
12840
+ '403':
12841
+ description: Forbidden, or the plan does not include this
12842
+ '404':
12843
+ description: Not found
12844
+ /v1/agents/{agent_id}/channels/{channel_id}/repair:
12845
+ parameters:
12846
+ - name: agent_id
12847
+ in: path
12848
+ required: true
12849
+ schema:
12850
+ type: string
12851
+ - name: channel_id
12852
+ in: path
12853
+ required: true
12854
+ schema:
12855
+ type: string
12856
+ post:
12857
+ tags: [Agents]
12858
+ summary: "Repair a channel: alias of refresh-webhook, re-registers the provider webhook for this channel."
12859
+ operationId: repair_channel_webhook
12860
+ responses:
12861
+ '200':
12862
+ description: Success
12863
+ '401':
12864
+ description: Unauthenticated
12865
+ '403':
12866
+ description: Forbidden, or the plan does not include this
12867
+ '404':
12868
+ description: Not found
12869
+ /v1/agents/{agent_id}/eoa:
12870
+ parameters:
12871
+ - name: agent_id
12872
+ in: path
12873
+ required: true
12874
+ schema:
12875
+ type: string
12876
+ get:
12877
+ tags: [Agents]
12878
+ summary: "Get the agent's EVM address (no private key exposure)."
12879
+ operationId: get_agent_eoa
12880
+ responses:
12881
+ '200':
12882
+ description: Success
12883
+ '401':
12884
+ description: Unauthenticated
12885
+ '403':
12886
+ description: Forbidden, or the plan does not include this
12887
+ '404':
12888
+ description: Not found
12889
+ post:
12890
+ tags: [Agents]
12891
+ 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."
12892
+ operationId: generate_agent_eoa
12893
+ responses:
12894
+ '200':
12895
+ description: Success
12896
+ '401':
12897
+ description: Unauthenticated
12898
+ '403':
12899
+ description: Forbidden, or the plan does not include this
12900
+ '404':
12901
+ description: Not found
12902
+ /v1/agents/{agent_id}/rotate-signer-key:
12903
+ parameters:
12904
+ - name: agent_id
12905
+ in: path
12906
+ required: true
12907
+ schema:
12908
+ type: string
12909
+ post:
12910
+ tags: [Agents]
12911
+ 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"
12912
+ operationId: rotate_signer_key
12913
+ responses:
12914
+ '200':
12915
+ description: Success
12916
+ '401':
12917
+ description: Unauthenticated
12918
+ '403':
12919
+ description: Forbidden, or the plan does not include this
12920
+ '404':
12921
+ description: Not found
12922
+ /v1/agents/{agent_id}/smart-accounts/{chain_id}:
12923
+ parameters:
12924
+ - name: agent_id
12925
+ in: path
12926
+ required: true
12927
+ schema:
12928
+ type: string
12929
+ - name: chain_id
12930
+ in: path
12931
+ required: true
12932
+ schema:
12933
+ type: string
12934
+ delete:
12935
+ tags: [Agents]
12936
+ summary: "delete smart account"
12937
+ operationId: delete_smart_account
12938
+ responses:
12939
+ '200':
12940
+ description: Success
12941
+ '401':
12942
+ description: Unauthenticated
12943
+ '403':
12944
+ description: Forbidden, or the plan does not include this
12945
+ '404':
12946
+ description: Not found
12947
+ /v1/agents/{agent_id}/unlock-platform:
12948
+ parameters:
12949
+ - name: agent_id
12950
+ in: path
12951
+ required: true
12952
+ schema:
12953
+ type: string
12954
+ post:
12955
+ tags: [Agents]
12956
+ summary: "User-only. Clears platform_locked when the app is no longer actively connected."
12957
+ operationId: unlock_agent_platform
12958
+ responses:
12959
+ '200':
12960
+ description: Success
12961
+ '401':
12962
+ description: Unauthenticated
12963
+ '403':
12964
+ description: Forbidden, or the plan does not include this
12965
+ '404':
12966
+ description: Not found
12967
+ /v1/audit/export:
12968
+ get:
12969
+ tags: [Audit]
12970
+ summary: "export audit events"
12971
+ operationId: export_audit_events
12972
+ responses:
12973
+ '200':
12974
+ description: Success
12975
+ '401':
12976
+ description: Unauthenticated
12977
+ '403':
12978
+ description: Forbidden, or the plan does not include this
12979
+ '404':
12980
+ description: Not found
12981
+ /v1/auth/credential-recovery/requests/{id}/cancel:
12982
+ parameters:
12983
+ - name: id
12984
+ in: path
12985
+ required: true
12986
+ schema:
12987
+ type: string
12988
+ post:
12989
+ tags: [Auth]
12990
+ summary: "cancel request"
12991
+ operationId: cancel_request
12992
+ responses:
12993
+ '200':
12994
+ description: Success
12995
+ '401':
12996
+ description: Unauthenticated
12997
+ '403':
12998
+ description: Forbidden, or the plan does not include this
12999
+ '404':
13000
+ description: Not found
13001
+ /v1/auth/migration-status:
13002
+ get:
13003
+ tags: [Auth]
13004
+ 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"
13005
+ operationId: migration_status
13006
+ responses:
13007
+ '200':
13008
+ description: Success
13009
+ '401':
13010
+ description: Unauthenticated
13011
+ '403':
13012
+ description: Forbidden, or the plan does not include this
13013
+ '404':
13014
+ description: Not found
13015
+ /v1/auth/passkeys/vault-assert/begin:
13016
+ post:
13017
+ tags: [Auth]
13018
+ summary: "Begin a passkey assertion that unlocks vault secret reads for users who have `require_passkey_for_vaults` enabled."
13019
+ operationId: vault_assert_begin
13020
+ responses:
13021
+ '200':
13022
+ description: Success
13023
+ '401':
13024
+ description: Unauthenticated
13025
+ '403':
13026
+ description: Forbidden, or the plan does not include this
13027
+ '404':
13028
+ description: Not found
13029
+ /v1/auth/passkeys/vault-assert/complete:
13030
+ post:
13031
+ tags: [Auth]
13032
+ summary: "Returns a short-lived `passkey_token` for the `X-Passkey-Token` header on secret reads."
13033
+ operationId: vault_assert_complete
12613
13034
  requestBody:
12614
13035
  required: true
12615
13036
  content:
12616
13037
  application/json:
12617
13038
  schema:
12618
- $ref: "#/components/schemas/ShamirKekVerifyCodeRequest"
13039
+ type: object
13040
+ required:
13041
+ - credential_id
13042
+ - authenticator_data
13043
+ - client_data_json
13044
+ - signature
13045
+ properties:
13046
+ credential_id:
13047
+ type: string
13048
+ authenticator_data:
13049
+ type: string
13050
+ client_data_json:
13051
+ type: string
13052
+ signature:
13053
+ type: string
12619
13054
  responses:
12620
- "200":
12621
- description: Verification result
12622
- content:
12623
- application/json:
12624
- schema:
12625
- $ref: "#/components/schemas/ShamirKekVerifyCodeResponse"
12626
- "400":
12627
- $ref: "#/components/responses/BadRequest"
12628
- "401":
12629
- $ref: "#/components/responses/Unauthorized"
12630
-
12631
- # =============================================================================
12632
- # COMPONENTS
12633
- # =============================================================================
13055
+ '200':
13056
+ description: Success
13057
+ '401':
13058
+ description: Unauthenticated
13059
+ '403':
13060
+ description: Forbidden, or the plan does not include this
13061
+ '404':
13062
+ description: Not found
13063
+ /v1/auth/reauth/begin:
13064
+ post:
13065
+ tags: [Auth]
13066
+ summary: "start a re-authentication ceremony. For passkey: returns a WebAuthn challenge. For password: returns immediately (no challenge needed)."
13067
+ operationId: reauth_begin
13068
+ requestBody:
13069
+ required: true
13070
+ content:
13071
+ application/json:
13072
+ schema:
13073
+ type: object
13074
+ required:
13075
+ - method
13076
+ properties:
13077
+ method:
13078
+ type: string
13079
+ purpose:
13080
+ type: string
13081
+ responses:
13082
+ '200':
13083
+ description: Success
13084
+ '401':
13085
+ description: Unauthenticated
13086
+ '403':
13087
+ description: Forbidden, or the plan does not include this
13088
+ '404':
13089
+ description: Not found
13090
+ /v1/auth/reauth/complete:
13091
+ post:
13092
+ tags: [Auth]
13093
+ summary: "verify re-authentication and issue a single-use token."
13094
+ operationId: reauth_complete
13095
+ requestBody:
13096
+ required: true
13097
+ content:
13098
+ application/json:
13099
+ schema:
13100
+ type: object
13101
+ required:
13102
+ - method
13103
+ properties:
13104
+ method:
13105
+ type: string
13106
+ purpose:
13107
+ type: string
13108
+ password:
13109
+ type: string
13110
+ credential_id:
13111
+ type: string
13112
+ authenticator_data:
13113
+ type: string
13114
+ client_data_json:
13115
+ type: string
13116
+ signature:
13117
+ type: string
13118
+ responses:
13119
+ '200':
13120
+ description: Success
13121
+ '401':
13122
+ description: Unauthenticated
13123
+ '403':
13124
+ description: Forbidden, or the plan does not include this
13125
+ '404':
13126
+ description: Not found
13127
+ /v1/auth/social/disconnect:
13128
+ post:
13129
+ tags: [Auth]
13130
+ 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"
13131
+ operationId: disconnect_social
13132
+ responses:
13133
+ '200':
13134
+ description: Success
13135
+ '401':
13136
+ description: Unauthenticated
13137
+ '403':
13138
+ description: Forbidden, or the plan does not include this
13139
+ '404':
13140
+ description: Not found
13141
+ /v1/auth/sso/authorize:
13142
+ get:
13143
+ tags: [Auth]
13144
+ summary: "returns JSON with authorization_url for WorkOS Hosted Auth."
13145
+ operationId: sso_authorize
13146
+ responses:
13147
+ '200':
13148
+ description: Success
13149
+ '401':
13150
+ description: Unauthenticated
13151
+ '403':
13152
+ description: Forbidden, or the plan does not include this
13153
+ '404':
13154
+ description: Not found
13155
+ /v1/auth/sso/callback:
13156
+ get:
13157
+ tags: [Auth]
13158
+ summary: "exchange code for profile, find/create user, redirect to dashboard with token."
13159
+ operationId: sso_callback
13160
+ responses:
13161
+ '200':
13162
+ description: Success
13163
+ '401':
13164
+ description: Unauthenticated
13165
+ '403':
13166
+ description: Forbidden, or the plan does not include this
13167
+ '404':
13168
+ description: Not found
13169
+ /v1/auth/sso/status:
13170
+ get:
13171
+ tags: [Auth]
13172
+ summary: "returns whether SSO is configured (for dashboard to show/hide SSO button)."
13173
+ operationId: sso_status
13174
+ responses:
13175
+ '200':
13176
+ description: Success
13177
+ '401':
13178
+ description: Unauthenticated
13179
+ '403':
13180
+ description: Forbidden, or the plan does not include this
13181
+ '404':
13182
+ description: Not found
13183
+ /v1/billing/llm-models:
13184
+ get:
13185
+ tags: [Billing]
13186
+ summary: "get llm models"
13187
+ operationId: get_llm_models
13188
+ responses:
13189
+ '200':
13190
+ description: Success
13191
+ '401':
13192
+ description: Unauthenticated
13193
+ '403':
13194
+ description: Forbidden, or the plan does not include this
13195
+ '404':
13196
+ description: Not found
13197
+ /v1/billing/llm-pricing:
13198
+ get:
13199
+ tags: [Billing]
13200
+ summary: "get llm pricing"
13201
+ operationId: get_llm_pricing
13202
+ responses:
13203
+ '200':
13204
+ description: Success
13205
+ '401':
13206
+ description: Unauthenticated
13207
+ '403':
13208
+ description: Forbidden, or the plan does not include this
13209
+ '404':
13210
+ description: Not found
13211
+ /v1/billing/promo/redeem:
13212
+ get:
13213
+ tags: [Billing]
13214
+ summary: "get llm billing status"
13215
+ operationId: get_llm_billing_status
13216
+ responses:
13217
+ '200':
13218
+ description: Success
13219
+ '401':
13220
+ description: Unauthenticated
13221
+ '403':
13222
+ description: Forbidden, or the plan does not include this
13223
+ '404':
13224
+ description: Not found
13225
+ post:
13226
+ tags: [Billing]
13227
+ summary: "redeem promo"
13228
+ operationId: redeem_promo
13229
+ requestBody:
13230
+ required: true
13231
+ content:
13232
+ application/json:
13233
+ schema:
13234
+ type: object
13235
+ required:
13236
+ - code
13237
+ properties:
13238
+ code:
13239
+ type: string
13240
+ responses:
13241
+ '200':
13242
+ description: Success
13243
+ '401':
13244
+ description: Unauthenticated
13245
+ '403':
13246
+ description: Forbidden, or the plan does not include this
13247
+ '404':
13248
+ description: Not found
13249
+ /v1/billing/promo/validate:
13250
+ get:
13251
+ tags: [Billing]
13252
+ summary: "validate promo"
13253
+ operationId: validate_promo
13254
+ responses:
13255
+ '200':
13256
+ description: Success
13257
+ '401':
13258
+ description: Unauthenticated
13259
+ '403':
13260
+ description: Forbidden, or the plan does not include this
13261
+ '404':
13262
+ description: Not found
13263
+ /v1/chains/rpc:
13264
+ post:
13265
+ tags: [Chains]
13266
+ 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"
13267
+ operationId: chain_rpc_proxy
13268
+ requestBody:
13269
+ required: true
13270
+ content:
13271
+ application/json:
13272
+ schema:
13273
+ type: object
13274
+ required:
13275
+ - chain_id
13276
+ - method
13277
+ - params
13278
+ properties:
13279
+ chain_id:
13280
+ type: integer
13281
+ method:
13282
+ type: string
13283
+ params:
13284
+ type: array
13285
+ items:
13286
+ type: object
13287
+ additionalProperties: true
13288
+ responses:
13289
+ '200':
13290
+ description: Success
13291
+ '401':
13292
+ description: Unauthenticated
13293
+ '403':
13294
+ description: Forbidden, or the plan does not include this
13295
+ '404':
13296
+ description: Not found
13297
+ /v1/fiat/webhooks:
13298
+ post:
13299
+ tags: [Fiat]
13300
+ summary: "Receive completion events from fiat partners (MoonPay signed body or generic JSON)."
13301
+ operationId: fiat_webhook
13302
+ responses:
13303
+ '200':
13304
+ description: Success
13305
+ '401':
13306
+ description: Unauthenticated
13307
+ '403':
13308
+ description: Forbidden, or the plan does not include this
13309
+ '404':
13310
+ description: Not found
13311
+ /v1/memory/shared-namespaces:
13312
+ get:
13313
+ tags: [Memory]
13314
+ summary: "list shared namespaces"
13315
+ operationId: list_shared_namespaces
13316
+ responses:
13317
+ '200':
13318
+ description: Success
13319
+ '401':
13320
+ description: Unauthenticated
13321
+ '403':
13322
+ description: Forbidden, or the plan does not include this
13323
+ '404':
13324
+ description: Not found
13325
+ post:
13326
+ tags: [Memory]
13327
+ summary: "create shared namespace"
13328
+ operationId: create_shared_namespace
13329
+ requestBody:
13330
+ required: true
13331
+ content:
13332
+ application/json:
13333
+ schema:
13334
+ type: object
13335
+ required:
13336
+ - namespace
13337
+ - agent_ids
13338
+ properties:
13339
+ namespace:
13340
+ type: string
13341
+ agent_ids:
13342
+ type: array
13343
+ items:
13344
+ type: string
13345
+ format: uuid
13346
+ responses:
13347
+ '200':
13348
+ description: Success
13349
+ '401':
13350
+ description: Unauthenticated
13351
+ '403':
13352
+ description: Forbidden, or the plan does not include this
13353
+ '404':
13354
+ description: Not found
13355
+ /v1/memory/shared-namespaces/{id}:
13356
+ parameters:
13357
+ - name: id
13358
+ in: path
13359
+ required: true
13360
+ schema:
13361
+ type: string
13362
+ delete:
13363
+ tags: [Memory]
13364
+ summary: "delete shared namespace"
13365
+ operationId: delete_shared_namespace
13366
+ responses:
13367
+ '200':
13368
+ description: Success
13369
+ '401':
13370
+ description: Unauthenticated
13371
+ '403':
13372
+ description: Forbidden, or the plan does not include this
13373
+ '404':
13374
+ description: Not found
13375
+ patch:
13376
+ tags: [Memory]
13377
+ summary: "update shared namespace"
13378
+ operationId: update_shared_namespace
13379
+ requestBody:
13380
+ required: true
13381
+ content:
13382
+ application/json:
13383
+ schema:
13384
+ type: object
13385
+ required:
13386
+ - agent_ids
13387
+ properties:
13388
+ agent_ids:
13389
+ type: array
13390
+ items:
13391
+ type: string
13392
+ format: uuid
13393
+ responses:
13394
+ '200':
13395
+ description: Success
13396
+ '401':
13397
+ description: Unauthenticated
13398
+ '403':
13399
+ description: Forbidden, or the plan does not include this
13400
+ '404':
13401
+ description: Not found
13402
+ /v1/onboarding/journey:
13403
+ post:
13404
+ tags: [Onboarding]
13405
+ 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 "
13406
+ operationId: record_journey
13407
+ requestBody:
13408
+ required: true
13409
+ content:
13410
+ application/json:
13411
+ schema:
13412
+ type: object
13413
+ required:
13414
+ - journey
13415
+ properties:
13416
+ journey:
13417
+ type: string
13418
+ step:
13419
+ type: string
13420
+ responses:
13421
+ '200':
13422
+ description: Success
13423
+ '401':
13424
+ description: Unauthenticated
13425
+ '403':
13426
+ description: Forbidden, or the plan does not include this
13427
+ '404':
13428
+ description: Not found
13429
+ /v1/org/env-vars/{id}/delete:
13430
+ parameters:
13431
+ - name: id
13432
+ in: path
13433
+ required: true
13434
+ schema:
13435
+ type: string
13436
+ post:
13437
+ tags: [Org]
13438
+ summary: "delete org env var"
13439
+ operationId: delete_org_env_var
13440
+ responses:
13441
+ '200':
13442
+ description: Success
13443
+ '401':
13444
+ description: Unauthenticated
13445
+ '403':
13446
+ description: Forbidden, or the plan does not include this
13447
+ '404':
13448
+ description: Not found
13449
+ /v1/org/kek-custody:
13450
+ get:
13451
+ tags: [Org]
13452
+ summary: "Get current custody mode and share metadata"
13453
+ operationId: get_custody
13454
+ responses:
13455
+ '200':
13456
+ description: Success
13457
+ '401':
13458
+ description: Unauthenticated
13459
+ '403':
13460
+ description: Forbidden, or the plan does not include this
13461
+ '404':
13462
+ description: Not found
13463
+ post:
13464
+ tags: [Org]
13465
+ summary: "Setup Shamir key custody"
13466
+ operationId: setup_custody
13467
+ requestBody:
13468
+ required: true
13469
+ content:
13470
+ application/json:
13471
+ schema:
13472
+ type: object
13473
+ required:
13474
+ - custody_mode
13475
+ properties:
13476
+ custody_mode:
13477
+ type: string
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/org/kek-custody/reconstruct:
13488
+ get:
13489
+ tags: [Org]
13490
+ summary: "list org env vars"
13491
+ operationId: list_org_env_vars
13492
+ responses:
13493
+ '200':
13494
+ description: Success
13495
+ '401':
13496
+ description: Unauthenticated
13497
+ '403':
13498
+ description: Forbidden, or the plan does not include this
13499
+ '404':
13500
+ description: Not found
13501
+ post:
13502
+ tags: [Org]
13503
+ summary: "TEE-bound reconstruction request"
13504
+ operationId: reconstruct
13505
+ requestBody:
13506
+ required: true
13507
+ content:
13508
+ application/json:
13509
+ schema:
13510
+ type: object
13511
+ required:
13512
+ - approval_id
13513
+ - action
13514
+ properties:
13515
+ approval_id:
13516
+ type: object
13517
+ client_share:
13518
+ type: string
13519
+ action:
13520
+ type: object
13521
+ additionalProperties: true
13522
+ responses:
13523
+ '200':
13524
+ description: Success
13525
+ '401':
13526
+ description: Unauthenticated
13527
+ '403':
13528
+ description: Forbidden, or the plan does not include this
13529
+ '404':
13530
+ description: Not found
13531
+ /v1/org/settings:
13532
+ get:
13533
+ tags: [Org]
13534
+ summary: "list org settings"
13535
+ operationId: list_org_settings
13536
+ responses:
13537
+ '200':
13538
+ description: Success
13539
+ '401':
13540
+ description: Unauthenticated
13541
+ '403':
13542
+ description: Forbidden, or the plan does not include this
13543
+ '404':
13544
+ description: Not found
13545
+ patch:
13546
+ tags: [Org]
13547
+ summary: "update org setting"
13548
+ operationId: update_org_setting
13549
+ requestBody:
13550
+ required: true
13551
+ content:
13552
+ application/json:
13553
+ schema:
13554
+ type: object
13555
+ required:
13556
+ - key
13557
+ - value
13558
+ properties:
13559
+ key:
13560
+ type: string
13561
+ value:
13562
+ type: string
13563
+ approval_id:
13564
+ type: string
13565
+ format: uuid
13566
+ responses:
13567
+ '200':
13568
+ description: Success
13569
+ '401':
13570
+ description: Unauthenticated
13571
+ '403':
13572
+ description: Forbidden, or the plan does not include this
13573
+ '404':
13574
+ description: Not found
13575
+ /v1/platform/apps/by-slug/{slug}/branding:
13576
+ parameters:
13577
+ - name: slug
13578
+ in: path
13579
+ required: true
13580
+ schema:
13581
+ type: string
13582
+ get:
13583
+ tags: [Platform]
13584
+ summary: "Public, returns app name + logo."
13585
+ operationId: app_branding
13586
+ security: []
13587
+ responses:
13588
+ '200':
13589
+ description: Success
13590
+ '404':
13591
+ description: Not found
13592
+ /v1/platform/apps/{app_id}/automations:
13593
+ parameters:
13594
+ - name: app_id
13595
+ in: path
13596
+ required: true
13597
+ schema:
13598
+ type: string
13599
+ get:
13600
+ tags: [Platform]
13601
+ summary: "list platform automations"
13602
+ operationId: list_platform_automations
13603
+ responses:
13604
+ '200':
13605
+ description: Success
13606
+ '401':
13607
+ description: Unauthenticated
13608
+ '403':
13609
+ description: Forbidden, or the plan does not include this
13610
+ '404':
13611
+ description: Not found
13612
+ post:
13613
+ tags: [Platform]
13614
+ summary: "upsert user"
13615
+ operationId: upsert_user
13616
+ requestBody:
13617
+ required: true
13618
+ content:
13619
+ application/json:
13620
+ schema:
13621
+ type: object
13622
+ properties:
13623
+ subject_token:
13624
+ type: string
13625
+ subject_token_type:
13626
+ type: string
13627
+ email:
13628
+ type: string
13629
+ display_name:
13630
+ type: string
13631
+ siwe_message:
13632
+ type: string
13633
+ siwe_signature:
13634
+ type: string
13635
+ return_to:
13636
+ type: string
13637
+ create_sub_org:
13638
+ type: boolean
13639
+ app_id:
13640
+ type: object
13641
+ responses:
13642
+ '200':
13643
+ description: Success
13644
+ '401':
13645
+ description: Unauthenticated
13646
+ '403':
13647
+ description: Forbidden, or the plan does not include this
13648
+ '404':
13649
+ description: Not found
13650
+ /v1/platform/connected-apps/{connection_id}/unlock-resources:
13651
+ parameters:
13652
+ - name: connection_id
13653
+ in: path
13654
+ required: true
13655
+ schema:
13656
+ type: string
13657
+ post:
13658
+ tags: [Platform]
13659
+ summary: "Unlocks platform-locked resources for a disconnected (or active) connection the user owns."
13660
+ operationId: unlock_connection_resources
13661
+ responses:
13662
+ '200':
13663
+ description: Success
13664
+ '401':
13665
+ description: Unauthenticated
13666
+ '403':
13667
+ description: Forbidden, or the plan does not include this
13668
+ '404':
13669
+ description: Not found
13670
+ /v1/platform/connections/{connection_id}/memory:
13671
+ parameters:
13672
+ - name: connection_id
13673
+ in: path
13674
+ required: true
13675
+ schema:
13676
+ type: string
13677
+ get:
13678
+ tags: [Platform]
13679
+ summary: "list connection memory namespaces"
13680
+ operationId: list_connection_memory_namespaces
13681
+ responses:
13682
+ '200':
13683
+ description: Success
13684
+ '401':
13685
+ description: Unauthenticated
13686
+ '403':
13687
+ description: Forbidden, or the plan does not include this
13688
+ '404':
13689
+ description: Not found
13690
+ /v1/platform/connections/{connection_id}/memory/{namespace}:
13691
+ parameters:
13692
+ - name: connection_id
13693
+ in: path
13694
+ required: true
13695
+ schema:
13696
+ type: string
13697
+ - name: namespace
13698
+ in: path
13699
+ required: true
13700
+ schema:
13701
+ type: string
13702
+ get:
13703
+ tags: [Platform]
13704
+ summary: "list connection memory entries"
13705
+ operationId: list_connection_memory_entries
13706
+ responses:
13707
+ '200':
13708
+ description: Success
13709
+ '401':
13710
+ description: Unauthenticated
13711
+ '403':
13712
+ description: Forbidden, or the plan does not include this
13713
+ '404':
13714
+ description: Not found
13715
+ /v1/platform/connections/{connection_id}/resources:
13716
+ parameters:
13717
+ - name: connection_id
13718
+ in: path
13719
+ required: true
13720
+ schema:
13721
+ type: string
13722
+ get:
13723
+ tags: [Platform]
13724
+ summary: "list connection resources"
13725
+ operationId: list_connection_resources
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
+ post:
13736
+ tags: [Platform]
13737
+ summary: "create app policy"
13738
+ operationId: create_app_policy
13739
+ requestBody:
13740
+ required: true
13741
+ content:
13742
+ application/json:
13743
+ schema:
13744
+ type: object
13745
+ properties:
13746
+ user_id:
13747
+ type: object
13748
+ to_allowlist:
13749
+ type: array
13750
+ items:
13751
+ type: string
13752
+ to_denylist:
13753
+ type: array
13754
+ items:
13755
+ type: string
13756
+ max_value_per_tx_eth:
13757
+ type: string
13758
+ daily_limit_eth:
13759
+ type: string
13760
+ allowed_chains:
13761
+ type: array
13762
+ items:
13763
+ type: string
13764
+ allowed_tokens:
13765
+ type: array
13766
+ items:
13767
+ type: string
13768
+ max_transactions_per_day:
13769
+ type: integer
13770
+ human_factor_auth:
13771
+ type: object
13772
+ additionalProperties: true
13773
+ responses:
13774
+ '200':
13775
+ description: Success
13776
+ '401':
13777
+ description: Unauthenticated
13778
+ '403':
13779
+ description: Forbidden, or the plan does not include this
13780
+ '404':
13781
+ description: Not found
13782
+ /v1/platform/link-account:
13783
+ post:
13784
+ tags: [Platform]
13785
+ summary: "Authenticated user links their account to a platform app. Used by the dashboard `/connect/{slug}/link` consent flow for cross-org users."
13786
+ operationId: link_account
13787
+ requestBody:
13788
+ required: true
13789
+ content:
13790
+ application/json:
13791
+ schema:
13792
+ type: object
13793
+ required:
13794
+ - client_id
13795
+ properties:
13796
+ client_id:
13797
+ type: string
13798
+ responses:
13799
+ '200':
13800
+ description: Success
13801
+ '401':
13802
+ description: Unauthenticated
13803
+ '403':
13804
+ description: Forbidden, or the plan does not include this
13805
+ '404':
13806
+ description: Not found
13807
+ /v1/platform/orphaned-resources:
13808
+ get:
13809
+ tags: [Platform]
13810
+ summary: "platform-locked agents/vaults with no active connection."
13811
+ operationId: list_orphaned_platform_resources
13812
+ responses:
13813
+ '200':
13814
+ description: Success
13815
+ '401':
13816
+ description: Unauthenticated
13817
+ '403':
13818
+ description: Forbidden, or the plan does not include this
13819
+ '404':
13820
+ description: Not found
13821
+ /v1/reports/request:
13822
+ post:
13823
+ tags: [Reports]
13824
+ summary: "Public (no auth). Submits lead info, sends email with download link."
13825
+ operationId: request_report
13826
+ security: []
13827
+ requestBody:
13828
+ required: true
13829
+ content:
13830
+ application/json:
13831
+ schema:
13832
+ type: object
13833
+ required:
13834
+ - first_name
13835
+ - last_name
13836
+ - email
13837
+ - company
13838
+ properties:
13839
+ first_name:
13840
+ type: string
13841
+ last_name:
13842
+ type: string
13843
+ email:
13844
+ type: string
13845
+ company:
13846
+ type: string
13847
+ job_title:
13848
+ type: string
13849
+ report_slug:
13850
+ type: string
13851
+ marketing_consent:
13852
+ type: boolean
13853
+ responses:
13854
+ '200':
13855
+ description: Success
13856
+ '404':
13857
+ description: Not found
13858
+ /v1/runtimes/{runtime_id}/chat/conversations:
13859
+ parameters:
13860
+ - name: runtime_id
13861
+ in: path
13862
+ required: true
13863
+ schema:
13864
+ type: string
13865
+ get:
13866
+ tags: [Runtimes]
13867
+ summary: "list runtime chat conversations"
13868
+ operationId: list_runtime_chat_conversations
13869
+ responses:
13870
+ '200':
13871
+ description: Success
13872
+ '401':
13873
+ description: Unauthenticated
13874
+ '403':
13875
+ description: Forbidden, or the plan does not include this
13876
+ '404':
13877
+ description: Not found
13878
+ /v1/runtimes/{runtime_id}/chat/conversations/{conversation_id}:
13879
+ parameters:
13880
+ - name: runtime_id
13881
+ in: path
13882
+ required: true
13883
+ schema:
13884
+ type: string
13885
+ - name: conversation_id
13886
+ in: path
13887
+ required: true
13888
+ schema:
13889
+ type: string
13890
+ delete:
13891
+ tags: [Runtimes]
13892
+ summary: "Archives a runtime chat session so the next message starts a fresh conversation."
13893
+ operationId: archive_runtime_chat_conversation
13894
+ responses:
13895
+ '200':
13896
+ description: Success
13897
+ '401':
13898
+ description: Unauthenticated
13899
+ '403':
13900
+ description: Forbidden, or the plan does not include this
13901
+ '404':
13902
+ description: Not found
13903
+ get:
13904
+ tags: [Runtimes]
13905
+ summary: "get runtime chat conversation"
13906
+ operationId: get_runtime_chat_conversation
13907
+ responses:
13908
+ '200':
13909
+ description: Success
13910
+ '401':
13911
+ description: Unauthenticated
13912
+ '403':
13913
+ description: Forbidden, or the plan does not include this
13914
+ '404':
13915
+ description: Not found
13916
+ /v1/runtimes/{runtime_id}/chat/diagnostics:
13917
+ parameters:
13918
+ - name: runtime_id
13919
+ in: path
13920
+ required: true
13921
+ schema:
13922
+ type: string
13923
+ get:
13924
+ tags: [Runtimes]
13925
+ 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."
13926
+ operationId: runtime_chat_diagnostics
13927
+ responses:
13928
+ '200':
13929
+ description: Success
13930
+ '401':
13931
+ description: Unauthenticated
13932
+ '403':
13933
+ description: Forbidden, or the plan does not include this
13934
+ '404':
13935
+ description: Not found
13936
+ /v1/runtimes/{runtime_id}/chat/unlock:
13937
+ parameters:
13938
+ - name: runtime_id
13939
+ in: path
13940
+ required: true
13941
+ schema:
13942
+ type: string
13943
+ post:
13944
+ tags: [Runtimes]
13945
+ summary: "Step-up (password or passkey reauth token, purpose=`runtime_chat`) unlocks dashboard runtime chat for 15 minutes — same trust bar as Shell/Logs."
13946
+ operationId: unlock_runtime_chat
13947
+ responses:
13948
+ '200':
13949
+ description: Success
13950
+ '401':
13951
+ description: Unauthenticated
13952
+ '403':
13953
+ description: Forbidden, or the plan does not include this
13954
+ '404':
13955
+ description: Not found
13956
+ /v1/runtimes/{runtime_id}/logs/stream:
13957
+ parameters:
13958
+ - name: runtime_id
13959
+ in: path
13960
+ required: true
13961
+ schema:
13962
+ type: string
13963
+ get:
13964
+ tags: [Runtimes]
13965
+ summary: "SSE live log streaming"
13966
+ operationId: stream_runtime_logs
13967
+ responses:
13968
+ '200':
13969
+ description: Success
13970
+ '401':
13971
+ description: Unauthenticated
13972
+ '403':
13973
+ description: Forbidden, or the plan does not include this
13974
+ '404':
13975
+ description: Not found
13976
+ /v1/runtimes/{runtime_id}/logs/unlock:
13977
+ parameters:
13978
+ - name: runtime_id
13979
+ in: path
13980
+ required: true
13981
+ schema:
13982
+ type: string
13983
+ post:
13984
+ tags: [Runtimes]
13985
+ summary: "Step-up (password or passkey reauth token) unlocks log fetch/stream for 15 minutes."
13986
+ operationId: unlock_runtime_logs
13987
+ responses:
13988
+ '200':
13989
+ description: Success
13990
+ '401':
13991
+ description: Unauthenticated
13992
+ '403':
13993
+ description: Forbidden, or the plan does not include this
13994
+ '404':
13995
+ description: Not found
13996
+ /v1/runtimes/{runtime_id}/rebuild:
13997
+ parameters:
13998
+ - name: runtime_id
13999
+ in: path
14000
+ required: true
14001
+ schema:
14002
+ type: string
14003
+ post:
14004
+ tags: [Runtimes]
14005
+ 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"
14006
+ operationId: rebuild_runtime
14007
+ responses:
14008
+ '200':
14009
+ description: Success
14010
+ '401':
14011
+ description: Unauthenticated
14012
+ '403':
14013
+ description: Forbidden, or the plan does not include this
14014
+ '404':
14015
+ description: Not found
14016
+ /v1/runtimes/{runtime_id}/restart:
14017
+ parameters:
14018
+ - name: runtime_id
14019
+ in: path
14020
+ required: true
14021
+ schema:
14022
+ type: string
14023
+ post:
14024
+ tags: [Runtimes]
14025
+ summary: "Force stop (best-effort) then start. Recovers stale `running` rows and proxy timeouts where the client never received the start response."
14026
+ operationId: restart_runtime
14027
+ responses:
14028
+ '200':
14029
+ description: Success
14030
+ '401':
14031
+ description: Unauthenticated
14032
+ '403':
14033
+ description: Forbidden, or the plan does not include this
14034
+ '404':
14035
+ description: Not found
14036
+ /v1/vaults/{vault_id}/secret-version-disable/{*path_and_version}:
14037
+ parameters:
14038
+ - name: vault_id
14039
+ in: path
14040
+ required: true
14041
+ schema:
14042
+ type: string
14043
+ post:
14044
+ tags: [Vaults]
14045
+ summary: "Disable a specific version so it can no longer be read (but is retained for audit)."
14046
+ operationId: disable_version
14047
+ responses:
14048
+ '200':
14049
+ description: Success
14050
+ '401':
14051
+ description: Unauthenticated
14052
+ '403':
14053
+ description: Forbidden, or the plan does not include this
14054
+ '404':
14055
+ description: Not found
14056
+ /v1/vaults/{vault_id}/secret-version/{*path_and_version}:
14057
+ parameters:
14058
+ - name: vault_id
14059
+ in: path
14060
+ required: true
14061
+ schema:
14062
+ type: string
14063
+ get:
14064
+ tags: [Vaults]
14065
+ summary: "get secret version"
14066
+ operationId: get_secret_version
14067
+ responses:
14068
+ '200':
14069
+ description: Success
14070
+ '401':
14071
+ description: Unauthenticated
14072
+ '403':
14073
+ description: Forbidden, or the plan does not include this
14074
+ '404':
14075
+ description: Not found
14076
+ /v1/vaults/{vault_id}/unlock-platform:
14077
+ parameters:
14078
+ - name: vault_id
14079
+ in: path
14080
+ required: true
14081
+ schema:
14082
+ type: string
14083
+ post:
14084
+ tags: [Vaults]
14085
+ summary: "unlock vault platform"
14086
+ operationId: unlock_vault_platform
14087
+ responses:
14088
+ '200':
14089
+ description: Success
14090
+ '401':
14091
+ description: Unauthenticated
14092
+ '403':
14093
+ description: Forbidden, or the plan does not include this
14094
+ '404':
14095
+ description: Not found
14096
+ /v1/webinars/register:
14097
+ post:
14098
+ tags: [Webinars]
14099
+ summary: "Public (no auth). Registers for a webinar, sends confirmation + calendar invite."
14100
+ operationId: register_webinar
14101
+ security: []
14102
+ requestBody:
14103
+ required: true
14104
+ content:
14105
+ application/json:
14106
+ schema:
14107
+ type: object
14108
+ required:
14109
+ - first_name
14110
+ - last_name
14111
+ - email
14112
+ - company
14113
+ properties:
14114
+ first_name:
14115
+ type: string
14116
+ last_name:
14117
+ type: string
14118
+ email:
14119
+ type: string
14120
+ company:
14121
+ type: string
14122
+ job_title:
14123
+ type: string
14124
+ webinar_slug:
14125
+ type: string
14126
+ marketing_consent:
14127
+ type: boolean
14128
+ responses:
14129
+ '200':
14130
+ description: Success
14131
+ '404':
14132
+ description: Not found
14133
+
14134
+ /v1/runtimes/templates:
14135
+ get:
14136
+ tags: [Runtimes]
14137
+ summary: "The provisionable runtime templates, with licence and whether the agent needs its own vendor account"
14138
+ operationId: list_runtime_templates
14139
+ responses:
14140
+ '200':
14141
+ description: The template catalogue
14142
+ content:
14143
+ application/json:
14144
+ schema:
14145
+ type: object
14146
+ properties:
14147
+ templates:
14148
+ type: array
14149
+ items:
14150
+ type: object
14151
+ properties:
14152
+ id:
14153
+ type: string
14154
+ description:
14155
+ type: string
14156
+ chat_capable:
14157
+ type: boolean
14158
+ license:
14159
+ type: string
14160
+ nullable: true
14161
+ description: SPDX id, or null when the agent is proprietary
14162
+ requires_vendor_subscription:
14163
+ type: boolean
14164
+ 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.
14165
+ vendor_credential_env:
14166
+ type: string
14167
+ nullable: true
14168
+ '401':
14169
+ description: Unauthenticated
14170
+ /v1/automations/step-types:
14171
+ get:
14172
+ tags: [Automations]
14173
+ summary: "The automation step vocabulary an automation may use"
14174
+ operationId: list_automation_step_types
14175
+ responses:
14176
+ '200':
14177
+ description: Supported step types
14178
+ '401':
14179
+ description: Unauthenticated
14180
+ /v1/platform/apps/{app_id}/runtimes:
14181
+ parameters:
14182
+ - name: app_id
14183
+ in: path
14184
+ required: true
14185
+ schema:
14186
+ type: string
14187
+ format: uuid
14188
+ get:
14189
+ tags: [Platform]
14190
+ summary: "Runtimes belonging to a platform app"
14191
+ operationId: list_platform_runtimes
14192
+ responses:
14193
+ '200':
14194
+ description: Success
14195
+ '401':
14196
+ description: Unauthenticated
14197
+ '403':
14198
+ description: Forbidden
14199
+ /v1/browser/devices:
14200
+ post:
14201
+ tags: [Browser Bridge]
14202
+ 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."
14203
+ operationId: pair_browser_device
14204
+ requestBody:
14205
+ required: true
14206
+ content:
14207
+ application/json:
14208
+ schema:
14209
+ type: object
14210
+ required: [label, public_key_pin]
14211
+ properties:
14212
+ label:
14213
+ type: string
14214
+ description: Name for this device. Re-pairing an existing label must present the same key.
14215
+ public_key_pin:
14216
+ type: string
14217
+ description: The bridge's public key, pinned on first use for this label.
14218
+ bridge_version:
14219
+ type: string
14220
+ platform:
14221
+ type: string
14222
+ responses:
14223
+ '201':
14224
+ description: "Paired. The credential is returned once and there is no endpoint that returns it again."
14225
+ content:
14226
+ application/json:
14227
+ schema:
14228
+ type: object
14229
+ properties:
14230
+ device_id:
14231
+ type: string
14232
+ format: uuid
14233
+ label:
14234
+ type: string
14235
+ credential:
14236
+ type: string
14237
+ description: The bb_ bridge credential. Shown once.
14238
+ '401':
14239
+ description: Unauthenticated, or step-up re-auth not satisfied
14240
+ '403':
14241
+ description: Not a human caller — agents and platform keys cannot pair a device
14242
+ '409':
14243
+ description: That label is already pinned to a different key
14244
+ /v1/browser/credentials:
14245
+ post:
14246
+ tags: [Browser Bridge]
14247
+ 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."
14248
+ operationId: create_browser_credential
14249
+ requestBody:
14250
+ required: true
14251
+ content:
14252
+ application/json:
14253
+ schema:
14254
+ type: object
14255
+ required: [label, vault_id, secret_path, login_url, allowed_hosts]
14256
+ properties:
14257
+ label:
14258
+ type: string
14259
+ vault_id:
14260
+ type: string
14261
+ format: uuid
14262
+ description: Must belong to the caller's org.
14263
+ secret_path:
14264
+ type: string
14265
+ description: Path of the secret inside that vault. The value never lands in the binding.
14266
+ login_url:
14267
+ type: string
14268
+ 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."
14269
+ allowed_hosts:
14270
+ type: array
14271
+ minItems: 1
14272
+ items:
14273
+ type: string
14274
+ description: "Bare hostnames, compared exactly. URLs, ports and wildcards are refused: a wildcard would match nothing while looking like it allowed something."
14275
+ sso_hosts:
14276
+ type: array
14277
+ items:
14278
+ type: string
14279
+ description: Identity-provider hosts the login legitimately bounces through.
14280
+ responses:
14281
+ '201':
14282
+ description: Created. Every field is a pointer or a policy; none is secret.
14283
+ '400':
14284
+ description: A host is not a bare hostname, allowed_hosts is empty, or login_url is http or outside the allowlist
14285
+ '403':
14286
+ description: Not a human caller, step-up not satisfied, or the vault belongs to another org
14287
+ '404':
14288
+ description: Vault not found
14289
+ get:
14290
+ tags: [Browser Bridge]
14291
+ summary: List this org's browser credential bindings
14292
+ operationId: list_browser_credentials
14293
+ responses:
14294
+ '200':
14295
+ description: The bindings
14296
+ /v1/browser/credentials/{id}:
14297
+ parameters:
14298
+ - name: id
14299
+ in: path
14300
+ required: true
14301
+ schema:
14302
+ type: string
14303
+ format: uuid
14304
+ delete:
14305
+ tags: [Browser Bridge]
14306
+ summary: Remove a browser credential binding
14307
+ operationId: delete_browser_credential
14308
+ responses:
14309
+ '204':
14310
+ description: Deleted
14311
+ '403':
14312
+ description: Not a human caller
14313
+ '404':
14314
+ description: Binding not found
14315
+ /v1/agents/{id}/browser/sessions:
14316
+ parameters:
14317
+ - name: id
14318
+ in: path
14319
+ required: true
14320
+ schema:
14321
+ type: string
14322
+ format: uuid
14323
+ post:
14324
+ tags: [Browser Bridge]
14325
+ 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."
14326
+ operationId: create_browser_session
14327
+ parameters:
14328
+ - name: x-1claw-bridge-credential
14329
+ in: header
14330
+ required: true
14331
+ schema:
14332
+ type: string
14333
+ description: The bb_ credential from `1claw browser-bridge login`
14334
+ - name: x-1claw-bridge-version
14335
+ in: header
14336
+ required: true
14337
+ schema:
14338
+ type: string
14339
+ description: Bridge build. Versions below the server minimum are refused.
14340
+ requestBody:
14341
+ required: true
14342
+ content:
14343
+ application/json:
14344
+ schema:
14345
+ type: object
14346
+ required: [agent_id, client_id]
14347
+ properties:
14348
+ agent_id:
14349
+ type: string
14350
+ format: uuid
14351
+ description: Must belong to the same org as the paired device.
14352
+ client_id:
14353
+ type: string
14354
+ bridge_version:
14355
+ type: string
14356
+ protocol_version:
14357
+ type: string
14358
+ responses:
14359
+ '200':
14360
+ description: Session created
14361
+ content:
14362
+ application/json:
14363
+ schema:
14364
+ type: object
14365
+ properties:
14366
+ session_id:
14367
+ type: string
14368
+ format: uuid
14369
+ session_token:
14370
+ type: string
14371
+ description: bs_ prefixed. Only its hash is stored.
14372
+ expires_at:
14373
+ type: string
14374
+ format: date-time
14375
+ '400':
14376
+ description: Missing or unsupported bridge version
14377
+ '401':
14378
+ description: Not a paired bridge, or an agent token was presented
14379
+ '403':
14380
+ description: The device and the agent are not in the same org
14381
+ /v1/agents/{id}/browser/fills:
14382
+ parameters:
14383
+ - name: id
14384
+ in: path
14385
+ required: true
14386
+ schema:
14387
+ type: string
14388
+ format: uuid
14389
+ post:
14390
+ tags: [Browser Bridge]
14391
+ summary: "Authorise one credential fill. Requires the bridge credential *and* an agent JWT — neither alone is sufficient."
14392
+ operationId: authorize_browser_fill
14393
+ parameters:
14394
+ - name: x-1claw-bridge-credential
14395
+ in: header
14396
+ required: true
14397
+ schema:
14398
+ type: string
14399
+ - name: x-1claw-bridge-version
14400
+ in: header
14401
+ required: true
14402
+ schema:
14403
+ type: string
14404
+ requestBody:
14405
+ required: true
14406
+ content:
14407
+ application/json:
14408
+ schema:
14409
+ type: object
14410
+ required: [session_id, binding_id, tab_origin, frame_origin, frame_id, generation]
14411
+ properties:
14412
+ session_id:
14413
+ type: string
14414
+ format: uuid
14415
+ description: Must match the session the presented bs_ token opened.
14416
+ binding_id:
14417
+ type: string
14418
+ format: uuid
14419
+ frame_id:
14420
+ type: string
14421
+ description: The target the fill is for. Recorded on the grant.
14422
+ generation:
14423
+ type: integer
14424
+ format: int64
14425
+ 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."
14426
+ form_action_origin:
14427
+ type: string
14428
+ 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."
14429
+ tab_origin:
14430
+ type: string
14431
+ description: "Origin of the tab being driven. Checked against the binding's allowed and sso hosts by exact host match."
14432
+ frame_origin:
14433
+ type: string
14434
+ 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."
14435
+ responses:
14436
+ '200':
14437
+ description: A grant, a denial, or a pending approval. Never a secret.
14438
+ content:
14439
+ application/json:
14440
+ schema:
14441
+ type: object
14442
+ properties:
14443
+ kind:
14444
+ type: string
14445
+ enum: [grant]
14446
+ grant_id:
14447
+ type: string
14448
+ format: uuid
14449
+ description: Single-use, short-lived, redeemable only by the session it was issued to.
14450
+ binding_id:
14451
+ type: string
14452
+ format: uuid
14453
+ expires_at:
14454
+ type: string
14455
+ format: date-time
14456
+ login_url:
14457
+ type: string
14458
+ description: "The bridge navigates here itself. An agent-supplied URL would be the agent choosing who receives the password."
14459
+ '400':
14460
+ description: Missing or unsupported bridge version
14461
+ '403':
14462
+ 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"
14463
+ '404':
14464
+ description: No such binding for this org
14465
+
14466
+ /v1/agents/{id}/browser/fills/consume:
14467
+ parameters:
14468
+ - name: id
14469
+ in: path
14470
+ required: true
14471
+ schema:
14472
+ type: string
14473
+ format: uuid
14474
+ post:
14475
+ tags: [Browser Bridge]
14476
+ 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."
14477
+ operationId: consume_browser_fill
14478
+ parameters:
14479
+ - name: x-1claw-bridge-credential
14480
+ in: header
14481
+ required: true
14482
+ schema:
14483
+ type: string
14484
+ - name: x-1claw-bridge-session
14485
+ in: header
14486
+ required: true
14487
+ schema:
14488
+ type: string
14489
+ description: The bs_ session token. Proof the redemption belongs to a session this bridge opened.
14490
+ - name: x-1claw-bridge-version
14491
+ in: header
14492
+ required: true
14493
+ schema:
14494
+ type: string
14495
+ requestBody:
14496
+ required: true
14497
+ content:
14498
+ application/json:
14499
+ schema:
14500
+ type: object
14501
+ required: [session_id, grant_id, generation]
14502
+ properties:
14503
+ session_id:
14504
+ type: string
14505
+ format: uuid
14506
+ grant_id:
14507
+ type: string
14508
+ format: uuid
14509
+ generation:
14510
+ type: integer
14511
+ format: int64
14512
+ description: The bridge's navigation counter now. A mismatch means the page moved after the decision.
14513
+ responses:
14514
+ '200':
14515
+ 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`."
14516
+ headers:
14517
+ x-1claw-binding-id:
14518
+ schema:
14519
+ type: string
14520
+ format: uuid
14521
+ x-1claw-form-fingerprint:
14522
+ schema:
14523
+ type: string
14524
+ format: byte
14525
+ 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."
14526
+ content:
14527
+ application/octet-stream:
14528
+ schema:
14529
+ type: string
14530
+ format: binary
14531
+ '400':
14532
+ description: Missing or unsupported bridge version
14533
+ '403':
14534
+ description: "Grant expired, already used, issued to another session or device; the page navigated after authorisation; or an agent principal was presented"
14535
+ '404':
14536
+ description: The binding or the secret behind it is missing
14537
+
14538
+ /v1/agents/{agent_id}/chat/unlock:
14539
+ parameters:
14540
+ - name: agent_id
14541
+ in: path
14542
+ required: true
14543
+ schema:
14544
+ type: string
14545
+ format: uuid
14546
+ post:
14547
+ tags: [Chat]
14548
+ summary: "Unlock an agent's chat history for reading"
14549
+ operationId: unlock_agent_chat
14550
+ responses:
14551
+ '200':
14552
+ description: Unlocked
14553
+ '401':
14554
+ description: Unauthenticated
14555
+ '403':
14556
+ description: Forbidden
14557
+ '404':
14558
+ description: Agent not found
12634
14559
 
12635
14560
  components:
12636
14561
  securitySchemes:
@@ -15404,11 +17329,21 @@ components:
15404
17329
 
15405
17330
  PatchConnectionAgentRequest:
15406
17331
  type: object
17332
+ description: |
17333
+ At least one field is required.
15407
17334
  properties:
15408
17335
  intents_api_enabled:
15409
17336
  type: boolean
15410
17337
  execution_intents_enabled:
15411
17338
  type: boolean
17339
+ memory_enabled:
17340
+ type: boolean
17341
+ description: |
17342
+ Agent memory, off by default. Until this field existed a
17343
+ platform app had no way to turn it on: a bootstrap template
17344
+ accepted `memory_enabled` in its spec and never read it, so
17345
+ the capability was reachable only from the end user's own
17346
+ dashboard. Templates now honour the flag too.
15412
17347
  system_prompt:
15413
17348
  type: string
15414
17349
  nullable: true
@@ -15423,6 +17358,8 @@ components:
15423
17358
  type: boolean
15424
17359
  execution_intents_enabled:
15425
17360
  type: boolean
17361
+ memory_enabled:
17362
+ type: boolean
15426
17363
  system_prompt:
15427
17364
  type: string
15428
17365
  nullable: true
@@ -17892,6 +19829,13 @@ components:
17892
19829
  type: boolean
17893
19830
  default: false
17894
19831
  description: When true, creates a sub-org under the platform app's org
19832
+ app_id:
19833
+ type: string
19834
+ format: uuid
19835
+ description: |
19836
+ Required only when calling as a user (the dashboard wizard).
19837
+ A `plt_` key carries its app in the credential; a user does not,
19838
+ so the app is named here and checked against the caller's org.
17895
19839
 
17896
19840
  PlatformUserResponse:
17897
19841
  type: object