@featureflip/mcp 0.1.11 → 0.1.13

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.
@@ -0,0 +1,2964 @@
1
+ declare const _default: {
2
+ "endpoints": {
3
+ "POST /api/v1/orgs/{org}/projects/{project}/environments": "PublicEnvironmentResponse",
4
+ "GET /api/v1/orgs/{org}/projects/{project}/environments": "PublicEnvironmentResponsePagedResult",
5
+ "GET /api/v1/orgs/{org}/projects/{project}/environments/{env}": "PublicEnvironmentResponse",
6
+ "POST /api/v1/orgs/{org}/projects/{project}/flags": "PublicFlagResponse",
7
+ "GET /api/v1/orgs/{org}/projects/{project}/flags": "PublicFlagListItemPagedResult",
8
+ "GET /api/v1/orgs/{org}/projects/{project}/flags/removal-candidates": "PublicFlagRemovalCandidatePagedResult",
9
+ "GET /api/v1/orgs/{org}/projects/{project}/flags/{flag}": "PublicFlagResponse",
10
+ "GET /api/v1/orgs/{org}/projects/{project}/flags/{flag}/environments/{env}": "PublicFlagEnvConfigResponse",
11
+ "GET /api/v1/orgs/{org}/projects/{project}/flags/{flag}/environments/{env}/targeting": "PublicTargetingConfigResponse",
12
+ "POST /api/v1/orgs/{org}/projects/{project}/flags/{flag}/environments/{env}/rules": "PublicTargetingRuleResponse",
13
+ "GET /api/v1/orgs/{org}/projects/{project}/flags/{flag}/environments/{env}/rules/{ruleId}": "PublicTargetingRuleResponse",
14
+ "POST /api/v1/orgs/{org}/projects/{project}/flags/{flag}/variations": "PublicVariationResponse",
15
+ "GET /api/v1/me": "MeResponse",
16
+ "GET /api/v1/orgs": "OrganizationResponsePagedResult",
17
+ "GET /api/v1/orgs/{org}": "OrganizationResponse",
18
+ "POST /api/v1/orgs/{org}/projects": "ProjectResponse",
19
+ "GET /api/v1/orgs/{org}/projects": "ProjectResponsePagedResult",
20
+ "GET /api/v1/orgs/{org}/projects/{project}": "ProjectResponse",
21
+ "GET /api/v1/orgs/{org}/projects/{project}/default-flag-lifetime/impact": "PublicDefaultFlagLifetimeImpact",
22
+ "POST /api/v1/orgs/{org}/projects/{project}/environments/{env}/sdk-keys": "PublicCreateSdkKeyResponse",
23
+ "GET /api/v1/orgs/{org}/projects/{project}/environments/{env}/sdk-keys": "PublicSdkKeyResponsePagedResult",
24
+ "GET /api/v1/orgs/{org}/projects/{project}/environments/{env}/sdk-keys/{sdkKey}": "PublicSdkKeyResponse",
25
+ "POST /api/v1/orgs/{org}/projects/{project}/segments": "PublicSegmentResponse",
26
+ "GET /api/v1/orgs/{org}/projects/{project}/segments": "PublicSegmentResponsePagedResult",
27
+ "GET /api/v1/orgs/{org}/projects/{project}/segments/{segment}": "PublicSegmentResponse",
28
+ "GET /api/v1/orgs/{org}/webhooks": "PublicWebhookSubscriptionResponsePagedResult",
29
+ "POST /api/v1/orgs/{org}/webhooks": "PublicCreateWebhookSubscriptionResponse",
30
+ "GET /api/v1/orgs/{org}/webhooks/{id}": "PublicWebhookSubscriptionResponse",
31
+ "POST /api/v1/orgs/{org}/webhooks/{id}/secrets": "PublicRotateWebhookSecretResponse",
32
+ "POST /api/v1/orgs/{org}/webhooks/{id}/test": "PublicTestWebhookSubscriptionResponse",
33
+ "GET /api/v1/orgs/{org}/webhooks/{id}/deliveries": "PublicWebhookDeliveryResponsePagedResult"
34
+ },
35
+ "$defs": {
36
+ "ActionCapability": {
37
+ "type": [
38
+ "object",
39
+ "null"
40
+ ],
41
+ "properties": {
42
+ "allowed": {
43
+ "type": [
44
+ "boolean",
45
+ "null"
46
+ ]
47
+ },
48
+ "reason": {
49
+ "type": [
50
+ "string",
51
+ "null"
52
+ ]
53
+ }
54
+ },
55
+ "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why."
56
+ },
57
+ "MeResponse": {
58
+ "type": [
59
+ "object",
60
+ "null"
61
+ ],
62
+ "properties": {
63
+ "type": {
64
+ "type": [
65
+ "string",
66
+ "null"
67
+ ]
68
+ },
69
+ "id": {
70
+ "type": [
71
+ "string",
72
+ "null"
73
+ ]
74
+ },
75
+ "name": {
76
+ "type": [
77
+ "string",
78
+ "null"
79
+ ]
80
+ },
81
+ "email": {
82
+ "type": [
83
+ "string",
84
+ "null"
85
+ ]
86
+ },
87
+ "emailVerified": {
88
+ "type": [
89
+ "boolean",
90
+ "null"
91
+ ]
92
+ },
93
+ "organizationId": {
94
+ "type": [
95
+ "string",
96
+ "null"
97
+ ]
98
+ },
99
+ "role": {
100
+ "type": [
101
+ "string",
102
+ "null"
103
+ ]
104
+ },
105
+ "projectScope": {
106
+ "type": [
107
+ "array",
108
+ "null"
109
+ ],
110
+ "items": {
111
+ "type": [
112
+ "string",
113
+ "null"
114
+ ]
115
+ }
116
+ }
117
+ },
118
+ "description": "The authenticated caller's identity, returned by `GET /api/v1/me`. The public API\nauthenticates two kinds of principal, so this is a `type`-discriminated shape.\nA `\"user\"` caller (a session/JWT user or a personal access token, `ffp_...`) carries\n`email` + `emailVerified`. A `\"service_token\"` caller (`ffs_...`) has no\nbacking user row, so it carries `organizationId` + `role` + `projectScope` (the\ntoken's org, its role in that org, and its project allowlist) instead. The type-inapplicable\nfields are omitted from the response body. `projectScope` is omitted for an unrestricted\nservice token (access to every project), never an empty list."
119
+ },
120
+ "NextAction": {
121
+ "type": [
122
+ "object",
123
+ "null"
124
+ ],
125
+ "properties": {
126
+ "method": {
127
+ "type": [
128
+ "string",
129
+ "null"
130
+ ]
131
+ },
132
+ "path": {
133
+ "type": [
134
+ "string",
135
+ "null"
136
+ ]
137
+ }
138
+ }
139
+ },
140
+ "OrganizationResponse": {
141
+ "type": [
142
+ "object",
143
+ "null"
144
+ ],
145
+ "properties": {
146
+ "id": {
147
+ "type": [
148
+ "string",
149
+ "null"
150
+ ]
151
+ },
152
+ "name": {
153
+ "type": [
154
+ "string",
155
+ "null"
156
+ ]
157
+ },
158
+ "slug": {
159
+ "type": [
160
+ "string",
161
+ "null"
162
+ ]
163
+ },
164
+ "plan": {
165
+ "type": [
166
+ "string",
167
+ "null"
168
+ ],
169
+ "description": "Allowed values: Solo, Team, Pro, Business, Enterprise."
170
+ },
171
+ "isActive": {
172
+ "type": [
173
+ "boolean",
174
+ "null"
175
+ ]
176
+ },
177
+ "createdAt": {
178
+ "type": [
179
+ "string",
180
+ "null"
181
+ ]
182
+ }
183
+ },
184
+ "description": "Public representation of an organization, returned by both `GET /api/v1/orgs` (list) and\n`GET /api/v1/orgs/{org}` (detail). Drops dashboard-only fields (`BillingEmail` is\nbilling-contact PII, `UpdatedAt` is dashboard audit trivia) from the dashboard's\nOrganizationDto/OrganizationListItemDto."
185
+ },
186
+ "OrganizationResponsePagedResult": {
187
+ "type": [
188
+ "object",
189
+ "null"
190
+ ],
191
+ "properties": {
192
+ "items": {
193
+ "type": [
194
+ "array",
195
+ "null"
196
+ ],
197
+ "items": {
198
+ "anyOf": [
199
+ {
200
+ "$ref": "#/$defs/OrganizationResponse"
201
+ },
202
+ {
203
+ "type": "null"
204
+ }
205
+ ]
206
+ }
207
+ },
208
+ "next_cursor": {
209
+ "type": [
210
+ "string",
211
+ "null"
212
+ ]
213
+ },
214
+ "_actions": {
215
+ "type": [
216
+ "object",
217
+ "null"
218
+ ],
219
+ "additionalProperties": {
220
+ "anyOf": [
221
+ {
222
+ "$ref": "#/$defs/ActionCapability"
223
+ },
224
+ {
225
+ "type": "null"
226
+ }
227
+ ]
228
+ },
229
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
230
+ }
231
+ },
232
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
233
+ },
234
+ "ProjectResponse": {
235
+ "type": [
236
+ "object",
237
+ "null"
238
+ ],
239
+ "properties": {
240
+ "id": {
241
+ "type": [
242
+ "string",
243
+ "null"
244
+ ]
245
+ },
246
+ "key": {
247
+ "type": [
248
+ "string",
249
+ "null"
250
+ ]
251
+ },
252
+ "name": {
253
+ "type": [
254
+ "string",
255
+ "null"
256
+ ]
257
+ },
258
+ "description": {
259
+ "type": [
260
+ "string",
261
+ "null"
262
+ ]
263
+ },
264
+ "createdAt": {
265
+ "type": [
266
+ "string",
267
+ "null"
268
+ ]
269
+ },
270
+ "updatedAt": {
271
+ "type": [
272
+ "string",
273
+ "null"
274
+ ]
275
+ },
276
+ "defaultFlagLifetimeDays": {
277
+ "type": [
278
+ "integer",
279
+ "null"
280
+ ]
281
+ },
282
+ "_actions": {
283
+ "type": [
284
+ "object",
285
+ "null"
286
+ ],
287
+ "additionalProperties": {
288
+ "anyOf": [
289
+ {
290
+ "$ref": "#/$defs/ActionCapability"
291
+ },
292
+ {
293
+ "type": "null"
294
+ }
295
+ ]
296
+ },
297
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
298
+ }
299
+ },
300
+ "description": "Public representation of a project, returned by `GET /api/v1/orgs/{org}/projects` (list),\n`GET .../projects/{project}` (detail), and the body of a successful create/update. Drops\nthe dashboard-only nested `Environments` collection from ProjectDto — the\npublic API surfaces environments via their own endpoint (Task 6), not embedded here.\nUpdatedAt is only populated from ProjectDto (the detail/create\nshape); ProjectListItemDto doesn't carry it, so list rows leave it `null`.\nDefaultFlagLifetimeDays is the project's default flag lifetime in days, or null (#3194)."
301
+ },
302
+ "ProjectResponsePagedResult": {
303
+ "type": [
304
+ "object",
305
+ "null"
306
+ ],
307
+ "properties": {
308
+ "items": {
309
+ "type": [
310
+ "array",
311
+ "null"
312
+ ],
313
+ "items": {
314
+ "anyOf": [
315
+ {
316
+ "$ref": "#/$defs/ProjectResponse"
317
+ },
318
+ {
319
+ "type": "null"
320
+ }
321
+ ]
322
+ }
323
+ },
324
+ "next_cursor": {
325
+ "type": [
326
+ "string",
327
+ "null"
328
+ ]
329
+ },
330
+ "_actions": {
331
+ "type": [
332
+ "object",
333
+ "null"
334
+ ],
335
+ "additionalProperties": {
336
+ "anyOf": [
337
+ {
338
+ "$ref": "#/$defs/ActionCapability"
339
+ },
340
+ {
341
+ "type": "null"
342
+ }
343
+ ]
344
+ },
345
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
346
+ }
347
+ },
348
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
349
+ },
350
+ "PublicAddVariationRequest": {
351
+ "type": [
352
+ "object",
353
+ "null"
354
+ ],
355
+ "properties": {
356
+ "key": {
357
+ "type": [
358
+ "string",
359
+ "null"
360
+ ]
361
+ },
362
+ "name": {
363
+ "type": [
364
+ "string",
365
+ "null"
366
+ ]
367
+ },
368
+ "value": {
369
+ "type": [
370
+ "string",
371
+ "null"
372
+ ]
373
+ },
374
+ "description": {
375
+ "type": [
376
+ "string",
377
+ "null"
378
+ ]
379
+ }
380
+ },
381
+ "description": "Request body for\n`POST /api/v1/orgs/{org}/projects/{project}/flags/{flag}/variations`. Named distinctly\nfrom the dashboard's own `AddVariationRequest` —\nsee PublicCreateEnvironmentRequest for the schemaId-collision rationale (both\ncontrollers share one Swagger document)."
382
+ },
383
+ "PublicApiErrorEnvelope": {
384
+ "type": [
385
+ "object",
386
+ "null"
387
+ ],
388
+ "properties": {
389
+ "error": {
390
+ "type": [
391
+ "string",
392
+ "null"
393
+ ]
394
+ },
395
+ "message": {
396
+ "type": [
397
+ "string",
398
+ "null"
399
+ ]
400
+ },
401
+ "docs_url": {
402
+ "type": [
403
+ "string",
404
+ "null"
405
+ ]
406
+ },
407
+ "fields": {
408
+ "type": [
409
+ "object",
410
+ "null"
411
+ ],
412
+ "additionalProperties": {
413
+ "type": [
414
+ "array",
415
+ "null"
416
+ ],
417
+ "items": {
418
+ "type": [
419
+ "string",
420
+ "null"
421
+ ]
422
+ }
423
+ }
424
+ },
425
+ "retry_after": {
426
+ "type": [
427
+ "integer",
428
+ "null"
429
+ ]
430
+ },
431
+ "did_you_mean": {
432
+ "type": [
433
+ "array",
434
+ "null"
435
+ ],
436
+ "items": {
437
+ "type": [
438
+ "string",
439
+ "null"
440
+ ]
441
+ }
442
+ },
443
+ "next_actions": {
444
+ "type": [
445
+ "array",
446
+ "null"
447
+ ],
448
+ "items": {
449
+ "anyOf": [
450
+ {
451
+ "$ref": "#/$defs/NextAction"
452
+ },
453
+ {
454
+ "type": "null"
455
+ }
456
+ ]
457
+ }
458
+ },
459
+ "connection_id": {
460
+ "type": [
461
+ "string",
462
+ "null"
463
+ ]
464
+ }
465
+ },
466
+ "description": "The frozen public-API error contract. `error` codes are stable snake_case strings. Wire keys\nare frozen snake_case too (`error`, `message`, `docs_url`, `fields`,\n`retry_after`) — the global camelCase naming policy would otherwise emit\n`docsUrl`/`retryAfter`, breaking the published spec. !:JsonPropertyName\nalways wins over the policy, so these are pinned explicitly rather than relying on the\nproperty names already being lowercase for the single-word ones.\n`did_you_mean`, `next_actions` and `connection_id` are ADDITIVE optional keys\n(null → omitted via the global `DefaultIgnoreCondition = WhenWritingNull`), so\npre-existing error bodies are byte-for-byte unchanged when they're absent.\n\n`connection_id` is present only on the `sso_required` error: the organization\nrequires single sign-on, and this credential didn't come through its identity provider.\n`connection_id` identifies which SSO connection to sign in with."
467
+ },
468
+ "PublicConditionGroupRequest": {
469
+ "type": [
470
+ "object",
471
+ "null"
472
+ ],
473
+ "properties": {
474
+ "operator": {
475
+ "type": [
476
+ "string",
477
+ "null"
478
+ ],
479
+ "description": "Allowed values: And, Or."
480
+ },
481
+ "conditions": {
482
+ "type": [
483
+ "array",
484
+ "null"
485
+ ],
486
+ "items": {
487
+ "anyOf": [
488
+ {
489
+ "$ref": "#/$defs/PublicConditionRequest"
490
+ },
491
+ {
492
+ "type": "null"
493
+ }
494
+ ]
495
+ }
496
+ }
497
+ },
498
+ "description": "Request-side condition group, symmetric with PublicConditionGroupResponse."
499
+ },
500
+ "PublicConditionGroupResponse": {
501
+ "type": [
502
+ "object",
503
+ "null"
504
+ ],
505
+ "properties": {
506
+ "operator": {
507
+ "type": [
508
+ "string",
509
+ "null"
510
+ ],
511
+ "description": "Allowed values: And, Or."
512
+ },
513
+ "conditions": {
514
+ "type": [
515
+ "array",
516
+ "null"
517
+ ],
518
+ "items": {
519
+ "anyOf": [
520
+ {
521
+ "$ref": "#/$defs/PublicConditionResponse"
522
+ },
523
+ {
524
+ "type": "null"
525
+ }
526
+ ]
527
+ }
528
+ }
529
+ },
530
+ "description": "A condition group within a PublicTargetingRuleResponse. Maps 1:1 onto\nConditionGroupDto. Operator is a bare wire string naming one of\nthe `ConditionGroupOperator` members (`\"And\"`/`\"Or\"`) —\ngroups are ANDed together at the rule level; within a group, its conditions combine using\nthis operator."
531
+ },
532
+ "PublicConditionRequest": {
533
+ "type": [
534
+ "object",
535
+ "null"
536
+ ],
537
+ "properties": {
538
+ "attribute": {
539
+ "type": [
540
+ "string",
541
+ "null"
542
+ ]
543
+ },
544
+ "operator": {
545
+ "type": [
546
+ "string",
547
+ "null"
548
+ ],
549
+ "description": "Allowed values: Equals, NotEquals, Contains, NotContains, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn, MatchesRegex, StartsWith, EndsWith, Before, After, SemverEquals, SemverGreaterThan, SemverGreaterThanOrEqual, SemverLessThan, SemverLessThanOrEqual."
550
+ },
551
+ "values": {
552
+ "type": [
553
+ "array",
554
+ "null"
555
+ ],
556
+ "items": {
557
+ "type": [
558
+ "string",
559
+ "null"
560
+ ]
561
+ }
562
+ },
563
+ "negate": {
564
+ "type": [
565
+ "boolean",
566
+ "null"
567
+ ]
568
+ }
569
+ },
570
+ "description": "Request-side condition, symmetric with PublicConditionResponse."
571
+ },
572
+ "PublicConditionResponse": {
573
+ "type": [
574
+ "object",
575
+ "null"
576
+ ],
577
+ "properties": {
578
+ "attribute": {
579
+ "type": [
580
+ "string",
581
+ "null"
582
+ ]
583
+ },
584
+ "operator": {
585
+ "type": [
586
+ "string",
587
+ "null"
588
+ ],
589
+ "description": "Allowed values: Equals, NotEquals, Contains, NotContains, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn, MatchesRegex, StartsWith, EndsWith, Before, After, SemverEquals, SemverGreaterThan, SemverGreaterThanOrEqual, SemverLessThan, SemverLessThanOrEqual."
590
+ },
591
+ "values": {
592
+ "type": [
593
+ "array",
594
+ "null"
595
+ ],
596
+ "items": {
597
+ "type": [
598
+ "string",
599
+ "null"
600
+ ]
601
+ }
602
+ },
603
+ "negate": {
604
+ "type": [
605
+ "boolean",
606
+ "null"
607
+ ]
608
+ }
609
+ },
610
+ "description": "A single condition within a PublicConditionGroupResponse. Maps 1:1 onto\nConditionDto. Operator is a bare wire string naming one of the\n`OperatorType` members (e.g. `\"Equals\"`, `\"In\"`)."
611
+ },
612
+ "PublicCreateEnvironmentRequest": {
613
+ "type": [
614
+ "object",
615
+ "null"
616
+ ],
617
+ "properties": {
618
+ "key": {
619
+ "type": [
620
+ "string",
621
+ "null"
622
+ ]
623
+ },
624
+ "name": {
625
+ "type": [
626
+ "string",
627
+ "null"
628
+ ]
629
+ },
630
+ "color": {
631
+ "type": [
632
+ "string",
633
+ "null"
634
+ ]
635
+ },
636
+ "sortOrder": {
637
+ "type": [
638
+ "integer",
639
+ "null"
640
+ ]
641
+ }
642
+ },
643
+ "description": "Request body for `POST /api/v1/orgs/{org}/projects/{project}/environments`. Named\ndistinctly from the dashboard's own `CreateEnvironmentRequest`\n— both controllers share one Swagger document (see `Program.cs`'s `AddSwaggerGen``DocInclusionPredicate` override), and Swashbuckle's default schemaId is the bare type\nname, so an identical name in either namespace throws a schemaId collision at\n`--export-openapi` time."
644
+ },
645
+ "PublicCreateFeatureFlagRequest": {
646
+ "type": [
647
+ "object",
648
+ "null"
649
+ ],
650
+ "properties": {
651
+ "key": {
652
+ "type": [
653
+ "string",
654
+ "null"
655
+ ]
656
+ },
657
+ "name": {
658
+ "type": [
659
+ "string",
660
+ "null"
661
+ ]
662
+ },
663
+ "type": {
664
+ "type": [
665
+ "string",
666
+ "null"
667
+ ],
668
+ "description": "Allowed values: Boolean, String, Number, Json."
669
+ },
670
+ "description": {
671
+ "type": [
672
+ "string",
673
+ "null"
674
+ ]
675
+ },
676
+ "tags": {
677
+ "type": [
678
+ "array",
679
+ "null"
680
+ ],
681
+ "items": {
682
+ "type": [
683
+ "string",
684
+ "null"
685
+ ]
686
+ }
687
+ },
688
+ "initialVariations": {
689
+ "type": [
690
+ "array",
691
+ "null"
692
+ ],
693
+ "items": {
694
+ "anyOf": [
695
+ {
696
+ "$ref": "#/$defs/PublicCreateVariationDto"
697
+ },
698
+ {
699
+ "type": "null"
700
+ }
701
+ ]
702
+ }
703
+ },
704
+ "clientSideVisible": {
705
+ "type": [
706
+ "boolean",
707
+ "null"
708
+ ]
709
+ },
710
+ "expiresAtUtc": {
711
+ "type": [
712
+ "string",
713
+ "null"
714
+ ]
715
+ },
716
+ "ownerEmail": {
717
+ "type": [
718
+ "string",
719
+ "null"
720
+ ]
721
+ },
722
+ "isPermanent": {
723
+ "type": [
724
+ "boolean",
725
+ "null"
726
+ ]
727
+ }
728
+ },
729
+ "description": "Request body for `POST /api/v1/orgs/{org}/projects/{project}/flags`. Named distinctly\nfrom the dashboard's own `CreateFeatureFlagRequest`\n— see PublicCreateEnvironmentRequest for the\nschemaId-collision rationale (both controllers share one Swagger document). Type\nis passed through verbatim to Type, which itself takes a\nbare string (Boolean/String/Number/Json) rather than the domain enum — invalid values surface\nas the handler's own validation failure, not a controller-level 400. ExpiresAtUtc is\noptional and advisory; a bare date (`2026-12-01`) means the end of that day in UTC, and a full\ntimestamp is stored exactly. It must be in the future and requires the flag-expiration feature\n(400 `EXPIRY_IN_PAST` / `FEATURE_NOT_ENABLED`). OwnerEmail optionally names\nthe owner (an active member, matched case-insensitively; requires the flag-ownership feature —\n400 `OWNER_NOT_MEMBER` / `FEATURE_NOT_ENABLED`). Omitted, the owner is the caller when\nthe caller is a member, so a service token creates an unowned flag. IsPermanent marks\nthe flag permanent (a kill switch, ops toggle or entitlement that is meant to stay; never reported for\ncleanup). It requires the flag-permanence feature and can't be combined with ExpiresAtUtc\n(400 `FEATURE_NOT_ENABLED` / `PERMANENT_FLAG_HAS_EXPIRY`)."
730
+ },
731
+ "PublicCreateProjectRequest": {
732
+ "type": [
733
+ "object",
734
+ "null"
735
+ ],
736
+ "properties": {
737
+ "key": {
738
+ "type": [
739
+ "string",
740
+ "null"
741
+ ]
742
+ },
743
+ "name": {
744
+ "type": [
745
+ "string",
746
+ "null"
747
+ ]
748
+ },
749
+ "description": {
750
+ "type": [
751
+ "string",
752
+ "null"
753
+ ]
754
+ }
755
+ },
756
+ "description": "Request body for `POST /api/v1/orgs/{org}/projects`. Named distinctly from the\ndashboard's own `CreateProjectRequest` — both\ncontrollers share one Swagger document (see `Program.cs`'s `AddSwaggerGen``DocInclusionPredicate` override), and Swashbuckle's default schemaId is the bare type\nname, so an identical name in either namespace throws a schemaId collision at\n`--export-openapi` time."
757
+ },
758
+ "PublicCreateSdkKeyRequest": {
759
+ "type": [
760
+ "object",
761
+ "null"
762
+ ],
763
+ "properties": {
764
+ "name": {
765
+ "type": [
766
+ "string",
767
+ "null"
768
+ ]
769
+ },
770
+ "description": {
771
+ "type": [
772
+ "string",
773
+ "null"
774
+ ]
775
+ },
776
+ "type": {
777
+ "type": [
778
+ "string",
779
+ "null"
780
+ ],
781
+ "description": "Allowed values: ClientSide, ServerSide."
782
+ }
783
+ },
784
+ "description": "Request body for `POST /api/v1/orgs/{org}/projects/{project}/environments/{env}/sdk-keys`.\nType is a bare string (\"ClientSide\" or \"ServerSide\") — the controller parses it\nagainst a NAME allowlist (not a bare TryParse``1(ReadOnlySpan{Char},Boolean,``0@), which would\nsilently accept a numeric string like `\"0\"`) before dispatching. Named distinctly from\nthe dashboard's own `CreateSdkKeyRequest` — both\ncontrollers share one Swagger document, and an identical type name in either namespace throws\na schemaId collision at `--export-openapi` time."
785
+ },
786
+ "PublicCreateSdkKeyResponse": {
787
+ "type": [
788
+ "object",
789
+ "null"
790
+ ],
791
+ "properties": {
792
+ "id": {
793
+ "type": [
794
+ "string",
795
+ "null"
796
+ ]
797
+ },
798
+ "key": {
799
+ "type": [
800
+ "string",
801
+ "null"
802
+ ]
803
+ },
804
+ "lastFourCharacters": {
805
+ "type": [
806
+ "string",
807
+ "null"
808
+ ]
809
+ },
810
+ "type": {
811
+ "type": [
812
+ "string",
813
+ "null"
814
+ ],
815
+ "description": "Allowed values: ClientSide, ServerSide."
816
+ },
817
+ "name": {
818
+ "type": [
819
+ "string",
820
+ "null"
821
+ ]
822
+ },
823
+ "createdAt": {
824
+ "type": [
825
+ "string",
826
+ "null"
827
+ ]
828
+ },
829
+ "warning": {
830
+ "type": [
831
+ "string",
832
+ "null"
833
+ ]
834
+ }
835
+ },
836
+ "description": "Response body for a successful `POST .../sdk-keys`. The ONLY place the plaintext\nKey is ever returned — PublicSdkKeyResponse (list/get) carries just\n`LastFourCharacters`. Built directly from CreateSdkKeyResult rather than a\nre-fetch (unlike `FeatureFlagsController.Create`'s re-fetch pattern) because the\nplaintext key only ever exists on the create result — a subsequent\nGetSdkKeyQuery can't recover it."
837
+ },
838
+ "PublicCreateSegmentRequest": {
839
+ "type": [
840
+ "object",
841
+ "null"
842
+ ],
843
+ "properties": {
844
+ "key": {
845
+ "type": [
846
+ "string",
847
+ "null"
848
+ ]
849
+ },
850
+ "name": {
851
+ "type": [
852
+ "string",
853
+ "null"
854
+ ]
855
+ },
856
+ "description": {
857
+ "type": [
858
+ "string",
859
+ "null"
860
+ ]
861
+ },
862
+ "conditions": {
863
+ "type": [
864
+ "array",
865
+ "null"
866
+ ],
867
+ "items": {
868
+ "anyOf": [
869
+ {
870
+ "$ref": "#/$defs/PublicSegmentConditionDto"
871
+ },
872
+ {
873
+ "type": "null"
874
+ }
875
+ ]
876
+ }
877
+ }
878
+ },
879
+ "description": "Request body for `POST /api/v1/orgs/{org}/projects/{project}/segments`. Named distinctly\nfrom the dashboard's own `CreateUserSegmentRequest` — see\nPublicCreateEnvironmentRequest for the schemaId-collision rationale (both\ncontrollers share one Swagger document)."
880
+ },
881
+ "PublicCreateTargetingRuleRequest": {
882
+ "type": [
883
+ "object",
884
+ "null"
885
+ ],
886
+ "properties": {
887
+ "description": {
888
+ "type": [
889
+ "string",
890
+ "null"
891
+ ]
892
+ },
893
+ "variationId": {
894
+ "type": [
895
+ "string",
896
+ "null"
897
+ ]
898
+ },
899
+ "rolloutPercentage": {
900
+ "type": [
901
+ "integer",
902
+ "null"
903
+ ]
904
+ },
905
+ "userSegmentId": {
906
+ "type": [
907
+ "string",
908
+ "null"
909
+ ]
910
+ },
911
+ "conditionGroups": {
912
+ "type": [
913
+ "array",
914
+ "null"
915
+ ],
916
+ "items": {
917
+ "anyOf": [
918
+ {
919
+ "$ref": "#/$defs/PublicConditionGroupRequest"
920
+ },
921
+ {
922
+ "type": "null"
923
+ }
924
+ ]
925
+ }
926
+ }
927
+ },
928
+ "description": "Request body for `POST .../rules`. The Application-side\n`CreateTargetingRuleDto`/`CreateConditionGroupDto`/`CreateConditionDto` all take\ntheir `Operator` as a bare string, re-parsed CASE-SENSITIVELY inside\n`CreateTargetingRuleCommandHandler` — `FlagTargetingController`'s mapping helpers\nvalidate every operator against the enum's member-name allowlist AND canonicalize the casing\n(e.g. `\"in\"` → `\"In\"`) before building the command DTO, so a valid\ncase-insensitive match never trips the handler's strict re-parse."
929
+ },
930
+ "PublicCreateVariationDto": {
931
+ "type": [
932
+ "object",
933
+ "null"
934
+ ],
935
+ "properties": {
936
+ "key": {
937
+ "type": [
938
+ "string",
939
+ "null"
940
+ ]
941
+ },
942
+ "name": {
943
+ "type": [
944
+ "string",
945
+ "null"
946
+ ]
947
+ },
948
+ "value": {
949
+ "type": [
950
+ "string",
951
+ "null"
952
+ ]
953
+ },
954
+ "description": {
955
+ "type": [
956
+ "string",
957
+ "null"
958
+ ]
959
+ }
960
+ },
961
+ "description": "A variation supplied at flag-creation time. Maps 1:1 onto\nCreateVariationDto."
962
+ },
963
+ "PublicCreateWebhookSubscriptionRequest": {
964
+ "type": [
965
+ "object",
966
+ "null"
967
+ ],
968
+ "properties": {
969
+ "name": {
970
+ "type": [
971
+ "string",
972
+ "null"
973
+ ]
974
+ },
975
+ "url": {
976
+ "type": [
977
+ "string",
978
+ "null"
979
+ ]
980
+ },
981
+ "provider": {
982
+ "type": [
983
+ "string",
984
+ "null"
985
+ ],
986
+ "description": "Allowed values: GenericHttp."
987
+ },
988
+ "eventTypes": {
989
+ "type": [
990
+ "array",
991
+ "null"
992
+ ],
993
+ "items": {
994
+ "type": [
995
+ "string",
996
+ "null"
997
+ ]
998
+ }
999
+ },
1000
+ "projectIds": {
1001
+ "type": [
1002
+ "array",
1003
+ "null"
1004
+ ],
1005
+ "items": {
1006
+ "type": [
1007
+ "string",
1008
+ "null"
1009
+ ]
1010
+ }
1011
+ },
1012
+ "environmentIds": {
1013
+ "type": [
1014
+ "array",
1015
+ "null"
1016
+ ],
1017
+ "items": {
1018
+ "type": [
1019
+ "string",
1020
+ "null"
1021
+ ]
1022
+ }
1023
+ }
1024
+ },
1025
+ "description": "Creates a webhook subscription. `provider` is `GenericHttp`. Omit `eventTypes`,\n`projectIds` or `environmentIds` (or send an empty list) to receive every event,\nproject or environment. A token restricted to specific projects must list at least one project,\nall of them within its allowlist."
1026
+ },
1027
+ "PublicCreateWebhookSubscriptionResponse": {
1028
+ "type": [
1029
+ "object",
1030
+ "null"
1031
+ ],
1032
+ "properties": {
1033
+ "id": {
1034
+ "type": [
1035
+ "string",
1036
+ "null"
1037
+ ]
1038
+ },
1039
+ "secret": {
1040
+ "type": [
1041
+ "string",
1042
+ "null"
1043
+ ]
1044
+ },
1045
+ "warning": {
1046
+ "type": [
1047
+ "string",
1048
+ "null"
1049
+ ]
1050
+ }
1051
+ },
1052
+ "description": "The created subscription's id and its signing secret. The secret is shown only here."
1053
+ },
1054
+ "PublicDefaultFlagLifetimeImpact": {
1055
+ "type": [
1056
+ "object",
1057
+ "null"
1058
+ ],
1059
+ "properties": {
1060
+ "newlyPastExpiry": {
1061
+ "type": [
1062
+ "integer",
1063
+ "null"
1064
+ ]
1065
+ },
1066
+ "noLongerPastExpiry": {
1067
+ "type": [
1068
+ "integer",
1069
+ "null"
1070
+ ]
1071
+ }
1072
+ },
1073
+ "description": "Response of `GET .../default-flag-lifetime/impact`: how many temporary flags with no expiry\ndate of their own would newly be past expiry, and how many would stop being past it."
1074
+ },
1075
+ "PublicEnvironmentResponse": {
1076
+ "type": [
1077
+ "object",
1078
+ "null"
1079
+ ],
1080
+ "properties": {
1081
+ "id": {
1082
+ "type": [
1083
+ "string",
1084
+ "null"
1085
+ ]
1086
+ },
1087
+ "key": {
1088
+ "type": [
1089
+ "string",
1090
+ "null"
1091
+ ]
1092
+ },
1093
+ "name": {
1094
+ "type": [
1095
+ "string",
1096
+ "null"
1097
+ ]
1098
+ },
1099
+ "color": {
1100
+ "type": [
1101
+ "string",
1102
+ "null"
1103
+ ]
1104
+ },
1105
+ "sortOrder": {
1106
+ "type": [
1107
+ "integer",
1108
+ "null"
1109
+ ]
1110
+ },
1111
+ "_actions": {
1112
+ "type": [
1113
+ "object",
1114
+ "null"
1115
+ ],
1116
+ "additionalProperties": {
1117
+ "anyOf": [
1118
+ {
1119
+ "$ref": "#/$defs/ActionCapability"
1120
+ },
1121
+ {
1122
+ "type": "null"
1123
+ }
1124
+ ]
1125
+ },
1126
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1127
+ }
1128
+ },
1129
+ "description": "Public representation of an environment, returned by\n`GET /api/v1/orgs/{org}/projects/{project}/environments` (list),\n`GET .../environments/{env}` (detail), and the body of a successful create/update. Drops\ninternal fields (e.g. `ProjectId` is implicit in the route) — mirrors\n`ProjectResponse`'s minimal shape. Named `PublicEnvironmentResponse` rather than\n`EnvironmentResponse` (unlike the sibling `ProjectResponse`, which didn't collide)\nbecause the dashboard already has its own\n`EnvironmentResponse` — see\nPublicCreateEnvironmentRequest for the schemaId-collision rationale."
1130
+ },
1131
+ "PublicEnvironmentResponsePagedResult": {
1132
+ "type": [
1133
+ "object",
1134
+ "null"
1135
+ ],
1136
+ "properties": {
1137
+ "items": {
1138
+ "type": [
1139
+ "array",
1140
+ "null"
1141
+ ],
1142
+ "items": {
1143
+ "anyOf": [
1144
+ {
1145
+ "$ref": "#/$defs/PublicEnvironmentResponse"
1146
+ },
1147
+ {
1148
+ "type": "null"
1149
+ }
1150
+ ]
1151
+ }
1152
+ },
1153
+ "next_cursor": {
1154
+ "type": [
1155
+ "string",
1156
+ "null"
1157
+ ]
1158
+ },
1159
+ "_actions": {
1160
+ "type": [
1161
+ "object",
1162
+ "null"
1163
+ ],
1164
+ "additionalProperties": {
1165
+ "anyOf": [
1166
+ {
1167
+ "$ref": "#/$defs/ActionCapability"
1168
+ },
1169
+ {
1170
+ "type": "null"
1171
+ }
1172
+ ]
1173
+ },
1174
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1175
+ }
1176
+ },
1177
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
1178
+ },
1179
+ "PublicFlagEnvConfigResponse": {
1180
+ "type": [
1181
+ "object",
1182
+ "null"
1183
+ ],
1184
+ "properties": {
1185
+ "environmentId": {
1186
+ "type": [
1187
+ "string",
1188
+ "null"
1189
+ ]
1190
+ },
1191
+ "environmentKey": {
1192
+ "type": [
1193
+ "string",
1194
+ "null"
1195
+ ]
1196
+ },
1197
+ "isEnabled": {
1198
+ "type": [
1199
+ "boolean",
1200
+ "null"
1201
+ ]
1202
+ },
1203
+ "defaultVariationId": {
1204
+ "type": [
1205
+ "string",
1206
+ "null"
1207
+ ]
1208
+ },
1209
+ "strategy": {
1210
+ "type": [
1211
+ "string",
1212
+ "null"
1213
+ ],
1214
+ "description": "Allowed values: SingleVariation, PercentageRollout, TargetedRollout."
1215
+ },
1216
+ "prerequisites": {
1217
+ "type": [
1218
+ "array",
1219
+ "null"
1220
+ ],
1221
+ "items": {
1222
+ "anyOf": [
1223
+ {
1224
+ "$ref": "#/$defs/PublicPrerequisiteDto"
1225
+ },
1226
+ {
1227
+ "type": "null"
1228
+ }
1229
+ ]
1230
+ }
1231
+ },
1232
+ "_actions": {
1233
+ "type": [
1234
+ "object",
1235
+ "null"
1236
+ ],
1237
+ "additionalProperties": {
1238
+ "anyOf": [
1239
+ {
1240
+ "$ref": "#/$defs/ActionCapability"
1241
+ },
1242
+ {
1243
+ "type": "null"
1244
+ }
1245
+ ]
1246
+ },
1247
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1248
+ }
1249
+ },
1250
+ "description": "Public representation of a flag's config within a single environment, returned by\n`GET .../flags/{flag}/environments` and `GET .../flags/{flag}/environments/{env}`.\nDrops internal/dashboard-only fields present on FlagEnvironmentConfigurationDto\n— Id (an internal row id, not part of the public\ncontract; EnvironmentId is the addressable key), `FeatureFlagId` (implicit\nin the route), the environment's name/color/sort-order (dashboard display fields — the public\ncontract only needs the addressable EnvironmentKey), and `Staleness` (an\ninternal analytics signal)."
1251
+ },
1252
+ "PublicFlagListItem": {
1253
+ "type": [
1254
+ "object",
1255
+ "null"
1256
+ ],
1257
+ "properties": {
1258
+ "id": {
1259
+ "type": [
1260
+ "string",
1261
+ "null"
1262
+ ]
1263
+ },
1264
+ "key": {
1265
+ "type": [
1266
+ "string",
1267
+ "null"
1268
+ ]
1269
+ },
1270
+ "name": {
1271
+ "type": [
1272
+ "string",
1273
+ "null"
1274
+ ]
1275
+ },
1276
+ "type": {
1277
+ "type": [
1278
+ "string",
1279
+ "null"
1280
+ ],
1281
+ "description": "Allowed values: Boolean, String, Number, Json."
1282
+ },
1283
+ "isArchived": {
1284
+ "type": [
1285
+ "boolean",
1286
+ "null"
1287
+ ]
1288
+ },
1289
+ "clientSideVisible": {
1290
+ "type": [
1291
+ "boolean",
1292
+ "null"
1293
+ ]
1294
+ },
1295
+ "tags": {
1296
+ "type": [
1297
+ "array",
1298
+ "null"
1299
+ ],
1300
+ "items": {
1301
+ "type": [
1302
+ "string",
1303
+ "null"
1304
+ ]
1305
+ }
1306
+ },
1307
+ "createdAt": {
1308
+ "type": [
1309
+ "string",
1310
+ "null"
1311
+ ]
1312
+ },
1313
+ "updatedAt": {
1314
+ "type": [
1315
+ "string",
1316
+ "null"
1317
+ ]
1318
+ },
1319
+ "expiresAtUtc": {
1320
+ "type": [
1321
+ "string",
1322
+ "null"
1323
+ ]
1324
+ },
1325
+ "owner": {
1326
+ "anyOf": [
1327
+ {
1328
+ "$ref": "#/$defs/PublicFlagOwner"
1329
+ },
1330
+ {
1331
+ "type": "null"
1332
+ }
1333
+ ]
1334
+ },
1335
+ "removalPrUrl": {
1336
+ "type": [
1337
+ "string",
1338
+ "null"
1339
+ ]
1340
+ },
1341
+ "isPermanent": {
1342
+ "type": [
1343
+ "boolean",
1344
+ "null"
1345
+ ]
1346
+ },
1347
+ "effectiveExpiresAtUtc": {
1348
+ "type": [
1349
+ "string",
1350
+ "null"
1351
+ ]
1352
+ },
1353
+ "expirySource": {
1354
+ "type": [
1355
+ "string",
1356
+ "null"
1357
+ ]
1358
+ }
1359
+ },
1360
+ "description": "Public list-item representation of a feature flag, returned by\n`GET .../flags`. Narrower than PublicFlagResponse — drops\nVariations (a summary-only shape upstream) and\nStaleness, matching the \"list is narrower than detail\"\nsplit already present on the Application-layer DTOs.\nEffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc\nor its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),\nboth null when neither applies."
1361
+ },
1362
+ "PublicFlagListItemPagedResult": {
1363
+ "type": [
1364
+ "object",
1365
+ "null"
1366
+ ],
1367
+ "properties": {
1368
+ "items": {
1369
+ "type": [
1370
+ "array",
1371
+ "null"
1372
+ ],
1373
+ "items": {
1374
+ "anyOf": [
1375
+ {
1376
+ "$ref": "#/$defs/PublicFlagListItem"
1377
+ },
1378
+ {
1379
+ "type": "null"
1380
+ }
1381
+ ]
1382
+ }
1383
+ },
1384
+ "next_cursor": {
1385
+ "type": [
1386
+ "string",
1387
+ "null"
1388
+ ]
1389
+ },
1390
+ "_actions": {
1391
+ "type": [
1392
+ "object",
1393
+ "null"
1394
+ ],
1395
+ "additionalProperties": {
1396
+ "anyOf": [
1397
+ {
1398
+ "$ref": "#/$defs/ActionCapability"
1399
+ },
1400
+ {
1401
+ "type": "null"
1402
+ }
1403
+ ]
1404
+ },
1405
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1406
+ }
1407
+ },
1408
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
1409
+ },
1410
+ "PublicFlagOwner": {
1411
+ "type": [
1412
+ "object",
1413
+ "null"
1414
+ ],
1415
+ "properties": {
1416
+ "id": {
1417
+ "type": [
1418
+ "string",
1419
+ "null"
1420
+ ]
1421
+ },
1422
+ "email": {
1423
+ "type": [
1424
+ "string",
1425
+ "null"
1426
+ ]
1427
+ },
1428
+ "name": {
1429
+ "type": [
1430
+ "string",
1431
+ "null"
1432
+ ]
1433
+ }
1434
+ },
1435
+ "description": "A flag's owner as returned on flag reads. Null means the flag is unowned."
1436
+ },
1437
+ "PublicFlagRemovalCandidate": {
1438
+ "type": [
1439
+ "object",
1440
+ "null"
1441
+ ],
1442
+ "properties": {
1443
+ "key": {
1444
+ "type": [
1445
+ "string",
1446
+ "null"
1447
+ ]
1448
+ },
1449
+ "reason": {
1450
+ "type": [
1451
+ "string",
1452
+ "null"
1453
+ ]
1454
+ },
1455
+ "treatment": {
1456
+ "type": [
1457
+ "boolean",
1458
+ "null"
1459
+ ]
1460
+ },
1461
+ "status": {
1462
+ "type": [
1463
+ "string",
1464
+ "null"
1465
+ ]
1466
+ },
1467
+ "blockedBy": {
1468
+ "type": [
1469
+ "array",
1470
+ "null"
1471
+ ],
1472
+ "items": {
1473
+ "type": [
1474
+ "string",
1475
+ "null"
1476
+ ]
1477
+ }
1478
+ }
1479
+ },
1480
+ "description": "One dead flag the Featureflip Flag Cleanup Action should remove, returned by\n`GET .../flags/removal-candidates`. `Treatment` is the kill decision: true → keep the\nflag's on-branch, false → keep the off-branch. `Status` is the flag's staleness tier\n(`\"Stale\"` or `\"Dead\"`, never `\"Active\"`) — lets a caller distinguish the two when\n`?staleness=stale` widens the response to include both tiers. This is the ONLY public\nprojection of staleness — PublicFlagResponse and PublicFlagListItem\nstill omit it by design. `BlockedBy` names the live flags that still list this one as a\nprerequisite, sorted by key; while it is non-empty the flag cannot be archived\n(`FLAG_HAS_DEPENDENTS`), so a caller should remove those dependents first."
1481
+ },
1482
+ "PublicFlagRemovalCandidatePagedResult": {
1483
+ "type": [
1484
+ "object",
1485
+ "null"
1486
+ ],
1487
+ "properties": {
1488
+ "items": {
1489
+ "type": [
1490
+ "array",
1491
+ "null"
1492
+ ],
1493
+ "items": {
1494
+ "anyOf": [
1495
+ {
1496
+ "$ref": "#/$defs/PublicFlagRemovalCandidate"
1497
+ },
1498
+ {
1499
+ "type": "null"
1500
+ }
1501
+ ]
1502
+ }
1503
+ },
1504
+ "next_cursor": {
1505
+ "type": [
1506
+ "string",
1507
+ "null"
1508
+ ]
1509
+ }
1510
+ },
1511
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
1512
+ },
1513
+ "PublicFlagResponse": {
1514
+ "type": [
1515
+ "object",
1516
+ "null"
1517
+ ],
1518
+ "properties": {
1519
+ "id": {
1520
+ "type": [
1521
+ "string",
1522
+ "null"
1523
+ ]
1524
+ },
1525
+ "key": {
1526
+ "type": [
1527
+ "string",
1528
+ "null"
1529
+ ]
1530
+ },
1531
+ "name": {
1532
+ "type": [
1533
+ "string",
1534
+ "null"
1535
+ ]
1536
+ },
1537
+ "description": {
1538
+ "type": [
1539
+ "string",
1540
+ "null"
1541
+ ]
1542
+ },
1543
+ "type": {
1544
+ "type": [
1545
+ "string",
1546
+ "null"
1547
+ ],
1548
+ "description": "Allowed values: Boolean, String, Number, Json."
1549
+ },
1550
+ "isArchived": {
1551
+ "type": [
1552
+ "boolean",
1553
+ "null"
1554
+ ]
1555
+ },
1556
+ "clientSideVisible": {
1557
+ "type": [
1558
+ "boolean",
1559
+ "null"
1560
+ ]
1561
+ },
1562
+ "tags": {
1563
+ "type": [
1564
+ "array",
1565
+ "null"
1566
+ ],
1567
+ "items": {
1568
+ "type": [
1569
+ "string",
1570
+ "null"
1571
+ ]
1572
+ }
1573
+ },
1574
+ "variations": {
1575
+ "type": [
1576
+ "array",
1577
+ "null"
1578
+ ],
1579
+ "items": {
1580
+ "anyOf": [
1581
+ {
1582
+ "$ref": "#/$defs/PublicVariationResponse"
1583
+ },
1584
+ {
1585
+ "type": "null"
1586
+ }
1587
+ ]
1588
+ }
1589
+ },
1590
+ "createdAt": {
1591
+ "type": [
1592
+ "string",
1593
+ "null"
1594
+ ]
1595
+ },
1596
+ "updatedAt": {
1597
+ "type": [
1598
+ "string",
1599
+ "null"
1600
+ ]
1601
+ },
1602
+ "expiresAtUtc": {
1603
+ "type": [
1604
+ "string",
1605
+ "null"
1606
+ ]
1607
+ },
1608
+ "owner": {
1609
+ "anyOf": [
1610
+ {
1611
+ "$ref": "#/$defs/PublicFlagOwner"
1612
+ },
1613
+ {
1614
+ "type": "null"
1615
+ }
1616
+ ]
1617
+ },
1618
+ "removalPrUrl": {
1619
+ "type": [
1620
+ "string",
1621
+ "null"
1622
+ ]
1623
+ },
1624
+ "isPermanent": {
1625
+ "type": [
1626
+ "boolean",
1627
+ "null"
1628
+ ]
1629
+ },
1630
+ "effectiveExpiresAtUtc": {
1631
+ "type": [
1632
+ "string",
1633
+ "null"
1634
+ ]
1635
+ },
1636
+ "expirySource": {
1637
+ "type": [
1638
+ "string",
1639
+ "null"
1640
+ ]
1641
+ },
1642
+ "_actions": {
1643
+ "type": [
1644
+ "object",
1645
+ "null"
1646
+ ],
1647
+ "additionalProperties": {
1648
+ "anyOf": [
1649
+ {
1650
+ "$ref": "#/$defs/ActionCapability"
1651
+ },
1652
+ {
1653
+ "type": "null"
1654
+ }
1655
+ ]
1656
+ },
1657
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1658
+ }
1659
+ },
1660
+ "description": "Public detail representation of a feature flag, returned by\n`GET .../flags/{flag}` and the body of a successful create. Drops internal/dashboard-only\nfields present on FeatureFlagDto — notably `ProjectId` (implicit in the\nroute) and `Staleness` (an internal analytics signal, not part of the public contract).\nEffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc\nor its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),\nboth null when neither applies."
1661
+ },
1662
+ "PublicPrerequisiteDto": {
1663
+ "type": [
1664
+ "object",
1665
+ "null"
1666
+ ],
1667
+ "properties": {
1668
+ "prerequisiteFlagKey": {
1669
+ "type": [
1670
+ "string",
1671
+ "null"
1672
+ ]
1673
+ },
1674
+ "expectedVariationKey": {
1675
+ "type": [
1676
+ "string",
1677
+ "null"
1678
+ ]
1679
+ }
1680
+ },
1681
+ "description": "A single prerequisite entry on a flag's per-environment config. Maps 1:1 onto\nPrerequisiteDto (read side) and PrerequisiteInput (write side)."
1682
+ },
1683
+ "PublicPutTargetingRequest": {
1684
+ "type": [
1685
+ "object",
1686
+ "null"
1687
+ ],
1688
+ "properties": {
1689
+ "rules": {
1690
+ "type": [
1691
+ "array",
1692
+ "null"
1693
+ ],
1694
+ "items": {
1695
+ "anyOf": [
1696
+ {
1697
+ "$ref": "#/$defs/PublicCreateTargetingRuleRequest"
1698
+ },
1699
+ {
1700
+ "type": "null"
1701
+ }
1702
+ ]
1703
+ }
1704
+ }
1705
+ },
1706
+ "description": "Request body for `PUT .../targeting` — a declarative full replace of the environment's\nordered targeting rule set. Rules are applied in array order (index = priority, so the array\norder IS the evaluation order). Rules is nullable so that an OMITTED `rules`\nfield (a body of `{}`) binds successfully instead of failing ASP.NET Core's implicit\nrequired-property check on non-nullable reference types — both an omitted `rules` field\nand an explicit empty list (`{ \"rules\": [] }`) clear all targeting rules for the\nenvironment. Each element is a PublicCreateTargetingRuleRequest (identical to the\n`POST .../rules` body), so `UserSegmentId` is supported — segment-scoped rules can be\nsubmitted through this endpoint. The replace is atomic (all-or-nothing): the whole rule set is\nswapped in one transaction, or nothing changes."
1707
+ },
1708
+ "PublicReorderRulesRequest": {
1709
+ "type": [
1710
+ "object",
1711
+ "null"
1712
+ ],
1713
+ "properties": {
1714
+ "ruleIds": {
1715
+ "type": [
1716
+ "array",
1717
+ "null"
1718
+ ],
1719
+ "items": {
1720
+ "type": [
1721
+ "string",
1722
+ "null"
1723
+ ]
1724
+ }
1725
+ }
1726
+ },
1727
+ "description": "Request body for `PUT .../rules/reorder`. Must include every existing rule id exactly\nonce — `ReorderTargetingRulesCommandHandler` rejects duplicate, omitted, or unknown rule\nids with `BadRequestException`, surfaced as an HTTP 400 `bad_request` envelope\ncarrying the handler's message."
1728
+ },
1729
+ "PublicRotateWebhookSecretResponse": {
1730
+ "type": [
1731
+ "object",
1732
+ "null"
1733
+ ],
1734
+ "properties": {
1735
+ "secretId": {
1736
+ "type": [
1737
+ "string",
1738
+ "null"
1739
+ ]
1740
+ },
1741
+ "secret": {
1742
+ "type": [
1743
+ "string",
1744
+ "null"
1745
+ ]
1746
+ },
1747
+ "warning": {
1748
+ "type": [
1749
+ "string",
1750
+ "null"
1751
+ ]
1752
+ }
1753
+ },
1754
+ "description": "A newly added signing secret. The secret is shown only here."
1755
+ },
1756
+ "PublicSdkKeyResponse": {
1757
+ "type": [
1758
+ "object",
1759
+ "null"
1760
+ ],
1761
+ "properties": {
1762
+ "id": {
1763
+ "type": [
1764
+ "string",
1765
+ "null"
1766
+ ]
1767
+ },
1768
+ "name": {
1769
+ "type": [
1770
+ "string",
1771
+ "null"
1772
+ ]
1773
+ },
1774
+ "description": {
1775
+ "type": [
1776
+ "string",
1777
+ "null"
1778
+ ]
1779
+ },
1780
+ "type": {
1781
+ "type": [
1782
+ "string",
1783
+ "null"
1784
+ ],
1785
+ "description": "Allowed values: ClientSide, ServerSide."
1786
+ },
1787
+ "lastFourCharacters": {
1788
+ "type": [
1789
+ "string",
1790
+ "null"
1791
+ ]
1792
+ },
1793
+ "isActive": {
1794
+ "type": [
1795
+ "boolean",
1796
+ "null"
1797
+ ]
1798
+ },
1799
+ "createdAt": {
1800
+ "type": [
1801
+ "string",
1802
+ "null"
1803
+ ]
1804
+ },
1805
+ "lastUsedAt": {
1806
+ "type": [
1807
+ "string",
1808
+ "null"
1809
+ ]
1810
+ },
1811
+ "revokedAt": {
1812
+ "type": [
1813
+ "string",
1814
+ "null"
1815
+ ]
1816
+ },
1817
+ "_actions": {
1818
+ "type": [
1819
+ "object",
1820
+ "null"
1821
+ ],
1822
+ "additionalProperties": {
1823
+ "anyOf": [
1824
+ {
1825
+ "$ref": "#/$defs/ActionCapability"
1826
+ },
1827
+ {
1828
+ "type": "null"
1829
+ }
1830
+ ]
1831
+ },
1832
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1833
+ }
1834
+ },
1835
+ "description": "Public representation of an SDK key, returned by\n`GET /api/v1/orgs/{org}/projects/{project}/environments/{env}/sdk-keys` (list) and\n`GET .../sdk-keys/{sdkKey}` (detail). Deliberately narrower than\nSdkKeyDto — drops `RevokedBy` (an internal user id) and\n`EnvironmentId` (implicit in the route), and carries no plaintext key field: only\nLastFourCharacters is ever exposed once the key has been created. The plaintext\nkey is a one-time value that appears solely in PublicCreateSdkKeyResponse."
1836
+ },
1837
+ "PublicSdkKeyResponsePagedResult": {
1838
+ "type": [
1839
+ "object",
1840
+ "null"
1841
+ ],
1842
+ "properties": {
1843
+ "items": {
1844
+ "type": [
1845
+ "array",
1846
+ "null"
1847
+ ],
1848
+ "items": {
1849
+ "anyOf": [
1850
+ {
1851
+ "$ref": "#/$defs/PublicSdkKeyResponse"
1852
+ },
1853
+ {
1854
+ "type": "null"
1855
+ }
1856
+ ]
1857
+ }
1858
+ },
1859
+ "next_cursor": {
1860
+ "type": [
1861
+ "string",
1862
+ "null"
1863
+ ]
1864
+ },
1865
+ "_actions": {
1866
+ "type": [
1867
+ "object",
1868
+ "null"
1869
+ ],
1870
+ "additionalProperties": {
1871
+ "anyOf": [
1872
+ {
1873
+ "$ref": "#/$defs/ActionCapability"
1874
+ },
1875
+ {
1876
+ "type": "null"
1877
+ }
1878
+ ]
1879
+ },
1880
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1881
+ }
1882
+ },
1883
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
1884
+ },
1885
+ "PublicSegmentConditionDto": {
1886
+ "type": [
1887
+ "object",
1888
+ "null"
1889
+ ],
1890
+ "properties": {
1891
+ "attribute": {
1892
+ "type": [
1893
+ "string",
1894
+ "null"
1895
+ ]
1896
+ },
1897
+ "operator": {
1898
+ "type": [
1899
+ "string",
1900
+ "null"
1901
+ ],
1902
+ "description": "Allowed values: Equals, NotEquals, Contains, NotContains, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn, MatchesRegex, StartsWith, EndsWith, Before, After, SemverEquals, SemverGreaterThan, SemverGreaterThanOrEqual, SemverLessThan, SemverLessThanOrEqual."
1903
+ },
1904
+ "values": {
1905
+ "type": [
1906
+ "array",
1907
+ "null"
1908
+ ],
1909
+ "items": {
1910
+ "type": [
1911
+ "string",
1912
+ "null"
1913
+ ]
1914
+ }
1915
+ },
1916
+ "negate": {
1917
+ "type": [
1918
+ "boolean",
1919
+ "null"
1920
+ ]
1921
+ }
1922
+ },
1923
+ "description": "A single targeting condition on a segment, used both as input (create/update) and output\n(Conditions). Operator is a bare string on\nboth sides of the wire — on write it's parsed to\nOperatorType by `SegmentsController` (an unknown\nvalue fails closed with a 400, never silently dropped or defaulted); on read it's mapped\nstraight through from Operator, which is already a string."
1924
+ },
1925
+ "PublicSegmentResponse": {
1926
+ "type": [
1927
+ "object",
1928
+ "null"
1929
+ ],
1930
+ "properties": {
1931
+ "id": {
1932
+ "type": [
1933
+ "string",
1934
+ "null"
1935
+ ]
1936
+ },
1937
+ "key": {
1938
+ "type": [
1939
+ "string",
1940
+ "null"
1941
+ ]
1942
+ },
1943
+ "name": {
1944
+ "type": [
1945
+ "string",
1946
+ "null"
1947
+ ]
1948
+ },
1949
+ "description": {
1950
+ "type": [
1951
+ "string",
1952
+ "null"
1953
+ ]
1954
+ },
1955
+ "conditions": {
1956
+ "type": [
1957
+ "array",
1958
+ "null"
1959
+ ],
1960
+ "items": {
1961
+ "anyOf": [
1962
+ {
1963
+ "$ref": "#/$defs/PublicSegmentConditionDto"
1964
+ },
1965
+ {
1966
+ "type": "null"
1967
+ }
1968
+ ]
1969
+ }
1970
+ },
1971
+ "createdAt": {
1972
+ "type": [
1973
+ "string",
1974
+ "null"
1975
+ ]
1976
+ },
1977
+ "updatedAt": {
1978
+ "type": [
1979
+ "string",
1980
+ "null"
1981
+ ]
1982
+ },
1983
+ "_actions": {
1984
+ "type": [
1985
+ "object",
1986
+ "null"
1987
+ ],
1988
+ "additionalProperties": {
1989
+ "anyOf": [
1990
+ {
1991
+ "$ref": "#/$defs/ActionCapability"
1992
+ },
1993
+ {
1994
+ "type": "null"
1995
+ }
1996
+ ]
1997
+ },
1998
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
1999
+ }
2000
+ },
2001
+ "description": "Public representation of a user segment, returned by `GET .../segments`,\n`GET .../segments/{segment}`, and the body of a successful create."
2002
+ },
2003
+ "PublicSegmentResponsePagedResult": {
2004
+ "type": [
2005
+ "object",
2006
+ "null"
2007
+ ],
2008
+ "properties": {
2009
+ "items": {
2010
+ "type": [
2011
+ "array",
2012
+ "null"
2013
+ ],
2014
+ "items": {
2015
+ "anyOf": [
2016
+ {
2017
+ "$ref": "#/$defs/PublicSegmentResponse"
2018
+ },
2019
+ {
2020
+ "type": "null"
2021
+ }
2022
+ ]
2023
+ }
2024
+ },
2025
+ "next_cursor": {
2026
+ "type": [
2027
+ "string",
2028
+ "null"
2029
+ ]
2030
+ },
2031
+ "_actions": {
2032
+ "type": [
2033
+ "object",
2034
+ "null"
2035
+ ],
2036
+ "additionalProperties": {
2037
+ "anyOf": [
2038
+ {
2039
+ "$ref": "#/$defs/ActionCapability"
2040
+ },
2041
+ {
2042
+ "type": "null"
2043
+ }
2044
+ ]
2045
+ },
2046
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
2047
+ }
2048
+ },
2049
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
2050
+ },
2051
+ "PublicSetDefaultFlagLifetimeRequest": {
2052
+ "type": [
2053
+ "object",
2054
+ "null"
2055
+ ],
2056
+ "properties": {
2057
+ "days": {
2058
+ "type": [
2059
+ "integer",
2060
+ "null"
2061
+ ]
2062
+ }
2063
+ },
2064
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/default-flag-lifetime`. `days`\nis 1–3650; null (or an empty body) removes the default."
2065
+ },
2066
+ "PublicSetFlagExpiryRequest": {
2067
+ "type": [
2068
+ "object",
2069
+ "null"
2070
+ ],
2071
+ "properties": {
2072
+ "expiresAtUtc": {
2073
+ "type": [
2074
+ "string",
2075
+ "null"
2076
+ ]
2077
+ }
2078
+ },
2079
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/flags/{flag}/expiry`. Expiry is a\ndedicated sub-resource, deliberately NOT a field on PublicUpdateFeatureFlagRequest: that\nPUT is a full replace, so a new nullable field there would let any client that doesn't know about\nexpiry (the Terraform provider included) wipe it on every update. A bare date means the end of that\nUTC day; a full timestamp is stored exactly."
2080
+ },
2081
+ "PublicSetFlagOwnerRequest": {
2082
+ "type": [
2083
+ "object",
2084
+ "null"
2085
+ ],
2086
+ "properties": {
2087
+ "email": {
2088
+ "type": [
2089
+ "string",
2090
+ "null"
2091
+ ]
2092
+ }
2093
+ },
2094
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/flags/{flag}/owner`. A dedicated\nsub-resource for the same reason as expiry: the main flag PUT is a full replace, so an owner field\nthere would let every client that doesn't know about owners wipe one. `email` must belong\nto an active member of the organization (case-insensitive)."
2095
+ },
2096
+ "PublicSetFlagRemovalPrRequest": {
2097
+ "type": [
2098
+ "object",
2099
+ "null"
2100
+ ],
2101
+ "properties": {
2102
+ "url": {
2103
+ "type": [
2104
+ "string",
2105
+ "null"
2106
+ ]
2107
+ }
2108
+ },
2109
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/flags/{flag}/removal-pr`: the\npull request that removes this flag from code, as opened by the Featureflip Flag Cleanup Action.\nA dedicated sub-resource for the same reason as expiry and owner. `url` must be an https\npull request URL (`https://{host}/{owner}/{repo}/pull/{number}`)."
2110
+ },
2111
+ "PublicTargetingConfigResponse": {
2112
+ "type": [
2113
+ "object",
2114
+ "null"
2115
+ ],
2116
+ "properties": {
2117
+ "isEnabled": {
2118
+ "type": [
2119
+ "boolean",
2120
+ "null"
2121
+ ]
2122
+ },
2123
+ "rules": {
2124
+ "type": [
2125
+ "array",
2126
+ "null"
2127
+ ],
2128
+ "items": {
2129
+ "anyOf": [
2130
+ {
2131
+ "$ref": "#/$defs/PublicTargetingRuleResponse"
2132
+ },
2133
+ {
2134
+ "type": "null"
2135
+ }
2136
+ ]
2137
+ }
2138
+ },
2139
+ "_actions": {
2140
+ "type": [
2141
+ "object",
2142
+ "null"
2143
+ ],
2144
+ "additionalProperties": {
2145
+ "anyOf": [
2146
+ {
2147
+ "$ref": "#/$defs/ActionCapability"
2148
+ },
2149
+ {
2150
+ "type": "null"
2151
+ }
2152
+ ]
2153
+ },
2154
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
2155
+ }
2156
+ },
2157
+ "description": "The full targeting configuration for a flag in a single environment, returned by\n`GET .../targeting`. Maps 1:1 onto TargetingConfigurationDto — including\nits IsEnabled field, which reflects the parent\n`FlagEnvironmentConfiguration.IsEnabled` (whether the flag is on in this environment at\nall), not anything specific to targeting itself."
2158
+ },
2159
+ "PublicTargetingRuleResponse": {
2160
+ "type": [
2161
+ "object",
2162
+ "null"
2163
+ ],
2164
+ "properties": {
2165
+ "id": {
2166
+ "type": [
2167
+ "string",
2168
+ "null"
2169
+ ]
2170
+ },
2171
+ "priority": {
2172
+ "type": [
2173
+ "integer",
2174
+ "null"
2175
+ ]
2176
+ },
2177
+ "description": {
2178
+ "type": [
2179
+ "string",
2180
+ "null"
2181
+ ]
2182
+ },
2183
+ "variationId": {
2184
+ "type": [
2185
+ "string",
2186
+ "null"
2187
+ ]
2188
+ },
2189
+ "rolloutPercentage": {
2190
+ "type": [
2191
+ "integer",
2192
+ "null"
2193
+ ]
2194
+ },
2195
+ "userSegmentId": {
2196
+ "type": [
2197
+ "string",
2198
+ "null"
2199
+ ]
2200
+ },
2201
+ "conditionGroups": {
2202
+ "type": [
2203
+ "array",
2204
+ "null"
2205
+ ],
2206
+ "items": {
2207
+ "anyOf": [
2208
+ {
2209
+ "$ref": "#/$defs/PublicConditionGroupResponse"
2210
+ },
2211
+ {
2212
+ "type": "null"
2213
+ }
2214
+ ]
2215
+ }
2216
+ },
2217
+ "_actions": {
2218
+ "type": [
2219
+ "object",
2220
+ "null"
2221
+ ],
2222
+ "additionalProperties": {
2223
+ "anyOf": [
2224
+ {
2225
+ "$ref": "#/$defs/ActionCapability"
2226
+ },
2227
+ {
2228
+ "type": "null"
2229
+ }
2230
+ ]
2231
+ },
2232
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
2233
+ }
2234
+ },
2235
+ "description": "A single targeting rule, returned by `GET .../rules/{ruleId}`,\n`POST .../rules` (201 body), and nested within PublicTargetingConfigResponse.\nMaps 1:1 onto TargetingRuleDto, dropping nothing — every field on the\nApplication DTO is part of the public contract."
2236
+ },
2237
+ "PublicTestWebhookSubscriptionResponse": {
2238
+ "type": [
2239
+ "object",
2240
+ "null"
2241
+ ],
2242
+ "properties": {
2243
+ "webhookEventId": {
2244
+ "type": [
2245
+ "string",
2246
+ "null"
2247
+ ]
2248
+ },
2249
+ "webhookDeliveryId": {
2250
+ "type": [
2251
+ "string",
2252
+ "null"
2253
+ ]
2254
+ }
2255
+ },
2256
+ "description": "The queued test event and its delivery. Poll the delivery log for the outcome."
2257
+ },
2258
+ "PublicToggleFlagRequest": {
2259
+ "type": [
2260
+ "object",
2261
+ "null"
2262
+ ],
2263
+ "properties": {
2264
+ "enabled": {
2265
+ "type": [
2266
+ "boolean",
2267
+ "null"
2268
+ ]
2269
+ }
2270
+ },
2271
+ "description": "Request body for `POST .../flags/{flag}/environments/{env}/toggle`. Named distinctly from\nthe dashboard's own `ToggleFlagInEnvironmentRequest`\n(which uses `IsEnabled`) — the public field is named Enabled per the phase-3c\ncontract. Enabled is a NULLABLE `bool?` deliberately: a non-nullable value\ntype would bind an omitted/empty body to `false` with no validation error (ASP.NET's\nimplicit-required only covers non-nullable reference types, not value types), silently disabling\nthe flag. The controller rejects a null Enabled with a `validation_failed` 400\nso the intent is never ambiguous (#1806)."
2272
+ },
2273
+ "PublicUpdateEnvironmentRequest": {
2274
+ "type": [
2275
+ "object",
2276
+ "null"
2277
+ ],
2278
+ "properties": {
2279
+ "name": {
2280
+ "type": [
2281
+ "string",
2282
+ "null"
2283
+ ]
2284
+ },
2285
+ "color": {
2286
+ "type": [
2287
+ "string",
2288
+ "null"
2289
+ ]
2290
+ },
2291
+ "sortOrder": {
2292
+ "type": [
2293
+ "integer",
2294
+ "null"
2295
+ ]
2296
+ }
2297
+ },
2298
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/environments/{env}`. See\nPublicCreateEnvironmentRequest for why this is named distinctly from the\ndashboard's `UpdateEnvironmentRequest`."
2299
+ },
2300
+ "PublicUpdateFeatureFlagRequest": {
2301
+ "type": [
2302
+ "object",
2303
+ "null"
2304
+ ],
2305
+ "properties": {
2306
+ "name": {
2307
+ "type": [
2308
+ "string",
2309
+ "null"
2310
+ ]
2311
+ },
2312
+ "description": {
2313
+ "type": [
2314
+ "string",
2315
+ "null"
2316
+ ]
2317
+ },
2318
+ "tags": {
2319
+ "type": [
2320
+ "array",
2321
+ "null"
2322
+ ],
2323
+ "items": {
2324
+ "type": [
2325
+ "string",
2326
+ "null"
2327
+ ]
2328
+ }
2329
+ },
2330
+ "clientSideVisible": {
2331
+ "type": [
2332
+ "boolean",
2333
+ "null"
2334
+ ]
2335
+ }
2336
+ },
2337
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/flags/{flag}`. See\nPublicCreateFeatureFlagRequest for why this is named distinctly from the\ndashboard's `UpdateFeatureFlagRequest`. The flag's key and type are immutable via this\nendpoint (mirrors `UpdateFeatureFlagCommand`, which has no `Key`/`Type`)."
2338
+ },
2339
+ "PublicUpdateFlagEnvConfigRequest": {
2340
+ "type": [
2341
+ "object",
2342
+ "null"
2343
+ ],
2344
+ "properties": {
2345
+ "defaultVariationId": {
2346
+ "type": [
2347
+ "string",
2348
+ "null"
2349
+ ]
2350
+ },
2351
+ "strategy": {
2352
+ "type": [
2353
+ "string",
2354
+ "null"
2355
+ ],
2356
+ "description": "Allowed values: SingleVariation, PercentageRollout, TargetedRollout."
2357
+ },
2358
+ "prerequisites": {
2359
+ "type": [
2360
+ "array",
2361
+ "null"
2362
+ ],
2363
+ "items": {
2364
+ "anyOf": [
2365
+ {
2366
+ "$ref": "#/$defs/PublicPrerequisiteDto"
2367
+ },
2368
+ {
2369
+ "type": "null"
2370
+ }
2371
+ ]
2372
+ }
2373
+ }
2374
+ },
2375
+ "description": "Request body for `PUT .../flags/{flag}/environments/{env}`. Named distinctly from the\ndashboard's own `UpdateFlagEnvironmentConfigurationRequest`\n— see PublicCreateEnvironmentRequest for the schemaId-collision rationale (both\ncontrollers share one Swagger document). Strategy is passed through verbatim to\nStrategy\n— the existing command validator name-allowlists it (SingleVariation/PercentageRollout/\nTargetedRollout or null), so an invalid value surfaces as the handler's own 400, not a\ncontroller-level guard. A null Prerequisites leaves prerequisites untouched; a\nnon-null list replaces them wholesale (mirrors UpdateFlagPrerequisitesCommand's\nreplace-all semantics)."
2376
+ },
2377
+ "PublicUpdateProjectRequest": {
2378
+ "type": [
2379
+ "object",
2380
+ "null"
2381
+ ],
2382
+ "properties": {
2383
+ "name": {
2384
+ "type": [
2385
+ "string",
2386
+ "null"
2387
+ ]
2388
+ },
2389
+ "description": {
2390
+ "type": [
2391
+ "string",
2392
+ "null"
2393
+ ]
2394
+ }
2395
+ },
2396
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}`. See\nPublicCreateProjectRequest for why this is named distinctly from the\ndashboard's `UpdateProjectRequest`."
2397
+ },
2398
+ "PublicUpdateSdkKeyRequest": {
2399
+ "type": [
2400
+ "object",
2401
+ "null"
2402
+ ],
2403
+ "properties": {
2404
+ "name": {
2405
+ "type": [
2406
+ "string",
2407
+ "null"
2408
+ ]
2409
+ },
2410
+ "description": {
2411
+ "type": [
2412
+ "string",
2413
+ "null"
2414
+ ]
2415
+ }
2416
+ },
2417
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/environments/{env}/sdk-keys/{sdkKey}`.\nType and key material are immutable via this endpoint (mirrors\nUpdateSdkKeyCommand, which\ncarries no `Type`)."
2418
+ },
2419
+ "PublicUpdateSegmentRequest": {
2420
+ "type": [
2421
+ "object",
2422
+ "null"
2423
+ ],
2424
+ "properties": {
2425
+ "name": {
2426
+ "type": [
2427
+ "string",
2428
+ "null"
2429
+ ]
2430
+ },
2431
+ "description": {
2432
+ "type": [
2433
+ "string",
2434
+ "null"
2435
+ ]
2436
+ },
2437
+ "conditions": {
2438
+ "type": [
2439
+ "array",
2440
+ "null"
2441
+ ],
2442
+ "items": {
2443
+ "anyOf": [
2444
+ {
2445
+ "$ref": "#/$defs/PublicSegmentConditionDto"
2446
+ },
2447
+ {
2448
+ "type": "null"
2449
+ }
2450
+ ]
2451
+ }
2452
+ }
2453
+ },
2454
+ "description": "Request body for `PUT /api/v1/orgs/{org}/projects/{project}/segments/{segment}`. The\nsegment's key is immutable via this endpoint (mirrors `UpdateUserSegmentCommand`, which\ncarries no `Key`)."
2455
+ },
2456
+ "PublicUpdateTargetingRuleRequest": {
2457
+ "type": [
2458
+ "object",
2459
+ "null"
2460
+ ],
2461
+ "properties": {
2462
+ "description": {
2463
+ "type": [
2464
+ "string",
2465
+ "null"
2466
+ ]
2467
+ },
2468
+ "variationId": {
2469
+ "type": [
2470
+ "string",
2471
+ "null"
2472
+ ]
2473
+ },
2474
+ "rolloutPercentage": {
2475
+ "type": [
2476
+ "integer",
2477
+ "null"
2478
+ ]
2479
+ },
2480
+ "userSegmentId": {
2481
+ "type": [
2482
+ "string",
2483
+ "null"
2484
+ ]
2485
+ },
2486
+ "conditionGroups": {
2487
+ "type": [
2488
+ "array",
2489
+ "null"
2490
+ ],
2491
+ "items": {
2492
+ "anyOf": [
2493
+ {
2494
+ "$ref": "#/$defs/PublicConditionGroupRequest"
2495
+ },
2496
+ {
2497
+ "type": "null"
2498
+ }
2499
+ ]
2500
+ }
2501
+ }
2502
+ },
2503
+ "description": "Request body for `PUT .../rules/{ruleId}`. Same shape as\nPublicCreateTargetingRuleRequest — see its remarks on operator\nvalidation/canonicalization, which applies identically here."
2504
+ },
2505
+ "PublicUpdateVariationRequest": {
2506
+ "type": [
2507
+ "object",
2508
+ "null"
2509
+ ],
2510
+ "properties": {
2511
+ "name": {
2512
+ "type": [
2513
+ "string",
2514
+ "null"
2515
+ ]
2516
+ },
2517
+ "value": {
2518
+ "type": [
2519
+ "string",
2520
+ "null"
2521
+ ]
2522
+ },
2523
+ "description": {
2524
+ "type": [
2525
+ "string",
2526
+ "null"
2527
+ ]
2528
+ }
2529
+ },
2530
+ "description": "Request body for\n`PUT /api/v1/orgs/{org}/projects/{project}/flags/{flag}/variations/{variationId}`. The\nvariation's key is immutable via this endpoint (mirrors\n`UpdateVariationCommand`, which\ncarries no `Key`)."
2531
+ },
2532
+ "PublicUpdateWebhookSubscriptionRequest": {
2533
+ "type": [
2534
+ "object",
2535
+ "null"
2536
+ ],
2537
+ "properties": {
2538
+ "name": {
2539
+ "type": [
2540
+ "string",
2541
+ "null"
2542
+ ]
2543
+ },
2544
+ "url": {
2545
+ "type": [
2546
+ "string",
2547
+ "null"
2548
+ ]
2549
+ },
2550
+ "eventTypes": {
2551
+ "type": [
2552
+ "array",
2553
+ "null"
2554
+ ],
2555
+ "items": {
2556
+ "type": [
2557
+ "string",
2558
+ "null"
2559
+ ]
2560
+ }
2561
+ },
2562
+ "projectIds": {
2563
+ "type": [
2564
+ "array",
2565
+ "null"
2566
+ ],
2567
+ "items": {
2568
+ "type": [
2569
+ "string",
2570
+ "null"
2571
+ ]
2572
+ }
2573
+ },
2574
+ "environmentIds": {
2575
+ "type": [
2576
+ "array",
2577
+ "null"
2578
+ ],
2579
+ "items": {
2580
+ "type": [
2581
+ "string",
2582
+ "null"
2583
+ ]
2584
+ }
2585
+ },
2586
+ "isEnabled": {
2587
+ "type": [
2588
+ "boolean",
2589
+ "null"
2590
+ ]
2591
+ }
2592
+ },
2593
+ "description": "Replaces a subscription's configuration (full replace — omitted lists become empty, meaning\n\"all\"). `isEnabled` is required. The provider cannot be changed."
2594
+ },
2595
+ "PublicVariationResponse": {
2596
+ "type": [
2597
+ "object",
2598
+ "null"
2599
+ ],
2600
+ "properties": {
2601
+ "id": {
2602
+ "type": [
2603
+ "string",
2604
+ "null"
2605
+ ]
2606
+ },
2607
+ "key": {
2608
+ "type": [
2609
+ "string",
2610
+ "null"
2611
+ ]
2612
+ },
2613
+ "name": {
2614
+ "type": [
2615
+ "string",
2616
+ "null"
2617
+ ]
2618
+ },
2619
+ "value": {
2620
+ "type": [
2621
+ "string",
2622
+ "null"
2623
+ ]
2624
+ },
2625
+ "description": {
2626
+ "type": [
2627
+ "string",
2628
+ "null"
2629
+ ]
2630
+ },
2631
+ "_actions": {
2632
+ "type": [
2633
+ "object",
2634
+ "null"
2635
+ ],
2636
+ "additionalProperties": {
2637
+ "anyOf": [
2638
+ {
2639
+ "$ref": "#/$defs/ActionCapability"
2640
+ },
2641
+ {
2642
+ "type": "null"
2643
+ }
2644
+ ]
2645
+ },
2646
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
2647
+ }
2648
+ },
2649
+ "description": "A single variation on a flag, as returned in Variations."
2650
+ },
2651
+ "PublicWebhookDeliveryResponse": {
2652
+ "type": [
2653
+ "object",
2654
+ "null"
2655
+ ],
2656
+ "properties": {
2657
+ "id": {
2658
+ "type": [
2659
+ "string",
2660
+ "null"
2661
+ ]
2662
+ },
2663
+ "webhookEventId": {
2664
+ "type": [
2665
+ "string",
2666
+ "null"
2667
+ ]
2668
+ },
2669
+ "status": {
2670
+ "type": [
2671
+ "string",
2672
+ "null"
2673
+ ],
2674
+ "description": "Allowed values: Pending, Succeeded, DeadLettered."
2675
+ },
2676
+ "attemptCount": {
2677
+ "type": [
2678
+ "integer",
2679
+ "null"
2680
+ ]
2681
+ },
2682
+ "nextAttemptAt": {
2683
+ "type": [
2684
+ "string",
2685
+ "null"
2686
+ ]
2687
+ },
2688
+ "lastResponseStatusCode": {
2689
+ "type": [
2690
+ "integer",
2691
+ "null"
2692
+ ]
2693
+ },
2694
+ "lastError": {
2695
+ "type": [
2696
+ "string",
2697
+ "null"
2698
+ ]
2699
+ },
2700
+ "completedAt": {
2701
+ "type": [
2702
+ "string",
2703
+ "null"
2704
+ ]
2705
+ },
2706
+ "createdAt": {
2707
+ "type": [
2708
+ "string",
2709
+ "null"
2710
+ ]
2711
+ }
2712
+ },
2713
+ "description": "One delivery attempt record. `status` is `Pending` (awaiting its first attempt,\nbacking off, or in flight), `Succeeded` or `DeadLettered`."
2714
+ },
2715
+ "PublicWebhookDeliveryResponsePagedResult": {
2716
+ "type": [
2717
+ "object",
2718
+ "null"
2719
+ ],
2720
+ "properties": {
2721
+ "items": {
2722
+ "type": [
2723
+ "array",
2724
+ "null"
2725
+ ],
2726
+ "items": {
2727
+ "anyOf": [
2728
+ {
2729
+ "$ref": "#/$defs/PublicWebhookDeliveryResponse"
2730
+ },
2731
+ {
2732
+ "type": "null"
2733
+ }
2734
+ ]
2735
+ }
2736
+ },
2737
+ "next_cursor": {
2738
+ "type": [
2739
+ "string",
2740
+ "null"
2741
+ ]
2742
+ }
2743
+ },
2744
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
2745
+ },
2746
+ "PublicWebhookSecretResponse": {
2747
+ "type": [
2748
+ "object",
2749
+ "null"
2750
+ ],
2751
+ "properties": {
2752
+ "id": {
2753
+ "type": [
2754
+ "string",
2755
+ "null"
2756
+ ]
2757
+ },
2758
+ "createdAt": {
2759
+ "type": [
2760
+ "string",
2761
+ "null"
2762
+ ]
2763
+ },
2764
+ "retiredAt": {
2765
+ "type": [
2766
+ "string",
2767
+ "null"
2768
+ ]
2769
+ }
2770
+ },
2771
+ "description": "A signing secret's id and lifecycle. A secret with no `retiredAt` is active and signs every delivery."
2772
+ },
2773
+ "PublicWebhookSubscriptionResponse": {
2774
+ "type": [
2775
+ "object",
2776
+ "null"
2777
+ ],
2778
+ "properties": {
2779
+ "id": {
2780
+ "type": [
2781
+ "string",
2782
+ "null"
2783
+ ]
2784
+ },
2785
+ "name": {
2786
+ "type": [
2787
+ "string",
2788
+ "null"
2789
+ ]
2790
+ },
2791
+ "url": {
2792
+ "type": [
2793
+ "string",
2794
+ "null"
2795
+ ]
2796
+ },
2797
+ "provider": {
2798
+ "type": [
2799
+ "string",
2800
+ "null"
2801
+ ],
2802
+ "description": "Allowed values: GenericHttp."
2803
+ },
2804
+ "isEnabled": {
2805
+ "type": [
2806
+ "boolean",
2807
+ "null"
2808
+ ]
2809
+ },
2810
+ "eventTypes": {
2811
+ "type": [
2812
+ "array",
2813
+ "null"
2814
+ ],
2815
+ "items": {
2816
+ "type": [
2817
+ "string",
2818
+ "null"
2819
+ ]
2820
+ }
2821
+ },
2822
+ "projectIds": {
2823
+ "type": [
2824
+ "array",
2825
+ "null"
2826
+ ],
2827
+ "items": {
2828
+ "type": [
2829
+ "string",
2830
+ "null"
2831
+ ]
2832
+ }
2833
+ },
2834
+ "environmentIds": {
2835
+ "type": [
2836
+ "array",
2837
+ "null"
2838
+ ],
2839
+ "items": {
2840
+ "type": [
2841
+ "string",
2842
+ "null"
2843
+ ]
2844
+ }
2845
+ },
2846
+ "consecutiveFailureCount": {
2847
+ "type": [
2848
+ "integer",
2849
+ "null"
2850
+ ]
2851
+ },
2852
+ "autoDisabledAt": {
2853
+ "type": [
2854
+ "string",
2855
+ "null"
2856
+ ]
2857
+ },
2858
+ "createdAt": {
2859
+ "type": [
2860
+ "string",
2861
+ "null"
2862
+ ]
2863
+ },
2864
+ "updatedAt": {
2865
+ "type": [
2866
+ "string",
2867
+ "null"
2868
+ ]
2869
+ },
2870
+ "secrets": {
2871
+ "type": [
2872
+ "array",
2873
+ "null"
2874
+ ],
2875
+ "items": {
2876
+ "anyOf": [
2877
+ {
2878
+ "$ref": "#/$defs/PublicWebhookSecretResponse"
2879
+ },
2880
+ {
2881
+ "type": "null"
2882
+ }
2883
+ ]
2884
+ }
2885
+ },
2886
+ "overPlanLimit": {
2887
+ "type": [
2888
+ "boolean",
2889
+ "null"
2890
+ ]
2891
+ },
2892
+ "_actions": {
2893
+ "type": [
2894
+ "object",
2895
+ "null"
2896
+ ],
2897
+ "additionalProperties": {
2898
+ "anyOf": [
2899
+ {
2900
+ "$ref": "#/$defs/ActionCapability"
2901
+ },
2902
+ {
2903
+ "type": "null"
2904
+ }
2905
+ ]
2906
+ },
2907
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
2908
+ }
2909
+ },
2910
+ "description": "A webhook subscription. Never carries secret material: signing secrets are listed by id and\nlifecycle only — the value itself is returned once, when it is created or rotated.\n`overPlanLimit` is true when the organization has more subscriptions than its plan\nallows, which happens after a downgrade. The oldest subscriptions up to the limit keep\ndelivering. The rest receive nothing and cannot be re-enabled, tested or redelivered to until\nthe plan is upgraded or older subscriptions are deleted."
2911
+ },
2912
+ "PublicWebhookSubscriptionResponsePagedResult": {
2913
+ "type": [
2914
+ "object",
2915
+ "null"
2916
+ ],
2917
+ "properties": {
2918
+ "items": {
2919
+ "type": [
2920
+ "array",
2921
+ "null"
2922
+ ],
2923
+ "items": {
2924
+ "anyOf": [
2925
+ {
2926
+ "$ref": "#/$defs/PublicWebhookSubscriptionResponse"
2927
+ },
2928
+ {
2929
+ "type": "null"
2930
+ }
2931
+ ]
2932
+ }
2933
+ },
2934
+ "next_cursor": {
2935
+ "type": [
2936
+ "string",
2937
+ "null"
2938
+ ]
2939
+ },
2940
+ "_actions": {
2941
+ "type": [
2942
+ "object",
2943
+ "null"
2944
+ ],
2945
+ "additionalProperties": {
2946
+ "anyOf": [
2947
+ {
2948
+ "$ref": "#/$defs/ActionCapability"
2949
+ },
2950
+ {
2951
+ "type": "null"
2952
+ }
2953
+ ]
2954
+ },
2955
+ "description": "Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it."
2956
+ }
2957
+ },
2958
+ "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`)."
2959
+ }
2960
+ }
2961
+ }
2962
+ ;
2963
+
2964
+ export default _default;