@1claw/openapi-spec 0.33.0 → 0.34.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.
Files changed (3) hide show
  1. package/openapi.json +644 -0
  2. package/openapi.yaml +410 -0
  3. package/package.json +1 -1
package/openapi.json CHANGED
@@ -118,6 +118,10 @@
118
118
  {
119
119
  "name": "OAuth",
120
120
  "description": "OAuth 2.0 authorization server (PKCE, consent, token exchange, OIDC UserInfo)"
121
+ },
122
+ {
123
+ "name": "Risk Engine",
124
+ "description": "Risk events, verdicts, and honeytoken management"
121
125
  }
122
126
  ],
123
127
  "paths": {
@@ -4277,6 +4281,74 @@
4277
4281
  }
4278
4282
  }
4279
4283
  },
4284
+ "/v1/org/bankr-config": {
4285
+ "get": {
4286
+ "tags": [
4287
+ "Organization"
4288
+ ],
4289
+ "summary": "Get org Bankr partner configuration",
4290
+ "description": "Returns whether the org has configured Bankr BYOK (partner key prefix and default wallet only — never the secret). Users only.",
4291
+ "operationId": "getOrgBankrConfig",
4292
+ "responses": {
4293
+ "200": {
4294
+ "description": "Bankr configuration status",
4295
+ "content": {
4296
+ "application/json": {
4297
+ "schema": {
4298
+ "$ref": "#/components/schemas/OrgBankrConfigResponse"
4299
+ }
4300
+ }
4301
+ }
4302
+ }
4303
+ }
4304
+ },
4305
+ "put": {
4306
+ "tags": [
4307
+ "Organization"
4308
+ ],
4309
+ "summary": "Set org Bankr partner configuration",
4310
+ "description": "Store or replace the org's Bankr partner key (`bk_ptr_...`) and optional default wallet (`wlt_...`). Owner/admin only. Partner key encrypted at rest.",
4311
+ "operationId": "upsertOrgBankrConfig",
4312
+ "requestBody": {
4313
+ "required": true,
4314
+ "content": {
4315
+ "application/json": {
4316
+ "schema": {
4317
+ "$ref": "#/components/schemas/UpsertOrgBankrConfigRequest"
4318
+ }
4319
+ }
4320
+ }
4321
+ },
4322
+ "responses": {
4323
+ "200": {
4324
+ "description": "Configuration saved",
4325
+ "content": {
4326
+ "application/json": {
4327
+ "schema": {
4328
+ "$ref": "#/components/schemas/OrgBankrConfigResponse"
4329
+ }
4330
+ }
4331
+ }
4332
+ }
4333
+ }
4334
+ },
4335
+ "delete": {
4336
+ "tags": [
4337
+ "Organization"
4338
+ ],
4339
+ "summary": "Remove org Bankr partner configuration",
4340
+ "description": "Delete BYOK credentials for the org. Owner/admin only.",
4341
+ "operationId": "deleteOrgBankrConfig",
4342
+ "responses": {
4343
+ "204": {
4344
+ "description": "Configuration removed"
4345
+ },
4346
+ "404": {
4347
+ "description": "Configuration not found"
4348
+ }
4349
+ }
4350
+ }
4351
+ },
4280
4352
  "/v1/org/invite": {
4281
4353
  "post": {
4282
4354
  "tags": [
@@ -8904,6 +8976,267 @@
8904
8976
  }
8905
8977
  }
8906
8978
  }
