@1claw/openapi-spec 0.61.17 → 0.61.19

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 +981 -1
  2. package/openapi.yaml +591 -1
  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.61.17"
5
+ version: "0.61.19"
6
6
  description: |
7
7
  Secure secret management for AI agents. Provides vaults, secrets,
8
8
  policy-based access control, agent identity, Intents API,
@@ -80,6 +80,8 @@ tags:
80
80
  description: Multi-sig treasury wallets (Safe) and agent access requests
81
81
  - name: Treasury Wallets
82
82
  description: Multi-chain wallet generation for human users (replaces CDP embedded wallets)
83
+ - name: Key Custody
84
+ description: Customer-held key shares for non-custodial (threshold) signing keys
83
85
  - name: Admin
84
86
  description: Platform administration
85
87
  - name: Health
@@ -801,6 +803,13 @@ paths:
801
803
  type: string
802
804
  created_at:
803
805
  type: string
806
+ prf_supported:
807
+ type: boolean
808
+ nullable: true
809
+ description: |
810
+ `true` — can hold a wallet share (WebAuthn PRF).
811
+ `false` — cannot. `null` — registered before this
812
+ was captured.
804
813
 
805
814
  /v1/auth/passkeys/{passkey_id}:
806
815
  delete:
@@ -5442,6 +5451,497 @@ paths:
5442
5451
  # Treasury Wallets (multi-chain key generation for human users)
5443
5452
  # ---------------------------------------------------------------------------
5444
5453
 
