@1claw/openapi-spec 0.61.19 → 0.61.21

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 +1156 -192
  2. package/openapi.yaml +514 -2
  3. package/package.json +1 -1
package/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "1Claw API",
5
- "version": "0.61.19",
5
+ "version": "0.61.21",
6
6
  "description": "Secure secret management for AI agents. Provides vaults, secrets,\npolicy-based access control, agent identity, Intents API,\nsharing, billing, and audit logging. Automations (workflow_spec,\nwebhook tokens, event triggers, Assist), cloud runtimes with\ninteractive shell sessions, agent memory, and discovery.\n\n## Domains\n\n`api.1claw.co` is canonical: it is the OIDC issuer, the `aud` the API\nmints, and the first entry in `servers` — a generated client takes its\nbase URL from there, and the previous ordering pointed every SDK at the\ndomain the issuer had already left. `api.1claw.xyz` still answers and is\nstill accepted on token validation, because tokens minted before the\nmove carry it; it is never minted now.\n\nOne deliberate exception: the Shroud attestation identity token is\nrequested from GCP with `audience: https://api.1claw.xyz`, so\n`/v1/shroud/attestation` reports that as its `expected_audience`. That\nis accurate rather than stale — the audience is a verification contract\nwith anyone already checking the token, and moving it is a breaking\nchange for them, not a rename.\n\nAll endpoints require JWT Bearer authentication unless marked with\n`security: []`.\n",
7
7
  "contact": {
8
8
  "email": "ops@1claw.co"
@@ -8657,6 +8657,11 @@
8657
8657
  "enum": [
8658
8658
  "solana"
8659
8659
  ]
8660
+ },
8661
+ "replace_existing": {
8662
+ "type": "boolean",
8663
+ "default": false,
8664
+ "description": "Re-key ceremony: replace the active server-custody wallet on\nthis chain. On `complete` its balance is swept to the new\naddress by the old key's last signature and the old wallet is\ndeactivated (audit `treasury_wallet.rekeyed`).\n"
8660
8665
  }
8661
8666
  }
8662
8667
  }
@@ -8991,10 +8996,1037 @@
8991
8996
  }
8992
8997
  }
8993
8998
  },