8979
+ },
8980
+ "/v1/risk/events": {
8981
+ "get": {
8982
+ "tags": [
8983
+ "Risk Engine"
8984
+ ],
8985
+ "summary": "List risk events",
8986
+ "description": "Returns risk events detected by the risk engine, ordered by most recent first.\nFilter by severity or principal type.\n",
8987
+ "operationId": "listRiskEvents",
8988
+ "parameters": [
8989
+ {
8990
+ "name": "severity",
8991
+ "in": "query",
8992
+ "schema": {
8993
+ "type": "string",
8994
+ "enum": [
8995
+ "low",
8996
+ "medium",
8997
+ "high",
8998
+ "critical"
8999
+ ]
9000
+ },
9001
+ "description": "Filter events by severity level"
9002
+ },
9003
+ {
9004
+ "name": "principal_type",
9005
+ "in": "query",
9006
+ "schema": {
9007
+ "type": "string",
9008
+ "enum": [
9009
+ "user",
9010
+ "agent"
9011
+ ]
9012
+ },
9013
+ "description": "Filter events by principal type"
9014
+ },
9015
+ {
9016
+ "name": "limit",
9017
+ "in": "query",
9018
+ "schema": {
9019
+ "type": "integer",
9020
+ "default": 50
9021
+ }
9022
+ },
9023
+ {
9024
+ "name": "offset",
9025
+ "in": "query",
9026
+ "schema": {
9027
+ "type": "integer",
9028
+ "default": 0
9029
+ }
9030
+ }
9031
+ ],
9032
+ "responses": {
9033
+ "200": {
9034
+ "description": "Risk event list",
9035
+ "content": {
9036
+ "application/json": {
9037
+ "schema": {
9038
+ "$ref": "#/components/schemas/RiskEventListResponse"
9039
+ }
9040
+ }
9041
+ }
9042
+ },
9043
+ "401": {
9044
+ "$ref": "#/components/responses/Unauthorized"
9045
+ }
9046
+ }
9047
+ }
9048
+ },
9049
+ "/v1/risk/verdicts": {
9050
+ "get": {
9051
+ "tags": [
9052
+ "Risk Engine"
9053
+ ],
9054
+ "summary": "List risk verdicts",
9055
+ "description": "Returns all active risk verdicts for the caller's organization.",
9056
+ "operationId": "listRiskVerdicts",
9057
+ "responses": {
9058
+ "200": {
9059
+ "description": "Verdict list",
9060
+ "content": {
9061
+ "application/json": {
9062
+ "schema": {
9063
+ "$ref": "#/components/schemas/RiskVerdictListResponse"
9064
+ }
9065
+ }
9066
+ }
9067
+ },
9068
+ "401": {
9069
+ "$ref": "#/components/responses/Unauthorized"
9070
+ }
9071
+ }
9072
+ }
9073
+ },
9074
+ "/v1/risk/verdicts/{principal_type}/{principal_id}": {
9075
+ "get": {
9076
+ "tags": [
9077
+ "Risk Engine"
9078
+ ],
9079
+ "summary": "Get risk verdict for a principal",
9080
+ "description": "Returns the current risk verdict for a specific user or agent.",
9081
+ "operationId": "getRiskVerdict",
9082
+ "parameters": [
9083
+ {
9084
+ "name": "principal_type",
9085
+ "in": "path",
9086
+ "required": true,
9087
+ "schema": {
9088
+ "type": "string",
9089
+ "enum": [
9090
+ "user",
9091
+ "agent"
9092
+ ]
9093
+ }
9094
+ },
9095
+ {
9096
+ "name": "principal_id",
9097
+ "in": "path",
9098
+ "required": true,
9099
+ "schema": {
9100
+ "type": "string",
9101
+ "format": "uuid"
9102
+ }
9103
+ }
9104
+ ],
9105
+ "responses": {
9106
+ "200": {
9107
+ "description": "Risk verdict (null if no verdict exists)",
9108
+ "content": {
9109
+ "application/json": {
9110
+ "schema": {
9111
+ "type": "object",
9112
+ "properties": {
9113
+ "verdict": {
9114
+ "$ref": "#/components/schemas/RiskVerdict",
9115
+ "nullable": true
9116
+ }
9117
+ }
9118
+ }
9119
+ }
9120
+ }
9121
+ },
9122
+ "401": {
9123
+ "$ref": "#/components/responses/Unauthorized"
9124
+ },
9125
+ "404": {
9126
+ "$ref": "#/components/responses/NotFound"
9127
+ }
9128
+ }
9129
+ }
9130
+ },
9131
+ "/v1/risk/honeytokens": {
9132
+ "get": {
9133
+ "tags": [
9134
+ "Risk Engine"
9135
+ ],
9136
+ "summary": "List honeytokens",
9137
+ "description": "Returns all honeytokens (canary secrets) configured for the caller's organization.",
9138
+ "operationId": "listHoneytokens",
9139
+ "responses": {
9140
+ "200": {
9141
+ "description": "Honeytoken list",
9142
+ "content": {
9143
+ "application/json": {
9144
+ "schema": {
9145
+ "$ref": "#/components/schemas/HoneytokenListResponse"
9146
+ }
9147
+ }
9148
+ }
9149
+ },
9150
+ "401": {
9151
+ "$ref": "#/components/responses/Unauthorized"
9152
+ }
9153
+ }
9154
+ },
9155
+ "post": {
9156
+ "tags": [
9157
+ "Risk Engine"
9158
+ ],
9159
+ "summary": "Create a honeytoken",
9160
+ "description": "Register a secret path as a honeytoken (canary). Any access to this secret\ntriggers a risk event and increments the trigger counter.\n",
9161
+ "operationId": "createHoneytoken",
9162
+ "requestBody": {
9163
+ "required": true,
9164
+ "content": {
9165
+ "application/json": {
9166
+ "schema": {
9167
+ "$ref": "#/components/schemas/CreateHoneytokenRequest"
9168
+ }
9169
+ }
9170
+ }
9171
+ },
9172
+ "responses": {
9173
+ "201": {
9174
+ "description": "Honeytoken created",
9175
+ "content": {
9176
+ "application/json": {
9177
+ "schema": {
9178
+ "type": "object",
9179
+ "properties": {
9180
+ "honeytoken": {
9181
+ "$ref": "#/components/schemas/Honeytoken"
9182
+ }
9183
+ }
9184
+ }
9185
+ }
9186
+ }
9187
+ },
9188
+ "400": {
9189
+ "$ref": "#/components/responses/BadRequest"
9190
+ },
9191
+ "401": {
9192
+ "$ref": "#/components/responses/Unauthorized"
9193
+ }
9194
+ }
9195
+ }
9196
+ },
9197
+ "/v1/risk/honeytokens/{id}": {
9198
+ "delete": {
9199
+ "tags": [
9200
+ "Risk Engine"
9201
+ ],
9202
+ "summary": "Delete a honeytoken",
9203
+ "description": "Remove a honeytoken registration. The underlying secret is not affected.",
9204
+ "operationId": "deleteHoneytoken",
9205
+ "parameters": [
9206
+ {
9207
+ "name": "id",
9208
+ "in": "path",
9209
+ "required": true,
9210
+ "schema": {
9211
+ "type": "string",
9212
+ "format": "uuid"
9213
+ }
9214
+ }
9215
+ ],
9216
+ "responses": {
9217
+ "200": {
9218
+ "description": "Honeytoken deleted",
9219
+ "content": {
9220
+ "application/json": {
9221
+ "schema": {
9222
+ "type": "object",
9223
+ "properties": {
9224
+ "deleted": {
9225
+ "type": "boolean"
9226
+ }
9227
+ }
9228
+ }
9229
+ }
9230
+ }
9231
+ },
9232
+ "401": {
9233
+ "$ref": "#/components/responses/Unauthorized"
9234
+ },
9235
+ "404": {
9236
+ "$ref": "#/components/responses/NotFound"
9237
+ }
9238
+ }
9239
+ }
8907
9240
  }