5454
+ /v1/keys/{key_id}/client-share:
5455
+ parameters:
5456
+ - name: key_id
5457
+ in: path
5458
+ required: true
5459
+ description: A treasury wallet id or an agent signing key id owned by the caller's org
5460
+ schema:
5461
+ type: string
5462
+ format: uuid
5463
+ put:
5464
+ tags: [Key Custody]
5465
+ summary: Store the customer's wrapped share of a threshold key
5466
+ description: |
5467
+ Stores ciphertext the vault cannot open: the customer's share of a
5468
+ 2-party threshold signing key, wrapped in the browser under the
5469
+ passkey's WebAuthn PRF output (`passkey_prf`, one wrap per credential)
5470
+ or under a recovery code (`recovery_code`, one per key). The vault
5471
+ keeps the blob and its salt and returns them only to the owning user.
5472
+ Human users only; the passkey must have reported PRF support at
5473
+ registration. Idempotent per (key, credential).
5474
+ operationId: putClientKeyShare
5475
+ security:
5476
+ - BearerAuth: []
5477
+ requestBody:
5478
+ required: true
5479
+ content:
5480
+ application/json:
5481
+ schema:
5482
+ $ref: "#/components/schemas/PutClientShareRequest"
5483
+ responses:
5484
+ "201":
5485
+ description: Share stored
5486
+ content:
5487
+ application/json:
5488
+ schema:
5489
+ $ref: "#/components/schemas/ClientShareResponse"
5490
+ "400":
5491
+ $ref: "#/components/responses/BadRequest"
5492
+ "401":
5493
+ $ref: "#/components/responses/Unauthorized"
5494
+ "403":
5495
+ $ref: "#/components/responses/Forbidden"
5496
+ "404":
5497
+ $ref: "#/components/responses/NotFound"
5498
+ get:
5499
+ tags: [Key Custody]
5500
+ summary: List the caller's wrapped shares for a key
5501
+ description: |
5502
+ Returns every wrap on file for this key, unopened, to the user who
5503
+ stored them. `custody` tells you whether the key is `server` (1claw
5504
+ holds the whole private key) or `client_tss` (threshold; neither party
5505
+ can sign alone). Funding a `client_tss` wallet needs at least two wraps.
5506
+ operationId: listClientKeyShares
5507
+ security:
5508
+ - BearerAuth: []
5509
+ responses:
5510
+ "200":
5511
+ description: Wraps on file
5512
+ content:
5513
+ application/json:
5514
+ schema:
5515
+ $ref: "#/components/schemas/ClientShareListResponse"
5516
+ "401":
5517
+ $ref: "#/components/responses/Unauthorized"
5518
+ "403":
5519
+ $ref: "#/components/responses/Forbidden"
5520
+ "404":
5521
+ $ref: "#/components/responses/NotFound"
5522
+
5523
+ /v1/keys/{key_id}/client-share/rewrap:
5524
+ parameters:
5525
+ - name: key_id
5526
+ in: path
5527
+ required: true
5528
+ schema:
5529
+ type: string
5530
+ format: uuid
5531
+ post:
5532
+ tags: [Key Custody]
5533
+ summary: Add a wrap for another credential or the recovery code
5534
+ description: |
5535
+ Same write as `PUT …/client-share`, for a key that already has at
5536
+ least one wrap: the browser, holding the share in memory during a
5537
+ passkey session, re-wraps it under a newly added passkey's PRF
5538
+ output or under the recovery code. 409 if no wrap exists yet.
5539
+ operationId: rewrapClientKeyShare
5540
+ security:
5541
+ - BearerAuth: []
5542
+ requestBody:
5543
+ required: true
5544
+ content:
5545
+ application/json:
5546
+ schema:
5547
+ $ref: "#/components/schemas/PutClientShareRequest"
5548
+ responses:
5549
+ "201":
5550
+ description: Wrap added
5551
+ content:
5552
+ application/json:
5553
+ schema:
5554
+ $ref: "#/components/schemas/ClientShareResponse"
5555
+ "400":
5556
+ $ref: "#/components/responses/BadRequest"
5557
+ "401":
5558
+ $ref: "#/components/responses/Unauthorized"
5559
+ "403":
5560
+ $ref: "#/components/responses/Forbidden"
5561
+ "404":
5562
+ $ref: "#/components/responses/NotFound"
5563
+ "409":
5564
+ $ref: "#/components/responses/Conflict"
5565
+
5566
+ /v1/keys/{key_id}/client-share/{share_id}:
5567
+ parameters:
5568
+ - name: key_id
5569
+ in: path
5570
+ required: true
5571
+ schema:
5572
+ type: string
5573
+ format: uuid
5574
+ - name: share_id
5575
+ in: path
5576
+ required: true
5577
+ schema:
5578
+ type: string
5579
+ format: uuid
5580
+ delete:
5581
+ tags: [Key Custody]
5582
+ summary: Remove one wrap
5583
+ description: |
5584
+ Deletes a single wrap. Wraps tied to a passkey are also removed when
5585
+ that passkey is deleted. Removing the last wrap of a `client_tss` key
5586
+ makes the key unrecoverable — the vault holds only its own share.
5587
+ operationId: deleteClientKeyShare
5588
+ security:
5589
+ - BearerAuth: []
5590
+ responses:
5591
+ "204":
5592
+ description: Wrap removed
5593
+ "401":
5594
+ $ref: "#/components/responses/Unauthorized"
5595
+ "403":
5596
+ $ref: "#/components/responses/Forbidden"
5597
+ "404":
5598
+ $ref: "#/components/responses/NotFound"
5599
+
5600
+ /v1/keys/tss/keygen/begin:
5601
+ post:
5602
+ tags: [Key Custody]
5603
+ summary: Start a 2-party threshold key generation
5604
+ description: |
5605
+ Begins a distributed key generation between the vault (party 1) and the
5606
+ caller's browser (party 2, `@1claw/tss-wasm`). The result is a
5607
+ `custody: client_tss` treasury wallet whose private key never exists
5608
+ anywhere: the vault keeps one FROST share, the caller keeps the other,
5609
+ wrapped under their passkey's PRF output. Requires a passkey with
5610
+ `prf_supported: true` and no active wallet on the chain. Chains: `solana`
5611
+ (Ed25519). Sessions expire after 10 minutes.
5612
+ operationId: tssKeygenBegin
5613
+ security:
5614
+ - BearerAuth: []
5615
+ requestBody:
5616
+ required: true
5617
+ content:
5618
+ application/json:
5619
+ schema:
5620
+ type: object
5621
+ required: [chain]
5622
+ properties:
5623
+ chain:
5624
+ type: string
5625
+ enum: [solana]
5626
+ responses:
5627
+ "201":
5628
+ description: Session opened; the vault's round-1 package
5629
+ content:
5630
+ application/json:
5631
+ schema:
5632
+ type: object
5633
+ properties:
5634
+ session_id: { type: string, format: uuid }
5635
+ chain: { type: string }
5636
+ curve: { type: string }
5637
+ server_identifier: { type: integer, example: 1 }
5638
+ client_identifier: { type: integer, example: 2 }
5639
+ server_round1:
5640
+ type: string
5641
+ description: Base64 FROST DKG round-1 package.
5642
+ expires_at: { type: string, format: date-time }
5643
+ "400":
5644
+ $ref: "#/components/responses/BadRequest"
5645
+ "401":
5646
+ $ref: "#/components/responses/Unauthorized"
5647
+ "403":
5648
+ $ref: "#/components/responses/Forbidden"
5649
+ "409":
5650
+ $ref: "#/components/responses/Conflict"
5651
+
5652
+ /v1/keys/tss/keygen/round2:
5653
+ post:
5654
+ tags: [Key Custody]
5655
+ summary: Threshold key generation, round 2
5656
+ operationId: tssKeygenRound2
5657
+ security:
5658
+ - BearerAuth: []
5659
+ requestBody:
5660
+ required: true
5661
+ content:
5662
+ application/json:
5663
+ schema:
5664
+ type: object
5665
+ required: [session_id, client_round1]
5666
+ properties:
5667
+ session_id: { type: string, format: uuid }
5668
+ client_round1:
5669
+ type: string
5670
+ description: Base64 FROST DKG round-1 package from the browser.
5671
+ responses:
5672
+ "200":
5673
+ description: The vault's round-2 package, addressed to the caller
5674
+ content:
5675
+ application/json:
5676
+ schema:
5677
+ type: object
5678
+ properties:
5679
+ session_id: { type: string, format: uuid }
5680
+ server_round2: { type: string }
5681
+ "400":
5682
+ $ref: "#/components/responses/BadRequest"
5683
+ "401":
5684
+ $ref: "#/components/responses/Unauthorized"
5685
+ "404":
5686
+ $ref: "#/components/responses/NotFound"
5687
+ "409":
5688
+ $ref: "#/components/responses/Conflict"
5689
+
5690
+ /v1/keys/tss/keygen/complete:
5691
+ post:
5692
+ tags: [Key Custody]
5693
+ summary: Threshold key generation, final round
5694
+ description: |
5695
+ Needs `X-Passkey-Token` from a tx-assert with `action: tss_keygen` and
5696
+ `tx_digest` = hex SHA-256 of the session id. Creates the `client_tss`
5697
+ wallet and returns its address. The browser derives the same public key
5698
+ package from the packages it already holds; store your share with
5699
+ `PUT /v1/keys/{key_id}/client-share` next.
5700
+ operationId: tssKeygenComplete
5701
+ security:
5702
+ - BearerAuth: []
5703
+ parameters:
5704
+ - name: X-Passkey-Token
5705
+ in: header
5706
+ required: true
5707
+ schema: { type: string }
5708
+ requestBody:
5709
+ required: true
5710
+ content:
5711
+ application/json:
5712
+ schema:
5713
+ type: object
5714
+ required: [session_id, client_round2]
5715
+ properties:
5716
+ session_id: { type: string, format: uuid }
5717
+ client_round2:
5718
+ type: string
5719
+ description: Base64 FROST DKG round-2 package from the browser, addressed to the vault.
5720
+ responses:
5721
+ "201":
5722
+ description: Wallet created
5723
+ content:
5724
+ application/json:
5725
+ schema:
5726
+ type: object
5727
+ properties:
5728
+ key_id: { type: string, format: uuid }
5729
+ chain: { type: string }
5730
+ curve: { type: string }
5731
+ custody: { type: string, enum: [client_tss] }
5732
+ address: { type: string }
5733
+ public_key_hex: { type: string }
5734
+ public_key_package: { type: string, description: Base64 FROST public key package. }
5735
+ "400":
5736
+ $ref: "#/components/responses/BadRequest"
5737
+ "401":
5738
+ $ref: "#/components/responses/Unauthorized"
5739
+ "403":
5740
+ $ref: "#/components/responses/Forbidden"
5741
+ "404":
5742
+ $ref: "#/components/responses/NotFound"
5743
+ "409":
5744
+ $ref: "#/components/responses/Conflict"
5745
+
5746
+ /v1/keys/{key_id}/tss/sign/begin:
5747
+ parameters:
5748
+ - name: key_id
5749
+ in: path
5750
+ required: true
5751
+ schema: { type: string, format: uuid }
5752
+ post:
5753
+ tags: [Key Custody]
5754
+ summary: Threshold signing, round 1
5755
+ description: |
5756
+ Needs `X-Passkey-Token` from a tx-assert with `action: tss_sign` and
5757
+ `tx_digest` = hex SHA-256 of `message`. The message must be a decodable
5758
+ Solana transaction message; every transfer destination in it is checked
5759
+ against the OFAC SDN list before the vault commits. Returns the vault's
5760
+ signing commitments; nonces are single-use and expire with the session.
5761
+ operationId: tssSignBegin
5762
+ security:
5763
+ - BearerAuth: []
5764
+ parameters:
5765
+ - name: X-Passkey-Token
5766
+ in: header
5767
+ required: true
5768
+ schema: { type: string }
5769
+ requestBody:
5770
+ required: true
5771
+ content:
5772
+ application/json:
5773
+ schema:
5774
+ type: object
5775
+ required: [message]
5776
+ properties:
5777
+ message:
5778
+ type: string
5779
+ description: Base64 bytes to sign (the serialised transaction message).
5780
+ responses:
5781
+ "201":
5782
+ description: Session opened
5783
+ content:
5784
+ application/json:
5785
+ schema:
5786
+ type: object
5787
+ properties:
5788
+ session_id: { type: string, format: uuid }
5789
+ key_id: { type: string, format: uuid }
5790
+ message_digest: { type: string }
5791
+ server_commitments: { type: string }
5792
+ expires_at: { type: string, format: date-time }
5793
+ "400":
5794
+ $ref: "#/components/responses/BadRequest"
5795
+ "401":
5796
+ $ref: "#/components/responses/Unauthorized"
5797
+ "403":
5798
+ $ref: "#/components/responses/Forbidden"
5799
+ "404":
5800
+ $ref: "#/components/responses/NotFound"
5801
+
5802
+ /v1/keys/{key_id}/tss/sign/complete:
5803
+ parameters:
5804
+ - name: key_id
5805
+ in: path
5806
+ required: true
5807
+ schema: { type: string, format: uuid }
5808
+ post:
5809
+ tags: [Key Custody]
5810
+ summary: Threshold signing, round 2 — aggregate and return the signature
5811
+ description: |
5812
+ The vault produces its share, verifies the caller's, aggregates, and
5813
+ verifies the result under the group key before returning it. A bad
5814
+ share is a `400`, never a published signature.
5815
+ operationId: tssSignComplete
5816
+ security:
5817
+ - BearerAuth: []
5818
+ requestBody:
5819
+ required: true
5820
+ content:
5821
+ application/json:
5822
+ schema:
5823
+ type: object
5824
+ required: [session_id, client_commitments, client_signature_share]
5825
+ properties:
5826
+ session_id: { type: string, format: uuid }
5827
+ client_commitments: { type: string }
5828
+ client_signature_share: { type: string }
5829
+ responses:
5830
+ "200":
5831
+ description: Signature
5832
+ content:
5833
+ application/json:
5834
+ schema:
5835
+ type: object
5836
+ properties:
5837
+ key_id: { type: string, format: uuid }
5838
+ message_digest: { type: string }
5839
+ signature: { type: string, description: Base64 64-byte Ed25519 signature. }
5840
+ signature_hex: { type: string }
5841
+ "400":
5842
+ $ref: "#/components/responses/BadRequest"
5843
+ "401":
5844
+ $ref: "#/components/responses/Unauthorized"
5845
+ "404":
5846
+ $ref: "#/components/responses/NotFound"
5847
+ "409":
5848
+ $ref: "#/components/responses/Conflict"
5849
+
5850
+ /v1/treasury/wallets/{chain}/tss/prepare:
5851
+ parameters:
5852
+ - name: chain
5853
+ in: path
5854
+ required: true
5855
+ schema: { type: string }
5856
+ post:
5857
+ tags: [Key Custody]
5858
+ summary: Build the unsigned message for a send from a client_tss wallet
5859
+ description: |
5860
+ Runs wallet access, the sanctions screen and spend policies on the
5861
+ declared destination, fetches a recent blockhash and returns the
5862
+ unsigned transaction message. Sign it with `/v1/keys/{key_id}/tss/sign/*`
5863
+ and submit with `…/tss/broadcast`.
5864
+ operationId: tssTreasuryPrepare
5865
+ security:
5866
+ - BearerAuth: []
5867
+ requestBody:
5868
+ required: true
5869
+ content:
5870
+ application/json:
5871
+ schema:
5872
+ type: object
5873
+ required: [to, value]
5874
+ properties:
5875
+ to: { type: string }
5876
+ value: { type: string, description: Major units, e.g. "0.5". }
5877
+ memo: { type: string }
5878
+ responses:
5879
+ "200":
5880
+ description: Unsigned message
5881
+ content:
5882
+ application/json:
5883
+ schema:
5884
+ type: object
5885
+ properties:
5886
+ key_id: { type: string, format: uuid }
5887
+ chain: { type: string }
5888
+ from: { type: string }
5889
+ to: { type: string }
5890
+ value_base_units: { type: string }
5891
+ recent_blockhash: { type: string }
5892
+ message: { type: string }
5893
+ message_digest: { type: string }
5894
+ "400":
5895
+ $ref: "#/components/responses/BadRequest"
5896
+ "401":
5897
+ $ref: "#/components/responses/Unauthorized"
5898
+ "403":
5899
+ $ref: "#/components/responses/Forbidden"
5900
+ "404":
5901
+ $ref: "#/components/responses/NotFound"
5902
+
5903
+ /v1/treasury/wallets/{chain}/tss/broadcast:
5904
+ parameters:
5905
+ - name: chain
5906
+ in: path
5907
+ required: true
5908
+ schema: { type: string }
5909
+ post:
5910
+ tags: [Key Custody]
5911
+ summary: Broadcast a threshold-signed send
5912
+ description: |
5913
+ Verifies the signature under the wallet's public key over exactly this
5914
+ message, checks `to` is a transfer destination inside it, assembles the
5915
+ transaction and submits it. Audited as `treasury_wallet.send`.
5916
+ operationId: tssTreasuryBroadcast
5917
+ security:
5918
+ - BearerAuth: []
5919
+ requestBody:
5920
+ required: true
5921
+ content:
5922
+ application/json:
5923
+ schema:
5924
+ type: object
5925
+ required: [message, signature, to, value_base_units]
5926
+ properties:
5927
+ message: { type: string }
5928
+ signature: { type: string }
5929
+ to: { type: string }
5930
+ value_base_units: { type: string }
5931
+ responses:
5932
+ "200":
5933
+ description: Broadcast
5934
+ content:
5935
+ application/json:
5936
+ schema:
5937
+ $ref: "#/components/schemas/TreasuryWalletSendResponse"
5938
+ "400":
5939
+ $ref: "#/components/responses/BadRequest"
5940
+ "401":
5941
+ $ref: "#/components/responses/Unauthorized"
5942
+ "404":
5943
+ $ref: "#/components/responses/NotFound"
5944
+
5445
5945
  /v1/treasury/wallets/generate:
5446
5946
  post:
5447
5947
  tags: [Treasury Wallets]
@@ -20764,6 +21264,12 @@ components:
20764
21264
  type: string
20765
21265
  format: date-time
20766
21266
  nullable: true
21267
+ custody:
21268
+ type: string
21269
+ enum: [server, client_tss]
21270
+ description: |
21271
+ `server` — 1claw holds the whole private key and can sign alone.
21272
+ `client_tss` — 2-party threshold key; the customer's passkey share is required.
20767
21273
 
20768
21274
  SigningKeyListResponse:
20769
21275
  type: object
@@ -22537,6 +23043,12 @@ components:
22537
23043
  created_at:
22538
23044
  type: string
22539
23045
  format: date-time
23046
+ custody:
23047
+ type: string
23048
+ enum: [server, client_tss]
23049
+ description: |
23050
+ `server` — 1claw holds the whole private key and can sign alone.
23051
+ `client_tss` — 2-party threshold key; the customer's passkey share is required.
22540
23052
 
22541
23053
  TreasuryWalletListResponse:
22542
23054
  type: object
@@ -24912,6 +25424,84 @@ components:
24912
25424
  type: string
24913
25425
  name:
24914
25426
  type: string
25427
+ prf_supported:
25428
+ type: boolean
25429
+ nullable: true
25430
+ description: |
25431
+ `prf.enabled` from `credential.getClientExtensionResults()` —
25432
+ whether this authenticator can derive the secret that wraps a
25433
+ wallet share. Omit if the client did not request the extension.
25434
+
25435
+ PutClientShareRequest:
25436
+ type: object
25437
+ required: [wrap_kind, wrapped_share, salt]
25438
+ properties:
25439
+ wrap_kind:
25440
+ type: string
25441
+ enum: [passkey_prf, recovery_code]
25442
+ credential_id:
25443
+ type: string
25444
+ format: uuid
25445
+ nullable: true
25446
+ description: Required for `passkey_prf`; the passkey id from `GET /v1/auth/passkeys`.
25447
+ wrapped_share:
25448
+ type: string
25449
+ description: Base64 ciphertext (≤ 4 KiB). Opaque to the vault.
25450
+ salt:
25451
+ type: string
25452
+ description: Base64 PRF salt, 16–64 random bytes, one per key.
25453
+
25454
+ ClientShareResponse:
25455
+ type: object
25456
+ properties:
25457
+ id:
25458
+ type: string
25459
+ format: uuid
25460
+ key_id:
25461
+ type: string
25462
+ format: uuid
25463
+ key_kind:
25464
+ type: string
25465
+ enum: [agent_signing_key, treasury_wallet]
25466
+ wrap_kind:
25467
+ type: string
25468
+ enum: [passkey_prf, recovery_code]
25469
+ credential_id:
25470
+ type: string
25471
+ format: uuid
25472
+ nullable: true
25473
+ wrapped_share:
25474
+ type: string
25475
+ description: Base64, exactly as stored.
25476
+ salt:
25477
+ type: string
25478
+ description: Base64.
25479
+ created_at:
25480
+ type: string
25481
+ format: date-time
25482
+ updated_at:
25483
+ type: string
25484
+ format: date-time
25485
+
25486
+ ClientShareListResponse:
25487
+ type: object
25488
+ properties:
25489
+ key_id:
25490
+ type: string
25491
+ format: uuid
25492
+ key_kind:
25493
+ type: string
25494
+ enum: [agent_signing_key, treasury_wallet]
25495
+ custody:
25496
+ type: string
25497
+ enum: [server, client_tss]
25498
+ description: |
25499
+ `server` — 1claw holds the whole private key and can sign alone.
25500
+ `client_tss` — 2-party threshold key; the customer's share is required.
25501
+ shares:
25502
+ type: array
25503
+ items:
25504
+ $ref: "#/components/schemas/ClientShareResponse"
24915
25505
 
24916
25506
  PasskeyRegisterCompleteResponse:
24917
25507
  type: object
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1claw/openapi-spec",
3
- "version": "0.61.17",
3
+ "version": "0.61.19",
4
4
  "description": "OpenAPI 3.1.0 specification for the 1Claw Vault API \u2014 generate clients in any language",
5
5
  "license": "MIT",
6
6
  "repository": {