@1claw/openapi-spec 0.20.0 → 0.21.0

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.
package/openapi.yaml CHANGED
@@ -2,7 +2,7 @@ openapi: 3.1.0
2
2
 
3
3
  info:
4
4
  title: 1Claw API
5
- version: 2.10.0
5
+ version: 2.11.0
6
6
  description: |
7
7
  Secure secret management for AI agents. Provides vaults, secrets,
8
8
  policy-based access control, agent identity, Intents API,
@@ -192,6 +192,12 @@ paths:
192
192
  Returns the Ed25519 public key used to sign JWTs.
193
193
  Use this to verify tokens independently (e.g. in a TEE proxy or
194
194
  gateway). No authentication required.
195
+
196
+ For OIDC-compliant relying parties (Anthropic Workload Identity
197
+ Federation, etc.) prefer the JWKS endpoint at
198
+ `/.well-known/jwks.json` together with the discovery document
199
+ at `/.well-known/openid-configuration` — those advertise both
200
+ Ed25519 and RS256 keys keyed by `kid` and survive key rotation.
195
201
  operationId: getJwtPublicKey
196
202
  security: []
197
203
  responses:
@@ -210,6 +216,100 @@ paths:
210
216
  type: string
211
217
  description: Base64-encoded Ed25519 public key
212
218
 
219
+ /v1/auth/federated-token:
220
+ post:
221
+ tags: [Authentication]
222
+ summary: Exchange a 1claw token for an OIDC federation token (RFC 8693)
223
+ description: |
224
+ Mints a short-lived RS256-signed JWT targeted at an external
225
+ relying party (e.g. Anthropic Workload Identity Federation).
226
+ The relying party validates the token via this issuer's JWKS
227
+ URL (`/.well-known/jwks.json`) and exchanges it for its own
228
+ short-lived service credentials.
229
+
230
+ Requirements:
231
+ - The agent that owns the `subject_token` must have
232
+ `federation_enabled = true` and the requested `audience`
233
+ must appear in `federation_audiences`.
234
+ - The `subject_token` must be a valid 1claw agent JWT or
235
+ `ocv_` API key.
236
+ - Optional `scope` narrows the agent's existing scopes — it
237
+ cannot escalate.
238
+
239
+ Returns 503 when `ONECLAW_JWT_RS256_SIGNING_KEY_ID` is not
240
+ configured on the server.
241
+ operationId: exchangeFederatedToken
242
+ security: []
243
+ requestBody:
244
+ required: true
245
+ content:
246
+ application/json:
247
+ schema:
248
+ $ref: "#/components/schemas/TokenExchangeRequest"
249
+ application/x-www-form-urlencoded:
250
+ schema:
251
+ $ref: "#/components/schemas/TokenExchangeRequest"
252
+ responses:
253
+ "200":
254
+ description: Federation token issued
255
+ content:
256
+ application/json:
257
+ schema:
258
+ $ref: "#/components/schemas/TokenExchangeResponse"
259
+ "400":
260
+ $ref: "#/components/responses/BadRequest"
261
+ "401":
262
+ $ref: "#/components/responses/Unauthorized"
263
+ "403":
264
+ $ref: "#/components/responses/Forbidden"
265
+ "503":
266
+ description: RS256 signing key not configured
267
+
268
+ /.well-known/openid-configuration:
269
+ get:
270
+ tags: [Authentication]
271
+ summary: OIDC discovery document
272
+ description: |
273
+ Standard OpenID Connect discovery document advertising the
274
+ issuer URL, JWKS URL, supported algorithms (`EdDSA`, `RS256`),
275
+ and the RFC 8693 token-exchange endpoint. External IdPs
276
+ (Anthropic WIF, Okta, Auth0, etc.) read this URL to learn
277
+ where 1claw publishes its JWKS.
278
+ operationId: openidConfiguration
279
+ security: []
280
+ responses:
281
+ "200":
282
+ description: Discovery document
283
+ content:
284
+ application/json:
285
+ schema:
286
+ type: object
287
+
288
+ /.well-known/jwks.json:
289
+ get:
290
+ tags: [Authentication]
291
+ summary: JSON Web Key Set
292
+ description: |
293
+ Public keys for every active version of every JWT signing
294
+ key (Ed25519 + RSA-2048). Each entry includes a `kid` so
295
+ consumers can validate tokens issued before the most recent
296
+ key rotation. Cached for 5 minutes via `Cache-Control` and
297
+ CORS-permissive for browser-based IdP consoles.
298
+ operationId: jwks
299
+ security: []
300
+ responses:
301
+ "200":
302
+ description: JWK Set
303
+ content:
304
+ application/jwk-set+json:
305
+ schema:
306
+ type: object
307
+ properties:
308
+ keys:
309
+ type: array
310
+ items:
311
+ type: object
312
+
213
313
  /v1/auth/signup:
214
314
  post:
215
315
  tags: [Authentication]
@@ -1121,7 +1221,7 @@ paths:
1121
1221
  "410":
1122
1222
  description: Version has been disabled or expired
1123
1223
 
1124
- /v1/vaults/{vault_id}/secret-version/{path}/{version}/disable:
1224
+ /v1/vaults/{vault_id}/secret-version-disable/{path}/{version}:
1125
1225
  post:
1126
1226
  tags: [Secrets]
1127
1227
  summary: Disable a specific secret version
@@ -1258,9 +1358,17 @@ paths:
1258
1358
  summary: Self-enroll an agent
1259
1359
  operationId: enrollAgent
1260
1360
  description: |
1261
- Public endpoint (no auth required). Creates an agent under the human's org
1262
- and emails the credentials to the specified human email. The API key is NOT
1263
- returned in the response. Anti-spam: IP rate limiting + per-email cooldown.
1361
+ Public endpoint (no auth required).
1362
+
1363
+ **With `human_email`:** Creates a pending enrollment for that account's org,
1364
+ emails Allow/Deny links, and returns `approval_url` in the JSON body (use if email
1365
+ is delayed). The API key is NOT returned until the human approves.
1366
+
1367
+ **Name only (omit `human_email`):** Creates a link-only pending enrollment.
1368
+ The response includes `approval_url`; the human opens it while signed in to
1369
+ approve the agent into their org.
1370
+
1371
+ Anti-spam: IP rate limiting, per-email cooldown, caps on pending rows.
1264
1372
  requestBody:
1265
1373
  required: true
1266
1374
  content:
@@ -1651,6 +1759,117 @@ paths:
1651
1759
  "402":
1652
1760
  $ref: "#/components/responses/PaymentRequired"
1653
1761
 