8908
9241
  },
8909
9242
  "components": {
@@ -12274,6 +12607,43 @@
12274
12607
  }
12275
12608
  }
12276
12609
  },
12610
+ "OrgBankrConfigResponse": {
12611
+ "type": "object",
12612
+ "properties": {
12613
+ "configured": {
12614
+ "type": "boolean"
12615
+ },
12616
+ "partner_key_prefix": {
12617
+ "type": "string"
12618
+ },
12619
+ "default_wallet_id": {
12620
+ "type": "string"
12621
+ },
12622
+ "updated_at": {
12623
+ "type": "string",
12624
+ "format": "date-time"
12625
+ },
12626
+ "using_platform_fallback": {
12627
+ "type": "boolean"
12628
+ }
12629
+ }
12630
+ },
12631
+ "UpsertOrgBankrConfigRequest": {
12632
+ "type": "object",
12633
+ "required": [
12634
+ "partner_key"
12635
+ ],
12636
+ "properties": {
12637
+ "partner_key": {
12638
+ "type": "string",
12639
+ "description": "Bankr partner API key (bk_ptr_...)"
12640
+ },
12641
+ "default_wallet_id": {
12642
+ "type": "string",
12643
+ "description": "Default provisioned wallet (wlt_...)"
12644
+ }
12645
+ }
12646
+ },
12277
12647
  "UsageSummaryResponse": {
12278
12648
  "type": "object",
12279
12649
  "properties": {
@@ -15169,6 +15539,280 @@
15169
15539
  "format": "date-time"
15170
15540
  }
15171
15541
  }
