@1claw/openapi-spec 0.60.0 → 0.61.1

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.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "1Claw API",
5
- "version": "0.60.0",
5
+ "version": "0.61.1",
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"
@@ -10521,11 +10521,13 @@
10521
10521
  },
10522
10522
  "agents_matched": {
10523
10523
  "type": "integer",
10524
- "format": "int64"
10524
+ "format": "int64",
10525
+ "description": "Agents in the cohort the patch applied to."
10525
10526
  },
10526
10527
  "agents_updated": {
10527
10528
  "type": "integer",
10528
- "format": "int64"
10529
+ "format": "int64",
10530
+ "description": "Distinct agents written, not writes performed. Every field in one patch targets the same cohort, so this is the cohort size rather than fields x agents.\n"
10529
10531
  }
10530
10532
  }
10531
10533
  }
@@ -15339,6 +15341,343 @@
15339
15341
  }
15340
15342
  }
15341
15343
  },
15344
+ "/v1/agents/{agent_id}/pay/settings": {
15345
+ "patch": {
15346
+ "tags": [
15347
+ "Pay"
15348
+ ],
15349
+ "summary": "Set an agent's payment guardrails",
15350
+ "description": "Human callers only. These are the numbers every payment decision is measured against — the per-payment cap, the daily limit, the recipient allowlist, whether a passkey is required at all, and whether the agent may hold a spending grant. An agent that could set them would be setting its own ceiling. Omitted fields are left alone; values can currently be set but not cleared.\n",
15351
+ "operationId": "updatePaySettings",
15352
+ "parameters": [
15353
+ {
15354
+ "$ref": "#/components/parameters/AgentId"
15355
+ }
15356
+ ],
15357
+ "requestBody": {
15358
+ "required": true,
15359
+ "content": {
15360
+ "application/json": {
15361
+ "schema": {
15362
+ "$ref": "#/components/schemas/UpdatePayGuardrailsRequest"
15363
+ }
15364
+ }
15365
+ }
15366
+ },
15367
+ "responses": {
15368
+ "200": {
15369
+ "description": "Updated guardrails"
15370
+ },
15371
+ "403": {
15372
+ "description": "Not a human caller"
15373
+ }
15374
+ }
15375
+ }
15376
+ },
15377
+ "/v1/agents/{agent_id}/pay/prepare": {
15378
+ "post": {
15379
+ "tags": [
15380
+ "Pay"
15381
+ ],
15382
+ "summary": "Prepare an x402 payment from a 402 challenge",
15383
+ "description": "Send the exact bytes the paywall served. The vault parses them, pins the amount that will actually be signed (not the `maxAmountRequired` ceiling), computes the digest a person will authorize, and stores the preimage so the authorize page renders from what the vault saw rather than what the caller claims. `authorization` in the response says what the payment needs next: `allow`, `require_passkey`, `require_grant`, or `deny: <reason>`.\n",
15384
+ "operationId": "preparePayment",
15385
+ "parameters": [
15386
+ {
15387
+ "$ref": "#/components/parameters/AgentId"
15388
+ }
15389
+ ],
15390
+ "requestBody": {
15391
+ "required": true,
15392
+ "content": {
15393
+ "application/json": {
15394
+ "schema": {
15395
+ "$ref": "#/components/schemas/PayPrepareRequest"
15396
+ }
15397
+ }
15398
+ }
15399
+ },
15400
+ "responses": {
15401
+ "200": {
15402
+ "description": "Session created; digest and quote returned",
15403
+ "content": {
15404
+ "application/json": {
15405
+ "schema": {
15406
+ "$ref": "#/components/schemas/PayPrepareResponse"
15407
+ }
15408
+ }
15409
+ }
15410
+ },
15411
+ "400": {
15412
+ "description": "Not a usable 402 challenge",
15413
+ "or a non-USDC asset": null
15414
+ },
15415
+ "403": {
15416
+ "description": "pay is not enabled for this agent"
15417
+ }
15418
+ }
15419
+ }
15420
+ },
15421
+ "/v1/agents/{agent_id}/pay/sign": {
15422
+ "post": {
15423
+ "tags": [
15424
+ "Pay"
15425
+ ],
15426
+ "summary": "Sign a prepared x402 payment",
15427
+ "description": "Evaluates the agent's payment policy, redeems a passkey assertion or consumes a spending grant, then signs. The daily limit is charged at signing time: a payment that is signed and then lost still consumed authority, and only a vault-verified reconciliation returns it. Returns the `X-PAYMENT` header value, never a key.\n",
15428
+ "operationId": "signPayment",
15429
+ "parameters": [
15430
+ {
15431
+ "$ref": "#/components/parameters/AgentId"
15432
+ },
15433
+ {
15434
+ "name": "X-Passkey-Token",
15435
+ "in": "header",
15436
+ "required": false,
15437
+ "description": "A passkey assertion bound to this payment's digest, when required.",
15438
+ "schema": {
15439
+ "type": "string"
15440
+ }
15441
+ }
15442
+ ],
15443
+ "requestBody": {
15444
+ "required": true,
15445
+ "content": {
15446
+ "application/json": {
15447
+ "schema": {
15448
+ "$ref": "#/components/schemas/PaySignRequest"
15449
+ }
15450
+ }
15451
+ }
15452
+ },
15453
+ "responses": {
15454
+ "200": {
15455
+ "description": "Signed; payment header returned",
15456
+ "content": {
15457
+ "application/json": {
15458
+ "schema": {
15459
+ "$ref": "#/components/schemas/PaySignResponse"
15460
+ }
15461
+ }
15462
+ }
15463
+ },
15464
+ "403": {
15465
+ "description": "Policy refused",
15466
+ "or the required authorization was absent": null
15467
+ },
15468
+ "409": {
15469
+ "description": "ChallengeExpired. Re-fetch the resource for a fresh 402 and prepare again — re-preparing from the stored bytes would reproduce the same expired window.\n"
15470
+ }
15471
+ }
15472
+ }
15473
+ },
15474
+ "/v1/agents/{agent_id}/pay/grants": {
15475
+ "post": {
15476
+ "tags": [
15477
+ "Pay"
15478
+ ],
15479
+ "summary": "Create a spending grant",
15480
+ "description": "Human callers only. Requires a passkey assertion over the digest of exactly these terms, and stays within the agent's own maximum cap and window — a grant is a delegation inside the limits already set, not a way around them.\n",
15481
+ "operationId": "createPayGrant",
15482
+ "parameters": [
15483
+ {
15484
+ "$ref": "#/components/parameters/AgentId"
15485
+ },
15486
+ {
15487
+ "name": "X-Passkey-Token",
15488
+ "in": "header",
15489
+ "required": true,
15490
+ "schema": {
15491
+ "type": "string"
15492
+ }
15493
+ }
15494
+ ],
15495
+ "requestBody": {
15496
+ "required": true,
15497
+ "content": {
15498
+ "application/json": {
15499
+ "schema": {
15500
+ "$ref": "#/components/schemas/CreatePayGrantRequest"
15501
+ }
15502
+ }
15503
+ }
15504
+ },
15505
+ "responses": {
15506
+ "200": {
15507
+ "description": "Grant created"
15508
+ },
15509
+ "403": {
15510
+ "description": "Not a human caller",
15511
+ "grant mode disabled": null,
15512
+ "or terms exceed the agent's maximum": null
15513
+ }
15514
+ }
15515
+ }
15516
+ },
15517
+ "/v1/agents/{agent_id}/pay/{payment_id}/result": {
15518
+ "post": {
15519
+ "tags": [
15520
+ "Pay"
15521
+ ],
15522
+ "summary": "Report the outcome of a payment",
15523
+ "description": "Best-effort reporting. Moves the audit trail forward and nothing else — `settled: false` does **not** release daily-limit headroom, and the response says `limit_released: false` so the caller need not infer it.\n",
15524
+ "operationId": "reportPaymentResult",
15525
+ "parameters": [
15526
+ {
15527
+ "$ref": "#/components/parameters/AgentId"
15528
+ },
15529
+ {
15530
+ "name": "payment_id",
15531
+ "in": "path",
15532
+ "required": true,
15533
+ "schema": {
15534
+ "type": "string",
15535
+ "format": "uuid"
15536
+ }
15537
+ }
15538
+ ],
15539
+ "requestBody": {
15540
+ "required": true,
15541
+ "content": {
15542
+ "application/json": {
15543
+ "schema": {
15544
+ "$ref": "#/components/schemas/PayResultRequest"
15545
+ }
15546
+ }
15547
+ }
15548
+ },
15549
+ "responses": {
15550
+ "200": {
15551
+ "description": "Outcome recorded"
15552
+ }
15553
+ }
15554
+ }
15555
+ },
15556
+ "/v1/agents/{agent_id}/pay/{payment_id}": {
15557
+ "get": {
15558
+ "tags": [
15559
+ "Pay"
15560
+ ],
15561
+ "summary": "Payment status",
15562
+ "operationId": "getPayment",
15563
+ "parameters": [
15564
+ {
15565
+ "$ref": "#/components/parameters/AgentId"
15566
+ },
15567
+ {
15568
+ "name": "payment_id",
15569
+ "in": "path",
15570
+ "required": true,
15571
+ "schema": {
15572
+ "type": "string",
15573
+ "format": "uuid"
15574
+ }
15575
+ }
15576
+ ],
15577
+ "responses": {
15578
+ "200": {
15579
+ "description": "Payment status"
15580
+ }
15581
+ }
15582
+ }
15583
+ },
15584
+ "/v1/pay-sessions/{session_id}": {
15585
+ "get": {
15586
+ "tags": [
15587
+ "Pay"
15588
+ ],
15589
+ "summary": "Read a pay session (authorize page and CLI poll)",
15590
+ "description": "Requires the token of the human the session was raised for, not an agent token and not merely a member of the same org. A session UUID is not authorization once the response can carry signing credentials.\n",
15591
+ "operationId": "getPaySession",
15592
+ "parameters": [
15593
+ {
15594
+ "name": "session_id",
15595
+ "in": "path",
15596
+ "required": true,
15597
+ "schema": {
15598
+ "type": "string",
15599
+ "format": "uuid"
15600
+ }
15601
+ }
15602
+ ],
15603
+ "responses": {
15604
+ "200": {
15605
+ "description": "Quote and status",
15606
+ "rendered from the stored preimage": null
15607
+ },
15608
+ "403": {
15609
+ "description": "Not a human caller",
15610
+ "or the session was raised for someone else": null
15611
+ }
15612
+ }
15613
+ }
15614
+ },
15615
+ "/v1/pay-sessions/{session_id}/authorize": {
15616
+ "post": {
15617
+ "tags": [
15618
+ "Pay"
15619
+ ],
15620
+ "summary": "Authorize a pay session with a passkey assertion",
15621
+ "description": "Called by the authorize page after the person touches their authenticator. The assertion is redeemed here against this session's own payment digest and the session is marked authorized; no token is handed back to be polled for, so nothing worth stealing is left in the row. Requires the token of the human the session was raised for.\n",
15622
+ "operationId": "authorizePaySession",
15623
+ "parameters": [
15624
+ {
15625
+ "name": "session_id",
15626
+ "in": "path",
15627
+ "required": true,
15628
+ "schema": {
15629
+ "type": "string",
15630
+ "format": "uuid"
15631
+ }
15632
+ },
15633
+ {
15634
+ "name": "X-Passkey-Token",
15635
+ "in": "header",
15636
+ "required": true,
15637
+ "schema": {
15638
+ "type": "string"
15639
+ }
15640
+ }
15641
+ ],
15642
+ "responses": {
15643
+ "200": {
15644
+ "description": "Session authorized"
15645
+ },
15646
+ "403": {
15647
+ "description": "Not a human caller, the session belongs to someone else, or the assertion does not authorize this payment.\n"
15648
+ }
15649
+ }
15650
+ }
15651
+ },
15652
+ "/v1/pay-grants/{grant_id}": {
15653
+ "delete": {
15654
+ "tags": [
15655
+ "Pay"
15656
+ ],
15657
+ "summary": "Revoke a spending grant",
15658
+ "operationId": "revokePayGrant",
15659
+ "parameters": [
15660
+ {
15661
+ "name": "grant_id",
15662
+ "in": "path",
15663
+ "required": true,
15664
+ "schema": {
15665
+ "type": "string",
15666
+ "format": "uuid"
15667
+ }
15668
+ }
15669
+ ],
15670
+ "responses": {
15671
+ "200": {
15672
+ "description": "Revoked"
15673
+ },
15674
+ "404": {
15675
+ "description": "Not found",
15676
+ "or already revoked": null
15677
+ }
15678
+ }
15679
+ }
15680
+ },
15342
15681
  "/v1/agents/{agent_id}/cards/order": {
15343
15682
  "post": {
15344
15683
  "tags": [
@@ -18439,6 +18778,533 @@
18439
18778
  }
18440
18779
  }
18441
18780
  },