1762
+ # ---------------------------------------------------------------------------
1763
+ # Agent Signing Keys (Multi-Chain)
1764
+ # ---------------------------------------------------------------------------
1765
+
1766
+ /v1/agents/{agent_id}/signing-keys:
1767
+ post:
1768
+ tags: [Signing Keys]
1769
+ summary: Provision a signing key for a chain
1770
+ operationId: createSigningKey
1771
+ parameters:
1772
+ - $ref: "#/components/parameters/AgentId"
1773
+ requestBody:
1774
+ required: true
1775
+ content:
1776
+ application/json:
1777
+ schema:
1778
+ $ref: "#/components/schemas/CreateSigningKeyRequest"
1779
+ responses:
1780
+ "201":
1781
+ description: Signing key created
1782
+ content:
1783
+ application/json:
1784
+ schema:
1785
+ $ref: "#/components/schemas/SigningKeyResponse"
1786
+ "400":
1787
+ $ref: "#/components/responses/BadRequest"
1788
+ "409":
1789
+ $ref: "#/components/responses/Conflict"
1790
+ get:
1791
+ tags: [Signing Keys]
1792
+ summary: List signing keys for an agent
1793
+ operationId: listSigningKeys
1794
+ parameters:
1795
+ - $ref: "#/components/parameters/AgentId"
1796
+ responses:
1797
+ "200":
1798
+ description: Signing keys list
1799
+ content:
1800
+ application/json:
1801
+ schema:
1802
+ $ref: "#/components/schemas/SigningKeyListResponse"
1803
+
1804
+ /v1/agents/{agent_id}/signing-keys/{chain}/rotate:
1805
+ post:
1806
+ tags: [Signing Keys]
1807
+ summary: Rotate a signing key for a chain
1808
+ operationId: rotateSigningKey
1809
+ parameters:
1810
+ - $ref: "#/components/parameters/AgentId"
1811
+ - name: chain
1812
+ in: path
1813
+ required: true
1814
+ schema:
1815
+ type: string
1816
+ responses:
1817
+ "200":
1818
+ description: Rotated signing key
1819
+ content:
1820
+ application/json:
1821
+ schema:
1822
+ $ref: "#/components/schemas/SigningKeyResponse"
1823
+ "404":
1824
+ $ref: "#/components/responses/NotFound"
1825
+
1826
+ /v1/agents/{agent_id}/signing-keys/{chain}:
1827
+ delete:
1828
+ tags: [Signing Keys]
1829
+ summary: Deactivate a signing key for a chain
1830
+ operationId: deactivateSigningKey
1831
+ parameters:
1832
+ - $ref: "#/components/parameters/AgentId"
1833
+ - name: chain
1834
+ in: path
1835
+ required: true
1836
+ schema:
1837
+ type: string
1838
+ responses:
1839
+ "204":
1840
+ description: Key deactivated
1841
+ "404":
1842
+ $ref: "#/components/responses/NotFound"
1843
+
1844
+ # ---------------------------------------------------------------------------
1845
+ # Unified Signing Intent
1846
+ # ---------------------------------------------------------------------------
1847
+
1848
+ /v1/agents/{agent_id}/sign:
1849
+ post:
1850
+ tags: [Signing]
1851
+ summary: Unified signing intent (EIP-191, EIP-712, EIP-2718 types 0-4)
1852
+ operationId: signIntent
1853
+ parameters:
1854
+ - $ref: "#/components/parameters/AgentId"
1855
+ requestBody:
1856
+ required: true
1857
+ content:
1858
+ application/json:
1859
+ schema:
1860
+ $ref: "#/components/schemas/SignIntentRequest"
1861
+ responses:
1862
+ "200":
1863
+ description: Signed result
1864
+ content:
1865
+ application/json:
1866
+ schema:
1867
+ $ref: "#/components/schemas/SignIntentResponse"
1868
+ "400":
1869
+ $ref: "#/components/responses/BadRequest"
1870
+ "403":
1871
+ $ref: "#/components/responses/Forbidden"
1872
+
1654
1873
  # ---------------------------------------------------------------------------
1655
1874
  # Chains
1656
1875
  # ---------------------------------------------------------------------------
@@ -3057,6 +3276,12 @@ components:
3057
3276
  application/json:
3058
3277
  schema:
3059
3278
  $ref: "#/components/schemas/PaymentRequirement"
3279
+ Conflict:
3280
+ description: Resource already exists or conflict
3281
+ content:
3282
+ application/json:
3283
+ schema:
3284
+ $ref: "#/components/schemas/ProblemDetails"
3060
3285
 
3061
3286
  schemas:
3062
3287
  ProblemDetails:
@@ -3168,6 +3393,55 @@ components:
3168
3393
  api_key:
3169
3394
  type: string
3170
3395
 