15542
+ },
15543
+ "RiskEvent": {
15544
+ "type": "object",
15545
+ "required": [
15546
+ "id",
15547
+ "occurred_at",
15548
+ "principal_type",
15549
+ "principal_id",
15550
+ "org_id",
15551
+ "event_type",
15552
+ "payload",
15553
+ "created_at"
15554
+ ],
15555
+ "properties": {
15556
+ "id": {
15557
+ "type": "string",
15558
+ "format": "uuid"
15559
+ },
15560
+ "occurred_at": {
15561
+ "type": "string",
15562
+ "format": "date-time"
15563
+ },
15564
+ "principal_type": {
15565
+ "type": "string",
15566
+ "enum": [
15567
+ "user",
15568
+ "agent"
15569
+ ]
15570
+ },
15571
+ "principal_id": {
15572
+ "type": "string",
15573
+ "format": "uuid"
15574
+ },
15575
+ "org_id": {
15576
+ "type": "string",
15577
+ "format": "uuid"
15578
+ },
15579
+ "event_type": {
15580
+ "type": "string",
15581
+ "description": "Risk event type (e.g. first_seen, geo_velocity, honeytoken_access)"
15582
+ },
15583
+ "ip": {
15584
+ "type": "string",
15585
+ "nullable": true
15586
+ },
15587
+ "asn": {
15588
+ "type": "integer",
15589
+ "nullable": true
15590
+ },
15591
+ "asn_org": {
15592
+ "type": "string",
15593
+ "nullable": true
15594
+ },
15595
+ "country_code": {
15596
+ "type": "string",
15597
+ "nullable": true
15598
+ },
15599
+ "region": {
15600
+ "type": "string",
15601
+ "nullable": true
15602
+ },
15603
+ "city": {
15604
+ "type": "string",
15605
+ "nullable": true
15606
+ },
15607
+ "latitude": {
15608
+ "type": "number",
15609
+ "nullable": true
15610
+ },
15611
+ "longitude": {
15612
+ "type": "number",
15613
+ "nullable": true
15614
+ },
15615
+ "user_agent": {
15616
+ "type": "string",
15617
+ "nullable": true
15618
+ },
15619
+ "payload": {
15620
+ "type": "object",
15621
+ "additionalProperties": true
15622
+ },
15623
+ "created_at": {
15624
+ "type": "string",
15625
+ "format": "date-time"
15626
+ }
15627
+ }
15628
+ },
15629
+ "RiskEventListResponse": {
15630
+ "type": "object",
15631
+ "required": [
15632
+ "events"
15633
+ ],
15634
+ "properties": {
15635
+ "events": {
15636
+ "type": "array",
15637
+ "items": {
15638
+ "$ref": "#/components/schemas/RiskEvent"
15639
+ }
15640
+ }
15641
+ }
15642
+ },
15643
+ "RiskVerdictReason": {
15644
+ "type": "object",
15645
+ "required": [
15646
+ "detector",
15647
+ "severity",
15648
+ "description"
15649
+ ],
15650
+ "properties": {
15651
+ "detector": {
15652
+ "type": "string"
15653
+ },
15654
+ "severity": {
15655
+ "type": "string"
15656
+ },
15657
+ "description": {
15658
+ "type": "string"
15659
+ },
15660
+ "metadata": {
15661
+ "type": "object",
15662
+ "additionalProperties": true
15663
+ }
15664
+ }
15665
+ },
15666
+ "RiskVerdict": {
15667
+ "type": "object",
15668
+ "required": [
15669
+ "principal_type",
15670
+ "principal_id",
15671
+ "org_id",
15672
+ "score",
15673
+ "severity",
15674
+ "reasons",
15675
+ "computed_at",
15676
+ "expires_at"
15677
+ ],
15678
+ "properties": {
15679
+ "principal_type": {
15680
+ "type": "string"
15681
+ },
15682
+ "principal_id": {
15683
+ "type": "string",
15684
+ "format": "uuid"
15685
+ },
15686
+ "org_id": {
15687
+ "type": "string",
15688
+ "format": "uuid"
15689
+ },
15690
+ "score": {
15691
+ "type": "number",
15692
+ "description": "Composite risk score (0.0 – 100.0)"
15693
+ },
15694
+ "severity": {
15695
+ "type": "string",
15696
+ "enum": [
15697
+ "low",
15698
+ "medium",
15699
+ "high",
15700
+ "critical"
15701
+ ]
15702
+ },
15703
+ "reasons": {
15704
+ "type": "array",
15705
+ "items": {
15706
+ "$ref": "#/components/schemas/RiskVerdictReason"
15707
+ }
15708
+ },
15709
+ "computed_at": {
15710
+ "type": "string",
15711
+ "format": "date-time"
15712
+ },
15713
+ "expires_at": {
15714
+ "type": "string",
15715
+ "format": "date-time"
15716
+ }
15717
+ }
15718
+ },
15719
+ "RiskVerdictListResponse": {
15720
+ "type": "object",
15721
+ "required": [
15722
+ "verdicts"
15723
+ ],
15724
+ "properties": {
15725
+ "verdicts": {
15726
+ "type": "array",
15727
+ "items": {
15728
+ "$ref": "#/components/schemas/RiskVerdict"
15729
+ }
15730
+ }
15731
+ }
15732
+ },
15733
+ "Honeytoken": {
15734
+ "type": "object",
15735
+ "required": [
15736
+ "id",
15737
+ "vault_id",
15738
+ "org_id",
15739
+ "secret_path",
15740
+ "created_by",
15741
+ "created_at",
15742
+ "triggered_count"
15743
+ ],
15744
+ "properties": {
15745
+ "id": {
15746
+ "type": "string",
15747
+ "format": "uuid"
15748
+ },
15749
+ "vault_id": {
15750
+ "type": "string",
15751
+ "format": "uuid"
15752
+ },
15753
+ "org_id": {
15754
+ "type": "string",
15755
+ "format": "uuid"
15756
+ },
15757
+ "secret_path": {
15758
+ "type": "string"
15759
+ },
15760
+ "created_by": {
15761
+ "type": "string",
15762
+ "format": "uuid"
15763
+ },
15764
+ "created_at": {
15765
+ "type": "string",
15766
+ "format": "date-time"
15767
+ },
15768
+ "notes": {
15769
+ "type": "string",
15770
+ "nullable": true
15771
+ },
15772
+ "triggered_count": {
15773
+ "type": "integer"
15774
+ },
15775
+ "last_triggered_at": {
15776
+ "type": "string",
15777
+ "format": "date-time",
15778
+ "nullable": true
15779
+ }
15780
+ }
15781
+ },
15782
+ "CreateHoneytokenRequest": {
15783
+ "type": "object",
15784
+ "required": [
15785
+ "vault_id",
15786
+ "secret_path"
15787
+ ],
15788
+ "properties": {
15789
+ "vault_id": {
15790
+ "type": "string",
15791
+ "format": "uuid"
15792
+ },
15793
+ "secret_path": {
15794
+ "type": "string",
15795
+ "description": "Vault secret path to monitor as a canary"
15796
+ },
15797
+ "notes": {
15798
+ "type": "string",
15799
+ "description": "Optional human-readable notes about this honeytoken"
15800
+ }
15801
+ }
15802
+ },
15803
+ "HoneytokenListResponse": {
15804
+ "type": "object",
15805
+ "required": [
15806
+ "honeytokens"
15807
+ ],
15808
+ "properties": {
15809
+ "honeytokens": {
15810
+ "type": "array",
15811
+ "items": {
15812
+ "$ref": "#/components/schemas/Honeytoken"
15813
+ }
15814
+ }
15815
+ }
15172
15816
  }