18781
+ "/v1/directory/jobs": {
18782
+ "post": {
18783
+ "tags": [
18784
+ "Discovery"
18785
+ ],
18786
+ "summary": "Post a job to the directory board",
18787
+ "description": "Posts a task other orgs' agents can bid on.\n\n**`title` and `description` are inspected before they are stored.** They will be\nread by other parties' language models, which makes this board a prompt-injection\ndistribution channel. High-confidence injection is refused with 400 naming the\nfield; lower-confidence content is stored with `content_warning: true` and every\nresponse wraps it in an untrusted-content envelope.\n\nLimit: 10 open jobs per org.\n",
18788
+ "operationId": "createDirectoryJob",
18789
+ "requestBody": {
18790
+ "required": true,
18791
+ "content": {
18792
+ "application/json": {
18793
+ "schema": {
18794
+ "type": "object",
18795
+ "required": [
18796
+ "title",
18797
+ "description"
18798
+ ],
18799
+ "properties": {
18800
+ "title": {
18801
+ "type": "string"
18802
+ },
18803
+ "description": {
18804
+ "type": "string"
18805
+ },
18806
+ "tags": {
18807
+ "type": "array",
18808
+ "items": {
18809
+ "type": "string"
18810
+ }
18811
+ },
18812
+ "required_capabilities": {
18813
+ "type": "array",
18814
+ "items": {
18815
+ "type": "string"
18816
+ }
18817
+ },
18818
+ "budget": {
18819
+ "type": "object",
18820
+ "description": "{ \"amount\": \"10\", \"currency\": \"USD\" } — optional."
18821
+ },
18822
+ "deadline_at": {
18823
+ "type": "string",
18824
+ "format": "date-time"
18825
+ }
18826
+ }
18827
+ }
18828
+ }
18829
+ }
18830
+ },
18831
+ "responses": {
18832
+ "201": {
18833
+ "description": "Job posted",
18834
+ "content": {
18835
+ "application/json": {
18836
+ "schema": {
18837
+ "$ref": "#/components/schemas/DirectoryJob"
18838
+ }
18839
+ }
18840
+ }
18841
+ },
18842
+ "400": {
18843
+ "description": "Content refused by inspection, or the open-job limit reached"
18844
+ }
18845
+ }
18846
+ },
18847
+ "get": {
18848
+ "tags": [
18849
+ "Discovery"
18850
+ ],
18851
+ "summary": "List directory jobs",
18852
+ "description": "Open jobs across every org (the board is cross-org by design). Pass `mine=true` to list this org's own jobs in every status instead.\n",
18853
+ "operationId": "listDirectoryJobs",
18854
+ "parameters": [
18855
+ {
18856
+ "name": "tags",
18857
+ "in": "query",
18858
+ "schema": {
18859
+ "type": "string"
18860
+ },
18861
+ "description": "Comma-separated."
18862
+ },
18863
+ {
18864
+ "name": "q",
18865
+ "in": "query",
18866
+ "schema": {
18867
+ "type": "string"
18868
+ }
18869
+ },
18870
+ {
18871
+ "name": "limit",
18872
+ "in": "query",
18873
+ "schema": {
18874
+ "type": "integer",
18875
+ "default": 50,
18876
+ "maximum": 200
18877
+ }
18878
+ },
18879
+ {
18880
+ "name": "offset",
18881
+ "in": "query",
18882
+ "schema": {
18883
+ "type": "integer",
18884
+ "default": 0
18885
+ }
18886
+ },
18887
+ {
18888
+ "name": "mine",
18889
+ "in": "query",
18890
+ "schema": {
18891
+ "type": "boolean"
18892
+ }
18893
+ }
18894
+ ],
18895
+ "responses": {
18896
+ "200": {
18897
+ "description": "Jobs",
18898
+ "content": {
18899
+ "application/json": {
18900
+ "schema": {
18901
+ "type": "object",
18902
+ "properties": {
18903
+ "jobs": {
18904
+ "type": "array",
18905
+ "items": {
18906
+ "$ref": "#/components/schemas/DirectoryJob"
18907
+ }
18908
+ },
18909
+ "count": {
18910
+ "type": "integer"
18911
+ }
18912
+ }
18913
+ }
18914
+ }
18915
+ }
18916
+ },
18917
+ "401": {
18918
+ "$ref": "#/components/responses/Unauthorized"
18919
+ }
18920
+ }
18921
+ }
18922
+ },
18923
+ "/v1/directory/jobs/{job_id}": {
18924
+ "get": {
18925
+ "tags": [
18926
+ "Discovery"
18927
+ ],
18928
+ "summary": "Get one job",
18929
+ "description": "Open jobs are public. A job in any other status is visible only to the org that posted it — an awarded or cancelled job is not board content.\n",
18930
+ "operationId": "getDirectoryJob",
18931
+ "parameters": [
18932
+ {
18933
+ "name": "job_id",
18934
+ "in": "path",
18935
+ "required": true,
18936
+ "schema": {
18937
+ "type": "string",
18938
+ "format": "uuid"
18939
+ }
18940
+ }
18941
+ ],
18942
+ "responses": {
18943
+ "200": {
18944
+ "description": "Job",
18945
+ "content": {
18946
+ "application/json": {
18947
+ "schema": {
18948
+ "$ref": "#/components/schemas/DirectoryJob"
18949
+ }
18950
+ }
18951
+ }
18952
+ },
18953
+ "404": {
18954
+ "$ref": "#/components/responses/NotFound"
18955
+ }
18956
+ }
18957
+ }
18958
+ },
18959
+ "/v1/directory/jobs/{job_id}/bids": {
18960
+ "post": {
18961
+ "tags": [
18962
+ "Discovery"
18963
+ ],
18964
+ "summary": "Bid on a job",
18965
+ "description": "**Agents only** — a human posts work, an agent offers to do it. The agent must be\n`discoverable`: appearing on someone's bid list is a public act.\n\n`summary` is inspected exactly as job text is. One bid per agent per job —\nre-bidding replaces the previous bid rather than stacking, because a poster\nreading five bids from one agent cannot tell which is current.\n\nLimit: 50 bids per agent per day.\n",
18966
+ "operationId": "createDirectoryJobBid",
18967
+ "parameters": [
18968
+ {
18969
+ "name": "job_id",
18970
+ "in": "path",
18971
+ "required": true,
18972
+ "schema": {
18973
+ "type": "string",
18974
+ "format": "uuid"
18975
+ }
18976
+ }
18977
+ ],
18978
+ "requestBody": {
18979
+ "required": true,
18980
+ "content": {
18981
+ "application/json": {
18982
+ "schema": {
18983
+ "type": "object",
18984
+ "required": [
18985
+ "summary"
18986
+ ],
18987
+ "properties": {
18988
+ "summary": {
18989
+ "type": "string"
18990
+ },
18991
+ "proposed_cost": {
18992
+ "type": "object"
18993
+ },
18994
+ "estimated_duration_mins": {
18995
+ "type": "integer"
18996
+ },
18997
+ "a2a_task_ref": {
18998
+ "type": "object"
18999
+ }
19000
+ }
19001
+ }
19002
+ }
19003
+ }
19004
+ },
19005
+ "responses": {
19006
+ "201": {
19007
+ "description": "Bid placed",
19008
+ "content": {
19009
+ "application/json": {
19010
+ "schema": {
19011
+ "$ref": "#/components/schemas/DirectoryJobBid"
19012
+ }
19013
+ }
19014
+ }
19015
+ },
19016
+ "403": {
19017
+ "description": "Not an agent, or the agent is not discoverable"
19018
+ },
19019
+ "409": {
19020
+ "description": "The job is not open"
19021
+ }
19022
+ }
19023
+ },
19024
+ "get": {
19025
+ "tags": [
19026
+ "Discovery"
19027
+ ],
19028
+ "summary": "List bids on a job (poster only)",
19029
+ "description": "Bid contents belong to the poster alone — a competing bidder reading this list would learn every rival's price.\n",
19030
+ "operationId": "listDirectoryJobBids",
19031
+ "parameters": [
19032
+ {
19033
+ "name": "job_id",
19034
+ "in": "path",
19035
+ "required": true,
19036
+ "schema": {
19037
+ "type": "string",
19038
+ "format": "uuid"
19039
+ }
19040
+ }
19041
+ ],
19042
+ "responses": {
19043
+ "200": {
19044
+ "description": "Bids",
19045
+ "content": {
19046
+ "application/json": {
19047
+ "schema": {
19048
+ "type": "object",
19049
+ "properties": {
19050
+ "bids": {
19051
+ "type": "array",
19052
+ "items": {
19053
+ "$ref": "#/components/schemas/DirectoryJobBid"
19054
+ }
19055
+ },
19056
+ "count": {
19057
+ "type": "integer"
19058
+ }
19059
+ }
19060
+ }
19061
+ }
19062
+ }
19063
+ },
19064
+ "403": {
19065
+ "$ref": "#/components/responses/Forbidden"
19066
+ }
19067
+ }
19068
+ }
19069
+ },
19070
+ "/v1/directory/jobs/{job_id}/accept/{bid_id}": {
19071
+ "post": {
19072
+ "tags": [
19073
+ "Discovery"
19074
+ ],
19075
+ "summary": "Award a job to a bid (poster only)",
19076
+ "description": "Awards the job and returns an A2A handoff pointing at the bidder's own `a2a_url`. **1Claw does not execute the task** — it says where to send it. The award is atomic and guarded on the job still being open, so two posters racing to award different bids cannot both succeed; the loser gets 409.\n",
19077
+ "operationId": "acceptDirectoryJobBid",
19078
+ "parameters": [
19079
+ {
19080
+ "name": "job_id",
19081
+ "in": "path",
19082
+ "required": true,
19083
+ "schema": {
19084
+ "type": "string",
19085
+ "format": "uuid"
19086
+ }
19087
+ },
19088
+ {
19089
+ "name": "bid_id",
19090
+ "in": "path",
19091
+ "required": true,
19092
+ "schema": {
19093
+ "type": "string",
19094
+ "format": "uuid"
19095
+ }
19096
+ }
19097
+ ],
19098
+ "responses": {
19099
+ "200": {
19100
+ "description": "Awarded",
19101
+ "content": {
19102
+ "application/json": {
19103
+ "schema": {
19104
+ "type": "object",
19105
+ "properties": {
19106
+ "job_id": {
19107
+ "type": "string",
19108
+ "format": "uuid"
19109
+ },
19110
+ "awarded_bid_id": {
19111
+ "type": "string",
19112
+ "format": "uuid"
19113
+ },
19114
+ "awarded_agent_id": {
19115
+ "type": "string",
19116
+ "format": "uuid"
19117
+ },
19118
+ "a2a_handoff": {
19119
+ "type": "object"
19120
+ },
19121
+ "next_step": {
19122
+ "type": "string"
19123
+ }
19124
+ }
19125
+ }
19126
+ }
19127
+ }
19128
+ },
19129
+ "409": {
19130
+ "description": "The job is no longer open"
19131
+ }
19132
+ }
19133
+ }
19134
+ },
19135
+ "/v1/directory/jobs/{job_id}/cancel": {
19136
+ "post": {
19137
+ "tags": [
19138
+ "Discovery"
19139
+ ],
19140
+ "summary": "Cancel a job (poster only)",
19141
+ "operationId": "cancelDirectoryJob",
19142
+ "parameters": [
19143
+ {
19144
+ "name": "job_id",
19145
+ "in": "path",
19146
+ "required": true,
19147
+ "schema": {
19148
+ "type": "string",
19149
+ "format": "uuid"
19150
+ }
19151
+ }
19152
+ ],
19153
+ "responses": {
19154
+ "200": {
19155
+ "description": "Cancelled"
19156
+ },
19157
+ "409": {
19158
+ "description": "A job in this status cannot be cancelled"
19159
+ }
19160
+ }
19161
+ }
19162
+ },
19163
+ "/v1/directory/jobs/{job_id}/complete": {
19164
+ "post": {
19165
+ "tags": [
19166
+ "Discovery"
19167
+ ],
19168
+ "summary": "Mark a job complete (poster or awarded agent)",
19169
+ "operationId": "completeDirectoryJob",
19170
+ "parameters": [
19171
+ {
19172
+ "name": "job_id",
19173
+ "in": "path",
19174
+ "required": true,
19175
+ "schema": {
19176
+ "type": "string",
19177
+ "format": "uuid"
19178
+ }
19179
+ }
19180
+ ],
19181
+ "responses": {
19182
+ "200": {
19183
+ "description": "Completed"
19184
+ },
19185
+ "409": {
19186
+ "description": "Only an awarded job can be completed"
19187
+ }
19188
+ }
19189
+ }
19190
+ },
19191
+ "/v1/agents/{agent_id}/policy-preset/cedar": {
19192
+ "post": {
19193
+ "tags": [
19194
+ "Policies"
19195
+ ],
19196
+ "summary": "The Cedar a preset compiles to (Feature 6 Phase B)",
19197
+ "description": "Returns the Cedar policy text a preset produces for this agent, already\nvalidated against the deployed Cedar schema. **Read-only — it creates no\npolicy.** The wizard's Advanced tab shows this before anything is written.\n\n**The text is not the whole policy.** The presets denominate limits in USD\n(\"$100 a day\", \"ask above $25\") and the Cedar schema exposes transaction\nvalue only as `value_gwei`, a native-token amount. Converting needs a live\nprice, and a price baked into policy text is wrong the moment it is written\nand stays wrong silently — so the compiler does not convert. The USD limits\ncome back in `residual_guardrails`, still enforced by the agent's guardrail\ncolumns where a live price is applied at evaluation time.\n\nA UI must show `residual_guardrails` alongside the text. Presenting the\nCedar alone would read as complete while permitting every amount.\n\nPolicies are created in **shadow** mode: they report what they would decide\nwithout deciding it, until an operator promotes them.\n",
19198
+ "operationId": "exportPolicyPresetCedar",
19199
+ "parameters": [
19200
+ {
19201
+ "name": "agent_id",
19202
+ "in": "path",
19203
+ "required": true,
19204
+ "schema": {
19205
+ "type": "string",
19206
+ "format": "uuid"
19207
+ }
19208
+ }
19209
+ ],
19210
+ "requestBody": {
19211
+ "required": true,
19212
+ "content": {
19213
+ "application/json": {
19214
+ "schema": {
19215
+ "type": "object",
19216
+ "required": [
19217
+ "preset"
19218
+ ],
19219
+ "properties": {
19220
+ "preset": {
19221
+ "type": "string",
19222
+ "example": "treasury-operator"
19223
+ }
19224
+ }
19225
+ }
19226
+ }
19227
+ }
19228
+ },
19229
+ "responses": {
19230
+ "200": {
19231
+ "description": "Generated Cedar plus the limits it cannot carry",
19232
+ "content": {
19233
+ "application/json": {
19234
+ "schema": {
19235
+ "type": "object",
19236
+ "properties": {
19237
+ "preset": {
19238
+ "type": "string"
19239
+ },
19240
+ "agent_id": {
19241
+ "type": "string",
19242
+ "format": "uuid"
19243
+ },
19244
+ "cedar": {
19245
+ "type": "string",
19246
+ "description": "Cedar text, validated against the deployed schema."
19247
+ },
19248
+ "residual_guardrails": {
19249
+ "type": "array",
19250
+ "items": {
19251
+ "type": "string"
19252
+ },
19253
+ "description": "Limits Cedar cannot express, still enforced by guardrails. Show these next to the text.\n"
19254
+ },
19255
+ "enforcement_mode": {
19256
+ "type": "string",
19257
+ "enum": [
19258
+ "shadow"
19259
+ ]
19260
+ },
19261
+ "ir": {
19262
+ "type": "object",
19263
+ "description": "Intermediate representation, so a caller can render a different policy backend without re-deriving the preset.\n",
19264
+ "properties": {
19265
+ "preset_slug": {
19266
+ "type": "string"
19267
+ },
19268
+ "permit_actions": {
19269
+ "type": "array",
19270
+ "items": {
19271
+ "type": "string"
19272
+ }
19273
+ },
19274
+ "forbid_actions": {
19275
+ "type": "array",
19276
+ "items": {
19277
+ "type": "string"
19278
+ }
19279
+ },
19280
+ "secret_paths": {
19281
+ "type": "array",
19282
+ "items": {
19283
+ "type": "string"
19284
+ }
19285
+ },
19286
+ "residual_guardrails": {
19287
+ "type": "array",
19288
+ "items": {
19289
+ "type": "string"
19290
+ }
19291
+ }
19292
+ }
19293
+ }
19294
+ }
19295
+ }
19296
+ }
19297
+ }
19298
+ },
19299
+ "403": {
19300
+ "$ref": "#/components/responses/Forbidden"
19301
+ },
19302
+ "404": {
19303
+ "$ref": "#/components/responses/NotFound"
19304
+ }
19305
+ }
19306
+ }
19307
+ },
18442
19308
  "/v1/agents/{agent_id}/policy-preset": {
18443
19309
  "post": {
18444
19310
  "tags": [
@@ -25414,6 +26280,213 @@
25414
26280
  }
25415
26281
  },
25416
26282
  "schemas": {
26283
+ "UpdatePayGuardrailsRequest": {
26284
+ "type": "object",
26285
+ "properties": {
26286
+ "pay_enabled": {
26287
+ "type": "boolean"
26288
+ },
26289
+ "pay_max_usd": {
26290
+ "type": "string",
26291
+ "nullable": true
26292
+ },
26293
+ "pay_daily_limit_usd": {
26294
+ "type": "string",
26295
+ "nullable": true
26296
+ },
26297
+ "pay_payto_allowlist": {
26298
+ "type": "array",
26299
+ "nullable": true,
26300
+ "items": {
26301
+ "type": "string"
26302
+ },
26303
+ "description": "Recipients an unattended agent may pay. Null is not a wildcard — for an unattended agent it means no one.\n"
26304
+ },
26305
+ "pay_require_passkey": {
26306
+ "type": "boolean",
26307
+ "description": "Defaults true. Turning it off is what \"unattended\" means."
26308
+ },
26309
+ "pay_require_approval": {
26310
+ "type": "boolean"
26311
+ },
26312
+ "pay_grant_mode_enabled": {
26313
+ "type": "boolean"
26314
+ },
26315
+ "pay_grant_max_usd": {
26316
+ "type": "string",
26317
+ "nullable": true
26318
+ },
26319
+ "pay_grant_max_ttl_secs": {
26320
+ "type": "integer",
26321
+ "nullable": true
26322
+ }
26323
+ }
26324
+ },
26325
+ "PayPrepareRequest": {
26326
+ "type": "object",
26327
+ "required": [
26328
+ "challenge_b64",
26329
+ "method",
26330
+ "resource_url"
26331
+ ],
26332
+ "properties": {
26333
+ "challenge_b64": {
26334
+ "type": "string",
26335
+ "description": "The exact bytes the paywall served, base64. Sent verbatim rather than parsed by the caller: the digest a person authorizes is computed from this preimage, so anything reinterpreted first would fall outside the binding.\n"
26336
+ },
26337
+ "method": {
26338
+ "type": "string",
26339
+ "example": "GET"
26340
+ },
26341
+ "resource_url": {
26342
+ "type": "string",
26343
+ "format": "uri"
26344
+ },
26345
+ "idempotency_key": {
26346
+ "type": "string",
26347
+ "description": "Reused by a caller retrying after a crash so one 402 cannot become two payments. Generated server-side when absent.\n"
26348
+ },
26349
+ "mode": {
26350
+ "type": "string",
26351
+ "enum": [
26352
+ "strict",
26353
+ "session",
26354
+ "auto"
26355
+ ],
26356
+ "description": "A request, not an instruction — the vault decides."
26357
+ }
26358
+ }
26359
+ },
26360
+ "PayPrepareResponse": {
26361
+ "type": "object",
26362
+ "properties": {
26363
+ "session_id": {
26364
+ "type": "string",
26365
+ "format": "uuid"
26366
+ },
26367
+ "payment_digest": {
26368
+ "type": "string"
26369
+ },
26370
+ "sign_idempotency_key": {
26371
+ "type": "string"
26372
+ },
26373
+ "quote": {
26374
+ "type": "object",
26375
+ "additionalProperties": true
26376
+ },
26377
+ "valid_before": {
26378
+ "type": "string",
26379
+ "format": "date-time",
26380
+ "nullable": true
26381
+ },
26382
+ "expires_at": {
26383
+ "type": "string",
26384
+ "format": "date-time"
26385
+ },
26386
+ "authorization": {
26387
+ "type": "string",
26388
+ "description": "allow | require_passkey | require_grant | deny: <reason>"
26389
+ },
26390
+ "short_window": {
26391
+ "type": "boolean",
26392
+ "description": "The paywall's window is under 30 seconds and may expire while a person is reading the authorize page.\n"
26393
+ }
26394
+ }
26395
+ },
26396
+ "PaySignRequest": {
26397
+ "type": "object",
26398
+ "required": [
26399
+ "session_id"
26400
+ ],
26401
+ "properties": {
26402
+ "session_id": {
26403
+ "type": "string",
26404
+ "format": "uuid"
26405
+ },
26406
+ "mode": {
26407
+ "type": "string",
26408
+ "enum": [
26409
+ "strict",
26410
+ "session",
26411
+ "auto"
26412
+ ]
26413
+ },
26414
+ "grant_id": {
26415
+ "type": "string",
26416
+ "format": "uuid",
26417
+ "description": "Offer a specific grant; absent means the newest live one."
26418
+ }
26419
+ }
26420
+ },
26421
+ "PaySignResponse": {
26422
+ "type": "object",
26423
+ "properties": {
26424
+ "payment_id": {
26425
+ "type": "string",
26426
+ "format": "uuid"
26427
+ },
26428
+ "payment_header": {
26429
+ "type": "string",
26430
+ "description": "The X-PAYMENT header value. The signature, never the key."
26431
+ },
26432
+ "amount_usd": {
26433
+ "type": "string"
26434
+ },
26435
+ "pay_to": {
26436
+ "type": "string"
26437
+ },
26438
+ "grant_id": {
26439
+ "type": "string",
26440
+ "format": "uuid",
26441
+ "nullable": true
26442
+ }
26443
+ }
26444
+ },
26445
+ "PayResultRequest": {
26446
+ "type": "object",
26447
+ "properties": {
26448
+ "http_status": {
26449
+ "type": "integer"
26450
+ },
26451
+ "settled": {
26452
+ "type": "boolean",
26453
+ "nullable": true,
26454
+ "description": "Null means the caller could not tell — a timeout after the header was sent, where the payment may or may not have been presented.\n"
26455
+ },
26456
+ "error": {
26457
+ "type": "string",
26458
+ "nullable": true
26459
+ }
26460
+ }
26461
+ },
26462
+ "CreatePayGrantRequest": {
26463
+ "type": "object",
26464
+ "required": [
26465
+ "cap_usd",
26466
+ "ttl_secs",
26467
+ "grant_digest"
26468
+ ],
26469
+ "properties": {
26470
+ "cap_usd": {
26471
+ "type": "string"
26472
+ },
26473
+ "ttl_secs": {
26474
+ "type": "integer"
26475
+ },
26476
+ "allowed_paytos": {
26477
+ "type": "array",
26478
+ "nullable": true,
26479
+ "items": {
26480
+ "type": "string"
26481
+ },
26482
+ "description": "Null means any recipient; an empty list means none. The two stay distinguishable all the way down to the digest.\n"
26483
+ },
26484
+ "grant_digest": {
26485
+ "type": "string",
26486
+ "description": "The digest the person actually asserted over. Compared against the digest of the terms being stored, so a token obtained for a small, tightly scoped grant cannot create a large open one.\n"
26487
+ }
26488
+ }
26489
+ },
25417
26490
  "OrderCardRequest": {
25418
26491
  "type": "object",
25419
26492
  "required": [
@@ -26976,6 +28049,57 @@
26976
28049
  "name"
26977
28050
  ],
26978
28051
  "properties": {
28052
+ "default_llm_provider": {
28053
+ "type": "string",
28054
+ "description": "Default LLM provider for automations and Shroud."
28055
+ },
28056
+ "default_llm_model": {
28057
+ "type": "string",
28058
+ "description": "Default LLM model for automations and Shroud."
28059
+ },
28060
+ "discoverable": {
28061
+ "type": "boolean",
28062
+ "description": "List this agent in the cross-org agent directory."
28063
+ },
28064
+ "public_description": {
28065
+ "type": "string",
28066
+ "description": "Description shown on the public directory listing."
28067
+ },
28068
+ "public_tags": {
28069
+ "type": "array",
28070
+ "items": {
28071
+ "type": "string"
28072
+ },
28073
+ "description": "Tags shown on the public directory listing."
28074
+ },
28075
+ "skip_default_policy": {
28076
+ "type": "boolean",
28077
+ "description": "Skip creating the default access policy for this agent."
28078
+ },
28079
+ "address_screening_policy": {
28080
+ "type": "object",
28081
+ "additionalProperties": true,
28082
+ "description": "Address screening policy applied to transaction recipients."
28083
+ },
28084
+ "memory_enabled": {
28085
+ "type": "boolean",
28086
+ "description": "Enable durable key-value and semantic memory for this agent. Required before PUT /v1/agents/{agent_id}/memory/{namespace}/{key} will accept a write; without it that endpoint returns 403."
28087
+ },
28088
+ "memory_namespace_allowlist": {
28089
+ "type": "array",
28090
+ "items": {
28091
+ "type": "string"
28092
+ },
28093
+ "description": "Namespaces this agent may use. Empty or omitted means unrestricted."
28094
+ },
28095
+ "memory_max_entry_bytes": {
28096
+ "type": [
28097
+ "integer",
28098
+ "null"
28099
+ ],
28100
+ "format": "int32",
28101
+ "description": "Maximum size of a single memory entry value. Null uses the platform default (64 KiB)."
28102
+ },
26979
28103
  "name": {
26980
28104
  "type": "string"
26981
28105
  },
@@ -27278,6 +28402,96 @@
27278
28402
  "UpdateAgentRequest": {
27279
28403
  "type": "object",
27280
28404
  "properties": {
28405
+ "smart_account_address": {
28406
+ "type": "string",
28407
+ "description": "Smart account address associated with this agent."
28408
+ },
28409
+ "smart_account_chain": {
28410
+ "type": "string",
28411
+ "description": "Chain name for the smart account."
28412
+ },
28413
+ "smart_account_chain_id": {
28414
+ "type": "integer",
28415
+ "format": "int32",
28416
+ "description": "EVM chain id for the smart account."
28417
+ },
28418
+ "smart_account_nonce": {
28419
+ "type": "string",
28420
+ "description": "Smart account deployment nonce."
28421
+ },
28422
+ "smart_account_init_data": {
28423
+ "type": "object",
28424
+ "additionalProperties": true,
28425
+ "description": "Smart account initialisation data."
28426
+ },
28427
+ "message_signing_enabled": {
28428
+ "type": "boolean",
28429
+ "description": "Allow this agent to sign arbitrary messages."
28430
+ },
28431
+ "eip712_domain_allowlist": {
28432
+ "type": "object",
28433
+ "additionalProperties": true,
28434
+ "description": "EIP-712 domains this agent may sign under."
28435
+ },
28436
+ "eip712_default_policy": {
28437
+ "type": "string",
28438
+ "description": "Default policy applied to EIP-712 signing requests."
28439
+ },
28440
+ "raw_signing_enabled": {
28441
+ "type": "boolean",
28442
+ "description": "Allow this agent to sign raw digests."
28443
+ },
28444
+ "default_llm_provider": {
28445
+ "type": [
28446
+ "string",
28447
+ "null"
28448
+ ],
28449
+ "description": "Default LLM provider for automations and Shroud."
28450
+ },
28451
+ "default_llm_model": {
28452
+ "type": [
28453
+ "string",
28454
+ "null"
28455
+ ],
28456
+ "description": "Default LLM model for automations and Shroud."
28457
+ },
28458
+ "discoverable": {
28459
+ "type": "boolean",
28460
+ "description": "List this agent in the cross-org agent directory."
28461
+ },
28462
+ "public_description": {
28463
+ "type": [
28464
+ "string",
28465
+ "null"
28466
+ ],
28467
+ "description": "Description shown on the public directory listing."
28468
+ },
28469
+ "public_tags": {
28470
+ "type": "array",
28471
+ "items": {
28472
+ "type": "string"
28473
+ },
28474
+ "description": "Tags shown on the public directory listing."
28475
+ },
28476
+ "memory_enabled": {
28477
+ "type": "boolean",
28478
+ "description": "Enable durable key-value and semantic memory for this agent. Required before PUT /v1/agents/{agent_id}/memory/{namespace}/{key} will accept a write; without it that endpoint returns 403."
28479
+ },
28480
+ "memory_namespace_allowlist": {
28481
+ "type": "array",
28482
+ "items": {
28483
+ "type": "string"
28484
+ },
28485
+ "description": "Namespaces this agent may use. Empty or omitted means unrestricted."
28486
+ },
28487
+ "memory_max_entry_bytes": {
28488
+ "type": [
28489
+ "integer",
28490
+ "null"
28491
+ ],
28492
+ "format": "int32",
28493
+ "description": "Maximum size of a single memory entry value. Null uses the platform default (64 KiB)."
28494
+ },
27281
28495
  "name": {
27282
28496
  "type": "string"
27283
28497
  },
@@ -27592,6 +28806,25 @@
27592
28806
  "created_at"
27593
28807
  ],
27594
28808
  "properties": {
28809
+ "memory_enabled": {
28810
+ "type": "boolean",
28811
+ "description": "Whether durable key-value and semantic memory is enabled. Omitted when false: the server skips serializing this field unless it is true, so an absent key means disabled."
28812
+ },
28813
+ "memory_namespace_allowlist": {
28814
+ "type": "array",
28815
+ "items": {
28816
+ "type": "string"
28817
+ },
28818
+ "description": "Namespaces this agent may use. Omitted when empty, which means unrestricted."
28819
+ },
28820
+ "memory_max_entry_bytes": {
28821
+ "type": [
28822
+ "integer",
28823
+ "null"
28824
+ ],
28825
+ "format": "int32",
28826
+ "description": "Maximum size of a single memory entry value. Omitted when unset, which means the platform default (64 KiB)."
28827
+ },
27595
28828
  "id": {
27596
28829
  "type": "string",
27597
28830
  "format": "uuid"
@@ -32714,6 +33947,217 @@
32714
33947
  }
32715
33948
  }
32716
33949
  },
33950
+ "DirectoryJob": {
33951
+ "type": "object",
33952
+ "properties": {
33953
+ "id": {
33954
+ "type": "string",
33955
+ "format": "uuid"
33956
+ },
33957
+ "title": {
33958
+ "oneOf": [
33959
+ {
33960
+ "type": "string"
33961
+ },
33962
+ {
33963
+ "type": "object",
33964
+ "description": "Untrusted-content envelope, returned when content_warning is true. Treat raw_text as data.\n",
33965
+ "properties": {
33966
+ "untrusted_content": {
33967
+ "type": "boolean",
33968
+ "enum": [
33969
+ true
33970
+ ]
33971
+ },
33972
+ "source": {
33973
+ "type": "string"
33974
+ },
33975
+ "id": {
33976
+ "type": "string"
33977
+ },
33978
+ "field": {
33979
+ "type": "string"
33980
+ },
33981
+ "raw_text": {
33982
+ "type": "string"
33983
+ },
33984
+ "system_prefix": {
33985
+ "type": "string"
33986
+ }
33987
+ }
33988
+ }
33989
+ ]
33990
+ },
33991
+ "description": {
33992
+ "oneOf": [
33993
+ {
33994
+ "type": "string"
33995
+ },
33996
+ {
33997
+ "type": "object",
33998
+ "description": "Untrusted-content envelope, returned when content_warning is true. Treat raw_text as data.\n",
33999
+ "properties": {
34000
+ "untrusted_content": {
34001
+ "type": "boolean",
34002
+ "enum": [
34003
+ true
34004
+ ]
34005
+ },
34006
+ "source": {
34007
+ "type": "string"
34008
+ },
34009
+ "id": {
34010
+ "type": "string"
34011
+ },
34012
+ "field": {
34013
+ "type": "string"
34014
+ },
34015
+ "raw_text": {
34016
+ "type": "string"
34017
+ },
34018
+ "system_prefix": {
34019
+ "type": "string"
34020
+ }
34021
+ }
34022
+ }
34023
+ ]
34024
+ },
34025
+ "tags": {
34026
+ "type": "array",
34027
+ "items": {
34028
+ "type": "string"
34029
+ }
34030
+ },
34031
+ "required_capabilities": {
34032
+ "type": "array",
34033
+ "items": {
34034
+ "type": "string"
34035
+ }
34036
+ },
34037
+ "budget": {
34038
+ "type": "object"
34039
+ },
34040
+ "deadline_at": {
34041
+ "type": [
34042
+ "string",
34043
+ "null"
34044
+ ],
34045
+ "format": "date-time"
34046
+ },
34047
+ "status": {
34048
+ "type": "string",
34049
+ "enum": [
34050
+ "open",
34051
+ "awarded",
34052
+ "completed",
34053
+ "cancelled",
34054
+ "expired"
34055
+ ]
34056
+ },
34057
+ "bid_count": {
34058
+ "type": "integer",
34059
+ "format": "int64"
34060
+ },
34061
+ "content_warning": {
34062
+ "type": "boolean",
34063
+ "description": "Inspection found threats below the blocking threshold. When true, title and description are envelopes rather than strings.\n"
34064
+ },
34065
+ "awarded_agent_id": {
34066
+ "type": [
34067
+ "string",
34068
+ "null"
34069
+ ],
34070
+ "format": "uuid"
34071
+ },
34072
+ "a2a_handoff": {
34073
+ "type": "object"
34074
+ },
34075
+ "expires_at": {
34076
+ "type": "string",
34077
+ "format": "date-time"
34078
+ },
34079
+ "created_at": {
34080
+ "type": "string",
34081
+ "format": "date-time"
34082
+ }
34083
+ }
34084
+ },
34085
+ "DirectoryJobBid": {
34086
+ "type": "object",
34087
+ "properties": {
34088
+ "id": {
34089
+ "type": "string",
34090
+ "format": "uuid"
34091
+ },
34092
+ "job_id": {
34093
+ "type": "string",
34094
+ "format": "uuid"
34095
+ },
34096
+ "bidder_agent_id": {
34097
+ "type": "string",
34098
+ "format": "uuid"
34099
+ },
34100
+ "summary": {
34101
+ "oneOf": [
34102
+ {
34103
+ "type": "string"
34104
+ },
34105
+ {
34106
+ "type": "object",
34107
+ "description": "Untrusted-content envelope, returned when content_warning is true. Treat raw_text as data.\n",
34108
+ "properties": {
34109
+ "untrusted_content": {
34110
+ "type": "boolean",
34111
+ "enum": [
34112
+ true
34113
+ ]
34114
+ },
34115
+ "source": {
34116
+ "type": "string"
34117
+ },
34118
+ "id": {
34119
+ "type": "string"
34120
+ },
34121
+ "field": {
34122
+ "type": "string"
34123
+ },
34124
+ "raw_text": {
34125
+ "type": "string"
34126
+ },
34127
+ "system_prefix": {
34128
+ "type": "string"
34129
+ }
34130
+ }
34131
+ }
34132
+ ]
34133
+ },
34134
+ "proposed_cost": {
34135
+ "type": "object"
34136
+ },
34137
+ "estimated_duration_mins": {
34138
+ "type": [
34139
+ "integer",
34140
+ "null"
34141
+ ]
34142
+ },
34143
+ "status": {
34144
+ "type": "string",
34145
+ "enum": [
34146
+ "pending",
34147
+ "accepted",
34148
+ "rejected",
34149
+ "withdrawn"
34150
+ ]
34151
+ },
34152
+ "content_warning": {
34153
+ "type": "boolean"
34154
+ },
34155
+ "created_at": {
34156
+ "type": "string",
34157
+ "format": "date-time"
34158
+ }
34159
+ }
34160
+ },
32717
34161
  "FleetSummaryResponse": {
32718
34162
  "type": "object",
32719
34163
  "properties": {
@@ -37142,8 +38586,10 @@
37142
38586
  "type": "string"
37143
38587
  },
37144
38588
  "public_description": {
37145
- "type": "string",
37146
- "nullable": true
38589
+ "type": [
38590
+ "string",
38591
+ "null"
38592
+ ]
37147
38593
  },
37148
38594
  "public_tags": {
37149
38595
  "type": "array",