8994
- "/v1/keys/{key_id}/tss/sign/complete": {
8999
+ "/v1/keys/{key_id}/tss/sign/complete": {
9000
+ "parameters": [
9001
+ {
9002
+ "name": "key_id",
9003
+ "in": "path",
9004
+ "required": true,
9005
+ "schema": {
9006
+ "type": "string",
9007
+ "format": "uuid"
9008
+ }
9009
+ }
9010
+ ],
9011
+ "post": {
9012
+ "tags": [
9013
+ "Key Custody"
9014
+ ],
9015
+ "summary": "Threshold signing, round 2 — aggregate and return the signature",
9016
+ "description": "The vault produces its share, verifies the caller's, aggregates, and\nverifies the result under the group key before returning it. A bad\nshare is a `400`, never a published signature.\n",
9017
+ "operationId": "tssSignComplete",
9018
+ "security": [
9019
+ {
9020
+ "BearerAuth": []
9021
+ }
9022
+ ],
9023
+ "requestBody": {
9024
+ "required": true,
9025
+ "content": {
9026
+ "application/json": {
9027
+ "schema": {
9028
+ "type": "object",
9029
+ "required": [
9030
+ "session_id",
9031
+ "client_commitments",
9032
+ "client_signature_share"
9033
+ ],
9034
+ "properties": {
9035
+ "session_id": {
9036
+ "type": "string",
9037
+ "format": "uuid"
9038
+ },
9039
+ "client_commitments": {
9040
+ "type": "string"
9041
+ },
9042
+ "client_signature_share": {
9043
+ "type": "string"
9044
+ }
9045
+ }
9046
+ }
9047
+ }
9048
+ }
9049
+ },
9050
+ "responses": {
9051
+ "200": {
9052
+ "description": "Signature",
9053
+ "content": {
9054
+ "application/json": {
9055
+ "schema": {
9056
+ "type": "object",
9057
+ "properties": {
9058
+ "key_id": {
9059
+ "type": "string",
9060
+ "format": "uuid"
9061
+ },
9062
+ "message_digest": {
9063
+ "type": "string"
9064
+ },
9065
+ "signature": {
9066
+ "type": "string",
9067
+ "description": "Base64 64-byte Ed25519 signature."
9068
+ },
9069
+ "signature_hex": {
9070
+ "type": "string"
9071
+ }
9072
+ }
9073
+ }
9074
+ }
9075
+ }
9076
+ },
9077
+ "400": {
9078
+ "$ref": "#/components/responses/BadRequest"
9079
+ },
9080
+ "401": {
9081
+ "$ref": "#/components/responses/Unauthorized"
9082
+ },
9083
+ "404": {
9084
+ "$ref": "#/components/responses/NotFound"
9085
+ },
9086
+ "409": {
9087
+ "$ref": "#/components/responses/Conflict"
9088
+ }
9089
+ }
9090
+ }
9091
+ },
9092
+ "/v1/treasury/wallets/{chain}/tss/prepare": {
9093
+ "parameters": [
9094
+ {
9095
+ "name": "chain",
9096
+ "in": "path",
9097
+ "required": true,
9098
+ "schema": {
9099
+ "type": "string"
9100
+ }
9101
+ }
9102
+ ],
9103
+ "post": {
9104
+ "tags": [
9105
+ "Key Custody"
9106
+ ],
9107
+ "summary": "Build the unsigned message for a send from a client_tss wallet",
9108
+ "description": "Runs wallet access, the sanctions screen and spend policies on the\ndeclared destination, fetches a recent blockhash and returns the\nunsigned transaction message. Sign it with `/v1/keys/{key_id}/tss/sign/*`\nand submit with `…/tss/broadcast`.\n",
9109
+ "operationId": "tssTreasuryPrepare",
9110
+ "security": [
9111
+ {
9112
+ "BearerAuth": []
9113
+ }
9114
+ ],
9115
+ "requestBody": {
9116
+ "required": true,
9117
+ "content": {
9118
+ "application/json": {
9119
+ "schema": {
9120
+ "type": "object",
9121
+ "required": [
9122
+ "to",
9123
+ "value"
9124
+ ],
9125
+ "properties": {
9126
+ "to": {
9127
+ "type": "string"
9128
+ },
9129
+ "value": {
9130
+ "type": "string",
9131
+ "description": "Major units",
9132
+ "e.g. \"0.5\".": null
9133
+ },
9134
+ "memo": {
9135
+ "type": "string"
9136
+ }
9137
+ }
9138
+ }
9139
+ }
9140
+ }
9141
+ },
9142
+ "responses": {
9143
+ "200": {
9144
+ "description": "Unsigned message",
9145
+ "content": {
9146
+ "application/json": {
9147
+ "schema": {
9148
+ "type": "object",
9149
+ "properties": {
9150
+ "key_id": {
9151
+ "type": "string",
9152
+ "format": "uuid"
9153
+ },
9154
+ "chain": {
9155
+ "type": "string"
9156
+ },
9157
+ "from": {
9158
+ "type": "string"
9159
+ },
9160
+ "to": {
9161
+ "type": "string"
9162
+ },
9163
+ "value_base_units": {
9164
+ "type": "string"
9165
+ },
9166
+ "recent_blockhash": {
9167
+ "type": "string"
9168
+ },
9169
+ "message": {
9170
+ "type": "string"
9171
+ },
9172
+ "message_digest": {
9173
+ "type": "string"
9174
+ }
9175
+ }
9176
+ }
9177
+ }
9178
+ }
9179
+ },
9180
+ "400": {
9181
+ "$ref": "#/components/responses/BadRequest"
9182
+ },
9183
+ "401": {
9184
+ "$ref": "#/components/responses/Unauthorized"
9185
+ },
9186
+ "403": {
9187
+ "$ref": "#/components/responses/Forbidden"
9188
+ },
9189
+ "404": {
9190
+ "$ref": "#/components/responses/NotFound"
9191
+ }
9192
+ }
9193
+ }
9194
+ },
9195
+ "/v1/treasury/wallets/{chain}/tss/broadcast": {
9196
+ "parameters": [
9197
+ {
9198
+ "name": "chain",
9199
+ "in": "path",
9200
+ "required": true,
9201
+ "schema": {
9202
+ "type": "string"
9203
+ }
9204
+ }
9205
+ ],
9206
+ "post": {
9207
+ "tags": [
9208
+ "Key Custody"
9209
+ ],
9210
+ "summary": "Broadcast a threshold-signed send",
9211
+ "description": "Verifies the signature under the wallet's public key over exactly this\nmessage, checks `to` is a transfer destination inside it, assembles the\ntransaction and submits it. Audited as `treasury_wallet.send`.\n",
9212
+ "operationId": "tssTreasuryBroadcast",
9213
+ "security": [
9214
+ {
9215
+ "BearerAuth": []
9216
+ }
9217
+ ],
9218
+ "requestBody": {
9219
+ "required": true,
9220
+ "content": {
9221
+ "application/json": {
9222
+ "schema": {
9223
+ "type": "object",
9224
+ "required": [
9225
+ "message",
9226
+ "signature",
9227
+ "to",
9228
+ "value_base_units"
9229
+ ],
9230
+ "properties": {
9231
+ "message": {
9232
+ "type": "string"
9233
+ },
9234
+ "signature": {
9235
+ "type": "string"
9236
+ },
9237
+ "to": {
9238
+ "type": "string"
9239
+ },
9240
+ "value_base_units": {
9241
+ "type": "string"
9242
+ }
9243
+ }
9244
+ }
9245
+ }
9246
+ }
9247
+ },
9248
+ "responses": {
9249
+ "200": {
9250
+ "description": "Broadcast",
9251
+ "content": {
9252
+ "application/json": {
9253
+ "schema": {
9254
+ "$ref": "#/components/schemas/TreasuryWalletSendResponse"
9255
+ }
9256
+ }
9257
+ }
9258
+ },
9259
+ "400": {
9260
+ "$ref": "#/components/responses/BadRequest"
9261
+ },
9262
+ "401": {
9263
+ "$ref": "#/components/responses/Unauthorized"
9264
+ },
9265
+ "404": {
9266
+ "$ref": "#/components/responses/NotFound"
9267
+ }
9268
+ }
9269
+ }
9270
+ },
9271
+ "/v1/runtimes/{runtime_id}/tss/holder": {
9272
+ "parameters": [
9273
+ {
9274
+ "name": "runtime_id",
9275
+ "in": "path",
9276
+ "required": true,
9277
+ "schema": {
9278
+ "type": "string",
9279
+ "format": "uuid"
9280
+ }
9281
+ }
9282
+ ],
9283
+ "post": {
9284
+ "tags": [
9285
+ "Key Custody"
9286
+ ],
9287
+ "summary": "Register the runtime's sidecar as a share holder",
9288
+ "description": "Called by the runtime's agent (the Shroud sidecar, at boot) with the P-256\npublic key it generated. The owner can then provision a threshold-key\nshare to this runtime, letting the agent co-sign below-cap sends\nunattended. Re-registering replaces the key; deleting the runtime revokes\nevery share held by it.\n",
9289
+ "operationId": "registerTssHolder",
9290
+ "security": [
9291
+ {
9292
+ "BearerAuth": []
9293
+ }
9294
+ ],
9295
+ "requestBody": {
9296
+ "required": true,
9297
+ "content": {
9298
+ "application/json": {
9299
+ "schema": {
9300
+ "type": "object",
9301
+ "required": [
9302
+ "public_key"
9303
+ ],
9304
+ "properties": {
9305
+ "public_key": {
9306
+ "type": "string",
9307
+ "description": "Base64 SEC1 uncompressed P-256 point (65 bytes)."
9308
+ }
9309
+ }
9310
+ }
9311
+ }
9312
+ }
9313
+ },
9314
+ "responses": {
9315
+ "201": {
9316
+ "description": "Registered",
9317
+ "content": {
9318
+ "application/json": {
9319
+ "schema": {
9320
+ "$ref": "#/components/schemas/TssHolder"
9321
+ }
9322
+ }
9323
+ }
9324
+ },
9325
+ "400": {
9326
+ "$ref": "#/components/responses/BadRequest"
9327
+ },
9328
+ "401": {
9329
+ "$ref": "#/components/responses/Unauthorized"
9330
+ },
9331
+ "403": {
9332
+ "$ref": "#/components/responses/Forbidden"
9333
+ },
9334
+ "404": {
9335
+ "$ref": "#/components/responses/NotFound"
9336
+ }
9337
+ }
9338
+ },
9339
+ "get": {
9340
+ "tags": [
9341
+ "Key Custody"
9342
+ ],
9343
+ "summary": "The runtime's registered share holder",
9344
+ "operationId": "getTssHolder",
9345
+ "security": [
9346
+ {
9347
+ "BearerAuth": []
9348
+ }
9349
+ ],
9350
+ "responses": {
9351
+ "200": {
9352
+ "description": "Holder",
9353
+ "content": {
9354
+ "application/json": {
9355
+ "schema": {
9356
+ "$ref": "#/components/schemas/TssHolder"
9357
+ }
9358
+ }
9359
+ }
9360
+ },
9361
+ "401": {
9362
+ "$ref": "#/components/responses/Unauthorized"
9363
+ },
9364
+ "404": {
9365
+ "$ref": "#/components/responses/NotFound"
9366
+ }
9367
+ }
9368
+ }
9369
+ },
9370
+ "/v1/keys/{key_id}/client-share/holder": {
9371
+ "parameters": [
9372
+ {
9373
+ "name": "key_id",
9374
+ "in": "path",
9375
+ "required": true,
9376
+ "schema": {
9377
+ "type": "string",
9378
+ "format": "uuid"
9379
+ }
9380
+ }
9381
+ ],
9382
+ "put": {
9383
+ "tags": [
9384
+ "Key Custody"
9385
+ ],
9386
+ "summary": "Provision a threshold-key share to a runtime holder",
9387
+ "description": "The owner's browser unlocks its share with the passkey PRF and re-wraps\nit to the holder's P-256 key (ECIES: ephemeral point ‖ iv ‖ AES-GCM). The\nvault stores the ciphertext unopened. The wallet must be delegated to the\nholder's agent. Audited as `client_share.provisioned_to_runtime`.\n",
9388
+ "operationId": "provisionTssHolderShare",
9389
+ "security": [
9390
+ {
9391
+ "BearerAuth": []
9392
+ }
9393
+ ],
9394
+ "requestBody": {
9395
+ "required": true,
9396
+ "content": {
9397
+ "application/json": {
9398
+ "schema": {
9399
+ "type": "object",
9400
+ "required": [
9401
+ "holder_id",
9402
+ "wrapped_share",
9403
+ "salt"
9404
+ ],
9405
+ "properties": {
9406
+ "holder_id": {
9407
+ "type": "string",
9408
+ "format": "uuid"
9409
+ },
9410
+ "wrapped_share": {
9411
+ "type": "string"
9412
+ },
9413
+ "salt": {
9414
+ "type": "string"
9415
+ }
9416
+ }
9417
+ }
9418
+ }
9419
+ }
9420
+ },
9421
+ "responses": {
9422
+ "201": {
9423
+ "description": "Stored"
9424
+ },
9425
+ "400": {
9426
+ "$ref": "#/components/responses/BadRequest"
9427
+ },
9428
+ "401": {
9429
+ "$ref": "#/components/responses/Unauthorized"
9430
+ },
9431
+ "403": {
9432
+ "$ref": "#/components/responses/Forbidden"
9433
+ },
9434
+ "404": {
9435
+ "$ref": "#/components/responses/NotFound"
9436
+ }
9437
+ }
9438
+ },
9439
+ "get": {
9440
+ "tags": [
9441
+ "Key Custody"
9442
+ ],
9443
+ "summary": "The sidecar fetches the wrap made for it",
9444
+ "description": "Agent-only; returns the wrap whose holder was registered by the calling agent.",
9445
+ "operationId": "getTssHolderShare",
9446
+ "security": [
9447
+ {
9448
+ "BearerAuth": []
9449
+ }
9450
+ ],
9451
+ "responses": {
9452
+ "200": {
9453
+ "description": "Wrapped share (opaque)",
9454
+ "content": {
9455
+ "application/json": {
9456
+ "schema": {
9457
+ "type": "object",
9458
+ "properties": {
9459
+ "key_id": {
9460
+ "type": "string",
9461
+ "format": "uuid"
9462
+ },
9463
+ "holder_id": {
9464
+ "type": "string",
9465
+ "format": "uuid"
9466
+ },
9467
+ "wrap_kind": {
9468
+ "type": "string",
9469
+ "enum": [
9470
+ "sidecar"
9471
+ ]
9472
+ },
9473
+ "wrapped_share": {
9474
+ "type": "string"
9475
+ },
9476
+ "salt": {
9477
+ "type": "string"
9478
+ }
9479
+ }
9480
+ }
9481
+ }
9482
+ }
9483
+ },
9484
+ "401": {
9485
+ "$ref": "#/components/responses/Unauthorized"
9486
+ },
9487
+ "403": {
9488
+ "$ref": "#/components/responses/Forbidden"
9489
+ },
9490
+ "404": {
9491
+ "$ref": "#/components/responses/NotFound"
9492
+ }
9493
+ }
9494
+ }
9495
+ },
9496
+ "/v1/agents/{agent_id}/tss/prepare": {
9497
+ "parameters": [
9498
+ {
9499
+ "name": "agent_id",
9500
+ "in": "path",
9501
+ "required": true,
9502
+ "schema": {
9503
+ "type": "string",
9504
+ "format": "uuid"
9505
+ }
9506
+ }
9507
+ ],
9508
+ "post": {
9509
+ "tags": [
9510
+ "Key Custody"
9511
+ ],
9512
+ "summary": "Agent declares a send from a delegated client_tss wallet",
9513
+ "description": "Runs the agent's guardrails (chains, allowlists, caps, daily limits,\napproval policy) and the sanctions screen on the declared call, builds\nthe unsigned message and records it as a prepared intent. Only a\nprepared message can enter `/tss/sign/begin`. Requires a treasury\ndelegation and a share provisioned to the agent's runtime.\n",
9514
+ "operationId": "agentTssPrepare",
9515
+ "security": [
9516
+ {
9517
+ "BearerAuth": []
9518
+ }
9519
+ ],
9520
+ "requestBody": {
9521
+ "required": true,
9522
+ "content": {
9523
+ "application/json": {
9524
+ "schema": {
9525
+ "type": "object",
9526
+ "required": [
9527
+ "key_id",
9528
+ "to",
9529
+ "value"
9530
+ ],
9531
+ "properties": {
9532
+ "key_id": {
9533
+ "type": "string",
9534
+ "format": "uuid"
9535
+ },
9536
+ "to": {
9537
+ "type": "string"
9538
+ },
9539
+ "value": {
9540
+ "type": "string",
9541
+ "description": "Major units."
9542
+ },
9543
+ "memo": {
9544
+ "type": "string"
9545
+ }
9546
+ }
9547
+ }
9548
+ }
9549
+ }
9550
+ },
9551
+ "responses": {
9552
+ "200": {
9553
+ "description": "Unsigned message"
9554
+ },
9555
+ "400": {
9556
+ "$ref": "#/components/responses/BadRequest"
9557
+ },
9558
+ "401": {
9559
+ "$ref": "#/components/responses/Unauthorized"
9560
+ },
9561
+ "403": {
9562
+ "$ref": "#/components/responses/Forbidden"
9563
+ },
9564
+ "404": {
9565
+ "$ref": "#/components/responses/NotFound"
9566
+ }
9567
+ }
9568
+ }
9569
+ },
9570
+ "/v1/agents/{agent_id}/tss/sign/begin": {
9571
+ "parameters": [
9572
+ {
9573
+ "name": "agent_id",
9574
+ "in": "path",
9575
+ "required": true,
9576
+ "schema": {
9577
+ "type": "string",
9578
+ "format": "uuid"
9579
+ }
9580
+ }
9581
+ ],
9582
+ "post": {
9583
+ "tags": [
9584
+ "Key Custody"
9585
+ ],
9586
+ "summary": "Agent threshold signing, round 1",
9587
+ "description": "The message must be a live prepared intent for this agent and key; its transfers are screened again.",
9588
+ "operationId": "agentTssSignBegin",
9589
+ "security": [
9590
+ {
9591
+ "BearerAuth": []
9592
+ }
9593
+ ],
9594
+ "requestBody": {
9595
+ "required": true,
9596
+ "content": {
9597
+ "application/json": {
9598
+ "schema": {
9599
+ "type": "object",
9600
+ "required": [
9601
+ "key_id",
9602
+ "message"
9603
+ ],
9604
+ "properties": {
9605
+ "key_id": {
9606
+ "type": "string",
9607
+ "format": "uuid"
9608
+ },
9609
+ "message": {
9610
+ "type": "string"
9611
+ }
9612
+ }
9613
+ }
9614
+ }
9615
+ }
9616
+ },
9617
+ "responses": {
9618
+ "201": {
9619
+ "description": "Session opened"
9620
+ },
9621
+ "401": {
9622
+ "$ref": "#/components/responses/Unauthorized"
9623
+ },
9624
+ "403": {
9625
+ "$ref": "#/components/responses/Forbidden"
9626
+ },
9627
+ "404": {
9628
+ "$ref": "#/components/responses/NotFound"
9629
+ }
9630
+ }
9631
+ }
9632
+ },
9633
+ "/v1/agents/{agent_id}/tss/sign/complete": {
9634
+ "parameters": [
9635
+ {
9636
+ "name": "agent_id",
9637
+ "in": "path",
9638
+ "required": true,
9639
+ "schema": {
9640
+ "type": "string",
9641
+ "format": "uuid"
9642
+ }
9643
+ }
9644
+ ],
9645
+ "post": {
9646
+ "tags": [
9647
+ "Key Custody"
9648
+ ],
9649
+ "summary": "Agent threshold signing, round 2",
9650
+ "operationId": "agentTssSignComplete",
9651
+ "security": [
9652
+ {
9653
+ "BearerAuth": []
9654
+ }
9655
+ ],
9656
+ "requestBody": {
9657
+ "required": true,
9658
+ "content": {
9659
+ "application/json": {
9660
+ "schema": {
9661
+ "type": "object",
9662
+ "required": [
9663
+ "session_id",
9664
+ "client_commitments",
9665
+ "client_signature_share"
9666
+ ],
9667
+ "properties": {
9668
+ "session_id": {
9669
+ "type": "string",
9670
+ "format": "uuid"
9671
+ },
9672
+ "client_commitments": {
9673
+ "type": "string"
9674
+ },
9675
+ "client_signature_share": {
9676
+ "type": "string"
9677
+ }
9678
+ }
9679
+ }
9680
+ }
9681
+ }
9682
+ },
9683
+ "responses": {
9684
+ "200": {
9685
+ "description": "Signature"
9686
+ },
9687
+ "400": {
9688
+ "$ref": "#/components/responses/BadRequest"
9689
+ },
9690
+ "401": {
9691
+ "$ref": "#/components/responses/Unauthorized"
9692
+ },
9693
+ "404": {
9694
+ "$ref": "#/components/responses/NotFound"
9695
+ },
9696
+ "409": {
9697
+ "$ref": "#/components/responses/Conflict"
9698
+ }
9699
+ }
9700
+ }
9701
+ },
9702
+ "/v1/agents/{agent_id}/tss/broadcast": {
9703
+ "parameters": [
9704
+ {
9705
+ "name": "agent_id",
9706
+ "in": "path",
9707
+ "required": true,
9708
+ "schema": {
9709
+ "type": "string",
9710
+ "format": "uuid"
9711
+ }
9712
+ }
9713
+ ],
9714
+ "post": {
9715
+ "tags": [
9716
+ "Key Custody"
9717
+ ],
9718
+ "summary": "Broadcast an agent's threshold-signed send",
9719
+ "description": "Verifies the signature under the wallet key, checks the message is the\nprepared one, re-runs the agent's guardrails, records the transaction\n(daily limits count it) and submits. Audited as `treasury_wallet.send`\nwith `via: runtime_share_holder`.\n",
9720
+ "operationId": "agentTssBroadcast",
9721
+ "security": [
9722
+ {
9723
+ "BearerAuth": []
9724
+ }
9725
+ ],
9726
+ "requestBody": {
9727
+ "required": true,
9728
+ "content": {
9729
+ "application/json": {
9730
+ "schema": {
9731
+ "type": "object",
9732
+ "required": [
9733
+ "key_id",
9734
+ "message",
9735
+ "signature"
9736
+ ],
9737
+ "properties": {
9738
+ "key_id": {
9739
+ "type": "string",
9740
+ "format": "uuid"
9741
+ },
9742
+ "message": {
9743
+ "type": "string"
9744
+ },
9745
+ "signature": {
9746
+ "type": "string"
9747
+ }
9748
+ }
9749
+ }
9750
+ }
9751
+ }
9752
+ },
9753
+ "responses": {
9754
+ "200": {
9755
+ "description": "Broadcast",
9756
+ "content": {
9757
+ "application/json": {
9758
+ "schema": {
9759
+ "$ref": "#/components/schemas/TreasuryWalletSendResponse"
9760
+ }
9761
+ }
9762
+ }
9763
+ },
9764
+ "400": {
9765
+ "$ref": "#/components/responses/BadRequest"
9766
+ },
9767
+ "401": {
9768
+ "$ref": "#/components/responses/Unauthorized"
9769
+ },
9770
+ "403": {
9771
+ "$ref": "#/components/responses/Forbidden"
9772
+ }
9773
+ }
9774
+ }
9775
+ },
9776
+ "/v1/treasury/passkey-safes": {
9777
+ "post": {
9778
+ "tags": [
9779
+ "Key Custody"
9780
+ ],
9781
+ "summary": "Create a Safe owned by your passkey",
9782
+ "description": "An EVM Safe (v1.4.1) whose only owner is Safe's WebAuthn shared signer,\nconfigured with this passkey's P-256 public key. No private key exists\nanywhere: signing a transaction is a WebAuthn assertion whose challenge\nis the SafeTx hash. The address is counterfactual (CREATE2) until the\nfirst `execute` deploys it. Chains: base, optimism, arbitrum, polygon\n(RIP-7212 precompile + fallback verifier), ethereum, sepolia, base-sepolia.\n",
9783
+ "operationId": "createPasskeySafe",
9784
+ "security": [
9785
+ {
9786
+ "BearerAuth": []
9787
+ }
9788
+ ],
9789
+ "requestBody": {
9790
+ "required": true,
9791
+ "content": {
9792
+ "application/json": {
9793
+ "schema": {
9794
+ "type": "object",
9795
+ "required": [
9796
+ "chain",
9797
+ "passkey_id"
9798
+ ],
9799
+ "properties": {
9800
+ "chain": {
9801
+ "type": "string"
9802
+ },
9803
+ "passkey_id": {
9804
+ "type": "string",
9805
+ "format": "uuid"
9806
+ }
9807
+ }
9808
+ }
9809
+ }
9810
+ }
9811
+ },
9812
+ "responses": {
9813
+ "201": {
9814
+ "description": "Safe registered (counterfactual)",
9815
+ "content": {
9816
+ "application/json": {
9817
+ "schema": {
9818
+ "$ref": "#/components/schemas/PasskeySafe"
9819
+ }
9820
+ }
9821
+ }
9822
+ },
9823
+ "400": {
9824
+ "$ref": "#/components/responses/BadRequest"
9825
+ },
9826
+ "401": {
9827
+ "$ref": "#/components/responses/Unauthorized"
9828
+ },
9829
+ "404": {
9830
+ "$ref": "#/components/responses/NotFound"
9831
+ },
9832
+ "409": {
9833
+ "$ref": "#/components/responses/Conflict"
9834
+ }
9835
+ }
9836
+ },
9837
+ "get": {
9838
+ "tags": [
9839
+ "Key Custody"
9840
+ ],
9841
+ "summary": "List your passkey-owned Safes",
9842
+ "operationId": "listPasskeySafes",
9843
+ "security": [
9844
+ {
9845
+ "BearerAuth": []
9846
+ }
9847
+ ],
9848
+ "responses": {
9849
+ "200": {
9850
+ "description": "Safes",
9851
+ "content": {
9852
+ "application/json": {
9853
+ "schema": {
9854
+ "type": "object",
9855
+ "properties": {
9856
+ "safes": {
9857
+ "type": "array",
9858
+ "items": {
9859
+ "$ref": "#/components/schemas/PasskeySafe"
9860
+ }
9861
+ }
9862
+ }
9863
+ }
9864
+ }
9865
+ }
9866
+ },
9867
+ "401": {
9868
+ "$ref": "#/components/responses/Unauthorized"
9869
+ }
9870
+ }
9871
+ }
9872
+ },
9873
+ "/v1/treasury/passkey-safes/{id}": {
9874
+ "parameters": [
9875
+ {
9876
+ "name": "id",
9877
+ "in": "path",
9878
+ "required": true,
9879
+ "schema": {
9880
+ "type": "string",
9881
+ "format": "uuid"
9882
+ }
9883
+ }
9884
+ ],
9885
+ "delete": {
9886
+ "tags": [
9887
+ "Key Custody"
9888
+ ],
9889
+ "summary": "Forget a passkey Safe",
9890
+ "description": "Deactivates the record only; the Safe and its funds stay on-chain under the passkey.",
9891
+ "operationId": "deactivatePasskeySafe",
9892
+ "security": [
9893
+ {
9894
+ "BearerAuth": []
9895
+ }
9896
+ ],
9897
+ "responses": {
9898
+ "204": {
9899
+ "description": "Deactivated"
9900
+ },
9901
+ "401": {
9902
+ "$ref": "#/components/responses/Unauthorized"
9903
+ },
9904
+ "404": {
9905
+ "$ref": "#/components/responses/NotFound"
9906
+ }
9907
+ }
9908
+ }
9909
+ },
9910
+ "/v1/treasury/passkey-safes/{id}/prepare": {
9911
+ "parameters": [
9912
+ {
9913
+ "name": "id",
9914
+ "in": "path",
9915
+ "required": true,
9916
+ "schema": {
9917
+ "type": "string",
9918
+ "format": "uuid"
9919
+ }
9920
+ }
9921
+ ],
9922
+ "post": {
9923
+ "tags": [
9924
+ "Key Custody"
9925
+ ],
9926
+ "summary": "Compute the SafeTx hash for a call from a passkey Safe",
9927
+ "description": "Runs the sanctions screen and spend policies on the call, reads the\nSafe's on-chain nonce (0 if not yet deployed), and returns the SafeTx\nhash — the raw 32 bytes are the WebAuthn challenge to sign with\n`userVerification: \"required\"`.\n",
9928
+ "operationId": "preparePasskeySafeTx",
9929
+ "security": [
9930
+ {
9931
+ "BearerAuth": []
9932
+ }
9933
+ ],
9934
+ "requestBody": {
9935
+ "required": true,
9936
+ "content": {
9937
+ "application/json": {
9938
+ "schema": {
9939
+ "type": "object",
9940
+ "required": [
9941
+ "to",
9942
+ "value_wei"
9943
+ ],
9944
+ "properties": {
9945
+ "to": {
9946
+ "type": "string"
9947
+ },
9948
+ "value_wei": {
9949
+ "type": "string"
9950
+ },
9951
+ "data": {
9952
+ "type": "string",
9953
+ "description": "Hex calldata",
9954
+ "optional.": null
9955
+ }
9956
+ }
9957
+ }
9958
+ }
9959
+ }
9960
+ },
9961
+ "responses": {
9962
+ "200": {
9963
+ "description": "What to sign",
9964
+ "content": {
9965
+ "application/json": {
9966
+ "schema": {
9967
+ "type": "object",
9968
+ "properties": {
9969
+ "safe_id": {
9970
+ "type": "string",
9971
+ "format": "uuid"
9972
+ },
9973
+ "safe_address": {
9974
+ "type": "string"
9975
+ },
9976
+ "chain": {
9977
+ "type": "string"
9978
+ },
9979
+ "chain_id": {
9980
+ "type": "integer"
9981
+ },
9982
+ "to": {
9983
+ "type": "string"
9984
+ },
9985
+ "value_wei": {
9986
+ "type": "string"
9987
+ },
9988
+ "data": {
9989
+ "type": "string"
9990
+ },
9991
+ "nonce": {
9992
+ "type": "integer"
9993
+ },
9994
+ "deploy_required": {
9995
+ "type": "boolean"
9996
+ },
9997
+ "safe_tx_hash": {
9998
+ "type": "string"
9999
+ },
10000
+ "credential_id": {
10001
+ "type": "string"
10002
+ },
10003
+ "rp_id": {
10004
+ "type": "string"
10005
+ }
10006
+ }
10007
+ }
10008
+ }
10009
+ }
10010
+ },
10011
+ "400": {
10012
+ "$ref": "#/components/responses/BadRequest"
10013
+ },
10014
+ "401": {
10015
+ "$ref": "#/components/responses/Unauthorized"
10016
+ },
10017
+ "403": {
10018
+ "$ref": "#/components/responses/Forbidden"
10019
+ },
10020
+ "404": {
10021
+ "$ref": "#/components/responses/NotFound"
10022
+ }
10023
+ }
10024
+ }
10025
+ },
10026
+ "/v1/treasury/passkey-safes/{id}/execute": {
8995
10027
  "parameters": [
8996
10028
  {
8997
- "name": "key_id",
10029
+ "name": "id",
8998
10030
  "in": "path",
8999
10031
  "required": true,
9000
10032
  "schema": {
@@ -9007,9 +10039,9 @@
9007
10039
  "tags": [
9008
10040
  "Key Custody"
9009
10041
  ],
9010
- "summary": "Threshold signing, round 2 — aggregate and return the signature",
9011
- "description": "The vault produces its share, verifies the caller's, aggregates, and\nverifies the result under the group key before returning it. A bad\nshare is a `400`, never a published signature.\n",
9012
- "operationId": "tssSignComplete",
10042
+ "summary": "Relay a passkey-signed Safe transaction",
10043
+ "description": "Recomputes the SafeTx hash, verifies the WebAuthn assertion locally\n(this passkey, this hash, a dashboard origin, UV flag set), wraps it in\nSafe's contract-signature format and relays `execTransaction` — deploying\nthe Safe first if needed from your Ethereum treasury wallet, which pays\ngas and is not an owner. Audited as `passkey_safe.executed`.\n",
10044
+ "operationId": "executePasskeySafeTx",
9013
10045
  "security": [
9014
10046
  {
9015
10047
  "BearerAuth": []
@@ -9022,112 +10054,37 @@
9022
10054
  "schema": {
9023
10055
  "type": "object",
9024
10056
  "required": [
9025
- "session_id",
9026
- "client_commitments",
9027
- "client_signature_share"
10057
+ "to",
10058
+ "value_wei",
10059
+ "nonce",
10060
+ "authenticator_data",
10061
+ "client_data_json",
10062
+ "signature"
9028
10063
  ],
9029
10064
  "properties": {
9030
- "session_id": {
9031
- "type": "string",
9032
- "format": "uuid"
9033
- },
9034
- "client_commitments": {
10065
+ "to": {
9035
10066
  "type": "string"
9036
10067
  },
9037
- "client_signature_share": {
10068
+ "value_wei": {
9038
10069
  "type": "string"
9039
- }
9040
- }
9041
- }
9042
- }
9043
- }
9044
- },
9045
- "responses": {
9046
- "200": {
9047
- "description": "Signature",
9048
- "content": {
9049
- "application/json": {
9050
- "schema": {
9051
- "type": "object",
9052
- "properties": {
9053
- "key_id": {
9054
- "type": "string",
9055
- "format": "uuid"
9056
- },
9057
- "message_digest": {
9058
- "type": "string"
9059
- },
9060
- "signature": {
9061
- "type": "string",
9062
- "description": "Base64 64-byte Ed25519 signature."
9063
- },
9064
- "signature_hex": {
9065
- "type": "string"
9066
- }
9067
- }
9068
- }
9069
- }
9070
- }
9071
- },
9072
- "400": {
9073
- "$ref": "#/components/responses/BadRequest"
9074
- },
9075
- "401": {
9076
- "$ref": "#/components/responses/Unauthorized"
9077
- },
9078
- "404": {
9079
- "$ref": "#/components/responses/NotFound"
9080
- },
9081
- "409": {
9082
- "$ref": "#/components/responses/Conflict"
9083
- }
9084
- }
9085
- }
9086
- },
9087
- "/v1/treasury/wallets/{chain}/tss/prepare": {
9088
- "parameters": [
9089
- {
9090
- "name": "chain",
9091
- "in": "path",
9092
- "required": true,
9093
- "schema": {
9094
- "type": "string"
9095
- }
9096
- }
9097
- ],
9098
- "post": {
9099
- "tags": [
9100
- "Key Custody"
9101
- ],
9102
- "summary": "Build the unsigned message for a send from a client_tss wallet",
9103
- "description": "Runs wallet access, the sanctions screen and spend policies on the\ndeclared destination, fetches a recent blockhash and returns the\nunsigned transaction message. Sign it with `/v1/keys/{key_id}/tss/sign/*`\nand submit with `…/tss/broadcast`.\n",
9104
- "operationId": "tssTreasuryPrepare",
9105
- "security": [
9106
- {
9107
- "BearerAuth": []
9108
- }
9109
- ],
9110
- "requestBody": {
9111
- "required": true,
9112
- "content": {
9113
- "application/json": {
9114
- "schema": {
9115
- "type": "object",
9116
- "required": [
9117
- "to",
9118
- "value"
9119
- ],
9120
- "properties": {
9121
- "to": {
10070
+ },
10071
+ "data": {
9122
10072
  "type": "string"
9123
10073
  },
9124
- "value": {
10074
+ "nonce": {
10075
+ "type": "integer"
10076
+ },
10077
+ "authenticator_data": {
9125
10078
  "type": "string",
9126
- "description": "Major units",
9127
- "e.g. \"0.5\".": null
10079
+ "description": "Base64url."
9128
10080
  },
9129
- "memo": {
9130
- "type": "string"
10081
+ "client_data_json": {
10082
+ "type": "string",
10083
+ "description": "Base64url."
10084
+ },
10085
+ "signature": {
10086
+ "type": "string",
10087
+ "description": "Base64url DER ECDSA signature."
9131
10088
  }
9132
10089
  }
9133
10090
  }
@@ -9136,35 +10093,33 @@
9136
10093
  },
9137
10094
  "responses": {
9138
10095
  "200": {
9139
- "description": "Unsigned message",
10096
+ "description": "Relayed",
9140
10097
  "content": {
9141
10098
  "application/json": {
9142
10099
  "schema": {
9143
10100
  "type": "object",
9144
10101
  "properties": {
9145
- "key_id": {
10102
+ "safe_id": {
9146
10103
  "type": "string",
9147
10104
  "format": "uuid"
9148
10105
  },
9149
- "chain": {
10106
+ "safe_address": {
9150
10107
  "type": "string"
9151
10108
  },
9152
- "from": {
9153
- "type": "string"
9154
- },
9155
- "to": {
10109
+ "chain": {
9156
10110
  "type": "string"
9157
10111
  },
9158
- "value_base_units": {
10112
+ "safe_tx_hash": {
9159
10113
  "type": "string"
9160
10114
  },
9161
- "recent_blockhash": {
9162
- "type": "string"
10115
+ "deploy_tx_hash": {
10116
+ "type": "string",
10117
+ "nullable": true
9163
10118
  },
9164
- "message": {
10119
+ "tx_hash": {
9165
10120
  "type": "string"
9166
10121
  },
9167
- "message_digest": {
10122
+ "status": {
9168
10123
  "type": "string"
9169
10124
  }
9170
10125
  }
@@ -9183,82 +10138,9 @@
9183
10138
  },
9184
10139
  "404": {
9185
10140
  "$ref": "#/components/responses/NotFound"
9186
- }
9187
- }
9188
- }
9189
- },
9190
- "/v1/treasury/wallets/{chain}/tss/broadcast": {
9191
- "parameters": [
9192
- {
9193
- "name": "chain",
9194
- "in": "path",
9195
- "required": true,
9196
- "schema": {
9197
- "type": "string"
9198
- }
9199
- }
9200
- ],
9201
- "post": {
9202
- "tags": [
9203
- "Key Custody"
9204
- ],
9205
- "summary": "Broadcast a threshold-signed send",
9206
- "description": "Verifies the signature under the wallet's public key over exactly this\nmessage, checks `to` is a transfer destination inside it, assembles the\ntransaction and submits it. Audited as `treasury_wallet.send`.\n",
9207
- "operationId": "tssTreasuryBroadcast",
9208
- "security": [
9209
- {
9210
- "BearerAuth": []
9211
- }
9212
- ],
9213
- "requestBody": {
9214
- "required": true,
9215
- "content": {
9216
- "application/json": {
9217
- "schema": {
9218
- "type": "object",
9219
- "required": [
9220
- "message",
9221
- "signature",
9222
- "to",
9223
- "value_base_units"
9224
- ],
9225
- "properties": {
9226
- "message": {
9227
- "type": "string"
9228
- },
9229
- "signature": {
9230
- "type": "string"
9231
- },
9232
- "to": {
9233
- "type": "string"
9234
- },
9235
- "value_base_units": {
9236
- "type": "string"
9237
- }
9238
- }
9239
- }
9240
- }
9241
- }
9242
- },
9243
- "responses": {
9244
- "200": {
9245
- "description": "Broadcast",
9246
- "content": {
9247
- "application/json": {
9248
- "schema": {
9249
- "$ref": "#/components/schemas/TreasuryWalletSendResponse"
9250
- }
9251
- }
9252
- }
9253
10141
  },
9254
- "400": {
9255
- "$ref": "#/components/responses/BadRequest"
9256
- },
9257
- "401": {
9258
- "$ref": "#/components/responses/Unauthorized"
9259
- },
9260
- "404": {
9261
- "$ref": "#/components/responses/NotFound"
10142
+ "409": {
10143
+ "$ref": "#/components/responses/Conflict"
9262
10144
  }
9263
10145
  }
9264
10146
  }
@@ -39048,7 +39930,8 @@
39048
39930
  "enum": [
39049
39931
  "passkey_prf",
39050
39932
  "recovery_code"
39051
- ]
39933
+ ],
39934
+ "description": "Sidecar wraps are stored through `PUT /v1/keys/{key_id}/client-share/holder`."
39052
39935
  },
39053
39936
  "credential_id": {
39054
39937
  "type": "string",
@@ -39088,7 +39971,8 @@
39088
39971
  "type": "string",
39089
39972
  "enum": [
39090
39973
  "passkey_prf",
39091
- "recovery_code"
39974
+ "recovery_code",
39975
+ "sidecar"
39092
39976
  ]
39093
39977
  },
39094
39978
  "credential_id": {
@@ -39096,6 +39980,11 @@
39096
39980
  "format": "uuid",
39097
39981
  "nullable": true
39098
39982
  },
39983
+ "holder_id": {
39984
+ "type": "string",
39985
+ "format": "uuid",
39986
+ "nullable": true
39987
+ },
39099
39988
  "wrapped_share": {
39100
39989
  "type": "string",
39101
39990
  "description": "Base64, exactly as stored."
@@ -39114,6 +40003,81 @@
39114
40003
  }
39115
40004
  }
39116
40005
  },
40006
+ "TssHolder": {
40007
+ "type": "object",
40008
+ "properties": {
40009
+ "holder_id": {
40010
+ "type": "string",
40011
+ "format": "uuid"
40012
+ },
40013
+ "runtime_id": {
40014
+ "type": "string",
40015
+ "format": "uuid"
40016
+ },
40017
+ "agent_id": {
40018
+ "type": "string",
40019
+ "format": "uuid"
40020
+ },
40021
+ "public_key": {
40022
+ "type": "string"
40023
+ },
40024
+ "registered_at": {
40025
+ "type": "string",
40026
+ "format": "date-time"
40027
+ },
40028
+ "last_seen_at": {
40029
+ "type": "string",
40030
+ "format": "date-time"
40031
+ }
40032
+ }
40033
+ },
40034
+ "PasskeySafe": {
40035
+ "type": "object",
40036
+ "properties": {
40037
+ "id": {
40038
+ "type": "string",
40039
+ "format": "uuid"
40040
+ },
40041
+ "chain": {
40042
+ "type": "string"
40043
+ },
40044
+ "chain_id": {
40045
+ "type": "integer"
40046
+ },
40047
+ "safe_address": {
40048
+ "type": "string"
40049
+ },
40050
+ "passkey_id": {
40051
+ "type": "string",
40052
+ "format": "uuid"
40053
+ },
40054
+ "custody": {
40055
+ "type": "string",
40056
+ "enum": [
40057
+ "passkey_owner"
40058
+ ]
40059
+ },
40060
+ "deploy_status": {
40061
+ "type": "string",
40062
+ "enum": [
40063
+ "pending",
40064
+ "deployed"
40065
+ ]
40066
+ },
40067
+ "deploy_tx_hash": {
40068
+ "type": "string",
40069
+ "nullable": true
40070
+ },
40071
+ "owner_signer": {
40072
+ "type": "string",
40073
+ "description": "The SafeWebAuthnSharedSigner address listed as the Safe's owner."
40074
+ },
40075
+ "created_at": {
40076
+ "type": "string",
40077
+ "format": "date-time"
40078
+ }
40079
+ }
40080
+ },
39117
40081
  "ClientShareListResponse": {
39118
40082
  "type": "object",
39119
40083
  "properties": {