15173
15817
  }
15174
15818
  }
package/openapi.yaml CHANGED
@@ -72,6 +72,8 @@ tags:
72
72
  description: Platform API for developers building on 1Claw (plt_ keys, user provisioning, bootstrap templates)
73
73
  - name: OAuth
74
74
  description: OAuth 2.0 authorization server (PKCE, consent, token exchange, OIDC UserInfo)
75
+ - name: Risk Engine
76
+ description: Risk events, verdicts, and honeytoken management
75
77
 
76
78
  # =============================================================================
77
79
  # PATHS
@@ -2806,6 +2808,48 @@ paths:
2806
2808
  "404":
2807
2809
  description: Agent-keys vault not found
2808
2810
 
2811
+ /v1/org/bankr-config:
2812
+ get:
2813
+ tags: [Organization]
2814
+ summary: Get org Bankr partner configuration
2815
+ description: Returns whether the org has configured Bankr BYOK (partner key prefix and default wallet only — never the secret). Users only.
2816
+ operationId: getOrgBankrConfig
2817
+ responses:
2818
+ "200":
2819
+ description: Bankr configuration status
2820
+ content:
2821
+ application/json:
2822
+ schema:
2823
+ $ref: "#/components/schemas/OrgBankrConfigResponse"
2824
+ put:
2825
+ tags: [Organization]
2826
+ summary: Set org Bankr partner configuration
2827
+ description: Store or replace the org's Bankr partner key (`bk_ptr_...`) and optional default wallet (`wlt_...`). Owner/admin only. Partner key encrypted at rest.
2828
+ operationId: upsertOrgBankrConfig
2829
+ requestBody:
2830
+ required: true
2831
+ content:
2832
+ application/json:
2833
+ schema:
2834
+ $ref: "#/components/schemas/UpsertOrgBankrConfigRequest"
2835
+ responses:
2836
+ "200":
2837
+ description: Configuration saved
2838
+ content:
2839
+ application/json:
2840
+ schema:
2841
+ $ref: "#/components/schemas/OrgBankrConfigResponse"
2842
+ delete:
2843
+ tags: [Organization]
2844
+ summary: Remove org Bankr partner configuration
2845
+ description: Delete BYOK credentials for the org. Owner/admin only.
2846
+ operationId: deleteOrgBankrConfig
2847
+ responses:
2848
+ "204":
2849
+ description: Configuration removed
2850
+ "404":
2851
+ description: Configuration not found
2852
+
2809
2853
  /v1/org/invite:
2810
2854
  post:
2811
2855
  tags: [Organization]
@@ -5682,6 +5726,173 @@ paths:
5682
5726
  "401":
5683
5727
  $ref: "#/components/responses/Unauthorized"
5684
5728
 
5729
+ # ---------------------------------------------------------------------------
5730
+ # Risk Engine
5731
+ # ---------------------------------------------------------------------------
5732
+
5733
+ /v1/risk/events:
5734
+ get:
5735
+ tags: [Risk Engine]
5736
+ summary: List risk events
5737
+ description: |
5738
+ Returns risk events detected by the risk engine, ordered by most recent first.
5739
+ Filter by severity or principal type.
5740
+ operationId: listRiskEvents
5741
+ parameters:
5742
+ - name: severity
5743
+ in: query
5744
+ schema:
5745
+ type: string
5746
+ enum: [low, medium, high, critical]
5747
+ description: Filter events by severity level
5748
+ - name: principal_type
5749
+ in: query
5750
+ schema:
5751
+ type: string
5752
+ enum: [user, agent]
5753
+ description: Filter events by principal type
5754
+ - name: limit
5755
+ in: query
5756
+ schema:
5757
+ type: integer
5758
+ default: 50
5759
+ - name: offset
5760
+ in: query
5761
+ schema:
5762
+ type: integer
5763
+ default: 0
5764
+ responses:
5765
+ "200":
5766
+ description: Risk event list
5767
+ content:
5768
+ application/json:
5769
+ schema:
5770
+ $ref: "#/components/schemas/RiskEventListResponse"
5771
+ "401":
5772
+ $ref: "#/components/responses/Unauthorized"
5773
+
5774
+ /v1/risk/verdicts:
5775
+ get:
5776
+ tags: [Risk Engine]
5777
+ summary: List risk verdicts
5778
+ description: Returns all active risk verdicts for the caller's organization.
5779
+ operationId: listRiskVerdicts
5780
+ responses:
5781
+ "200":
5782
+ description: Verdict list
5783
+ content:
5784
+ application/json:
5785
+ schema:
5786
+ $ref: "#/components/schemas/RiskVerdictListResponse"
5787
+ "401":
5788
+ $ref: "#/components/responses/Unauthorized"
5789
+
5790
+ /v1/risk/verdicts/{principal_type}/{principal_id}:
5791
+ get:
5792
+ tags: [Risk Engine]
5793
+ summary: Get risk verdict for a principal
5794
+ description: Returns the current risk verdict for a specific user or agent.
5795
+ operationId: getRiskVerdict
5796
+ parameters:
5797
+ - name: principal_type
5798
+ in: path
5799
+ required: true
5800
+ schema:
5801
+ type: string
5802
+ enum: [user, agent]
5803
+ - name: principal_id
5804
+ in: path
5805
+ required: true
5806
+ schema:
5807
+ type: string
5808
+ format: uuid
5809
+ responses:
5810
+ "200":
5811
+ description: Risk verdict (null if no verdict exists)
5812
+ content:
5813
+ application/json:
5814
+ schema:
5815
+ type: object
5816
+ properties:
5817
+ verdict:
5818
+ $ref: "#/components/schemas/RiskVerdict"
5819
+ nullable: true
5820
+ "401":
5821
+ $ref: "#/components/responses/Unauthorized"
5822
+ "404":
5823
+ $ref: "#/components/responses/NotFound"
5824
+
5825
+ /v1/risk/honeytokens:
5826
+ get:
5827
+ tags: [Risk Engine]
5828
+ summary: List honeytokens
5829
+ description: Returns all honeytokens (canary secrets) configured for the caller's organization.
5830
+ operationId: listHoneytokens
5831
+ responses:
5832
+ "200":
5833
+ description: Honeytoken list
5834
+ content:
5835
+ application/json:
5836
+ schema:
5837
+ $ref: "#/components/schemas/HoneytokenListResponse"
5838
+ "401":
5839
+ $ref: "#/components/responses/Unauthorized"
5840
+ post:
5841
+ tags: [Risk Engine]
5842
+ summary: Create a honeytoken
5843
+ description: |
5844
+ Register a secret path as a honeytoken (canary). Any access to this secret
5845
+ triggers a risk event and increments the trigger counter.
5846
+ operationId: createHoneytoken
5847
+ requestBody:
5848
+ required: true
5849
+ content:
5850
+ application/json:
5851
+ schema:
5852
+ $ref: "#/components/schemas/CreateHoneytokenRequest"
5853
+ responses:
5854
+ "201":
5855
+ description: Honeytoken created
5856
+ content:
5857
+ application/json:
5858
+ schema:
5859
+ type: object
5860
+ properties:
5861
+ honeytoken:
5862
+ $ref: "#/components/schemas/Honeytoken"
5863
+ "400":
5864
+ $ref: "#/components/responses/BadRequest"
5865
+ "401":
5866
+ $ref: "#/components/responses/Unauthorized"
5867
+
5868
+ /v1/risk/honeytokens/{id}:
5869
+ delete:
5870
+ tags: [Risk Engine]
5871
+ summary: Delete a honeytoken
5872
+ description: Remove a honeytoken registration. The underlying secret is not affected.
5873
+ operationId: deleteHoneytoken
5874
+ parameters:
5875
+ - name: id
5876
+ in: path
5877
+ required: true
5878
+ schema:
5879
+ type: string
5880
+ format: uuid
5881
+ responses:
5882
+ "200":
5883
+ description: Honeytoken deleted
5884
+ content:
5885
+ application/json:
5886
+ schema:
5887
+ type: object
5888
+ properties:
5889
+ deleted:
5890
+ type: boolean
5891
+ "401":
5892
+ $ref: "#/components/responses/Unauthorized"
5893
+ "404":
5894
+ $ref: "#/components/responses/NotFound"
5895
+
5685
5896
  # =============================================================================