3396
+ TokenExchangeRequest:
3397
+ type: object
3398
+ required: [grant_type, subject_token, subject_token_type, audience]
3399
+ description: |
3400
+ RFC 8693 token-exchange request body. `subject_token_type`
3401
+ accepts the standard JWT URI or 1claw's API-key URI:
3402
+ - `urn:ietf:params:oauth:token-type:jwt`
3403
+ - `urn:1claw:params:oauth:token-type:api-key`
3404
+ properties:
3405
+ grant_type:
3406
+ type: string
3407
+ enum:
3408
+ - "urn:ietf:params:oauth:grant-type:token-exchange"
3409
+ subject_token:
3410
+ type: string
3411
+ description: 1claw JWT or `ocv_` API key authorising the exchange.
3412
+ subject_token_type:
3413
+ type: string
3414
+ enum:
3415
+ - "urn:ietf:params:oauth:token-type:jwt"
3416
+ - "urn:1claw:params:oauth:token-type:api-key"
3417
+ audience:
3418
+ type: string
3419
+ format: uri
3420
+ description: Required `aud` claim for the issued federation token (must be in agent's allowlist).
3421
+ example: "https://api.anthropic.com"
3422
+ scope:
3423
+ type: string
3424
+ description: Optional space-separated subset of the agent's existing scopes.
3425
+ requested_token_type:
3426
+ type: string
3427
+ description: Optional. Defaults to `urn:ietf:params:oauth:token-type:jwt`.
3428
+
3429
+ TokenExchangeResponse:
3430
+ type: object
3431
+ required: [access_token, issued_token_type, token_type, expires_in]
3432
+ properties:
3433
+ access_token:
3434
+ type: string
3435
+ description: RS256-signed federation JWT.
3436
+ issued_token_type:
3437
+ type: string
3438
+ token_type:
3439
+ type: string
3440
+ expires_in:
3441
+ type: integer
3442
+ scope:
3443
+ type: string
3444
+
3171
3445
  SignupRequest:
3172
3446
  type: object
3173
3447
  required: [email, password]
@@ -3792,7 +4066,7 @@ components:
3792
4066
 
3793
4067
  EnrollAgentRequest:
3794
4068
  type: object
3795
- required: [name, human_email]
4069
+ required: [name]
3796
4070
  properties:
3797
4071
  name:
3798
4072
  type: string
@@ -3800,7 +4074,10 @@ components:
3800
4074
  human_email:
3801
4075
  type: string
3802
4076
  format: email
3803
- description: Email of the human who will receive the agent credentials
4077
+ description: |
4078
+ Optional. If set, pending enrollment is bound to that 1Claw account email
4079
+ and Allow/Deny links are emailed. If omitted, only `approval_url` is used
4080
+ (link-only enrollment; human must open the URL while signed in).
3804
4081
  description:
3805
4082
  type: string
3806
4083
  description: Optional agent description
@@ -3811,10 +4088,16 @@ components:
3811
4088
  agent_id:
3812
4089
  type: string
3813
4090
  format: uuid
3814
- description: UUID of the created agent (nil UUID when email not found — uniform response)
4091
+ description: UUID of the created agent (nil UUID until approved — uniform response)
3815
4092
  message:
3816
4093
  type: string
3817
- description: Status message (always generic to prevent email enumeration)
4094
+ description: Status message (worded to limit email enumeration where applicable)
4095
+ approval_url:
4096
+ type: string
4097
+ format: uri
4098
+ description: |
4099
+ Present when a pending enrollment was created and the client should show
4100
+ this link (email flow includes it as a fallback; name-only flow requires it).
3818
4101
 
3819
4102
  # --- Agents ---
3820
4103
 
@@ -3920,6 +4203,30 @@ components:
3920
4203
  description: Enable/disable Shroud LLM Proxy
3921
4204
  shroud_config:
3922
4205
  $ref: "#/components/schemas/ShroudConfig"
4206
+ federation_enabled:
4207
+ type: boolean
4208
+ description: |
4209
+ Enable OIDC federation (RFC 8693 token-exchange) for this agent.
4210
+ When true, the agent may call POST /v1/auth/federated-token to mint
4211
+ federation tokens for the audiences listed in `federation_audiences`.
4212
+ federation_audiences:
4213
+ type: array
4214
+ items:
4215
+ type: string
4216
+ format: uri
4217
+ description: |
4218
+ Allowlist of `aud` values the federation token-exchange may issue
4219
+ tokens for (e.g. `["https://api.anthropic.com"]`). Empty array
4220
+ blocks all federation requests (zero-trust default).
4221
+ federated_token_ttl_seconds:
4222
+ type: integer
4223
+ minimum: 60
4224
+ maximum: 3600
4225
+ nullable: true
4226
+ description: |
4227
+ Per-agent TTL override for federation tokens (seconds). NULL falls
4228
+ back to the global default (`ONECLAW_JWT_FEDERATED_TOKEN_EXPIRY_SECS`).
4229
+ Hard-capped at 3600 seconds.
3923
4230
 
3924
4231
  AgentResponse:
3925
4232
  type: object
@@ -3995,6 +4302,38 @@ components:
3995
4302
  description: Whether this agent routes LLM traffic through the Shroud TEE proxy
3996
4303
  shroud_config:
3997
4304
  $ref: "#/components/schemas/ShroudConfig"
4305
+ federation_enabled:
4306
+ type: boolean
4307
+ description: |
4308
+ Whether this agent may mint OIDC federation tokens via
4309
+ POST /v1/auth/federated-token. False by default.
4310
+ federation_audiences:
4311
+ type: array
4312
+ items:
4313
+ type: string
4314
+ format: uri
4315
+ description: Allowlist of audience URIs the agent may federate to.
4316
+ federated_token_ttl_seconds:
4317
+ type: integer
4318
+ nullable: true
4319
+ description: Per-agent TTL override for federation tokens (60..=3600).
4320
+ signing_chains:
4321
+ type: array
4322
+ items:
4323
+ type: string
4324
+ description: Chains for which this agent has provisioned signing keys.
4325
+ eip712_domain_allowlist:
4326
+ type: array
4327
+ items:
4328
+ type: object
4329
+ description: JSON array of allowed EIP-712 domain entries.
4330
+ eip712_default_policy:
4331
+ type: string
4332
+ enum: [deny, allow]
4333
+ description: Default EIP-712 policy (deny blocks all unless allowlisted).
4334
+ message_signing_enabled:
4335
+ type: boolean
4336
+ description: Whether EIP-191 personal_sign is enabled.
3998
4337
  created_at:
3999
4338
  type: string
4000
4339
  format: date-time
@@ -4616,6 +4955,133 @@ components:
4616
4955
  items:
4617
4956
  $ref: "#/components/schemas/SimulateTransactionRequest"
4618
4957
 
4958
+ # Signing Keys (Multi-Chain)
4959
+ CreateSigningKeyRequest:
4960
+ type: object
4961
+ required: [chain]
4962
+ properties:
4963
+ chain:
4964
+ type: string
4965
+ enum: [ethereum, bitcoin, solana, xrp, cardano, tron]
4966
+
4967
+ SigningKeyResponse:
4968
+ type: object
4969
+ properties:
4970
+ id:
4971
+ type: string
4972
+ format: uuid
4973
+ agent_id:
4974
+ type: string
4975
+ format: uuid
4976
+ chain:
4977
+ type: string
4978
+ curve:
4979
+ type: string
4980
+ public_key:
4981
+ type: string
4982
+ address:
4983
+ type: string
4984
+ nullable: true
4985
+ key_version:
4986
+ type: integer
4987
+ is_active:
4988
+ type: boolean
4989
+ created_at:
4990
+ type: string
4991
+ format: date-time
4992
+ rotated_at:
4993
+ type: string
4994
+ format: date-time
4995
+ nullable: true
4996
+
4997
+ SigningKeyListResponse:
4998
+ type: object
4999
+ properties:
5000
+ keys:
5001
+ type: array
5002
+ items:
5003
+ $ref: "#/components/schemas/SigningKeyResponse"
5004
+
5005
+ # Unified Signing Intent
5006
+ SignIntentRequest:
5007
+ type: object
5008
+ required: [intent_type, chain]
5009
+ properties:
5010
+ intent_type:
5011
+ type: string
5012
+ enum: [personal_sign, typed_data, transaction]
5013
+ chain:
5014
+ type: string
5015
+ signing_key_path:
5016
+ type: string
5017
+ message:
5018
+ type: string
5019
+ description: Hex-encoded message bytes (for personal_sign)
5020
+ typed_data:
5021
+ type: object
5022
+ description: EIP-712 typed data JSON (for typed_data)
5023
+ tx_type:
5024
+ type: integer
5025
+ description: "EIP-2718 type: 0=legacy, 1=2930, 2=1559, 3=4844, 4=7702"
5026
+ to:
5027
+ type: string
5028
+ value:
5029
+ type: string
5030
+ data:
5031
+ type: string
5032
+ nonce:
5033
+ type: integer
5034
+ gas_limit:
5035
+ type: integer
5036
+ gas_price:
5037
+ type: string
5038
+ max_fee_per_gas:
5039
+ type: string
5040
+ max_priority_fee_per_gas:
5041
+ type: string
5042
+ access_list:
5043
+ type: array
5044
+ items:
5045
+ type: object
5046
+ max_fee_per_blob_gas:
5047
+ type: string
5048
+ blob_versioned_hashes:
5049
+ type: array
5050
+ items:
5051
+ type: string
5052
+ authorization_list:
5053
+ type: array
5054
+ items:
5055
+ type: object
5056
+
5057
+ SignIntentResponse:
5058
+ type: object
5059
+ properties:
5060
+ intent_type:
5061
+ type: string
5062
+ chain:
5063
+ type: string
5064
+ from:
5065
+ type: string
5066
+ signature:
5067
+ type: string
5068
+ nullable: true
5069
+ signed_tx:
5070
+ type: string
5071
+ nullable: true
5072
+ tx_hash:
5073
+ type: string
5074
+ nullable: true
5075
+ message_hash:
5076
+ type: string
5077
+ nullable: true
5078
+ typed_data_hash:
5079
+ type: string
5080
+ nullable: true
5081
+ tx_type:
5082
+ type: integer
5083
+ nullable: true
5084
+
4619
5085
  TransactionResponse:
4620
5086
  type: object
4621
5087
  properties:
@@ -5643,6 +6109,31 @@ components:
5643
6109
  type: array
5644
6110
  items:
5645
6111
  type: string
6112
+ # Response-side inspection signals (Shroud v0.5.0+,
6113
+ # H-RESP-INSPECT). Optional — pre-v0.5.0 events have them
6114
+ # unset; treat as zero / empty.
6115
+ response_injection_score:
6116
+ type: number
6117
+ description: Response-side prompt-injection score (0.0–1.0).
6118
+ response_context_injection_score:
6119
+ type: number
6120
+ description: Response-side context-injection score (0.0–1.0).
6121
+ response_injection_categories:
6122
+ type: array
6123
+ items:
6124
+ type: string
6125
+ description: Category tags emitted by the response-side filters (e.g. `markdown_image_exfil`, `data_uri_blob`, `echoed_instruction`).
6126
+ external_urls_flagged:
6127
+ type: array
6128
+ items:
6129
+ type: string
6130
+ description: URLs emitted by the model that were flagged as potential exfil / callback targets.
6131
+ unexpected_code_blocks:
6132
+ type: integer
6133
+ description: Number of code fences in the response that were not expected for the agent's allowed task set.
6134
+ content_filtered:
6135
+ type: boolean
6136
+ description: True when Shroud rewrote or blocked response content before returning it to the agent.
5646
6137
  metadata:
5647
6138
  type: object
5648
6139
  timestamp:
@@ -5684,6 +6175,28 @@ components:
5684
6175
  type: string
5685
6176
  metadata:
5686
6177
  type: object
6178
+ # Response-side inspection signals (Shroud v0.5.0+,
6179
+ # H-RESP-INSPECT). Optional for backward compatibility.
6180
+ response_injection_score:
6181
+ type: number
6182
+ default: 0
6183
+ response_context_injection_score:
6184
+ type: number
6185
+ default: 0
6186
+ response_injection_categories:
6187
+ type: array
6188
+ items:
6189
+ type: string
6190
+ external_urls_flagged:
6191
+ type: array
6192
+ items:
6193
+ type: string
6194
+ unexpected_code_blocks:
6195
+ type: integer
6196
+ default: 0
6197
+ content_filtered:
6198
+ type: boolean
6199
+ default: false
5687
6200
 
5688
6201
  ShroudThreatSummary:
5689
6202
  type: object
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1claw/openapi-spec",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "description": "OpenAPI 3.1.0 specification for the 1Claw Vault API — generate clients in any language",
5
5
  "license": "MIT",
6
6
  "repository": {