5686
5897
  # COMPONENTS
5687
5898
  # =============================================================================
@@ -8043,6 +8254,32 @@ components:
8043
8254
  type: string
8044
8255
  format: uuid
8045
8256
 
8257
+ OrgBankrConfigResponse:
8258
+ type: object
8259
+ properties:
8260
+ configured:
8261
+ type: boolean
8262
+ partner_key_prefix:
8263
+ type: string
8264
+ default_wallet_id:
8265
+ type: string
8266
+ updated_at:
8267
+ type: string
8268
+ format: date-time
8269
+ using_platform_fallback:
8270
+ type: boolean
8271
+
8272
+ UpsertOrgBankrConfigRequest:
8273
+ type: object
8274
+ required: [partner_key]
8275
+ properties:
8276
+ partner_key:
8277
+ type: string
8278
+ description: Bankr partner API key (bk_ptr_...)
8279
+ default_wallet_id:
8280
+ type: string
8281
+ description: Default provisioned wallet (wlt_...)
8282
+
8046
8283
  # --- Billing ---
8047
8284
 
8048
8285
  UsageSummaryResponse:
@@ -10016,3 +10253,176 @@ components:
10016
10253
  created_at:
10017
10254
  type: string
10018
10255
  format: date-time
10256
+
10257
+ # --- Risk Engine ---
10258
+
10259
+ RiskEvent:
10260
+ type: object
10261
+ required: [id, occurred_at, principal_type, principal_id, org_id, event_type, payload, created_at]
10262
+ properties:
10263
+ id:
10264
+ type: string
10265
+ format: uuid
10266
+ occurred_at:
10267
+ type: string
10268
+ format: date-time
10269
+ principal_type:
10270
+ type: string
10271
+ enum: [user, agent]
10272
+ principal_id:
10273
+ type: string
10274
+ format: uuid
10275
+ org_id:
10276
+ type: string
10277
+ format: uuid
10278
+ event_type:
10279
+ type: string
10280
+ description: "Risk event type (e.g. first_seen, geo_velocity, honeytoken_access)"
10281
+ ip:
10282
+ type: string
10283
+ nullable: true
10284
+ asn:
10285
+ type: integer
10286
+ nullable: true
10287
+ asn_org:
10288
+ type: string
10289
+ nullable: true
10290
+ country_code:
10291
+ type: string
10292
+ nullable: true
10293
+ region:
10294
+ type: string
10295
+ nullable: true
10296
+ city:
10297
+ type: string
10298
+ nullable: true
10299
+ latitude:
10300
+ type: number
10301
+ nullable: true
10302
+ longitude:
10303
+ type: number
10304
+ nullable: true
10305
+ user_agent:
10306
+ type: string
10307
+ nullable: true
10308
+ payload:
10309
+ type: object
10310
+ additionalProperties: true
10311
+ created_at:
10312
+ type: string
10313
+ format: date-time
10314
+
10315
+ RiskEventListResponse:
10316
+ type: object
10317
+ required: [events]
10318
+ properties:
10319
+ events:
10320
+ type: array
10321
+ items:
10322
+ $ref: "#/components/schemas/RiskEvent"
10323
+
10324
+ RiskVerdictReason:
10325
+ type: object
10326
+ required: [detector, severity, description]
10327
+ properties:
10328
+ detector:
10329
+ type: string
10330
+ severity:
10331
+ type: string
10332
+ description:
10333
+ type: string
10334
+ metadata:
10335
+ type: object
10336
+ additionalProperties: true
10337
+
10338
+ RiskVerdict:
10339
+ type: object
10340
+ required: [principal_type, principal_id, org_id, score, severity, reasons, computed_at, expires_at]
10341
+ properties:
10342
+ principal_type:
10343
+ type: string
10344
+ principal_id:
10345
+ type: string
10346
+ format: uuid
10347
+ org_id:
10348
+ type: string
10349
+ format: uuid
10350
+ score:
10351
+ type: number
10352
+ description: Composite risk score (0.0 – 100.0)
10353
+ severity:
10354
+ type: string
10355
+ enum: [low, medium, high, critical]
10356
+ reasons:
10357
+ type: array
10358
+ items:
10359
+ $ref: "#/components/schemas/RiskVerdictReason"
10360
+ computed_at:
10361
+ type: string
10362
+ format: date-time
10363
+ expires_at:
10364
+ type: string
10365
+ format: date-time
10366
+
10367
+ RiskVerdictListResponse:
10368
+ type: object
10369
+ required: [verdicts]
10370
+ properties:
10371
+ verdicts:
10372
+ type: array
10373
+ items:
10374
+ $ref: "#/components/schemas/RiskVerdict"
10375
+
10376
+ Honeytoken:
10377
+ type: object
10378
+ required: [id, vault_id, org_id, secret_path, created_by, created_at, triggered_count]
10379
+ properties:
10380
+ id:
10381
+ type: string
10382
+ format: uuid
10383
+ vault_id:
10384
+ type: string
10385
+ format: uuid
10386
+ org_id:
10387
+ type: string
10388
+ format: uuid
10389
+ secret_path:
10390
+ type: string
10391
+ created_by:
10392
+ type: string
10393
+ format: uuid
10394
+ created_at:
10395
+ type: string
10396
+ format: date-time
10397
+ notes:
10398
+ type: string
10399
+ nullable: true
10400
+ triggered_count:
10401
+ type: integer
10402
+ last_triggered_at:
10403
+ type: string
10404
+ format: date-time
10405
+ nullable: true
10406
+
10407
+ CreateHoneytokenRequest:
10408
+ type: object
10409
+ required: [vault_id, secret_path]
10410
+ properties:
10411
+ vault_id:
10412
+ type: string
10413
+ format: uuid
10414
+ secret_path:
10415
+ type: string
10416
+ description: Vault secret path to monitor as a canary
10417
+ notes:
10418
+ type: string
10419
+ description: Optional human-readable notes about this honeytoken
10420
+
10421
+ HoneytokenListResponse:
10422
+ type: object
10423
+ required: [honeytokens]
10424
+ properties:
10425
+ honeytokens:
10426
+ type: array
10427
+ items:
10428
+ $ref: "#/components/schemas/Honeytoken"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1claw/openapi-spec",
3
- "version": "0.33.0",
3
+ "version": "0.34.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": {