Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level rules array; each rule includes allEnvironments / environments scope fields.
Naming for human review
The id is the Feature Flag’s permanent name in the UI and code. Keep it short (checkout-express-pay) and put context in description. To create it disabled, list every environment in environments with enabled: false.
Config-backed features (Config mode)
A JSON feature can be backed by a shared config — the config supplies the base JSON value and schema, and the feature’s rule values become override patches merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw $extends: ["@config:…"] inside a value string (that is rejected). @const: references inside values still work.
Top-level (baseConfig): set valueType: "json" and baseConfig: "<configKey>" to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches.
Default value: unlike rules, the default is exactly a config with no overrides of its own — send defaultValue: "{}" to use baseConfig. To resolve the default to a descendant of baseConfig instead, set defaultValueConfig to that descendant’s key (it must be within baseConfig’s family); omit/null to use baseConfig directly.
Rules & experiment variations: each carries its own config field naming the family config that value patches (omit/null to patch the base). value is the override patch.
Unique, permanent key, shown as the Feature Flag's name in the UI and used in code. Keep it short. If featureRegexValidator in GET /api/v1/settings is set, follow it (featureKeyExample shows the format); otherwise use kebab-case (e.g. checkout-express-pay). Put context in description.
Default value when feature is enabled. Type must match valueType. In Config mode (baseConfig set) the default must be exactly a config with no overrides: send "{}" to use baseConfig, or set defaultValueConfig to point at a descendant.
The userId or email address of the owner. If an email address is provided, it will be used to look up the userId of the matching organization member. If an ID is provided, it will be validated as existing in the organization. When omitted, it defaults to the requesting member: a personal access token's owner, or the member an organization API key assumes. An organization API key acting as itself must send it, or the request fails with a 400.
Make this feature discoverable in — and served to — every project, beyond its primary project. Requires the targetFeatures permission (FlagsTarget policy) unscoped to any project. Governance stays with project.
Secondary project IDs this feature is targeted in and served to, beyond its primary project. Adding a project requires the targetFeatures permission (FlagsTarget policy) in that project. Governance stays with project.
Key of the config backing this flag ("Config mode"). Requires valueType: "json" and a live config. The config supplies the base JSON and schema; defaultValue and rule values are override patches on top. null or omitted for a plain flag.
Optional. A config within baseConfig's family that the default value resolves to instead of baseConfig itself. null or omitted means the default is baseConfig. The default is exactly this config and carries no overrides of its own.
Per-environment enabled state, keyed by environment ID. An environment you leave out uses its "Default state for new features" setting, which may be enabled. To create the Feature Flag disabled, list every environment with enabled: false. Rules go on the top-level rules field.
Set to true to acknowledge the warnings listed in a blocked response and continue. This covers experiment guards, locked dependents, and references affected by an archive. When the organization treats schema failures as warnings, it also covers schema and invariant warnings. It never bypasses a rejected Custom Hook. On revision publish endpoints, it can also force-publish an out-of-date draft when the caller has Bypass draft approvals access. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.
Set to true to publish despite schema validation errors, failed invariants, or schema changes that invalidate dependent resources. This does not bypass a rejected Custom Hook; use skipHooks for that. The caller must have Bypass draft approvals access for Feature Flags, Configs, and Constants in every Project. Otherwise, this field is ignored. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.
Set to true to publish despite a Custom Hook rejection. This does not bypass schema validation; use skipSchemaValidation for that. The caller must have Bypass draft approvals access for Feature Flags, Configs, and Constants in every Project. Otherwise, this field is ignored. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.
When the organization requires rules to target specific environments or Projects, set to true to save a rule that applies to All Environments and All Projects. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"GrowthBook Documentation","colors":{"primary":"#039DD0","light":"#baa7ff","dark":"#039DD0"},"logo":{"light":"https://mintcdn.com/growthbook-ea15456d/66H-dO8hZfIFVUdN/static/img/growthbook-docslogo-light.png?fit=max\u0026auto=format\u0026n=66H-dO8hZfIFVUdN\u0026q=85\u0026s=36f32d1bbabbdafdb0bd9bc2b53c43e7","dark":"https://mintcdn.com/growthbook-ea15456d/66H-dO8hZfIFVUdN/static/img/growthbook-docslogo-dark.png?fit=max\u0026auto=format\u0026n=66H-dO8hZfIFVUdN\u0026q=85\u0026s=4d2b042f7579c6c815de8ce10cbf6408","href":"/"},"favicon":"https://mintcdn.com/growthbook-ea15456d/giSZyh24PfnTkKz4/static/favicon.png?fit=max\u0026auto=format\u0026n=giSZyh24PfnTkKz4\u0026q=85\u0026s=6832a69676f48e5223736cd3b6ce33da","background":{"color":{"dark":"#1B1B1D"}},"navbar":{"links":[{"icon":"bullhorn","href":"https://growthbook.io/product-updates","label":"Product Updates"},{"href":"https://github.com/growthbook/growthbook","label":"Github","type":"github"}],"primary":{"type":"button","label":"Open App","href":"https://app.growthbook.io/"}},"footer":{"socials":{"x":"https://twitter.com/growth_book","linkedin":"https://www.linkedin.com/company/growthbook","github":"https://github.com/growthbook/growthbook","slack":"https://slack.growthbook.io/?ref=footer-icon"},"links":[{"header":"Community","items":[{"label":"Join us on Slack","href":"https://slack.growthbook.io/"},{"label":"Open an Issue","href":"https://github.com/growthbook/growthbook/issues/new/choose"}]},{"header":"Company","items":[{"label":"About","href":"https://www.growthbook.io/about"},{"label":"Blog","href":"https://www.growthbook.io/blog"}]}]},"seo":{"indexing":"navigable"},"styling":{"eyebrows":"breadcrumbs","latex":true},"integrations":{"gtm":{"tagId":"GTM-MF7GKV4V"}},"banner":{"content":"**New:** See what we've shipped lately on our [Product Updates](https://growthbook.io/product-updates) page.","dismissible":true},"contextual":{"options":["copy","view",{"title":"Edit this page","description":"Propose a change on GitHub","icon":"pencil","href":{"base":"https://github.com/growthbook/growthbook/edit/main/docs$path.mdx"}},"chatgpt","claude","perplexity","grok","aistudio","devin","windsurf","mcp","cursor","vscode","devin-mcp"],"display":"header"},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"growthbook-ea15456d","hasAudioNarration":false,"actualSubdomain":"growthbook-ea15456d","customDomains":["docs.growthbook.io"],"gitSource":{"type":"github","owner":"growthbook","repo":"growthbook","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"contextualFeedback":{"allowEmail":true}},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af314502e595ebec461d060","clientVersion":"0.0.4094","searchFilterCounts":[{"language":"default","tag":"API","count":569},{"language":"default","tag":"Endpoints","count":451},{"language":"default","tag":"Docs","count":189},{"language":"default","tag":"Models","count":117},{"language":"default","tag":"Data \u0026 Metrics","count":41},{"language":"default","tag":"Experimentation","count":41},{"language":"default","tag":"Feature Revisions","count":33},{"language":"default","tag":"SDKs","count":29},{"language":"default","tag":"Feature Flags","count":27},{"language":"default","tag":"Contextual Bandits","count":26}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"styles.css","content":":root{--violet-1: #fdfcfe;--violet-2: #faf8ff;--violet-3: #f4f0fe;--violet-4: #ebe4ff;--violet-5: #e1d9ff;--violet-6: #d4cafe;--violet-7: #c2b5f5;--violet-8: #aa99ec;--violet-9: #6e56cf;--violet-10: #654dc4;--violet-11: #6550b9;--violet-12: #2f265f;--violet-a1: #5500aa03;--violet-a2: #4900ff07;--violet-a3: #4400ee0f;--violet-a4: #4300ff1b;--violet-a5: #3600ff26;--violet-a6: #3100fb35;--violet-a7: #2d01dd4a;--violet-a8: #2b00d066;--violet-a9: #2400b7a9;--violet-a10: #2300abb2;--violet-a11: #1f0099af;--violet-a12: #0b0043d9;--slate-a1: #00005503;--slate-a2: #00005506;--slate-a3: #0000330f;--slate-a4: #00002d17;--slate-a5: #0009321f;--slate-a6: #00002f26;--slate-a7: #00062e32;--slate-a8: #00083046;--slate-a9: #00051d74;--slate-a10: #00071b7f;--slate-a11: #0007149f;--slate-a12: #000509e3;--indigo-1: #fdfdfe;--indigo-2: #f7f9ff;--indigo-3: #edf2fe;--indigo-4: #e1e9ff;--indigo-5: #d2deff;--indigo-6: #c1d0ff;--indigo-7: #abbdf9;--indigo-8: #8da4ef;--indigo-9: #3e63dd;--indigo-10: #3358d4;--indigo-11: #3a5bc7;--indigo-12: hsl(226, 50%, 24%);--indigo-a1: #00008002;--indigo-a2: #0040ff08;--indigo-a3: #0047f112;--indigo-a4: #0044ff1e;--indigo-a5: #0044ff2d;--indigo-a6: #003eff3e;--indigo-a7: #0037ed54;--indigo-a8: #0034dc72;--indigo-a9: hsla(226, 100%, 41%, 0.757);--indigo-a10: hsla(226, 100%, 39%, 0.8);--indigo-a11: hsla(226, 100%, 36%, 0.773);--indigo-a12: hsla(226, 100%, 14%, 0.878);--amber-a1: #c0800004;--amber-a2: #f4d10016;--amber-a3: #ffde003d;--amber-a4: #ffd40063;--amber-a5: #f8cf0088;--amber-a6: #eab5008c;--amber-a7: #dc9b009d;--amber-a8: #da8a00c9;--amber-a9: #ffb300c2;--amber-a10: #ffb300e7;--amber-a11: #ab6400;--amber-a12: #341500dd;--green-a1: #00c04004;--green-a2: #00a32f0b;--green-a3: #00a43319;--green-a4: #00a83829;--green-a5: #019c393b;--green-a6: #00963c52;--green-a7: #00914071;--green-a8: #00924ba4;--green-a9: #008f4acf;--green-a10: #008647d4;--green-a11: #00713fde;--green-a12: #002616e6;--red-a1: #ff000003;--red-a2: #ff000008;--red-a3: #f3000d14;--red-a4: #ff000824;--red-a5: #ff000632;--red-a6: #f8000442;--red-a7: #df000356;--red-a8: #d2000571;--red-a9: #db0007b7;--red-a10: #d10005c1;--red-a11: #c40006d3;--red-a12: #55000de8;--color-text-high: var(--indigo-12);--color-text-mid: hsl(226 50% 24% / 85%);--color-contrast: #fff;--ifm-color-primary: var(--violet-11);--ifm-color-primary-dark: var(--violet-10);--ifm-color-primary-darker: var(--violet-11);--ifm-color-primary-darkest: var(--violet-12);--ifm-color-primary-light: var(--violet-7);--ifm-color-primary-lighter: var(--violet-6);--ifm-color-primary-lightest: var(--violet-5);--ifm-navbar-link-color: var(--color-text-mid);--ifm-code-font-size: 95%;--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);--ifm-alert-border-color: #8a26e7;--color-border: var(--slate-a6);--ifm-background-color: #fff;--color-inverse: #000}.dark{--violet-1: #14121f;--violet-2: #1b1525;--violet-3: #291f43;--violet-4: #33255b;--violet-5: #3c2e69;--violet-6: #473876;--violet-7: #56468b;--violet-8: #6958ad;--violet-9: #6e56cf;--violet-10: #7d66d9;--violet-11: #baa7ff;--violet-12: #e2ddfe;--violet-a1: #4422ff0f;--violet-a2: #853ff916;--violet-a3: #8354fe36;--violet-a4: #7d51fd50;--violet-a5: #845ffd5f;--violet-a6: #8f6cfd6d;--violet-a7: #9879ff83;--violet-a8: #977dfea8;--violet-a9: #8668ffcc;--violet-a10: #9176fed7;--violet-a11: #baa7ff;--violet-a12: #e3defffe;--slate-a1: #00000000;--slate-a2: #d8f4f609;--slate-a3: #ddeaf814;--slate-a4: #d3edf81d;--slate-a5: #d9edfe25;--slate-a6: #d6ebfd30;--slate-a7: #d9edff40;--slate-a8: #d9edff5d;--slate-a9: #dfebfd6d;--slate-a10: #e5edfd7b;--slate-a11: #f1f7feb5;--slate-a12: #fcfdffef;--indigo-1: #11131f;--indigo-2: #141726;--indigo-3: #182449;--indigo-4: #1d2e62;--indigo-5: #253974;--indigo-6: #304384;--indigo-7: #3a4f97;--indigo-8: #435db1;--indigo-9: #3e63dd;--indigo-10: #5472e4;--indigo-11: #9eb1ff;--indigo-12: #d6e1ff;--indigo-a1: #1133ff0f;--indigo-a2: #3354fa17;--indigo-a3: #2f62ff3c;--indigo-a4: #3566ff57;--indigo-a5: #4171fd6b;--indigo-a6: #5178fd7c;--indigo-a7: #5a7fff90;--indigo-a8: #5b81feac;--indigo-a9: #4671ffdb;--indigo-a10: #5c7efee3;--indigo-a11: #9eb1ff;--indigo-a12: #d6e1ff;--amber-a1: #e63c0006;--amber-a2: #fd9b000d;--amber-a3: #fa820022;--amber-a4: #fc820032;--amber-a5: #fd8b0041;--amber-a6: #fd9b0051;--amber-a7: #ffab2567;--amber-a8: #ffae3587;--amber-a9: #ffc53d;--amber-a10: #ffd60a;--amber-a11: #ffca16;--amber-a12: #ffe7b3;--green-a1: #00de4505;--green-a2: #29f99d0b;--green-a3: #22ff991e;--green-a4: #11ff992d;--green-a5: #2bffa23c;--green-a6: #44ffaa4b;--green-a7: #50fdac5e;--green-a8: #54ffad73;--green-a9: #44ffa49e;--green-a10: #43fea4ab;--green-a11: #46fea5d4;--green-a12: #bbffd7f0;--red-a1: #f4121209;--red-a2: #f22f3e11;--red-a3: #ff173f2d;--red-a4: #fe0a3b44;--red-a5: #ff204756;--red-a6: #ff3e5668;--red-a7: #ff536184;--red-a8: #ff5d61b0;--red-a9: #fe4e54e4;--red-a10: #ff6465eb;--red-a11: #ff9592;--red-a12: #ffd1d9;--color-text-high: #fff;--color-text-mid: hsl(0 0% 100% / 0.85);--color-contrast: #fff;--color-inverse: #fff}a code,a:hover code{color:inherit!important}pre a,code a{color:inherit!important}#content a{color:rgb(var(--primary));border-bottom:0!important}#content a:hover{text-decoration:underline!important}.dark #content a{color:rgb(var(--primary-light))}.dark #navbar>div.z-0.absolute.inset-0.bg-background-light.dark\\:bg-background-dark{background-color:#242526!important}@media (min-width: 1024px){#navbar .nav-logo{height:2rem!important;max-width:none!important}#navbar div:has(>a>.nav-logo){flex:0 1 auto}}@media (min-width: 1024px){#sidebar-content{width:18rem!important}#body-content{padding-left:18rem!important}}@media (min-width: 1651px){#content-area{margin-left:max(0px, calc(50vw - 348px - 18rem))!important}}#body-content:has(.not-found-container){padding-left:0!important}#content-area:has(.not-found-container){margin-left:0!important}ul.sidebar-group>li[data-title=\"Tutorials\"],ul.sidebar-group>li[data-title=\"Knowledge Base\"],ul.sidebar-group>li[data-title=\"GrowthBook Guide\"]{border-top:1px solid rgb(var(--gray-200));margin-top:0.5rem;padding-top:0.5rem}.dark ul.sidebar-group>li[data-title=\"Tutorials\"],.dark ul.sidebar-group>li[data-title=\"Knowledge Base\"],.dark ul.sidebar-group>li[data-title=\"GrowthBook Guide\"]{border-top-color:rgb(var(--gray-800))}#sidebar-content li[data-title]>button>div:first-child{flex:1 1 auto;min-width:0}#sidebar-content li[data-title]>button>div:first-child>span:first-child{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#sidebar-content li[data-title]>button>div:first-child .nav-tag-pill{flex:0 0 auto;margin-left:auto}#sidebar-content [data-nav-tag=\"BETA\"]{background:#fbbf24!important;color:#78350f!important}#sidebar-content [data-nav-tag=\"NEW\"]{background:var(--green-a9)!important;color:#fff!important}#sidebar-content [data-nav-tag=\"LEGACY\"]{background:#e5e7eb!important;color:#4b5563!important}#sidebar-content [data-nav-tag=\"v2\"]{background:#c2e6ff!important;color:#0d74ce!important}.dark #sidebar-content [data-nav-tag=\"BETA\"]{background:#78350f!important;color:#fde68a!important}.dark #sidebar-content [data-nav-tag=\"NEW\"]{background:#14532d!important;color:#86efac!important}.dark #sidebar-content [data-nav-tag=\"LEGACY\"]{background:#374151!important;color:#d1d5db!important}.dark #sidebar-content [data-nav-tag=\"v2\"]{background:#0c4a6e!important;color:#7dd3fc!important}#sidebar-content li[data-title]>button{display:flex;width:100%;max-width:100%;box-sizing:border-box;justify-content:space-between;align-items:center}#sidebar-content li[data-title]>button>div:last-child{flex:0 0 auto;margin-left:auto}#sidebar-content a:has(.method-nav-pill)>.flex-1{min-width:0}#sidebar-content a:has(.method-nav-pill) .flex-wrap{flex-wrap:nowrap;width:100%}#sidebar-content a:has(.method-nav-pill) .flex-wrap>span.min-w-0{flex:1 1 auto;max-width:100%}#sidebar-content a[href^=\"/api/features/operation/\"],#sidebar-content a[href^=\"/api/feature-revisions/operation/\"],#sidebar-content a[href^=\"/api/metrics/operation/\"]{color:rgb(156 163 175)!important}.dark #sidebar-content a[href^=\"/api/features/operation/\"],.dark #sidebar-content a[href^=\"/api/feature-revisions/operation/\"],.dark #sidebar-content a[href^=\"/api/metrics/operation/\"]{color:rgb(107 114 128)!important}#sidebar-content a[href^=\"/api/features/operation/\"]:hover,#sidebar-content a[href^=\"/api/features/operation/\"]:focus-visible,#sidebar-content a[href^=\"/api/feature-revisions/operation/\"]:hover,#sidebar-content a[href^=\"/api/feature-revisions/operation/\"]:focus-visible,#sidebar-content a[href^=\"/api/metrics/operation/\"]:hover,#sidebar-content a[href^=\"/api/metrics/operation/\"]:focus-visible{color:#111!important}.dark #sidebar-content a[href^=\"/api/features/operation/\"]:hover,.dark #sidebar-content a[href^=\"/api/features/operation/\"]:focus-visible,.dark #sidebar-content a[href^=\"/api/feature-revisions/operation/\"]:hover,.dark #sidebar-content a[href^=\"/api/feature-revisions/operation/\"]:focus-visible,.dark #sidebar-content a[href^=\"/api/metrics/operation/\"]:hover,.dark #sidebar-content a[href^=\"/api/metrics/operation/\"]:focus-visible{color:#fff!important}#sidebar-content a[href^=\"/api/features/operation/\"] .method-nav-pill,#sidebar-content a[href^=\"/api/feature-revisions/operation/\"] .method-nav-pill,#sidebar-content a[href^=\"/api/metrics/operation/\"] .method-nav-pill{filter:grayscale(1);opacity:0.65}#sidebar-content a[href^=\"/api/features/operation/\"]:hover .method-nav-pill,#sidebar-content a[href^=\"/api/features/operation/\"]:focus-visible .method-nav-pill,#sidebar-content a[href^=\"/api/feature-revisions/operation/\"]:hover .method-nav-pill,#sidebar-content a[href^=\"/api/feature-revisions/operation/\"]:focus-visible .method-nav-pill,#sidebar-content a[href^=\"/api/metrics/operation/\"]:hover .method-nav-pill,#sidebar-content a[href^=\"/api/metrics/operation/\"]:focus-visible .method-nav-pill{filter:none;opacity:1}#sidebar-content a[href^=\"/api/features/operation/\"] .flex-wrap>span.min-w-0,#sidebar-content a[href^=\"/api/feature-revisions/operation/\"] .flex-wrap>span.min-w-0,#sidebar-content a[href^=\"/api/metrics/operation/\"] .flex-wrap>span.min-w-0{text-decoration:line-through}.chat-assistant-send-button{display:none!important}table[class*=\"[\u0026_td]:min-w-[150px]\"] td:first-child:has(code){max-width:25%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:break-word}#navbar a[href=\"https://growthbook.io/product-updates\"]:not(#banner a){--pu-accent: var(--primary);--pu-text: 3 120 160;--pu-ring: var(--background-light);--pu-tint: 0.08;position:relative;color:rgb(var(--pu-text))!important;border-color:rgb(var(--pu-accent) / 0.4)!important;background-color:rgb(var(--pu-accent) / var(--pu-tint))!important}.dark #navbar a[href=\"https://growthbook.io/product-updates\"]:not(#banner a){--pu-accent: var(--primary-light);--pu-text: var(--primary-light);--pu-ring: var(--background-dark);--pu-tint: 0.12}#navbar a[href=\"https://growthbook.io/product-updates\"]:not(#banner a) svg{background-color:rgb(var(--pu-text))!important}#navbar a[href=\"https://growthbook.io/product-updates\"]:not(#banner a)::after{content:\"\";position:absolute;top:8px;left:29px;width:7px;height:7px;border-radius:9999px;background:rgb(var(--pu-accent));box-shadow:0 0 0 2px rgb(var(--pu-ring))}"}],"page":{"pagePath":"api/features-v2/operation/postFeatureV2","slug":"/api/features-v2/operation/postFeatureV2","pageMetadata":{"title":"Create a single feature","openapi":"openapi.yaml POST /v2/features","description":"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level `rules` array; each rule includes `allEnvironments` / `environments` scope fields.\n\n### Naming for human review\n\nThe `id` is the Feature Flag's permanent name in the UI and code. Keep it short (`checkout-express-pay`) and put context in `description`. To create it disabled, list every environment in `environments` with `enabled: false`.\n\n### Config-backed features (Config mode)\n\nA JSON feature can be backed by a shared **config** — the config supplies the base JSON value and schema, and the feature's *rule* values become override *patches* merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw `$extends: [\"@config:…\"]` inside a value string (that is rejected). `@const:` references inside values still work.\n\n- **Top-level (`baseConfig`):** set `valueType: \"json\"` and `baseConfig: \"\u003cconfigKey>\"` to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches.\n- **Default value:** unlike rules, the default is exactly a config with no overrides of its own — send `defaultValue: \"{}\"` to use `baseConfig`. To resolve the default to a *descendant* of `baseConfig` instead, set `defaultValueConfig` to that descendant's key (it must be within `baseConfig`'s family); omit/null to use `baseConfig` directly.\n- **Rules \u0026 experiment variations:** each carries its own `config` field naming the family config that value patches (omit/null to patch the base). `value` is the override patch.\n\nExample:\n\n```json\n{\n \"id\": \"checkout-config\",\n \"valueType\": \"json\",\n \"baseConfig\": \"purchase-flow\",\n \"defaultValue\": \"{}\",\n \"rules\": [\n { \"type\": \"force\", \"config\": \"purchase-flow-vip\", \"value\": \"{\\\"maxItems\\\": 20}\", \"allEnvironments\": true }\n ]\n}\n```","href":"/api/features-v2/operation/postFeatureV2"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n em: \"em\",\n h3: \"h3\",\n li: \"li\",\n p: \"p\",\n pre: \"pre\",\n span: \"span\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n }, {CodeBlock} = _components;\n if (!CodeBlock) _missingMdxReference(\"CodeBlock\", true);\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level \", _jsx(_components.code, {\n children: \"rules\"\n }), \" array; each rule includes \", _jsx(_components.code, {\n children: \"allEnvironments\"\n }), \" / \", _jsx(_components.code, {\n children: \"environments\"\n }), \" scope fields.\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Naming for human review\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The \", _jsx(_components.code, {\n children: \"id\"\n }), \" is the Feature Flag’s permanent name in the UI and code. Keep it short (\", _jsx(_components.code, {\n children: \"checkout-express-pay\"\n }), \") and put context in \", _jsx(_components.code, {\n children: \"description\"\n }), \". To create it disabled, list every environment in \", _jsx(_components.code, {\n children: \"environments\"\n }), \" with \", _jsx(_components.code, {\n children: \"enabled: false\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Config-backed features (Config mode)\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A JSON feature can be backed by a shared \", _jsx(_components.strong, {\n children: \"config\"\n }), \" — the config supplies the base JSON value and schema, and the feature’s \", _jsx(_components.em, {\n children: \"rule\"\n }), \" values become override \", _jsx(_components.em, {\n children: \"patches\"\n }), \" merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw \", _jsx(_components.code, {\n children: \"$extends: [\\\"@config:…\\\"]\"\n }), \" inside a value string (that is rejected). \", _jsx(_components.code, {\n children: \"@const:\"\n }), \" references inside values still work.\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsxs(_components.strong, {\n children: [\"Top-level (\", _jsx(_components.code, {\n children: \"baseConfig\"\n }), \"):\"]\n }), \" set \", _jsx(_components.code, {\n children: \"valueType: \\\"json\\\"\"\n }), \" and \", _jsx(_components.code, {\n children: \"baseConfig: \\\"\u003cconfigKey>\\\"\"\n }), \" to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Default value:\"\n }), \" unlike rules, the default is exactly a config with no overrides of its own — send \", _jsx(_components.code, {\n children: \"defaultValue: \\\"{}\\\"\"\n }), \" to use \", _jsx(_components.code, {\n children: \"baseConfig\"\n }), \". To resolve the default to a \", _jsx(_components.em, {\n children: \"descendant\"\n }), \" of \", _jsx(_components.code, {\n children: \"baseConfig\"\n }), \" instead, set \", _jsx(_components.code, {\n children: \"defaultValueConfig\"\n }), \" to that descendant’s key (it must be within \", _jsx(_components.code, {\n children: \"baseConfig\"\n }), \"’s family); omit/null to use \", _jsx(_components.code, {\n children: \"baseConfig\"\n }), \" directly.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Rules \u0026 experiment variations:\"\n }), \" each carries its own \", _jsx(_components.code, {\n children: \"config\"\n }), \" field naming the family config that value patches (omit/null to patch the base). \", _jsx(_components.code, {\n children: \"value\"\n }), \" is the override patch.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Example:\"\n }), \"\\n\", _jsx(CodeBlock, {\n numberOfLines: \"9\",\n language: \"json\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"json\",\n children: _jsxs(_components.code, {\n language: \"json\",\n numberOfLines: \"9\",\n children: [_jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"{\"\n })\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"id\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"checkout-config\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"valueType\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"json\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"baseConfig\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"purchase-flow\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"defaultValue\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"{}\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \",\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \" \\\"rules\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": [\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" { \"\n }), _jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \"\\\"type\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"force\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \", \"\n }), _jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \"\\\"config\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"purchase-flow-vip\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \", \"\n }), _jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \"\\\"value\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"\\\"{\"\n }), _jsx(_components.span, {\n style: {\n color: \"#CF222E\",\n \"--shiki-dark\": \"#D7BA7D\"\n },\n children: \"\\\\\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \"maxItems\"\n }), _jsx(_components.span, {\n style: {\n color: \"#CF222E\",\n \"--shiki-dark\": \"#D7BA7D\"\n },\n children: \"\\\\\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \": 20}\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \", \"\n }), _jsx(_components.span, {\n style: {\n color: \"#116329\",\n \"--shiki-dark\": \"#9CDCFE\"\n },\n children: \"\\\"allEnvironments\\\"\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \": \"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \"true\"\n }), _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" }\"\n })]\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \" ]\"\n })\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#1F2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n children: \"}\"\n })\n }), \"\\n\"]\n })\n })\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\nfunction _missingMdxReference(id, component) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\");\n}\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a single feature","openapi":"openapi.yaml POST /v2/features","description":"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level `rules` array; each rule includes `allEnvironments` / `environments` scope fields.\n\n### Naming for human review\n\nThe `id` is the Feature Flag's permanent name in the UI and code. Keep it short (`checkout-express-pay`) and put context in `description`. To create it disabled, list every environment in `environments` with `enabled: false`.\n\n### Config-backed features (Config mode)\n\nA JSON feature can be backed by a shared **config** — the config supplies the base JSON value and schema, and the feature's *rule* values become override *patches* merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw `$extends: [\"@config:…\"]` inside a value string (that is rejected). `@const:` references inside values still work.\n\n- **Top-level (`baseConfig`):** set `valueType: \"json\"` and `baseConfig: \"\u003cconfigKey>\"` to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches.\n- **Default value:** unlike rules, the default is exactly a config with no overrides of its own — send `defaultValue: \"{}\"` to use `baseConfig`. To resolve the default to a *descendant* of `baseConfig` instead, set `defaultValueConfig` to that descendant's key (it must be within `baseConfig`'s family); omit/null to use `baseConfig` directly.\n- **Rules \u0026 experiment variations:** each carries its own `config` field naming the family config that value patches (omit/null to patch the base). `value` is the override patch.\n\nExample:\n\n```json\n{\n \"id\": \"checkout-config\",\n \"valueType\": \"json\",\n \"baseConfig\": \"purchase-flow\",\n \"defaultValue\": \"{}\",\n \"rules\": [\n { \"type\": \"force\", \"config\": \"purchase-flow-vip\", \"value\": \"{\\\"maxItems\\\": 20}\", \"allEnvironments\": true }\n ]\n}\n```","href":"/api/features-v2/operation/postFeatureV2"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/growthbook-ea15456d/1f4d041fccf45c4d/docs-ui.js","/_mintlify/custom/growthbook-ea15456d/2a3423f351be4eea/kapa-widget.js","/_mintlify/custom/growthbook-ea15456d/e900cb7870eac898/snippets/data/SDKInfo.js","/_mintlify/custom/growthbook-ea15456d/5075c54121b00a3d/snippets/data/commercialFeatures.js","/_mintlify/custom/growthbook-ea15456d/55695472085fd488/reo.js"],"openApiReferenceData":{"operation":{"operationId":"postFeatureV2","summary":"Create a single feature","description":"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level `rules` array; each rule includes `allEnvironments` / `environments` scope fields.\n\n### Naming for human review\n\nThe `id` is the Feature Flag's permanent name in the UI and code. Keep it short (`checkout-express-pay`) and put context in `description`. To create it disabled, list every environment in `environments` with `enabled: false`.\n\n### Config-backed features (Config mode)\n\nA JSON feature can be backed by a shared **config** — the config supplies the base JSON value and schema, and the feature's *rule* values become override *patches* merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw `$extends: [\"@config:…\"]` inside a value string (that is rejected). `@const:` references inside values still work.\n\n- **Top-level (`baseConfig`):** set `valueType: \"json\"` and `baseConfig: \"\u003cconfigKey>\"` to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches.\n- **Default value:** unlike rules, the default is exactly a config with no overrides of its own — send `defaultValue: \"{}\"` to use `baseConfig`. To resolve the default to a *descendant* of `baseConfig` instead, set `defaultValueConfig` to that descendant's key (it must be within `baseConfig`'s family); omit/null to use `baseConfig` directly.\n- **Rules \u0026 experiment variations:** each carries its own `config` field naming the family config that value patches (omit/null to patch the base). `value` is the override patch.\n\nExample:\n\n```json\n{\n \"id\": \"checkout-config\",\n \"valueType\": \"json\",\n \"baseConfig\": \"purchase-flow\",\n \"defaultValue\": \"{}\",\n \"rules\": [\n { \"type\": \"force\", \"config\": \"purchase-flow-vip\", \"value\": \"{\\\"maxItems\\\": 20}\", \"allEnvironments\": true }\n ]\n}\n```","tags":["features-v2"],"parameters":["784b41b1-b49a-4790-b121-7174dd89e3aa","1538532b-2629-4f7b-80b4-0d7cfedc3a89"],"requestBody":"008e7c39-4162-43d4-8eac-e687714448ba","responses":{"200":"e3205c11-939e-4882-b768-b699e5728cd3","202":"e996a2cb-7896-4f5e-beb3-2bceeb2bb7cc","422":"9135e685-bda1-4725-b385-2b9bdde4d928"},"x-codeSamples":[{"lang":"cURL","source":"curl -X POST 'https://api.growthbook.io/api/v2/features' \\\n -H 'Authorization: Bearer YOUR_API_KEY'"}],"method":"post","type":"path","servers":["a90fa77a-1e3a-4653-822f-0ec7a0c0e5c9","da4439ad-114f-418d-b8e9-ec5d8270d44a"],"security":["9b0fc9dc-914c-45e6-98a0-ae13016d3aba","9c080b0f-17f7-40e8-9d49-cacc8725e1ed"],"path":"/v2/features","baseUrlOptions":["https://api.growthbook.io/api","https://{domain}/api"],"title":"Create a single feature","codeSamples":[{"lang":"cURL","source":"curl -X POST 'https://api.growthbook.io/api/v2/features' \\\n -H 'Authorization: Bearer YOUR_API_KEY'"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{"784b41b1-b49a-4790-b121-7174dd89e3aa":{"name":"skipSchemaValidation","in":"query","description":"Deprecated — pass `skipSchemaValidation` in the request body instead.","schema":{"oneOf":[{"type":"string","description":"Deprecated — pass `skipSchemaValidation` in the request body instead.","const":"true","deprecated":true,"uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"string","description":"Deprecated — pass `skipSchemaValidation` in the request body instead.","const":"false","deprecated":true,"uniqueKey":"oneOf.1","typeLabel":"string"},{"type":"string","description":"Deprecated — pass `skipSchemaValidation` in the request body instead.","const":"0","deprecated":true,"uniqueKey":"oneOf.2","typeLabel":"string"},{"type":"string","description":"Deprecated — pass `skipSchemaValidation` in the request body instead.","const":"1","deprecated":true,"uniqueKey":"oneOf.3","typeLabel":"string"},{"type":"boolean","description":"Deprecated — pass `skipSchemaValidation` in the request body instead.","deprecated":true,"uniqueKey":"oneOf.4","typeLabel":"boolean"}],"uniqueKey":"","typeLabel":"string · string · string · string · boolean"}},"1538532b-2629-4f7b-80b4-0d7cfedc3a89":{"name":"ignoreWarnings","in":"query","description":"Deprecated — pass `ignoreWarnings` in the request body instead.","schema":{"oneOf":[{"type":"string","description":"Deprecated — pass `ignoreWarnings` in the request body instead.","const":"true","deprecated":true,"uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"string","description":"Deprecated — pass `ignoreWarnings` in the request body instead.","const":"false","deprecated":true,"uniqueKey":"oneOf.1","typeLabel":"string"},{"type":"string","description":"Deprecated — pass `ignoreWarnings` in the request body instead.","const":"0","deprecated":true,"uniqueKey":"oneOf.2","typeLabel":"string"},{"type":"string","description":"Deprecated — pass `ignoreWarnings` in the request body instead.","const":"1","deprecated":true,"uniqueKey":"oneOf.3","typeLabel":"string"},{"type":"boolean","description":"Deprecated — pass `ignoreWarnings` in the request body instead.","deprecated":true,"uniqueKey":"oneOf.4","typeLabel":"boolean"}],"uniqueKey":"","typeLabel":"string · string · string · string · boolean"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"pattern":"^[a-zA-Z0-9_.:\\|\\-]+$","description":"Unique, permanent key, shown as the Feature Flag's name in the UI and used in code. Keep it short. If `featureRegexValidator` in `GET /api/v1/settings` is set, follow it (`featureKeyExample` shows the format); otherwise use kebab-case (e.g. `checkout-express-pay`). Put context in `description`.","type":"string","minLength":1,"isRequired":true,"uniqueKey":"id","typeLabel":"string"},"valueType":{"description":"The data type of the feature payload. Boolean by default.","type":"string","enum":["boolean","string","number","json"],"isRequired":true,"uniqueKey":"valueType","typeLabel":"enum\u003cstring>"},"defaultValue":{"description":"Default value when feature is enabled. Type must match `valueType`. In Config mode (`baseConfig` set) the default must be exactly a config with no overrides: send `\"{}\"` to use `baseConfig`, or set `defaultValueConfig` to point at a descendant.","type":"string","isRequired":true,"uniqueKey":"defaultValue","typeLabel":"string"},"archived":{"type":"boolean","uniqueKey":"archived","typeLabel":"boolean"},"description":{"description":"Markdown. What the Feature Flag gates and why, rollout plan, and links. Put context here, not in the key.","type":"string","maxLength":10000,"uniqueKey":"description","typeLabel":"string"},"owner":{"description":"The userId or email address of the owner. If an email address is provided, it will be used to look up the userId of the matching organization member. If an ID is provided, it will be validated as existing in the organization. When omitted, it defaults to the requesting member: a personal access token's owner, or the member an organization API key assumes. An organization API key acting as itself must send it, or the request fails with a 400.","type":"string","uniqueKey":"owner","typeLabel":"string"},"project":{"description":"An associated project ID","type":"string","uniqueKey":"project","typeLabel":"string"},"targetingAllProjects":{"description":"Make this feature discoverable in — and served to — every project, beyond its primary `project`. Requires the `targetFeatures` permission (FlagsTarget policy) unscoped to any project. Governance stays with `project`.","type":"boolean","uniqueKey":"targetingAllProjects","typeLabel":"boolean"},"targetingProjects":{"description":"Secondary project IDs this feature is targeted in and served to, beyond its primary `project`. Adding a project requires the `targetFeatures` permission (FlagsTarget policy) in that project. Governance stays with `project`.","type":"array","items":{"type":"string","uniqueKey":"targetingProjects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"targetingProjects","typeLabel":"string[]"},"baseConfig":{"oneOf":[{"type":"string","description":"Key of the config backing this flag (\"Config mode\"). Requires `valueType: \"json\"` and a live config. The config supplies the base JSON and schema; `defaultValue` and rule values are override patches on top. null or omitted for a plain flag.","uniqueKey":"baseConfig.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of the config backing this flag (\"Config mode\"). Requires `valueType: \"json\"` and a live config. The config supplies the base JSON and schema; `defaultValue` and rule values are override patches on top. null or omitted for a plain flag.","uniqueKey":"baseConfig.oneOf.1","typeLabel":"null"}],"uniqueKey":"baseConfig","typeLabel":"string | null"},"defaultValueConfig":{"oneOf":[{"type":"string","description":"Optional. A config within `baseConfig`'s family that the default value resolves to instead of `baseConfig` itself. null or omitted means the default is `baseConfig`. The default is exactly this config and carries no overrides of its own.","uniqueKey":"defaultValueConfig.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional. A config within `baseConfig`'s family that the default value resolves to instead of `baseConfig` itself. null or omitted means the default is `baseConfig`. The default is exactly this config and carries no overrides of its own.","uniqueKey":"defaultValueConfig.oneOf.1","typeLabel":"null"}],"uniqueKey":"defaultValueConfig","typeLabel":"string | null"},"tags":{"description":"Tags for filtering and grouping. Use these instead of encoding groups in names.","type":"array","items":{"type":"string","uniqueKey":"tags.items.[INDEX]","typeLabel":"string"},"uniqueKey":"tags","typeLabel":"string[]"},"rules":{"description":"Feature rules. Each rule carries its own environment scope via `allEnvironments` / `environments`.","type":"array","items":{"oneOf":[{"type":"object","required":["type","value"],"properties":{"type":{"type":"string","const":"force","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.type","typeLabel":"string"},"value":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.value","typeLabel":"string"},"description":{"description":"Short note on why the rule exists (e.g. `Beta testers only`).","type":"string","maxLength":10000,"uniqueKey":"rules.items.[INDEX].oneOf.0.description","typeLabel":"string"},"condition":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.0.condition","typeLabel":"string"},"savedGroups":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","enum":["all","none","any"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroups.items.[INDEX].match","typeLabel":"enum\u003cstring>"},"ids":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroups.items.[INDEX].ids.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroups.items.[INDEX].ids","typeLabel":"string[]"}},"required":["match","ids"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroups.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroups","typeLabel":"object[]"},"savedGroupTargeting":{"description":"Deprecated — use `savedGroups`. Accepted so a GET response can be posted back unchanged; `savedGroups` takes precedence if both are sent.","deprecated":true,"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.0.savedGroupTargeting","typeLabel":"object[]"},"pendingRamp":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.0.pendingRamp","typeLabel":"any"},"rampScheduleId":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.0.rampScheduleId","typeLabel":"any"},"scheduleType":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.0.scheduleType","typeLabel":"any"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID","type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.0.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.0.prerequisites","typeLabel":"object[]"},"scheduleRules":{"type":"array","items":{"type":"object","properties":{"timestamp":{"oneOf":[{"type":"string","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","format":"date-time","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"}},"required":["timestamp","enabled"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.0.scheduleRules","typeLabel":"object[]"},"id":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.0.id","typeLabel":"string"},"enabled":{"type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.0.enabled","typeLabel":"boolean"},"config":{"oneOf":[{"type":"string","description":"Key of a config to back this value. When set, `value` is a JSON override patch merged on top of the config; omit or null for a plain value.","uniqueKey":"rules.items.[INDEX].oneOf.0.config.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of a config to back this value. When set, `value` is a JSON override patch merged on top of the config; omit or null for a plain value.","uniqueKey":"rules.items.[INDEX].oneOf.0.config.oneOf.1","typeLabel":"null"}],"uniqueKey":"rules.items.[INDEX].oneOf.0.config","typeLabel":"string | null"},"sparse":{"description":"JSON features only. When true, the rule value is a partial object merged onto the feature's default value instead of replacing it.","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.0.sparse","typeLabel":"boolean"},"allEnvironments":{"description":"When true the rule applies to all environments (default).","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.0.allEnvironments","typeLabel":"boolean"},"environments":{"description":"Environment IDs the rule applies to. Ignored when allEnvironments is true; with allEnvironments false, an omitted or empty list scopes the rule to no environment.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.0.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.0.environments","typeLabel":"string[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. Set false and supply `projects` to scope the rule.","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.0.allProjects","typeLabel":"boolean"},"projects":{"description":"Specific project IDs this rule applies to. Used when allProjects is false. An empty array scopes the rule to no project. When the organization requires registered attributes with project scoping, the rule's attributes are validated against these projects rather than the whole feature's.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.0.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.0.projects","typeLabel":"string[]"}},"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["type","value","coverage","hashAttribute"],"properties":{"type":{"type":"string","const":"rollout","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.type","typeLabel":"string"},"value":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.value","typeLabel":"string"},"coverage":{"type":"number","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.coverage","typeLabel":"number"},"hashAttribute":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.hashAttribute","typeLabel":"string"},"description":{"description":"Short note on why the rule exists (e.g. `Beta testers only`).","type":"string","maxLength":10000,"uniqueKey":"rules.items.[INDEX].oneOf.1.description","typeLabel":"string"},"condition":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.condition","typeLabel":"string"},"savedGroups":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","enum":["all","none","any"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroups.items.[INDEX].match","typeLabel":"enum\u003cstring>"},"ids":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroups.items.[INDEX].ids.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroups.items.[INDEX].ids","typeLabel":"string[]"}},"required":["match","ids"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroups.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroups","typeLabel":"object[]"},"savedGroupTargeting":{"description":"Deprecated — use `savedGroups`. Accepted so a GET response can be posted back unchanged; `savedGroups` takes precedence if both are sent.","deprecated":true,"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.1.savedGroupTargeting","typeLabel":"object[]"},"pendingRamp":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.1.pendingRamp","typeLabel":"any"},"rampScheduleId":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.1.rampScheduleId","typeLabel":"any"},"scheduleType":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.1.scheduleType","typeLabel":"any"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID","type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.1.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.1.prerequisites","typeLabel":"object[]"},"scheduleRules":{"type":"array","items":{"type":"object","properties":{"timestamp":{"oneOf":[{"type":"string","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","format":"date-time","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"}},"required":["timestamp","enabled"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.1.scheduleRules","typeLabel":"object[]"},"id":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.id","typeLabel":"string"},"enabled":{"type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.1.enabled","typeLabel":"boolean"},"config":{"oneOf":[{"type":"string","description":"Key of a config to back this value. When set, `value` is a JSON override patch merged on top of the config; omit or null for a plain value.","uniqueKey":"rules.items.[INDEX].oneOf.1.config.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of a config to back this value. When set, `value` is a JSON override patch merged on top of the config; omit or null for a plain value.","uniqueKey":"rules.items.[INDEX].oneOf.1.config.oneOf.1","typeLabel":"null"}],"uniqueKey":"rules.items.[INDEX].oneOf.1.config","typeLabel":"string | null"},"sparse":{"description":"JSON features only. When true, the rule value is a partial object merged onto the feature's default value instead of replacing it.","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.1.sparse","typeLabel":"boolean"},"fallbackAttribute":{"description":"Used in place of `hashAttribute` when a user lacks it. Only SDKs with Sticky Bucketing enabled use it.","type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.fallbackAttribute","typeLabel":"string"},"seed":{"description":"Optional seed for the hash function; defaults to the rule id","type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.seed","typeLabel":"string"},"hashVersion":{"oneOf":[{"type":"number","const":1,"uniqueKey":"rules.items.[INDEX].oneOf.1.hashVersion.oneOf.0","typeLabel":"number"},{"type":"number","const":2,"uniqueKey":"rules.items.[INDEX].oneOf.1.hashVersion.oneOf.1","typeLabel":"number"}],"uniqueKey":"rules.items.[INDEX].oneOf.1.hashVersion","typeLabel":"number"},"allEnvironments":{"description":"When true the rule applies to all environments (default).","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.1.allEnvironments","typeLabel":"boolean"},"environments":{"description":"Environment IDs the rule applies to. Ignored when allEnvironments is true; with allEnvironments false, an omitted or empty list scopes the rule to no environment.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.1.environments","typeLabel":"string[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. Set false and supply `projects` to scope the rule.","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.1.allProjects","typeLabel":"boolean"},"projects":{"description":"Specific project IDs this rule applies to. Used when allProjects is false. An empty array scopes the rule to no project. When the organization requires registered attributes with project scoping, the rule's attributes are validated against these projects rather than the whole feature's.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.1.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.1.projects","typeLabel":"string[]"}},"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","required":["type","variations","experimentId"],"properties":{"type":{"type":"string","const":"experiment-ref","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.type","typeLabel":"string"},"variations":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.variations.items.[INDEX].value","typeLabel":"string"},"variationId":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.variations.items.[INDEX].variationId","typeLabel":"string"},"config":{"oneOf":[{"type":"string","description":"Key of a config to back this value. When set, `value` is a JSON override patch merged on top of the config; omit or null for a plain value.","uniqueKey":"rules.items.[INDEX].oneOf.2.variations.items.[INDEX].config.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of a config to back this value. When set, `value` is a JSON override patch merged on top of the config; omit or null for a plain value.","uniqueKey":"rules.items.[INDEX].oneOf.2.variations.items.[INDEX].config.oneOf.1","typeLabel":"null"}],"uniqueKey":"rules.items.[INDEX].oneOf.2.variations.items.[INDEX].config","typeLabel":"string | null"}},"required":["value","variationId"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.2.variations.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.variations","typeLabel":"object[]"},"experimentId":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.experimentId","typeLabel":"string"},"description":{"description":"Short note on why the rule exists (e.g. `Beta testers only`).","type":"string","maxLength":10000,"uniqueKey":"rules.items.[INDEX].oneOf.2.description","typeLabel":"string"},"id":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.2.id","typeLabel":"string"},"enabled":{"type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.2.enabled","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.2.condition","typeLabel":"string"},"savedGroups":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","enum":["all","none","any"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroups.items.[INDEX].match","typeLabel":"enum\u003cstring>"},"ids":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroups.items.[INDEX].ids.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroups.items.[INDEX].ids","typeLabel":"string[]"}},"required":["match","ids"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroups.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroups","typeLabel":"object[]"},"savedGroupTargeting":{"description":"Deprecated — use `savedGroups`. Accepted so a GET response can be posted back unchanged; `savedGroups` takes precedence if both are sent.","deprecated":true,"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.2.savedGroupTargeting","typeLabel":"object[]"},"pendingRamp":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.2.pendingRamp","typeLabel":"any"},"rampScheduleId":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.2.rampScheduleId","typeLabel":"any"},"scheduleType":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.2.scheduleType","typeLabel":"any"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID","type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.2.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.2.prerequisites","typeLabel":"object[]"},"scheduleRules":{"type":"array","items":{"type":"object","properties":{"timestamp":{"oneOf":[{"type":"string","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","format":"date-time","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"}},"required":["timestamp","enabled"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.2.scheduleRules","typeLabel":"object[]"},"sparse":{"description":"JSON features only. When true, the rule value is a partial object merged onto the feature's default value instead of replacing it.","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.2.sparse","typeLabel":"boolean"},"allEnvironments":{"description":"When true the rule applies to all environments (default).","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.2.allEnvironments","typeLabel":"boolean"},"environments":{"description":"Environment IDs the rule applies to. Ignored when allEnvironments is true; with allEnvironments false, an omitted or empty list scopes the rule to no environment.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.2.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.2.environments","typeLabel":"string[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. Set false and supply `projects` to scope the rule.","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.2.allProjects","typeLabel":"boolean"},"projects":{"description":"Specific project IDs this rule applies to. Used when allProjects is false. An empty array scopes the rule to no project. When the organization requires registered attributes with project scoping, the rule's attributes are validated against these projects rather than the whole feature's.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.2.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.2.projects","typeLabel":"string[]"}},"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","required":["type","controlValue","variationValue","hashAttribute","safeRolloutId"],"properties":{"type":{"type":"string","const":"safe-rollout","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.type","typeLabel":"string"},"controlValue":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.controlValue","typeLabel":"string"},"variationValue":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.variationValue","typeLabel":"string"},"hashAttribute":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.hashAttribute","typeLabel":"string"},"safeRolloutId":{"description":"ID of an existing SafeRollout on this feature. Bulk POST/PUT cannot create new safe-rollouts; use POST /v2/features/:id/revisions/:version/rules to create one.","type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.safeRolloutId","typeLabel":"string"},"description":{"description":"Short note on why the rule exists (e.g. `Beta testers only`).","type":"string","maxLength":10000,"uniqueKey":"rules.items.[INDEX].oneOf.3.description","typeLabel":"string"},"id":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.id","typeLabel":"string"},"enabled":{"type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.3.enabled","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.condition","typeLabel":"string"},"savedGroups":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","enum":["all","none","any"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroups.items.[INDEX].match","typeLabel":"enum\u003cstring>"},"ids":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroups.items.[INDEX].ids.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroups.items.[INDEX].ids","typeLabel":"string[]"}},"required":["match","ids"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroups.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroups","typeLabel":"object[]"},"savedGroupTargeting":{"description":"Deprecated — use `savedGroups`. Accepted so a GET response can be posted back unchanged; `savedGroups` takes precedence if both are sent.","deprecated":true,"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.3.savedGroupTargeting","typeLabel":"object[]"},"pendingRamp":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.3.pendingRamp","typeLabel":"any"},"rampScheduleId":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.3.rampScheduleId","typeLabel":"any"},"scheduleType":{"description":"Read-only; ignored on write. Accepted so a GET response can be posted back unchanged.","uniqueKey":"rules.items.[INDEX].oneOf.3.scheduleType","typeLabel":"any"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID","type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.3.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.3.prerequisites","typeLabel":"object[]"},"scheduleRules":{"type":"array","items":{"type":"object","properties":{"timestamp":{"oneOf":[{"type":"string","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","format":"date-time","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO 8601 date-time, e.g. \"2025-06-01T00:00:00Z\".","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"}},"required":["timestamp","enabled"],"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules.items.[INDEX].oneOf.3.scheduleRules","typeLabel":"object[]"},"trackingKey":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.trackingKey","typeLabel":"string"},"seed":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.seed","typeLabel":"string"},"status":{"type":"string","enum":["running","released","rolled-back","stopped"],"uniqueKey":"rules.items.[INDEX].oneOf.3.status","typeLabel":"enum\u003cstring>"},"allEnvironments":{"description":"When true the rule applies to all environments (default).","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.3.allEnvironments","typeLabel":"boolean"},"environments":{"description":"Environment IDs the rule applies to. Ignored when allEnvironments is true; with allEnvironments false, an omitted or empty list scopes the rule to no environment.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.3.environments","typeLabel":"string[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. Set false and supply `projects` to scope the rule.","type":"boolean","uniqueKey":"rules.items.[INDEX].oneOf.3.allProjects","typeLabel":"boolean"},"projects":{"description":"Specific project IDs this rule applies to. Used when allProjects is false. An empty array scopes the rule to no project. When the organization requires registered attributes with project scoping, the rule's attributes are validated against these projects rather than the whole feature's.","type":"array","items":{"type":"string","uniqueKey":"rules.items.[INDEX].oneOf.3.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"rules.items.[INDEX].oneOf.3.projects","typeLabel":"string[]"}},"additionalProperties":false,"uniqueKey":"rules.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"rules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rules","typeLabel":"object[]"},"environments":{"description":"Per-environment enabled state, keyed by environment ID. An environment you leave out uses its \"Default state for new features\" setting, which may be enabled. To create the Feature Flag disabled, list every environment with `enabled: false`. Rules go on the top-level `rules` field.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"description":"Whether the Feature Flag is enabled in this environment.","type":"boolean","uniqueKey":"environments.additionalProperties.enabled","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"environments.additionalProperties","typeLabel":"object"},"uniqueKey":"environments","typeLabel":"object"},"prerequisites":{"description":"Feature IDs. Each feature must evaluate to `true`","type":"array","items":{"type":"string","uniqueKey":"prerequisites.items.[INDEX]","typeLabel":"string"},"uniqueKey":"prerequisites","typeLabel":"string[]"},"jsonSchema":{"description":"Use JSON schema to validate the payload of a JSON-type feature value (enterprise only).","type":"string","uniqueKey":"jsonSchema","typeLabel":"string"},"customFields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"customFields.additionalProperties","typeLabel":"string"},"uniqueKey":"customFields","typeLabel":"object"},"comment":{"description":"Comment to record on the feature's initial revision. Defaults to an empty comment.","type":"string","uniqueKey":"comment","typeLabel":"string"},"ignoreWarnings":{"description":"Set to true to acknowledge the warnings listed in a blocked response and continue. This covers experiment guards, locked dependents, and references affected by an archive. When the organization treats schema failures as warnings, it also covers schema and invariant warnings. It never bypasses a rejected Custom Hook. On revision publish endpoints, it can also force-publish an out-of-date draft when the caller has Bypass draft approvals access. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.","type":"boolean","uniqueKey":"ignoreWarnings","typeLabel":"boolean"},"skipSchemaValidation":{"description":"Set to true to publish despite schema validation errors, failed invariants, or schema changes that invalidate dependent resources. This does not bypass a rejected Custom Hook; use `skipHooks` for that. The caller must have Bypass draft approvals access for Feature Flags, Configs, and Constants in every Project. Otherwise, this field is ignored. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.","type":"boolean","uniqueKey":"skipSchemaValidation","typeLabel":"boolean"},"skipHooks":{"description":"Set to true to publish despite a Custom Hook rejection. This does not bypass schema validation; use `skipSchemaValidation` for that. The caller must have Bypass draft approvals access for Feature Flags, Configs, and Constants in every Project. Otherwise, this field is ignored. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.","type":"boolean","uniqueKey":"skipHooks","typeLabel":"boolean"},"allowUnscopedRules":{"description":"When the organization requires rules to target specific environments or Projects, set to true to save a rule that applies to All Environments and All Projects. Only set this when a person has explicitly asked you to. If a check blocks you, stop and ask a person instead of working around it.","type":"boolean","uniqueKey":"allowUnscopedRules","typeLabel":"boolean"}},"required":["id","valueType","defaultValue"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","defaultValue":"\u003cstring>","archived":true,"description":"\u003cstring>","owner":"\u003cstring>","project":"\u003cstring>","targetingAllProjects":true,"targetingProjects":["\u003cstring>"],"baseConfig":"\u003cstring>","defaultValueConfig":"\u003cstring>","tags":["\u003cstring>"],"rules":[{"type":"force","value":"\u003cstring>","description":"\u003cstring>","condition":"\u003cstring>","savedGroups":[{"ids":["\u003cstring>"]}],"savedGroupTargeting":[{"savedGroups":["\u003cstring>"]}],"pendingRamp":"\u003cunknown>","rampScheduleId":"\u003cunknown>","scheduleType":"\u003cunknown>","prerequisites":[{"id":"\u003cstring>","condition":"\u003cstring>"}],"scheduleRules":[{"timestamp":"2023-11-07T05:31:56Z","enabled":true}],"id":"\u003cstring>","enabled":true,"config":"\u003cstring>","sparse":true,"allEnvironments":true,"environments":["\u003cstring>"],"allProjects":true,"projects":["\u003cstring>"]}],"environments":{},"prerequisites":["\u003cstring>"],"jsonSchema":"\u003cstring>","customFields":{},"comment":"\u003cstring>","ignoreWarnings":true,"skipSchemaValidation":true,"skipHooks":true,"allowUnscopedRules":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"e3205c11-939e-4882-b768-b699e5728cd3":{"description":"Resource created","content":{"application/json":{"schema":{"type":"object","properties":{"feature":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"feature.id","typeLabel":"string"},"dateCreated":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"feature.dateCreated","typeLabel":"string\u003cdate-time>"},"dateUpdated":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"feature.dateUpdated","typeLabel":"string\u003cdate-time>"},"archived":{"type":"boolean","isRequired":true,"uniqueKey":"feature.archived","typeLabel":"boolean"},"description":{"type":"string","maxLength":10000,"isRequired":true,"uniqueKey":"feature.description","typeLabel":"string"},"owner":{"description":"The userId or email address of the owner. If an email address is provided, it will be used to look up the userId of the matching organization member. If an ID is provided, it will be validated as existing in the organization.","type":"string","isRequired":true,"uniqueKey":"feature.owner","typeLabel":"string"},"project":{"type":"string","isRequired":true,"uniqueKey":"feature.project","typeLabel":"string"},"valueType":{"type":"string","enum":["boolean","string","number","json"],"isRequired":true,"uniqueKey":"feature.valueType","typeLabel":"enum\u003cstring>"},"defaultValue":{"type":"string","isRequired":true,"uniqueKey":"feature.defaultValue","typeLabel":"string"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"feature.tags.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"feature.tags","typeLabel":"string[]"},"rules":{"description":"Unified rules array. Each rule carries its own environment scope via `allEnvironments` / `environments`.","type":"array","items":{"oneOf":[{"type":"object","description":"Common fields shared by all feature rule types. Specific rule types extend\nthis base with their own required properties (value, coverage, etc.).\n","required":["allEnvironments","type","value","description","id","enabled"],"properties":{"description":{"type":"string","maxLength":10000,"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.description","typeLabel":"string"},"id":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.id","typeLabel":"string"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.enabled","typeLabel":"boolean"},"type":{"type":"string","const":"force","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.type","typeLabel":"string"},"value":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.value","typeLabel":"string"},"allEnvironments":{"description":"When true the rule applies to all environments. When false only the environments listed in `environments` receive the rule.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.allEnvironments","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.condition","typeLabel":"string"},"scheduleRules":{"description":"Simple time-based on/off schedule for this rule","type":"array","items":{"type":"object","properties":{"enabled":{"description":"Whether the rule should be enabled or disabled at the specified timestamp.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"},"timestamp":{"oneOf":[{"type":"string","description":"ISO timestamp when the rule should activate.","format":"date-time","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO timestamp when the rule should activate.","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"}},"required":["enabled","timestamp"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.scheduleRules","typeLabel":"object[]"},"scheduleType":{"description":"UI hint for which scheduling mode is active:\n- `none` – no schedule\n- `schedule` – simple time-based enable/disable via `scheduleRules`\n- `ramp` – multi-step ramp-up controlled by an associated RampSchedule document\n","type":"string","enum":["none","schedule","ramp"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.scheduleType","typeLabel":"enum\u003cstring>"},"rampScheduleId":{"description":"ID of the active RampSchedule document controlling this rule. Present when `scheduleType` is `ramp` and a live schedule exists.","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.rampScheduleId","typeLabel":"string"},"savedGroupTargeting":{"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.savedGroupTargeting","typeLabel":"object[]"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID of the prerequisite","type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.prerequisites","typeLabel":"object[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. When false the rule is limited to `projects`.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.allProjects","typeLabel":"boolean"},"projects":{"description":"Project IDs this rule is scoped to when `allProjects` is false. An empty array scopes the rule to no project.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.projects","typeLabel":"string[]"},"sparse":{"description":"JSON features only. When true, `value` is a partial object merged onto the feature's default value instead of replacing it.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.sparse","typeLabel":"boolean"},"config":{"oneOf":[{"type":"string","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.config.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.config.oneOf.1","typeLabel":"null"}],"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.config","typeLabel":"string | null"},"environments":{"description":"The environment IDs this rule is active in. Populated when `allEnvironments` is false.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.0.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.environments","typeLabel":"string[]"},"pendingRamp":{"description":"Present on draft revisions only. \"create\" means a ramp schedule will be created for this rule on publish. \"detach\" means an existing live ramp schedule will be removed on publish. Use PUT/DELETE .../rules/{ruleId}/ramp-schedule to modify.","type":"string","enum":["create","detach"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.0.pendingRamp","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"Common fields shared by all feature rule types. Specific rule types extend\nthis base with their own required properties (value, coverage, etc.).\n","required":["allEnvironments","type","value","coverage","hashAttribute","description","id","enabled"],"properties":{"description":{"type":"string","maxLength":10000,"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.description","typeLabel":"string"},"id":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.id","typeLabel":"string"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.enabled","typeLabel":"boolean"},"type":{"type":"string","const":"rollout","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.type","typeLabel":"string"},"value":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.value","typeLabel":"string"},"coverage":{"type":"number","minimum":0,"maximum":1,"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.coverage","typeLabel":"number"},"hashAttribute":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.hashAttribute","typeLabel":"string"},"allEnvironments":{"description":"When true the rule applies to all environments. When false only the environments listed in `environments` receive the rule.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.allEnvironments","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.condition","typeLabel":"string"},"scheduleRules":{"description":"Simple time-based on/off schedule for this rule","type":"array","items":{"type":"object","properties":{"enabled":{"description":"Whether the rule should be enabled or disabled at the specified timestamp.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"},"timestamp":{"oneOf":[{"type":"string","description":"ISO timestamp when the rule should activate.","format":"date-time","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO timestamp when the rule should activate.","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"}},"required":["enabled","timestamp"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.scheduleRules","typeLabel":"object[]"},"scheduleType":{"description":"UI hint for which scheduling mode is active:\n- `none` – no schedule\n- `schedule` – simple time-based enable/disable via `scheduleRules`\n- `ramp` – multi-step ramp-up controlled by an associated RampSchedule document\n","type":"string","enum":["none","schedule","ramp"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.scheduleType","typeLabel":"enum\u003cstring>"},"rampScheduleId":{"description":"ID of the active RampSchedule document controlling this rule. Present when `scheduleType` is `ramp` and a live schedule exists.","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.rampScheduleId","typeLabel":"string"},"savedGroupTargeting":{"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.savedGroupTargeting","typeLabel":"object[]"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID of the prerequisite","type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.prerequisites","typeLabel":"object[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. When false the rule is limited to `projects`.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.allProjects","typeLabel":"boolean"},"projects":{"description":"Project IDs this rule is scoped to when `allProjects` is false. An empty array scopes the rule to no project.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.projects","typeLabel":"string[]"},"sparse":{"description":"JSON features only. When true, `value` is a partial object merged onto the feature's default value instead of replacing it.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.sparse","typeLabel":"boolean"},"fallbackAttribute":{"description":"Used in place of `hashAttribute` when a user lacks it. Only SDKs with Sticky Bucketing enabled use it.","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.fallbackAttribute","typeLabel":"string"},"seed":{"description":"Optional seed for the hash function; defaults to the rule id","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.seed","typeLabel":"string"},"hashVersion":{"oneOf":[{"type":"number","description":"Hash algorithm version for bucketing. Defaults to 2 (preferred) when not specified.","const":1,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.hashVersion.oneOf.0","typeLabel":"number"},{"type":"number","description":"Hash algorithm version for bucketing. Defaults to 2 (preferred) when not specified.","const":2,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.hashVersion.oneOf.1","typeLabel":"number"}],"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.hashVersion","typeLabel":"number"},"config":{"oneOf":[{"type":"string","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.config.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.config.oneOf.1","typeLabel":"null"}],"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.config","typeLabel":"string | null"},"environments":{"description":"The environment IDs this rule is active in. Populated when `allEnvironments` is false.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.1.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.environments","typeLabel":"string[]"},"pendingRamp":{"description":"Present on draft revisions only. \"create\" means a ramp schedule will be created for this rule on publish. \"detach\" means an existing live ramp schedule will be removed on publish. Use PUT/DELETE .../rules/{ruleId}/ramp-schedule to modify.","type":"string","enum":["create","detach"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.1.pendingRamp","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","title":"Feature Experiment Rule","description":"Common fields shared by all feature rule types. Specific rule types extend\nthis base with their own required properties (value, coverage, etc.).\n","required":["allEnvironments","type","description","id","enabled"],"properties":{"description":{"type":"string","maxLength":10000,"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.description","typeLabel":"string"},"id":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.id","typeLabel":"string"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.enabled","typeLabel":"boolean"},"type":{"type":"string","const":"experiment","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.type","typeLabel":"string"},"allEnvironments":{"description":"When true the rule applies to all environments. When false only the environments listed in `environments` receive the rule.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.allEnvironments","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.condition","typeLabel":"string"},"scheduleRules":{"description":"Simple time-based on/off schedule for this rule","type":"array","items":{"type":"object","properties":{"enabled":{"description":"Whether the rule should be enabled or disabled at the specified timestamp.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"},"timestamp":{"oneOf":[{"type":"string","description":"ISO timestamp when the rule should activate.","format":"date-time","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO timestamp when the rule should activate.","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"}},"required":["enabled","timestamp"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.scheduleRules","typeLabel":"object[]"},"scheduleType":{"description":"UI hint for which scheduling mode is active:\n- `none` – no schedule\n- `schedule` – simple time-based enable/disable via `scheduleRules`\n- `ramp` – multi-step ramp-up controlled by an associated RampSchedule document\n","type":"string","enum":["none","schedule","ramp"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.scheduleType","typeLabel":"enum\u003cstring>"},"rampScheduleId":{"description":"ID of the active RampSchedule document controlling this rule. Present when `scheduleType` is `ramp` and a live schedule exists.","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.rampScheduleId","typeLabel":"string"},"savedGroupTargeting":{"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.savedGroupTargeting","typeLabel":"object[]"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID of the prerequisite","type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.prerequisites","typeLabel":"object[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. When false the rule is limited to `projects`.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.allProjects","typeLabel":"boolean"},"projects":{"description":"Project IDs this rule is scoped to when `allProjects` is false. An empty array scopes the rule to no project.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.projects","typeLabel":"string[]"},"trackingKey":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.trackingKey","typeLabel":"string"},"hashAttribute":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.hashAttribute","typeLabel":"string"},"fallbackAttribute":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.fallbackAttribute","typeLabel":"string"},"disableStickyBucketing":{"type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.disableStickyBucketing","typeLabel":"boolean"},"bucketVersion":{"type":"number","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.bucketVersion","typeLabel":"number"},"minBucketVersion":{"type":"number","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.minBucketVersion","typeLabel":"number"},"namespace":{"type":"object","properties":{"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.namespace.enabled","typeLabel":"boolean"},"name":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.namespace.name","typeLabel":"string"},"range":{"minItems":2,"maxItems":2,"type":"array","items":{"type":"number","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.namespace.range.items.[INDEX]","typeLabel":"number"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.namespace.range","typeLabel":"number[]"}},"required":["enabled","name","range"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.namespace","typeLabel":"object"},"coverage":{"type":"number","minimum":0,"maximum":1,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.coverage","typeLabel":"number"},"value":{"description":"Variation values with weights","type":"array","items":{"type":"object","properties":{"value":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.value.items.[INDEX].value","typeLabel":"string"},"weight":{"type":"number","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.value.items.[INDEX].weight","typeLabel":"number"},"name":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.value.items.[INDEX].name","typeLabel":"string"}},"required":["value","weight"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.value.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.value","typeLabel":"object[]"},"environments":{"description":"The environment IDs this rule is active in. Populated when `allEnvironments` is false.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.2.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.environments","typeLabel":"string[]"},"pendingRamp":{"description":"Present on draft revisions only. \"create\" means a ramp schedule will be created for this rule on publish. \"detach\" means an existing live ramp schedule will be removed on publish. Use PUT/DELETE .../rules/{ruleId}/ramp-schedule to modify.","type":"string","enum":["create","detach"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.2.pendingRamp","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.2","typeLabel":"Feature Experiment Rule · object"},{"type":"object","required":["allEnvironments","type","variations","experimentId","description","id","enabled"],"properties":{"description":{"type":"string","maxLength":10000,"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.description","typeLabel":"string"},"id":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.id","typeLabel":"string"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.enabled","typeLabel":"boolean"},"type":{"type":"string","const":"experiment-ref","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.type","typeLabel":"string"},"variations":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.variations.items.[INDEX].value","typeLabel":"string"},"variationId":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.variations.items.[INDEX].variationId","typeLabel":"string"},"config":{"oneOf":[{"type":"string","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.variations.items.[INDEX].config.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.variations.items.[INDEX].config.oneOf.1","typeLabel":"null"}],"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.variations.items.[INDEX].config","typeLabel":"string | null"}},"required":["value","variationId"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.variations.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.variations","typeLabel":"object[]"},"experimentId":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.experimentId","typeLabel":"string"},"allEnvironments":{"description":"When true the rule applies to all environments. When false only the environments listed in `environments` receive the rule.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.allEnvironments","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.condition","typeLabel":"string"},"scheduleRules":{"description":"Simple time-based on/off schedule for this rule","type":"array","items":{"type":"object","properties":{"enabled":{"description":"Whether the rule should be enabled or disabled at the specified timestamp.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"},"timestamp":{"oneOf":[{"type":"string","description":"ISO timestamp when the rule should activate.","format":"date-time","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO timestamp when the rule should activate.","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"}},"required":["enabled","timestamp"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.scheduleRules","typeLabel":"object[]"},"scheduleType":{"description":"UI hint for which scheduling mode is active:\n- `none` – no schedule\n- `schedule` – simple time-based enable/disable via `scheduleRules`\n- `ramp` – multi-step ramp-up controlled by an associated RampSchedule document\n","type":"string","enum":["none","schedule","ramp"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.scheduleType","typeLabel":"enum\u003cstring>"},"rampScheduleId":{"description":"ID of the active RampSchedule document controlling this rule. Present when `scheduleType` is `ramp` and a live schedule exists.","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.rampScheduleId","typeLabel":"string"},"savedGroupTargeting":{"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.savedGroupTargeting","typeLabel":"object[]"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID of the prerequisite","type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.prerequisites","typeLabel":"object[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. When false the rule is limited to `projects`.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.allProjects","typeLabel":"boolean"},"projects":{"description":"Project IDs this rule is scoped to when `allProjects` is false. An empty array scopes the rule to no project.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.projects","typeLabel":"string[]"},"sparse":{"description":"JSON features only. When true, each variation `value` is a partial object merged onto the feature's default value instead of replacing it.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.sparse","typeLabel":"boolean"},"environments":{"description":"The environment IDs this rule is active in. Populated when `allEnvironments` is false.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.3.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.environments","typeLabel":"string[]"},"pendingRamp":{"description":"Present on draft revisions only. \"create\" means a ramp schedule will be created for this rule on publish. \"detach\" means an existing live ramp schedule will be removed on publish. Use PUT/DELETE .../rules/{ruleId}/ramp-schedule to modify.","type":"string","enum":["create","detach"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.3.pendingRamp","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","required":["allEnvironments","type","variations","contextualBanditId","description","id","enabled"],"properties":{"description":{"type":"string","maxLength":10000,"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.description","typeLabel":"string"},"id":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.id","typeLabel":"string"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.enabled","typeLabel":"boolean"},"type":{"type":"string","const":"contextual-bandit-ref","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.type","typeLabel":"string"},"variations":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.variations.items.[INDEX].value","typeLabel":"string"},"variationId":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.variations.items.[INDEX].variationId","typeLabel":"string"},"config":{"oneOf":[{"type":"string","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.variations.items.[INDEX].config.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of the config backing this value, or null when the value is not config-backed. The config supplies the base JSON (and its schema); the value is an override patch merged on top.","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.variations.items.[INDEX].config.oneOf.1","typeLabel":"null"}],"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.variations.items.[INDEX].config","typeLabel":"string | null"}},"required":["value","variationId"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.variations.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.variations","typeLabel":"object[]"},"contextualBanditId":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.contextualBanditId","typeLabel":"string"},"allEnvironments":{"description":"When true the rule applies to all environments. When false only the environments listed in `environments` receive the rule.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.allEnvironments","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.condition","typeLabel":"string"},"scheduleRules":{"description":"Simple time-based on/off schedule for this rule","type":"array","items":{"type":"object","properties":{"enabled":{"description":"Whether the rule should be enabled or disabled at the specified timestamp.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"},"timestamp":{"oneOf":[{"type":"string","description":"ISO timestamp when the rule should activate.","format":"date-time","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO timestamp when the rule should activate.","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"}},"required":["enabled","timestamp"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.scheduleRules","typeLabel":"object[]"},"scheduleType":{"description":"UI hint for which scheduling mode is active:\n- `none` – no schedule\n- `schedule` – simple time-based enable/disable via `scheduleRules`\n- `ramp` – multi-step ramp-up controlled by an associated RampSchedule document\n","type":"string","enum":["none","schedule","ramp"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.scheduleType","typeLabel":"enum\u003cstring>"},"rampScheduleId":{"description":"ID of the active RampSchedule document controlling this rule. Present when `scheduleType` is `ramp` and a live schedule exists.","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.rampScheduleId","typeLabel":"string"},"savedGroupTargeting":{"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.savedGroupTargeting","typeLabel":"object[]"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID of the prerequisite","type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.prerequisites","typeLabel":"object[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. When false the rule is limited to `projects`.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.allProjects","typeLabel":"boolean"},"projects":{"description":"Project IDs this rule is scoped to when `allProjects` is false. An empty array scopes the rule to no project.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.projects","typeLabel":"string[]"},"environments":{"description":"The environment IDs this rule is active in. Populated when `allEnvironments` is false.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.4.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.environments","typeLabel":"string[]"},"pendingRamp":{"description":"Present on draft revisions only. \"create\" means a ramp schedule will be created for this rule on publish. \"detach\" means an existing live ramp schedule will be removed on publish. Use PUT/DELETE .../rules/{ruleId}/ramp-schedule to modify.","type":"string","enum":["create","detach"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.4.pendingRamp","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","title":"Feature Safe Rollout Rule","description":"Common fields shared by all feature rule types. Specific rule types extend\nthis base with their own required properties (value, coverage, etc.).\n","required":["allEnvironments","type","controlValue","variationValue","description","id","enabled"],"properties":{"description":{"type":"string","maxLength":10000,"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.description","typeLabel":"string"},"id":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.id","typeLabel":"string"},"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.enabled","typeLabel":"boolean"},"type":{"type":"string","const":"safe-rollout","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.type","typeLabel":"string"},"controlValue":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.controlValue","typeLabel":"string"},"variationValue":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.variationValue","typeLabel":"string"},"allEnvironments":{"description":"When true the rule applies to all environments. When false only the environments listed in `environments` receive the rule.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.allEnvironments","typeLabel":"boolean"},"condition":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.condition","typeLabel":"string"},"scheduleRules":{"description":"Simple time-based on/off schedule for this rule","type":"array","items":{"type":"object","properties":{"enabled":{"description":"Whether the rule should be enabled or disabled at the specified timestamp.","type":"boolean","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.scheduleRules.items.[INDEX].enabled","typeLabel":"boolean"},"timestamp":{"oneOf":[{"type":"string","description":"ISO timestamp when the rule should activate.","format":"date-time","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.scheduleRules.items.[INDEX].timestamp.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"ISO timestamp when the rule should activate.","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.scheduleRules.items.[INDEX].timestamp.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.scheduleRules.items.[INDEX].timestamp","typeLabel":"string\u003cdate-time> | null"}},"required":["enabled","timestamp"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.scheduleRules.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.scheduleRules","typeLabel":"object[]"},"scheduleType":{"description":"UI hint for which scheduling mode is active:\n- `none` – no schedule\n- `schedule` – simple time-based enable/disable via `scheduleRules`\n- `ramp` – multi-step ramp-up controlled by an associated RampSchedule document\n","type":"string","enum":["none","schedule","ramp"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.scheduleType","typeLabel":"enum\u003cstring>"},"rampScheduleId":{"description":"ID of the active RampSchedule document controlling this rule. Present when `scheduleType` is `ramp` and a live schedule exists.","type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.rampScheduleId","typeLabel":"string"},"savedGroupTargeting":{"type":"array","items":{"type":"object","properties":{"matchType":{"type":"string","enum":["all","any","none"],"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.savedGroupTargeting.items.[INDEX].matchType","typeLabel":"enum\u003cstring>"},"savedGroups":{"type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.savedGroupTargeting.items.[INDEX].savedGroups.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.savedGroupTargeting.items.[INDEX].savedGroups","typeLabel":"string[]"}},"required":["matchType","savedGroups"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.savedGroupTargeting.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.savedGroupTargeting","typeLabel":"object[]"},"prerequisites":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Feature ID of the prerequisite","type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.prerequisites.items.[INDEX].id","typeLabel":"string"},"condition":{"type":"string","isRequired":true,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.prerequisites.items.[INDEX].condition","typeLabel":"string"}},"required":["id","condition"],"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.prerequisites.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.prerequisites","typeLabel":"object[]"},"allProjects":{"description":"When true (the default) the rule applies to every project the feature is delivered to. When false the rule is limited to `projects`.","type":"boolean","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.allProjects","typeLabel":"boolean"},"projects":{"description":"Project IDs this rule is scoped to when `allProjects` is false. An empty array scopes the rule to no project.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.projects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.projects","typeLabel":"string[]"},"seed":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.seed","typeLabel":"string"},"hashAttribute":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.hashAttribute","typeLabel":"string"},"trackingKey":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.trackingKey","typeLabel":"string"},"safeRolloutId":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.safeRolloutId","typeLabel":"string"},"status":{"type":"string","enum":["running","released","rolled-back","stopped"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.status","typeLabel":"enum\u003cstring>"},"environments":{"description":"The environment IDs this rule is active in. Populated when `allEnvironments` is false.","type":"array","items":{"type":"string","uniqueKey":"feature.rules.items.[INDEX].oneOf.5.environments.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.environments","typeLabel":"string[]"},"pendingRamp":{"description":"Present on draft revisions only. \"create\" means a ramp schedule will be created for this rule on publish. \"detach\" means an existing live ramp schedule will be removed on publish. Use PUT/DELETE .../rules/{ruleId}/ramp-schedule to modify.","type":"string","enum":["create","detach"],"uniqueKey":"feature.rules.items.[INDEX].oneOf.5.pendingRamp","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"feature.rules.items.[INDEX].oneOf.5","typeLabel":"Feature Safe Rollout Rule · object"}],"uniqueKey":"feature.rules.items.[INDEX]","typeLabel":"object · object · Feature Experiment Rule · object · object · object · Feature Safe Rollout Rule · object"},"isRequired":true,"uniqueKey":"feature.rules","typeLabel":"object · object · Feature Experiment Rule · object · object · object · Feature Safe Rollout Rule · object[]"},"environments":{"description":"Per-environment enabled state and SDK payload. Rules are on the top-level `rules` field.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean","isRequired":true,"uniqueKey":"feature.environments.additionalProperties.enabled","typeLabel":"boolean"},"defaultValue":{"type":"string","isRequired":true,"uniqueKey":"feature.environments.additionalProperties.defaultValue","typeLabel":"string"},"definition":{"description":"A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model)","type":"string","uniqueKey":"feature.environments.additionalProperties.definition","typeLabel":"string"}},"required":["enabled","defaultValue"],"additionalProperties":false,"uniqueKey":"feature.environments.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"feature.environments","typeLabel":"object"},"revision":{"type":"object","properties":{"version":{"type":"integer","isRequired":true,"uniqueKey":"feature.revision.version","typeLabel":"integer"},"comment":{"type":"string","isRequired":true,"uniqueKey":"feature.revision.comment","typeLabel":"string"},"date":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"feature.revision.date","typeLabel":"string\u003cdate-time>"},"id":{"description":"Stable id of the feature's live revision.","type":"string","uniqueKey":"feature.revision.id","typeLabel":"string"},"createdBy":{"description":"Who performed an action","type":"object","properties":{"type":{"description":"`dashboard` (signed-in member), `api_key` (API key or personal access token) or `system`","type":"string","enum":["dashboard","api_key","system"],"isRequired":true,"uniqueKey":"feature.revision.createdBy.type","typeLabel":"enum\u003cstring>"},"id":{"description":"The member's user ID. Absent for an organization API key","type":"string","uniqueKey":"feature.revision.createdBy.id","typeLabel":"string"},"apiKey":{"description":"The API key's ID, when the action came through one","type":"string","uniqueKey":"feature.revision.createdBy.apiKey","typeLabel":"string"},"name":{"description":"The member's name, or the organization API key's name","type":"string","uniqueKey":"feature.revision.createdBy.name","typeLabel":"string"},"email":{"description":"The member's email. Absent for an organization API key","type":"string","uniqueKey":"feature.revision.createdBy.email","typeLabel":"string"},"requestedBy":{"description":"The member named with `X-GrowthBook-Requested-By`","type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"feature.revision.createdBy.requestedBy.id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"feature.revision.createdBy.requestedBy.name","typeLabel":"string"},"email":{"type":"string","isRequired":true,"uniqueKey":"feature.revision.createdBy.requestedBy.email","typeLabel":"string"}},"required":["id","name","email"],"additionalProperties":false,"uniqueKey":"feature.revision.createdBy.requestedBy","typeLabel":"object"},"assumedRole":{"description":"Whether the key assumed the named member's role","type":"boolean","uniqueKey":"feature.revision.createdBy.assumedRole","typeLabel":"boolean"}},"required":["type"],"additionalProperties":false,"uniqueKey":"feature.revision.createdBy","typeLabel":"object"},"publishedBy":{"description":"Who performed an action","type":"object","properties":{"type":{"description":"`dashboard` (signed-in member), `api_key` (API key or personal access token) or `system`","type":"string","enum":["dashboard","api_key","system"],"isRequired":true,"uniqueKey":"feature.revision.publishedBy.type","typeLabel":"enum\u003cstring>"},"id":{"description":"The member's user ID. Absent for an organization API key","type":"string","uniqueKey":"feature.revision.publishedBy.id","typeLabel":"string"},"apiKey":{"description":"The API key's ID, when the action came through one","type":"string","uniqueKey":"feature.revision.publishedBy.apiKey","typeLabel":"string"},"name":{"description":"The member's name, or the organization API key's name","type":"string","uniqueKey":"feature.revision.publishedBy.name","typeLabel":"string"},"email":{"description":"The member's email. Absent for an organization API key","type":"string","uniqueKey":"feature.revision.publishedBy.email","typeLabel":"string"},"requestedBy":{"description":"The member named with `X-GrowthBook-Requested-By`","type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"feature.revision.publishedBy.requestedBy.id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"feature.revision.publishedBy.requestedBy.name","typeLabel":"string"},"email":{"type":"string","isRequired":true,"uniqueKey":"feature.revision.publishedBy.requestedBy.email","typeLabel":"string"}},"required":["id","name","email"],"additionalProperties":false,"uniqueKey":"feature.revision.publishedBy.requestedBy","typeLabel":"object"},"assumedRole":{"description":"Whether the key assumed the named member's role","type":"boolean","uniqueKey":"feature.revision.publishedBy.assumedRole","typeLabel":"boolean"}},"required":["type"],"additionalProperties":false,"uniqueKey":"feature.revision.publishedBy","typeLabel":"object"}},"required":["version","comment","date"],"additionalProperties":false,"isRequired":true,"uniqueKey":"feature.revision","typeLabel":"object"},"targetingAllProjects":{"type":"boolean","uniqueKey":"feature.targetingAllProjects","typeLabel":"boolean"},"targetingProjects":{"type":"array","items":{"type":"string","uniqueKey":"feature.targetingProjects.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.targetingProjects","typeLabel":"string[]"},"baseConfig":{"oneOf":[{"type":"string","description":"Key of the config backing this flag (\"Config mode\"). Requires `valueType: \"json\"` and a live config. The config supplies the base JSON and schema; `defaultValue` and rule values are override patches on top. null or omitted for a plain flag.","uniqueKey":"feature.baseConfig.oneOf.0","typeLabel":"string"},{"type":"null","description":"Key of the config backing this flag (\"Config mode\"). Requires `valueType: \"json\"` and a live config. The config supplies the base JSON and schema; `defaultValue` and rule values are override patches on top. null or omitted for a plain flag.","uniqueKey":"feature.baseConfig.oneOf.1","typeLabel":"null"}],"uniqueKey":"feature.baseConfig","typeLabel":"string | null"},"defaultValueConfig":{"oneOf":[{"type":"string","description":"Optional. A config within `baseConfig`'s family that the default value resolves to instead of `baseConfig` itself. null or omitted means the default is `baseConfig`. The default is exactly this config and carries no overrides of its own.","uniqueKey":"feature.defaultValueConfig.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional. A config within `baseConfig`'s family that the default value resolves to instead of `baseConfig` itself. null or omitted means the default is `baseConfig`. The default is exactly this config and carries no overrides of its own.","uniqueKey":"feature.defaultValueConfig.oneOf.1","typeLabel":"null"}],"uniqueKey":"feature.defaultValueConfig","typeLabel":"string | null"},"prerequisites":{"description":"Feature IDs. Each feature must evaluate to `true`","type":"array","items":{"type":"string","uniqueKey":"feature.prerequisites.items.[INDEX]","typeLabel":"string"},"uniqueKey":"feature.prerequisites","typeLabel":"string[]"},"customFields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"oneOf":[{}],"uniqueKey":"feature.customFields.additionalProperties","typeLabel":"any"},"uniqueKey":"feature.customFields","typeLabel":"object"},"holdout":{"oneOf":[{"type":"object","required":["id","value"],"properties":{"id":{"description":"Holdout ID","type":"string","isRequired":true,"uniqueKey":"feature.holdout.oneOf.0.id","typeLabel":"string"},"value":{"description":"The feature value assigned to users in the holdout treatment group","type":"string","isRequired":true,"uniqueKey":"feature.holdout.oneOf.0.value","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"feature.holdout.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"feature.holdout.oneOf.1","typeLabel":"null"}],"uniqueKey":"feature.holdout","typeLabel":"object | null"}},"required":["id","dateCreated","dateUpdated","archived","description","owner","project","valueType","defaultValue","tags","rules","environments","revision"],"additionalProperties":false,"isRequired":true,"uniqueKey":"feature","typeLabel":"object"}},"required":["feature"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"feature":{"id":"\u003cstring>","dateCreated":"2023-11-07T05:31:56Z","dateUpdated":"2023-11-07T05:31:56Z","archived":true,"description":"\u003cstring>","owner":"\u003cstring>","project":"\u003cstring>","valueType":"boolean","defaultValue":"\u003cstring>","tags":["\u003cstring>"],"rules":[{"description":"\u003cstring>","id":"\u003cstring>","enabled":true,"type":"force","value":"\u003cstring>","allEnvironments":true,"condition":"\u003cstring>","scheduleRules":[{"enabled":true,"timestamp":"2023-11-07T05:31:56Z"}],"scheduleType":"none","rampScheduleId":"\u003cstring>","savedGroupTargeting":[{"matchType":"all","savedGroups":["\u003cstring>"]}],"prerequisites":[{"id":"\u003cstring>","condition":"\u003cstring>"}],"allProjects":true,"projects":["\u003cstring>"],"sparse":true,"config":"\u003cstring>","environments":["\u003cstring>"],"pendingRamp":"create"}],"environments":{},"revision":{"version":123,"comment":"\u003cstring>","date":"2023-11-07T05:31:56Z","id":"\u003cstring>","createdBy":{"type":"dashboard","id":"\u003cstring>","apiKey":"\u003cstring>","name":"\u003cstring>","email":"\u003cstring>","requestedBy":{"id":"\u003cstring>","name":"\u003cstring>","email":"\u003cstring>"},"assumedRole":true},"publishedBy":{"type":"dashboard","id":"\u003cstring>","apiKey":"\u003cstring>","name":"\u003cstring>","email":"\u003cstring>","requestedBy":{"id":"\u003cstring>","name":"\u003cstring>","email":"\u003cstring>"},"assumedRole":true}},"targetingAllProjects":true,"targetingProjects":["\u003cstring>"],"baseConfig":"\u003cstring>","defaultValueConfig":"\u003cstring>","prerequisites":["\u003cstring>"],"customFields":{},"holdout":{"id":"\u003cstring>","value":"\u003cstring>"}}}}},"exampleType":"generated"}},"exampleType":"generated"},"e996a2cb-7896-4f5e-beb3-2bceeb2bb7cc":{"description":"Held until a person confirms it in GrowthBook. Poll the Location until the confirmation completes.","headers":{"Location":{"description":"The confirmation to poll","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before polling","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"confirmation":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"confirmation.id","typeLabel":"string"},"status":{"type":"string","enum":["pending","running","completed","rejected","expired"],"isRequired":true,"uniqueKey":"confirmation.status","typeLabel":"enum\u003cstring>"},"actions":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string","enum":["feature.create","feature.draft","feature.review","feature.publish","feature.archive","feature.delete","feature.other","experiment.create","experiment.draft","experiment.start","experiment.stop","experiment.targeting","experiment.traffic","experiment.phases","experiment.visualEditor","experiment.checklist","experiment.other","savedGroup.create","savedGroup.draft","savedGroup.review","savedGroup.publish","savedGroup.archive","savedGroup.delete","savedGroup.other","constant.create","constant.draft","constant.review","constant.publish","constant.archive","constant.delete","constant.other","config.create","config.draft","config.review","config.publish","config.archive","config.delete","config.other","rampSchedule.create","rampSchedule.start","rampSchedule.pause","rampSchedule.progression","rampSchedule.approve","rampSchedule.edit","rampSchedule.delete","rampSchedule.other","settings.approvals","settings.other","access.members","access.teams","customHook.create","customHook.edit","customHook.delete","environment.create","environment.edit","environment.delete","project.create","project.edit","project.delete","attribute.create","attribute.edit","attribute.delete","customField.create","customField.edit","customField.delete","sdkConnection.create","sdkConnection.edit","sdkConnection.delete","metric.create","metric.edit","metric.delete","factTable.create","factTable.edit","factTable.delete","segment.create","segment.edit","segment.delete","dimension.create","dimension.edit","dimension.delete","override.ignoreWarnings","override.skipSchemaValidation","override.skipHooks","override.bypassApproval","override.restBypassesReviews","override.draftLimit","override.skipChecklist","override.bypassDuplicateKeyCheck","override.unscopedRules","other.write"],"isRequired":true,"uniqueKey":"confirmation.actions.items.[INDEX].action","typeLabel":"enum\u003cstring>"},"environments":{"type":"array","items":{"type":"string","uniqueKey":"confirmation.actions.items.[INDEX].environments.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"confirmation.actions.items.[INDEX].environments","typeLabel":"string[]"}},"required":["action","environments"],"additionalProperties":false,"uniqueKey":"confirmation.actions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"confirmation.actions","typeLabel":"object[]"},"summary":{"type":"string","isRequired":true,"uniqueKey":"confirmation.summary","typeLabel":"string"},"url":{"type":"string","isRequired":true,"uniqueKey":"confirmation.url","typeLabel":"string"},"expiresAt":{"type":"string","isRequired":true,"uniqueKey":"confirmation.expiresAt","typeLabel":"string"},"response":{"oneOf":[{"type":"object","required":["status","body"],"properties":{"status":{"type":"number","isRequired":true,"uniqueKey":"confirmation.response.oneOf.0.status","typeLabel":"number"},"body":{"oneOf":[{"isRequired":true}],"isRequired":true,"uniqueKey":"confirmation.response.oneOf.0.body","typeLabel":"any"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"confirmation.response.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"confirmation.response.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"confirmation.response","typeLabel":"object | null"},"note":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"confirmation.note.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"confirmation.note.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"confirmation.note","typeLabel":"string | null"}},"required":["id","status","actions","summary","url","expiresAt","response","note"],"additionalProperties":false,"isRequired":true,"uniqueKey":"confirmation","typeLabel":"object"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"required":["confirmation","message"],"additionalProperties":false,"$defs":{"Confirmation":{"id":"Confirmation","type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending","running","completed","rejected","expired"]},"actions":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string","enum":["feature.create","feature.draft","feature.review","feature.publish","feature.archive","feature.delete","feature.other","experiment.create","experiment.draft","experiment.start","experiment.stop","experiment.targeting","experiment.traffic","experiment.phases","experiment.visualEditor","experiment.checklist","experiment.other","savedGroup.create","savedGroup.draft","savedGroup.review","savedGroup.publish","savedGroup.archive","savedGroup.delete","savedGroup.other","constant.create","constant.draft","constant.review","constant.publish","constant.archive","constant.delete","constant.other","config.create","config.draft","config.review","config.publish","config.archive","config.delete","config.other","rampSchedule.create","rampSchedule.start","rampSchedule.pause","rampSchedule.progression","rampSchedule.approve","rampSchedule.edit","rampSchedule.delete","rampSchedule.other","settings.approvals","settings.other","access.members","access.teams","customHook.create","customHook.edit","customHook.delete","environment.create","environment.edit","environment.delete","project.create","project.edit","project.delete","attribute.create","attribute.edit","attribute.delete","customField.create","customField.edit","customField.delete","sdkConnection.create","sdkConnection.edit","sdkConnection.delete","metric.create","metric.edit","metric.delete","factTable.create","factTable.edit","factTable.delete","segment.create","segment.edit","segment.delete","dimension.create","dimension.edit","dimension.delete","override.ignoreWarnings","override.skipSchemaValidation","override.skipHooks","override.bypassApproval","override.restBypassesReviews","override.draftLimit","override.skipChecklist","override.bypassDuplicateKeyCheck","override.unscopedRules","other.write"]},"environments":{"type":"array","items":{"type":"string"}}},"required":["action","environments"],"additionalProperties":false}},"summary":{"type":"string"},"url":{"type":"string"},"expiresAt":{"type":"string"},"response":{"anyOf":[{"type":"object","properties":{"status":{"type":"number"},"body":{}},"required":["status","body"],"additionalProperties":false},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","status","actions","summary","url","expiresAt","response","note"],"additionalProperties":false}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"confirmation":{"id":"\u003cstring>","status":"pending","actions":[{"action":"feature.create","environments":["\u003cstring>"]}],"summary":"\u003cstring>","url":"\u003cstring>","expiresAt":"\u003cstring>","response":{"status":123,"body":"\u003cunknown>"},"note":"\u003cstring>"},"message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"9135e685-bda1-4725-b385-2b9bdde4d928":{"description":"Error","content":{"application/json":{"schema":{"type":"object","description":"A rule applies to All Environments and All Projects, which the organization doesn't allow without `allowUnscopedRules`","properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","enum":["unscoped_rule"],"isRequired":true,"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"details":{"type":"object","properties":{"ruleIds":{"type":"array","items":{"type":"string","uniqueKey":"details.ruleIds.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"details.ruleIds","typeLabel":"string[]"}},"required":["ruleIds"],"additionalProperties":false,"isRequired":true,"uniqueKey":"details","typeLabel":"object"}},"required":["message","code","details"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"unscoped_rule","details":{"ruleIds":["\u003cstring>"]}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"9b0fc9dc-914c-45e6-98a0-ae13016d3aba":{"bearerAuth":{"type":"http","scheme":"bearer","description":"If using Bearer auth, pass the Secret Key as the token:\n```bash\ncurl https://api.growthbook.io/api/v1/features -H \"Authorization: Bearer secret_abc123DEF456\"\n```\n","scopes":[],"schemeName":"bearerAuth"}},"9c080b0f-17f7-40e8-9d49-cacc8725e1ed":{"basicAuth":{"type":"http","scheme":"basic","description":"If using HTTP Basic auth, pass the Secret Key as the username and leave the password blank:\n```bash\ncurl https://api.growthbook.io/api/v1/features -u secret_abc123DEF456:\n# The \":\" at the end stops curl from asking for a password\n```\n","scopes":[],"schemeName":"basicAuth"}}},"servers":{"a90fa77a-1e3a-4653-822f-0ec7a0c0e5c9":{"url":"https://api.growthbook.io/api","description":"GrowthBook Cloud"},"da4439ad-114f-418d-b8e9-ec5d8270d44a":{"url":"https://{domain}/api","description":"Self-hosted GrowthBook","variables":{"domain":{"default":"localhost:3100","description":"Your self-hosted GrowthBook host (and port)"}}}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"If using Bearer auth, pass the Secret Key as the token:\n```bash\ncurl https://api.growthbook.io/api/v1/features -H \"Authorization: Bearer secret_abc123DEF456\"\n```\n","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"If using Bearer auth, pass the Secret Key as the token:\n```bash\ncurl https://api.growthbook.io/api/v1/features -H \"Authorization: Bearer secret_abc123DEF456\"\n```\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"},{"schemes":[{"scheme":{"type":"http","scheme":"basic","description":"If using HTTP Basic auth, pass the Secret Key as the username and leave the password blank:\n```bash\ncurl https://api.growthbook.io/api/v1/features -u secret_abc123DEF456:\n# The \":\" at the end stops curl from asking for a password\n```\n","scopes":[],"schemeName":"basicAuth"},"schema":{"title":"Basic Auth","type":"object","description":"If using HTTP Basic auth, pass the Secret Key as the username and leave the password blank:\n```bash\ncurl https://api.growthbook.io/api/v1/features -u secret_abc123DEF456:\n# The \":\" at the end stops curl from asking for a password\n```\n","isRequired":true,"properties":{"username":{"type":"string","uniqueKey":"username","isRequired":true,"typeLabel":"string","deprecated":false},"password":{"type":"string","uniqueKey":"password","isRequired":true,"typeLabel":"string","deprecated":false}},"additionalProperties":false,"deprecated":false},"schemeName":"basicAuth","name":"Authorization"}],"title":"basicAuth"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"growthbook-ea15456d","siteName":"GrowthBook Documentation","title":"Create a single feature - GrowthBook Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-19T19:01:50.347Z","originalFileLocation":"api/features-v2/operation/postFeatureV2.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level rules array; each rule includes allEnvironments / environments scope fields. ### Naming for human review The id is the Feature Flag\u0026#x27;s permanent name in the UI and code. Keep it short (checkout-express-pay) and put context in description. To create it disabled, list every environment in environments with enabled: false. ### Config-backed features (Config mode) A JSON feature can be backed by a shared config — the config supplies the base JSON value and schema, and the feature\u0026#x27;s rule values become override patches merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw $extends: [\u0026quot;@config:…\u0026quot;] inside a value string (that is rejected). @const: references inside values still work. - Top-level (baseConfig): set valueType: \u0026quot;json\u0026quot; and baseConfig: \u0026quot;\u0026quot; to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches. - Default value: unlike rules, the default is exactly a config with no overrides of its own — send defaultValue: \u0026quot;{}\u0026quot; to use baseConfig. To resolve the default to a descendant of baseConfig instead, set defaultValueConfig to that descendant\u0026#x27;s key (it must be within baseConfig\u0026#x27;s family); omit/null to use baseConfig directly. - Rules \u0026amp; experiment variations: each carries its own config field naming the family config that value patches (omit/null to patch the base). value is the override patch. Example: json { \u0026quot;id\u0026quot;: \u0026quot;checkout-config\u0026quot;, \u0026quot;valueType\u0026quot;: \u0026quot;json\u0026quot;, \u0026quot;baseConfig\u0026quot;: \u0026quot;purchase-flow\u0026quot;, \u0026quot;defaultValue\u0026quot;: \u0026quot;{}\u0026quot;, \u0026quot;rules\u0026quot;: [ { \u0026quot;type\u0026quot;: \u0026quot;force\u0026quot;, \u0026quot;config\u0026quot;: \u0026quot;purchase-flow-vip\u0026quot;, \u0026quot;value\u0026quot;: \u0026quot;{\\\u0026quot;maxItems\\\u0026quot;: 20}\u0026quot;, \u0026quot;allEnvironments\u0026quot;: true } ] }\">\u003cmeta data-mint-head name=\"application-name\" content=\"GrowthBook Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a single feature - GrowthBook Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level rules array; each rule includes allEnvironments / environments scope fields. ### Naming for human review The id is the Feature Flag\u0026#x27;s permanent name in the UI and code. Keep it short (checkout-express-pay) and put context in description. To create it disabled, list every environment in environments with enabled: false. ### Config-backed features (Config mode) A JSON feature can be backed by a shared config — the config supplies the base JSON value and schema, and the feature\u0026#x27;s rule values become override patches merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw $extends: [\u0026quot;@config:…\u0026quot;] inside a value string (that is rejected). @const: references inside values still work. - Top-level (baseConfig): set valueType: \u0026quot;json\u0026quot; and baseConfig: \u0026quot;\u0026quot; to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches. - Default value: unlike rules, the default is exactly a config with no overrides of its own — send defaultValue: \u0026quot;{}\u0026quot; to use baseConfig. To resolve the default to a descendant of baseConfig instead, set defaultValueConfig to that descendant\u0026#x27;s key (it must be within baseConfig\u0026#x27;s family); omit/null to use baseConfig directly. - Rules \u0026amp; experiment variations: each carries its own config field naming the family config that value patches (omit/null to patch the base). value is the override patch. Example: json { \u0026quot;id\u0026quot;: \u0026quot;checkout-config\u0026quot;, \u0026quot;valueType\u0026quot;: \u0026quot;json\u0026quot;, \u0026quot;baseConfig\u0026quot;: \u0026quot;purchase-flow\u0026quot;, \u0026quot;defaultValue\u0026quot;: \u0026quot;{}\u0026quot;, \u0026quot;rules\u0026quot;: [ { \u0026quot;type\u0026quot;: \u0026quot;force\u0026quot;, \u0026quot;config\u0026quot;: \u0026quot;purchase-flow-vip\u0026quot;, \u0026quot;value\u0026quot;: \u0026quot;{\\\u0026quot;maxItems\\\u0026quot;: 20}\u0026quot;, \u0026quot;allEnvironments\u0026quot;: true } ] }\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"GrowthBook Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://growthbook-ea15456d.mintlify.site/_mintlify/api/og/v2?division=Feature+Flags\u0026amp;title=Create+a+single+feature\u0026amp;description=Creates+a+new+Feature+Flag.+The+caller+needs+Create+access+in+its+Project%2C+plus+Publish+access+for+any+environment+the+Feature+Flag+starts+enabled+in+%E2%80%94+one+that\u0026amp;theme=eaa6443ec500d260c3ee1256\u0026amp;signature=269530cd005f4733bf51e583c9565a50e3a4e742b70db4a77564fc350f519783\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a single feature - GrowthBook Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level rules array; each rule includes allEnvironments / environments scope fields. ### Naming for human review The id is the Feature Flag\u0026#x27;s permanent name in the UI and code. Keep it short (checkout-express-pay) and put context in description. To create it disabled, list every environment in environments with enabled: false. ### Config-backed features (Config mode) A JSON feature can be backed by a shared config — the config supplies the base JSON value and schema, and the feature\u0026#x27;s rule values become override patches merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw $extends: [\u0026quot;@config:…\u0026quot;] inside a value string (that is rejected). @const: references inside values still work. - Top-level (baseConfig): set valueType: \u0026quot;json\u0026quot; and baseConfig: \u0026quot;\u0026quot; to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches. - Default value: unlike rules, the default is exactly a config with no overrides of its own — send defaultValue: \u0026quot;{}\u0026quot; to use baseConfig. To resolve the default to a descendant of baseConfig instead, set defaultValueConfig to that descendant\u0026#x27;s key (it must be within baseConfig\u0026#x27;s family); omit/null to use baseConfig directly. - Rules \u0026amp; experiment variations: each carries its own config field naming the family config that value patches (omit/null to patch the base). value is the override patch. Example: json { \u0026quot;id\u0026quot;: \u0026quot;checkout-config\u0026quot;, \u0026quot;valueType\u0026quot;: \u0026quot;json\u0026quot;, \u0026quot;baseConfig\u0026quot;: \u0026quot;purchase-flow\u0026quot;, \u0026quot;defaultValue\u0026quot;: \u0026quot;{}\u0026quot;, \u0026quot;rules\u0026quot;: [ { \u0026quot;type\u0026quot;: \u0026quot;force\u0026quot;, \u0026quot;config\u0026quot;: \u0026quot;purchase-flow-vip\u0026quot;, \u0026quot;value\u0026quot;: \u0026quot;{\\\u0026quot;maxItems\\\u0026quot;: 20}\u0026quot;, \u0026quot;allEnvironments\u0026quot;: true } ] }\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://growthbook-ea15456d.mintlify.site/_mintlify/api/og/v2?division=Feature+Flags\u0026amp;title=Create+a+single+feature\u0026amp;description=Creates+a+new+Feature+Flag.+The+caller+needs+Create+access+in+its+Project%2C+plus+Publish+access+for+any+environment+the+Feature+Flag+starts+enabled+in+%E2%80%94+one+that\u0026amp;theme=eaa6443ec500d260c3ee1256\u0026amp;signature=269530cd005f4733bf51e583c9565a50e3a4e742b70db4a77564fc350f519783\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/growthbook-ea15456d/OQgSyDtrkb__kTVO/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"GrowthBook Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#039DD0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/features-v2/operation/postFeatureV2.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.growthbook.io/#organization\",\"name\":\"GrowthBook Documentation\",\"url\":\"https://docs.growthbook.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/growthbook-ea15456d/66H-dO8hZfIFVUdN/static/img/growthbook-docslogo-light.png?fit=max\u0026auto=format\u0026n=66H-dO8hZfIFVUdN\u0026q=85\u0026s=36f32d1bbabbdafdb0bd9bc2b53c43e7\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.growthbook.io#website\",\"name\":\"GrowthBook Documentation\",\"url\":\"https://docs.growthbook.io\",\"publisher\":{\"@id\":\"https://docs.growthbook.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2#webpage\",\"url\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2\",\"name\":\"Create a single feature\",\"description\":\"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level rules array; each rule includes allEnvironments / environments scope fields. ### Naming for human review The id is the Feature Flag's permanent name in the UI and code. Keep it short (checkout-express-pay) and put context in description. To create it disabled, list every environment in environments with enabled: false. ### Config-backed features (Config mode) A JSON feature can be backed by a shared config — the config supplies the base JSON value and schema, and the feature's rule values become override patches merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw $extends: [\\\"@config:…\\\"] inside a value string (that is rejected). @const: references inside values still work. - Top-level (baseConfig): set valueType: \\\"json\\\" and baseConfig: \\\"\\\" to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches. - Default value: unlike rules, the default is exactly a config with no overrides of its own — send defaultValue: \\\"{}\\\" to use baseConfig. To resolve the default to a descendant of baseConfig instead, set defaultValueConfig to that descendant's key (it must be within baseConfig's family); omit/null to use baseConfig directly. - Rules \u0026 experiment variations: each carries its own config field naming the family config that value patches (omit/null to patch the base). value is the override patch. Example: json { \\\"id\\\": \\\"checkout-config\\\", \\\"valueType\\\": \\\"json\\\", \\\"baseConfig\\\": \\\"purchase-flow\\\", \\\"defaultValue\\\": \\\"{}\\\", \\\"rules\\\": [ { \\\"type\\\": \\\"force\\\", \\\"config\\\": \\\"purchase-flow-vip\\\", \\\"value\\\": \\\"{\\\\\\\"maxItems\\\\\\\": 20}\\\", \\\"allEnvironments\\\": true } ] }\",\"dateModified\":\"2026-10-19T19:01:50.347Z\",\"isPartOf\":{\"@id\":\"https://docs.growthbook.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.growthbook.io/api/projects/operation/listProjects\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature Flags\",\"item\":\"https://docs.growthbook.io/api/features-v2/operation/listFeaturesV2\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create a single feature\",\"item\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2#apireference\",\"headline\":\"Create a single feature\",\"name\":\"Create a single feature\",\"description\":\"Creates a new Feature Flag. The caller needs Create access in its Project, plus Publish access for any environment the Feature Flag starts enabled in — one that starts disabled everywhere needs Create alone. Rules are supplied as a top-level rules array; each rule includes allEnvironments / environments scope fields. ### Naming for human review The id is the Feature Flag's permanent name in the UI and code. Keep it short (checkout-express-pay) and put context in description. To create it disabled, list every environment in environments with enabled: false. ### Config-backed features (Config mode) A JSON feature can be backed by a shared config — the config supplies the base JSON value and schema, and the feature's rule values become override patches merged on top (nested objects deep-merge; arrays and scalars replace). The default value is exactly a config with no overrides (see below). Config backing is set exclusively through dedicated fields — never a raw $extends: [\\\"@config:…\\\"] inside a value string (that is rejected). @const: references inside values still work. - Top-level (baseConfig): set valueType: \\\"json\\\" and baseConfig: \\\"\\\" to put the Feature Flag in Config mode. The config must be live. This is the family root and the base the default value patches. - Default value: unlike rules, the default is exactly a config with no overrides of its own — send defaultValue: \\\"{}\\\" to use baseConfig. To resolve the default to a descendant of baseConfig instead, set defaultValueConfig to that descendant's key (it must be within baseConfig's family); omit/null to use baseConfig directly. - Rules \u0026 experiment variations: each carries its own config field naming the family config that value patches (omit/null to patch the base). value is the override patch. Example: json { \\\"id\\\": \\\"checkout-config\\\", \\\"valueType\\\": \\\"json\\\", \\\"baseConfig\\\": \\\"purchase-flow\\\", \\\"defaultValue\\\": \\\"{}\\\", \\\"rules\\\": [ { \\\"type\\\": \\\"force\\\", \\\"config\\\": \\\"purchase-flow-vip\\\", \\\"value\\\": \\\"{\\\\\\\"maxItems\\\\\\\": 20}\\\", \\\"allEnvironments\\\": true } ] }\",\"url\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2\",\"mainEntityOfPage\":{\"@id\":\"https://docs.growthbook.io/api/features-v2/operation/postFeatureV2#webpage\"},\"dateModified\":\"2026-10-19T19:01:50.347Z\",\"publisher\":{\"@id\":\"https://docs.growthbook.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.growthbook.io#website\"}}]}\u003c/script>","siteName":"GrowthBook Documentation","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Docs","pages":[{"title":"Docs","href":""}]},{"tab":"SDKs","pages":[{"title":"SDKs","href":"/lib"}]},{"tab":"API","groups":[{"group":"Introduction","pages":[{"title":"Introduction","href":"/api/introduction"}]},{"group":"Endpoints","pages":[{"group":"Projects","pages":[{"title":"Get all projects","openapi":"openapi.yaml GET /v1/projects","href":"/api/projects/operation/listProjects"},{"title":"Create a single project","openapi":"openapi.yaml POST /v1/projects","href":"/api/projects/operation/postProject"},{"title":"Get a single project","openapi":"openapi.yaml GET /v1/projects/{id}","href":"/api/projects/operation/getProject"},{"title":"Edit a single project","openapi":"openapi.yaml PUT /v1/projects/{id}","href":"/api/projects/operation/putProject"},{"title":"Deletes a single project","openapi":"openapi.yaml DELETE /v1/projects/{id}","href":"/api/projects/operation/deleteProject"}]},{"group":"Environments","pages":[{"title":"Get the organization's environments","openapi":"openapi.yaml GET /v1/environments","href":"/api/environments/operation/listEnvironments"},{"title":"Create a new environment","openapi":"openapi.yaml POST /v1/environments","href":"/api/environments/operation/postEnvironment"},{"title":"Update an environment","openapi":"openapi.yaml PUT /v1/environments/{id}","href":"/api/environments/operation/putEnvironment"},{"title":"Deletes a single environment","openapi":"openapi.yaml DELETE /v1/environments/{id}","href":"/api/environments/operation/deleteEnvironment"}]},{"group":"Feature Flags","tag":"v2","pages":[{"title":"Get all features","openapi":"openapi.yaml GET /v2/features","description":"Returns features with pagination. Rules are returned as a unified top-level array with per-rule environment scope.\n","href":"/api/features-v2/operation/listFeaturesV2"},{"title":"Create a single feature","openapi":"openapi.yaml POST /v2/features","href":"/api/features-v2/operation/postFeatureV2"},{"title":"Get a single feature","openapi":"openapi.yaml GET /v2/features/{id}","description":null,"href":"/api/features-v2/operation/getFeatureV2"},{"title":"Partially update a feature","openapi":"openapi.yaml POST /v2/features/{id}","href":"/api/features-v2/operation/updateFeatureV2"},{"title":"Deletes a single feature","openapi":"openapi.yaml DELETE /v2/features/{id}","href":"/api/features-v2/operation/deleteFeatureV2"},{"title":"Toggle a feature in one or more environments","openapi":"openapi.yaml POST /v2/features/{id}/toggle","href":"/api/features-v2/operation/toggleFeatureV2"},{"title":"Revert a feature to a specific revision","openapi":"openapi.yaml POST /v2/features/{id}/revert","href":"/api/features-v2/operation/revertFeatureV2"},{"title":"Get list of feature keys","openapi":"openapi.yaml GET /v2/feature-keys","href":"/api/features-v2/operation/getFeatureKeysV2"},{"title":"Get stale status for one or more features","openapi":"openapi.yaml GET /v2/stale-features","href":"/api/features-v2/operation/getFeatureStaleV2"}]},{"group":"Feature Revisions","tag":"v2","pages":[{"title":"List revisions across all features","openapi":"openapi.yaml GET /v2/feature-revisions","href":"/api/feature-revisions-v2/operation/listRevisionsV2"},{"title":"List revisions for a feature","openapi":"openapi.yaml GET /v2/features/{id}/revisions","href":"/api/feature-revisions-v2/operation/getFeatureRevisionsV2"},{"title":"Create a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions","href":"/api/feature-revisions-v2/operation/postFeatureRevisionV2"},{"title":"Get the most recent active draft revision","openapi":"openapi.yaml GET /v2/features/{id}/revisions/latest","href":"/api/feature-revisions-v2/operation/getFeatureRevisionLatestV2"},{"title":"Get a single feature revision","openapi":"openapi.yaml GET /v2/features/{id}/revisions/{version}","href":"/api/feature-revisions-v2/operation/getFeatureRevisionV2"},{"title":"Diff a revision against another revision","openapi":"openapi.yaml GET /v2/features/{id}/revisions/{version}/diff","href":"/api/feature-revisions-v2/operation/getFeatureRevisionDiffV2"},{"title":"Update revision metadata","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/metadata","href":"/api/feature-revisions-v2/operation/putFeatureRevisionMetadataV2"},{"title":"Set the default value in a draft revision","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/default-value","href":"/api/feature-revisions-v2/operation/putFeatureRevisionDefaultValueV2"},{"title":"Set feature-level prerequisites in a draft revision","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/prerequisites","href":"/api/feature-revisions-v2/operation/putFeatureRevisionPrerequisitesV2"},{"title":"Set holdout in a draft revision","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/holdout","href":"/api/feature-revisions-v2/operation/putFeatureRevisionHoldoutV2"},{"title":"Set archived state in a draft revision","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/archive","href":"/api/feature-revisions-v2/operation/putFeatureRevisionArchiveV2"},{"title":"Toggle an environment on/off in a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/toggle","href":"/api/feature-revisions-v2/operation/postFeatureRevisionToggleV2"},{"title":"Add a rule to a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/rules","href":"/api/feature-revisions-v2/operation/postFeatureRevisionRuleAddV2"},{"title":"Update a rule in a draft revision","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/rules/{ruleId}","href":"/api/feature-revisions-v2/operation/putFeatureRevisionRuleV2"},{"title":"Delete a rule from a draft revision","openapi":"openapi.yaml DELETE /v2/features/{id}/revisions/{version}/rules/{ruleId}","href":"/api/feature-revisions-v2/operation/deleteFeatureRevisionRuleV2"},{"title":"Reorder rules in the revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/rules/reorder","href":"/api/feature-revisions-v2/operation/postFeatureRevisionRulesReorderV2"},{"title":"Set ramp schedule for a rule","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/rules/{ruleId}/ramp-schedule","href":"/api/feature-revisions-v2/operation/putFeatureRevisionRuleRampScheduleV2"},{"title":"Remove ramp schedule from a rule","openapi":"openapi.yaml DELETE /v2/features/{id}/revisions/{version}/rules/{ruleId}/ramp-schedule","href":"/api/feature-revisions-v2/operation/deleteFeatureRevisionRuleRampScheduleV2"},{"title":"Request review for a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/request-review","href":"/api/feature-revisions-v2/operation/postFeatureRevisionRequestReviewV2"},{"title":"Schedule (or cancel) a deferred publish for a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/schedule-publish","href":"/api/feature-revisions-v2/operation/postFeatureRevisionSchedulePublishV2"},{"title":"Submit a review on a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/submit-review","href":"/api/feature-revisions-v2/operation/postFeatureRevisionSubmitReviewV2"},{"title":"Recall a review request (revert to draft)","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/recall-review","href":"/api/feature-revisions-v2/operation/postFeatureRevisionRecallReviewV2"},{"title":"Undo a reviewer's own review verdict","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/undo-review","href":"/api/feature-revisions-v2/operation/postFeatureRevisionUndoReviewV2"},{"title":"List the activity log for a revision","openapi":"openapi.yaml GET /v2/features/{id}/revisions/{version}/log","href":"/api/feature-revisions-v2/operation/getFeatureRevisionLogV2"},{"title":"Edit the comment text of an owned log entry","openapi":"openapi.yaml PUT /v2/features/{id}/revisions/{version}/log/{logId}","href":"/api/feature-revisions-v2/operation/putFeatureRevisionLogCommentV2"},{"title":"Delete an owned revision Comment entry","openapi":"openapi.yaml DELETE /v2/features/{id}/revisions/{version}/log/{logId}","href":"/api/feature-revisions-v2/operation/deleteFeatureRevisionLogEntryV2"},{"title":"Get merge status for a draft revision","openapi":"openapi.yaml GET /v2/features/{id}/revisions/{version}/merge-status","href":"/api/feature-revisions-v2/operation/getFeatureRevisionMergeStatusV2"},{"title":"Preview a rebase without applying it","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/rebase/preview","href":"/api/feature-revisions-v2/operation/postFeatureRevisionRebasePreviewV2"},{"title":"Rebase a draft revision onto the current live version","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/rebase","href":"/api/feature-revisions-v2/operation/postFeatureRevisionRebaseV2"},{"title":"Publish a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/publish","href":"/api/feature-revisions-v2/operation/postFeatureRevisionPublishV2"},{"title":"Discard a draft revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/discard","href":"/api/feature-revisions-v2/operation/postFeatureRevisionDiscardV2"},{"title":"Reopen a discarded revision as a draft","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/reopen","href":"/api/feature-revisions-v2/operation/postFeatureRevisionReopenV2"},{"title":"Revert the feature to a prior revision","openapi":"openapi.yaml POST /v2/features/{id}/revisions/{version}/revert","href":"/api/feature-revisions-v2/operation/postFeatureRevisionRevertV2"}]},{"group":"Feature Flags (legacy)","tag":"LEGACY","expanded":false,"pages":[{"title":"Get all features","openapi":"openapi.yaml GET /v1/features","href":"/api/features/operation/listFeatures"},{"title":"Create a single feature","openapi":"openapi.yaml POST /v1/features","href":"/api/features/operation/postFeature"},{"title":"Get a single feature","openapi":"openapi.yaml GET /v1/features/{id}","href":"/api/features/operation/getFeature"},{"title":"Partially update a feature","openapi":"openapi.yaml POST /v1/features/{id}","href":"/api/features/operation/updateFeature"},{"title":"Deletes a single feature","openapi":"openapi.yaml DELETE /v1/features/{id}","href":"/api/features/operation/deleteFeature"},{"title":"Toggle a feature in one or more environments","openapi":"openapi.yaml POST /v1/features/{id}/toggle","href":"/api/features/operation/toggleFeature"},{"title":"Revert a feature to a specific revision","openapi":"openapi.yaml POST /v1/features/{id}/revert","href":"/api/features/operation/revertFeature"},{"title":"Get list of feature keys","openapi":"openapi.yaml GET /v1/feature-keys","href":"/api/features/operation/getFeatureKeys"},{"title":"Get stale status for one or more features","openapi":"openapi.yaml GET /v1/stale-features","href":"/api/features/operation/getFeatureStale"}]},{"group":"Feature Revisions (legacy)","tag":"LEGACY","expanded":false,"pages":[{"title":"List feature revisions","openapi":"openapi.yaml GET /v1/revisions","href":"/api/feature-revisions/operation/listRevisions"},{"title":"List revisions for a feature","openapi":"openapi.yaml GET /v1/features/{id}/revisions","href":"/api/feature-revisions/operation/getFeatureRevisions"},{"title":"Create a draft revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions","href":"/api/feature-revisions/operation/postFeatureRevision"},{"title":"Get the most recent active draft revision","openapi":"openapi.yaml GET /v1/features/{id}/revisions/latest","href":"/api/feature-revisions/operation/getFeatureRevisionLatest"},{"title":"Get a single feature revision","openapi":"openapi.yaml GET /v1/features/{id}/revisions/{version}","href":"/api/feature-revisions/operation/getFeatureRevision"},{"title":"Update revision metadata (comment, title, feature metadata)","openapi":"openapi.yaml PUT /v1/features/{id}/revisions/{version}/metadata","href":"/api/feature-revisions/operation/putFeatureRevisionMetadata"},{"title":"Set the default value in a draft revision","openapi":"openapi.yaml PUT /v1/features/{id}/revisions/{version}/default-value","href":"/api/feature-revisions/operation/putFeatureRevisionDefaultValue"},{"title":"Set feature-level prerequisites in a draft revision","openapi":"openapi.yaml PUT /v1/features/{id}/revisions/{version}/prerequisites","href":"/api/feature-revisions/operation/putFeatureRevisionPrerequisites"},{"title":"Set holdout in a draft revision","openapi":"openapi.yaml PUT /v1/features/{id}/revisions/{version}/holdout","href":"/api/feature-revisions/operation/putFeatureRevisionHoldout"},{"title":"Set archived state in a draft revision","openapi":"openapi.yaml PUT /v1/features/{id}/revisions/{version}/archive","href":"/api/feature-revisions/operation/putFeatureRevisionArchive"},{"title":"Toggle an environment on/off in a draft revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/toggle","href":"/api/feature-revisions/operation/postFeatureRevisionToggle"},{"title":"Add a rule to a draft revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/rules","href":"/api/feature-revisions/operation/postFeatureRevisionRuleAdd"},{"title":"Update a rule in a draft revision","openapi":"openapi.yaml PUT /v1/features/{id}/revisions/{version}/rules/{ruleId}","href":"/api/feature-revisions/operation/putFeatureRevisionRule"},{"title":"Delete a rule from a draft revision","openapi":"openapi.yaml DELETE /v1/features/{id}/revisions/{version}/rules/{ruleId}","href":"/api/feature-revisions/operation/deleteFeatureRevisionRule"},{"title":"Reorder rules in an environment","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/rules/reorder","href":"/api/feature-revisions/operation/postFeatureRevisionRulesReorder"},{"title":"Set ramp schedule for a rule","openapi":"openapi.yaml PUT /v1/features/{id}/revisions/{version}/rules/{ruleId}/ramp-schedule","href":"/api/feature-revisions/operation/putFeatureRevisionRuleRampSchedule"},{"title":"Remove ramp schedule from a rule","openapi":"openapi.yaml DELETE /v1/features/{id}/revisions/{version}/rules/{ruleId}/ramp-schedule","href":"/api/feature-revisions/operation/deleteFeatureRevisionRuleRampSchedule"},{"title":"Request review for a draft revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/request-review","href":"/api/feature-revisions/operation/postFeatureRevisionRequestReview"},{"title":"Submit a review on a draft revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/submit-review","href":"/api/feature-revisions/operation/postFeatureRevisionSubmitReview"},{"title":"Get merge status for a draft revision","openapi":"openapi.yaml GET /v1/features/{id}/revisions/{version}/merge-status","href":"/api/feature-revisions/operation/getFeatureRevisionMergeStatus"},{"title":"Rebase a draft revision onto the current live version","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/rebase","href":"/api/feature-revisions/operation/postFeatureRevisionRebase"},{"title":"Publish a draft revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/publish","href":"/api/feature-revisions/operation/postFeatureRevisionPublish"},{"title":"Discard a draft revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/discard","href":"/api/feature-revisions/operation/postFeatureRevisionDiscard"},{"title":"Revert the feature to a prior revision","openapi":"openapi.yaml POST /v1/features/{id}/revisions/{version}/revert","href":"/api/feature-revisions/operation/postFeatureRevisionRevert"}]},{"group":"Ramp Schedules","pages":[{"title":"Get all rampSchedules","openapi":"openapi.yaml GET /v1/ramp-schedules","href":"/api/ramp-schedules/operation/listRampSchedules"},{"title":"Create a ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules","href":"/api/ramp-schedules/operation/postRampSchedule"},{"title":"Start a ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/start","href":"/api/ramp-schedules/operation/startRampSchedule"},{"title":"Pause a ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/pause","href":"/api/ramp-schedules/operation/pauseRampSchedule"},{"title":"Resume a paused ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/resume","href":"/api/ramp-schedules/operation/resumeRampSchedule"},{"title":"Roll back a ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/rollback","href":"/api/ramp-schedules/operation/rollbackRampSchedule"},{"title":"Restart a terminal ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/restart","href":"/api/ramp-schedules/operation/restartRampSchedule"},{"title":"Jump to a specific step","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/jump","href":"/api/ramp-schedules/operation/jumpRampSchedule"},{"title":"Complete a ramp schedule immediately","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/complete","href":"/api/ramp-schedules/operation/completeRampSchedule"},{"title":"Approve the pending approval gate","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/approve-step","href":"/api/ramp-schedules/operation/approveStepRampSchedule"},{"title":"Add a target rule to a ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/add-target","href":"/api/ramp-schedules/operation/addTargetRampSchedule"},{"title":"Remove a target rule from a ramp schedule","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/eject-target","href":"/api/ramp-schedules/operation/ejectTargetRampSchedule"},{"title":"Advance to the next step, overriding any holds","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/advance","href":"/api/ramp-schedules/operation/apiAdvanceRampSchedule"},{"title":"Get ramp schedule status summary","openapi":"openapi.yaml GET /v1/ramp-schedules/{id}/status","href":"/api/ramp-schedules/operation/getRampScheduleStatus"},{"title":"Set ramp monitoring mode","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/set-monitoring-mode","href":"/api/ramp-schedules/operation/setMonitoringModeRampSchedule"},{"title":"Toggle automatic monitoring updates","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/set-auto-update","href":"/api/ramp-schedules/operation/setAutoUpdateRampSchedule"},{"title":"Update ramp monitoring configuration","openapi":"openapi.yaml PUT /v1/ramp-schedules/{id}/monitoring","href":"/api/ramp-schedules/operation/updateRampScheduleMonitoring"},{"title":"Update ramp lockdown configuration","openapi":"openapi.yaml PUT /v1/ramp-schedules/{id}/lockdown","href":"/api/ramp-schedules/operation/updateRampScheduleLockdown"},{"title":"Update ramp schedule steps","openapi":"openapi.yaml PUT /v1/ramp-schedules/{id}/steps","href":"/api/ramp-schedules/operation/updateRampScheduleSteps"},{"title":"Trigger a manual monitoring update","openapi":"openapi.yaml POST /v1/ramp-schedules/{id}/actions/refresh-monitoring","href":"/api/ramp-schedules/operation/refreshMonitoringRampSchedule"},{"title":"Roll back matching ramp schedules","openapi":"openapi.yaml POST /v1/ramp-schedules/actions/rollback","href":"/api/ramp-schedules/operation/rollbackMatchingRampSchedules"},{"title":"Pause matching ramp schedules","openapi":"openapi.yaml POST /v1/ramp-schedules/actions/pause","href":"/api/ramp-schedules/operation/pauseMatchingRampSchedules"},{"title":"Get a single rampSchedule","openapi":"openapi.yaml GET /v1/ramp-schedules/{id}","href":"/api/ramp-schedules/operation/getRampSchedule"},{"title":"Update a single rampSchedule","openapi":"openapi.yaml PUT /v1/ramp-schedules/{id}","href":"/api/ramp-schedules/operation/updateRampSchedule"},{"title":"Delete a single rampSchedule","openapi":"openapi.yaml DELETE /v1/ramp-schedules/{id}","href":"/api/ramp-schedules/operation/deleteRampSchedule"}]},{"group":"Data Sources","pages":[{"title":"Get all data sources","openapi":"openapi.yaml GET /v1/data-sources","href":"/api/data-sources/operation/listDataSources"},{"title":"Get a single data source","openapi":"openapi.yaml GET /v1/data-sources/{id}","href":"/api/data-sources/operation/getDataSource"},{"title":"Get a Data Source's Information Schema","openapi":"openapi.yaml GET /v1/data-sources/{dataSourceId}/information-schema","href":"/api/data-sources/operation/getInformationSchema"},{"title":"Search warehouse tables","openapi":"openapi.yaml POST /v1/data-sources/{id}/sql/search-tables","href":"/api/data-sources/operation/searchWarehouseTables"},{"title":"Get warehouse table schemas","openapi":"openapi.yaml POST /v1/data-sources/{id}/sql/table-schema","href":"/api/data-sources/operation/getWarehouseTableSchema"},{"title":"Preview distinct column values","openapi":"openapi.yaml POST /v1/data-sources/{id}/sql/preview-values","href":"/api/data-sources/operation/previewWarehouseColumnValues"},{"title":"Execute a read-only SQL query","openapi":"openapi.yaml POST /v1/data-sources/{id}/sql/run-query","href":"/api/data-sources/operation/runSqlQuery"},{"title":"Get a single Information Schema Table by id","openapi":"openapi.yaml GET /v1/information-schema-tables/{tableId}","href":"/api/data-sources/operation/getInformationSchemaTable"}]},{"group":"Fact Tables","pages":[{"title":"Get all fact tables","openapi":"openapi.yaml GET /v1/fact-tables","href":"/api/fact-tables/operation/listFactTables"},{"title":"Create a single fact table","openapi":"openapi.yaml POST /v1/fact-tables","href":"/api/fact-tables/operation/postFactTable"},{"title":"Get a single fact table","openapi":"openapi.yaml GET /v1/fact-tables/{id}","href":"/api/fact-tables/operation/getFactTable"},{"title":"Update a single fact table","openapi":"openapi.yaml POST /v1/fact-tables/{id}","href":"/api/fact-tables/operation/updateFactTable"},{"title":"Deletes a single fact table","openapi":"openapi.yaml DELETE /v1/fact-tables/{id}","href":"/api/fact-tables/operation/deleteFactTable"},{"title":"Get all filters for a fact table","openapi":"openapi.yaml GET /v1/fact-tables/{factTableId}/filters","href":"/api/fact-tables/operation/listFactTableFilters"},{"title":"Create a single fact table filter","openapi":"openapi.yaml POST /v1/fact-tables/{factTableId}/filters","href":"/api/fact-tables/operation/postFactTableFilter"},{"title":"Get a single fact filter","openapi":"openapi.yaml GET /v1/fact-tables/{factTableId}/filters/{id}","href":"/api/fact-tables/operation/getFactTableFilter"},{"title":"Update a single fact table filter","openapi":"openapi.yaml POST /v1/fact-tables/{factTableId}/filters/{id}","href":"/api/fact-tables/operation/updateFactTableFilter"},{"title":"Deletes a single fact table filter","openapi":"openapi.yaml DELETE /v1/fact-tables/{factTableId}/filters/{id}","href":"/api/fact-tables/operation/deleteFactTableFilter"},{"title":"Create a virtual (computed) column on a fact table","openapi":"openapi.yaml POST /v1/fact-tables/{factTableId}/virtual-columns","href":"/api/fact-tables/operation/postFactTableVirtualColumn"},{"title":"Update a virtual (computed) column on a fact table","openapi":"openapi.yaml POST /v1/fact-tables/{factTableId}/virtual-columns/{id}","href":"/api/fact-tables/operation/updateFactTableVirtualColumn"},{"title":"Delete a virtual (computed) column from a fact table","openapi":"openapi.yaml DELETE /v1/fact-tables/{factTableId}/virtual-columns/{id}","href":"/api/fact-tables/operation/deleteFactTableVirtualColumn"},{"title":"Get the materialization status of a fact table's shared daily aggregated tables","openapi":"openapi.yaml GET /v1/fact-tables/{id}/aggregated-tables","href":"/api/fact-tables/operation/getAggregatedFactTables"},{"title":"Force a refresh or full restate of a fact table's shared daily aggregated tables","openapi":"openapi.yaml POST /v1/fact-tables/{id}/aggregated-tables/refresh","href":"/api/fact-tables/operation/refreshAggregatedFactTable"},{"title":"List aggregated table runs","openapi":"openapi.yaml GET /v1/fact-tables/{id}/aggregated-tables/runs","href":"/api/fact-tables/operation/listAggregatedTableRuns"},{"title":"Get a single aggregated table run","openapi":"openapi.yaml GET /v1/fact-tables/{id}/aggregated-tables/runs/{runId}","href":"/api/fact-tables/operation/getAggregatedTableRun"},{"title":"Bulk import fact tables, filters, and metrics","openapi":"openapi.yaml POST /v1/bulk-import/facts","href":"/api/fact-tables/operation/postBulkImportFacts"}]},{"group":"Fact Metrics","pages":[{"title":"Get all fact metrics","openapi":"openapi.yaml GET /v1/fact-metrics","href":"/api/fact-metrics/operation/listFactMetrics"},{"title":"Create a single fact metric","openapi":"openapi.yaml POST /v1/fact-metrics","href":"/api/fact-metrics/operation/postFactMetric"},{"title":"Get a single fact metric","openapi":"openapi.yaml GET /v1/fact-metrics/{id}","href":"/api/fact-metrics/operation/getFactMetric"},{"title":"Update a single fact metric","openapi":"openapi.yaml POST /v1/fact-metrics/{id}","href":"/api/fact-metrics/operation/updateFactMetric"},{"title":"Deletes a single fact metric","openapi":"openapi.yaml DELETE /v1/fact-metrics/{id}","href":"/api/fact-metrics/operation/deleteFactMetric"},{"title":"Create a fact metric analysis","openapi":"openapi.yaml POST /v1/fact-metrics/{id}/analysis","href":"/api/fact-metrics/operation/postFactMetricAnalysis"}]},{"group":"Metrics (legacy)","tag":"LEGACY","expanded":false,"pages":[{"title":"Get all metrics","openapi":"openapi.yaml GET /v1/metrics","href":"/api/metrics/operation/listMetrics"},{"title":"Create a single metric","openapi":"openapi.yaml POST /v1/metrics","href":"/api/metrics/operation/postMetric"},{"title":"Get a single metric","openapi":"openapi.yaml GET /v1/metrics/{id}","href":"/api/metrics/operation/getMetric"},{"title":"Update a metric","openapi":"openapi.yaml PUT /v1/metrics/{id}","href":"/api/metrics/operation/putMetric"},{"title":"Deletes a metric","openapi":"openapi.yaml DELETE /v1/metrics/{id}","href":"/api/metrics/operation/deleteMetric"},{"title":"Get results for all experiments that use a metric","openapi":"openapi.yaml GET /v1/metrics/{id}/experiments","href":"/api/metrics/operation/listMetricExperiments"}]},{"group":"Experiments","pages":[{"title":"Get all experiments","openapi":"openapi.yaml GET /v1/experiments","href":"/api/experiments/operation/listExperiments"},{"title":"Create a single experiment","openapi":"openapi.yaml POST /v1/experiments","href":"/api/experiments/operation/postExperiment"},{"title":"Get latest results for many experiments","openapi":"openapi.yaml GET /v1/experiments/results","href":"/api/experiments/operation/listExperimentResults"},{"title":"Get a single experiment","openapi":"openapi.yaml GET /v1/experiments/{id}","href":"/api/experiments/operation/getExperiment"},{"title":"Update a single experiment","openapi":"openapi.yaml POST /v1/experiments/{id}","href":"/api/experiments/operation/updateExperiment"},{"title":"Delete an experiment","openapi":"openapi.yaml DELETE /v1/experiments/{id}","href":"/api/experiments/operation/deleteExperiment"},{"title":"Get an experiment pre-launch checklist status","openapi":"openapi.yaml GET /v1/experiments/{id}/start-checklist","href":"/api/experiments/operation/getExperimentStartChecklist"},{"title":"Get results for an experiment","openapi":"openapi.yaml GET /v1/experiments/{id}/results","href":"/api/experiments/operation/getExperimentResults"},{"title":"Archive an experiment","openapi":"openapi.yaml POST /v1/experiments/{id}/archive","href":"/api/experiments/operation/postExperimentArchive"},{"title":"Unarchive an experiment","openapi":"openapi.yaml POST /v1/experiments/{id}/unarchive","href":"/api/experiments/operation/postExperimentUnarchive"},{"title":"Start/Stage an experiment","openapi":"openapi.yaml POST /v1/experiments/{id}/start","href":"/api/experiments/operation/postExperimentStart"},{"title":"Mark manual pre-launch checklist items complete","openapi":"openapi.yaml POST /v1/experiments/{id}/start-checklist/manual/complete","href":"/api/experiments/operation/postExperimentStartChecklistManualComplete"},{"title":"Stop an experiment","openapi":"openapi.yaml POST /v1/experiments/{id}/stop","href":"/api/experiments/operation/postExperimentStop"},{"title":"Set an experiment's schedule and shipping automation","openapi":"openapi.yaml PUT /v1/experiments/{id}/schedule","href":"/api/experiments/operation/putExperimentSchedule"},{"title":"Modify temporary rollout status for a stopped experiment","openapi":"openapi.yaml POST /v1/experiments/{id}/modify-temporary-rollout","href":"/api/experiments/operation/postExperimentModifyTemporaryRollout"},{"title":"Create Experiment Snapshot","openapi":"openapi.yaml POST /v1/experiments/{id}/snapshot","href":"/api/experiments/operation/postExperimentSnapshot"},{"title":"Upload a variation screenshot","openapi":"openapi.yaml POST /v1/experiments/{id}/variation/{variationId}/screenshot/upload","href":"/api/experiments/operation/postVariationImageUpload"},{"title":"Delete a variation screenshot","openapi":"openapi.yaml DELETE /v1/experiments/{id}/variation/{variationId}/screenshot","href":"/api/experiments/operation/deleteVariationScreenshot"},{"title":"Get a list of experiments with names and ids","openapi":"openapi.yaml GET /v1/experiment-names","href":"/api/experiments/operation/getExperimentNames"},{"title":"Post a comment on an experiment","openapi":"openapi.yaml POST /v1/experiments/{id}/comment","href":"/api/experiments/operation/postExperimentComment"}]},{"group":"Namespaces","pages":[{"title":"Get all namespaces","openapi":"openapi.yaml GET /v1/namespaces","href":"/api/namespaces/operation/listNamespaces"},{"title":"Create a namespace","openapi":"openapi.yaml POST /v1/namespaces","href":"/api/namespaces/operation/postNamespace"},{"title":"Get a single namespace","openapi":"openapi.yaml GET /v1/namespaces/{id}","href":"/api/namespaces/operation/getNamespace"},{"title":"Update a namespace","openapi":"openapi.yaml PUT /v1/namespaces/{id}","href":"/api/namespaces/operation/putNamespace"},{"title":"Delete a namespace","openapi":"openapi.yaml DELETE /v1/namespaces/{id}","href":"/api/namespaces/operation/deleteNamespace"},{"title":"Get namespace membership","openapi":"openapi.yaml GET /v1/namespaces/{id}/memberships","href":"/api/namespaces/operation/getNamespaceMemberships"},{"title":"Rotate namespace seed","openapi":"openapi.yaml POST /v1/namespaces/{id}/rotateSeed","href":"/api/namespaces/operation/postNamespaceRotateSeed"}]},{"group":"Experiment Snapshots","pages":[{"title":"Get an experiment snapshot status","openapi":"openapi.yaml GET /v1/snapshots/{id}","href":"/api/snapshots/operation/getExperimentSnapshot"}]},{"group":"Dimensions","pages":[{"title":"Get all dimensions","openapi":"openapi.yaml GET /v1/dimensions","href":"/api/dimensions/operation/listDimensions"},{"title":"Create a single dimension","openapi":"openapi.yaml POST /v1/dimensions","href":"/api/dimensions/operation/postDimension"},{"title":"Get a single dimension","openapi":"openapi.yaml GET /v1/dimensions/{id}","href":"/api/dimensions/operation/getDimension"},{"title":"Update a single dimension","openapi":"openapi.yaml POST /v1/dimensions/{id}","href":"/api/dimensions/operation/updateDimension"},{"title":"Deletes a single dimension","openapi":"openapi.yaml DELETE /v1/dimensions/{id}","href":"/api/dimensions/operation/deleteDimension"}]},{"group":"Segments","pages":[{"title":"Get all segments","openapi":"openapi.yaml GET /v1/segments","href":"/api/segments/operation/listSegments"},{"title":"Create a single segment","openapi":"openapi.yaml POST /v1/segments","href":"/api/segments/operation/postSegment"},{"title":"Get a single segment","openapi":"openapi.yaml GET /v1/segments/{id}","href":"/api/segments/operation/getSegment"},{"title":"Update a single segment","openapi":"openapi.yaml POST /v1/segments/{id}","href":"/api/segments/operation/updateSegment"},{"title":"Deletes a single segment","openapi":"openapi.yaml DELETE /v1/segments/{id}","href":"/api/segments/operation/deleteSegment"}]},{"group":"Experiment Reports","pages":[{"title":"Get all reports","openapi":"openapi.yaml GET /v1/reports","href":"/api/reports/operation/listReports"},{"title":"Create a new report","openapi":"openapi.yaml POST /v1/reports","href":"/api/reports/operation/postReport"},{"title":"Get a single report","openapi":"openapi.yaml GET /v1/reports/{id}","href":"/api/reports/operation/getReport"},{"title":"Refresh a report by re-running its analysis","openapi":"openapi.yaml POST /v1/reports/{id}/refresh","href":"/api/reports/operation/postReportRefresh"},{"title":"Update report metadata (title, description, visibility)","openapi":"openapi.yaml PUT /v1/reports/{id}/metadata","href":"/api/reports/operation/putReportMetadata"},{"title":"Update report analysis settings","openapi":"openapi.yaml PUT /v1/reports/{id}/settings","href":"/api/reports/operation/putReportSettings"}]},{"group":"SDK Connections","pages":[{"title":"Get all sdk connections","openapi":"openapi.yaml GET /v1/sdk-connections","href":"/api/sdk-connections/operation/listSdkConnections"},{"title":"Create a single sdk connection","openapi":"openapi.yaml POST /v1/sdk-connections","href":"/api/sdk-connections/operation/postSdkConnection"},{"title":"Get a single sdk connection","openapi":"openapi.yaml GET /v1/sdk-connections/{id}","href":"/api/sdk-connections/operation/getSdkConnection"},{"title":"Update a single sdk connection","openapi":"openapi.yaml PUT /v1/sdk-connections/{id}","href":"/api/sdk-connections/operation/putSdkConnection"},{"title":"Deletes a single SDK connection","openapi":"openapi.yaml DELETE /v1/sdk-connections/{id}","href":"/api/sdk-connections/operation/deleteSdkConnection"},{"title":"Find a single sdk connection by its key","openapi":"openapi.yaml GET /v1/sdk-connections/lookup/{key}","href":"/api/sdk-connections/operation/lookupSdkConnectionByKey"}]},{"group":"Visual Changesets","pages":[{"title":"Get all visual changesets","openapi":"openapi.yaml GET /v1/experiments/{id}/visual-changesets","href":"/api/visual-changesets/operation/listVisualChangesets"},{"title":"Create a visual changeset for an experiment","openapi":"openapi.yaml POST /v1/experiments/{id}/visual-changesets","href":"/api/visual-changesets/operation/postVisualChangesets"},{"title":"Get a single visual changeset","openapi":"openapi.yaml GET /v1/visual-changesets/{id}","href":"/api/visual-changesets/operation/getVisualChangeset"},{"title":"Update a visual changeset","openapi":"openapi.yaml PUT /v1/visual-changesets/{id}","href":"/api/visual-changesets/operation/putVisualChangeset"},{"title":"Create a visual change for a visual changeset","openapi":"openapi.yaml POST /v1/visual-changesets/{id}/visual-change","href":"/api/visual-changesets/operation/postVisualChange"},{"title":"Update a visual change for a visual changeset","openapi":"openapi.yaml PUT /v1/visual-changesets/{id}/visual-change/{visualChangeId}","href":"/api/visual-changesets/operation/putVisualChange"}]},{"group":"Saved Groups","pages":[{"title":"Get all saved group","openapi":"openapi.yaml GET /v1/saved-groups","href":"/api/saved-groups/operation/listSavedGroups"},{"title":"Create a single saved group","openapi":"openapi.yaml POST /v1/saved-groups","href":"/api/saved-groups/operation/postSavedGroup"},{"title":"Get a single saved group","openapi":"openapi.yaml GET /v1/saved-groups/{id}","href":"/api/saved-groups/operation/getSavedGroup"},{"title":"Partially update a single saved group","openapi":"openapi.yaml POST /v1/saved-groups/{id}","href":"/api/saved-groups/operation/updateSavedGroup"},{"title":"Deletes a single saved group","openapi":"openapi.yaml DELETE /v1/saved-groups/{id}","href":"/api/saved-groups/operation/deleteSavedGroup"},{"title":"Archive a single saved group","openapi":"openapi.yaml POST /v1/saved-groups/{id}/archive","href":"/api/saved-groups/operation/archiveSavedGroup"},{"title":"Unarchive a single saved group","openapi":"openapi.yaml POST /v1/saved-groups/{id}/unarchive","href":"/api/saved-groups/operation/unarchiveSavedGroup"},{"title":"Get features, experiments, and saved groups that reference this saved group","openapi":"openapi.yaml GET /v1/saved-groups/{id}/references","href":"/api/saved-groups/operation/getSavedGroupReferences"},{"title":"List the uploads of a remote saved group","openapi":"openapi.yaml GET /v1/saved-groups/{id}/uploads","href":"/api/saved-groups/operation/listSavedGroupUploads"},{"title":"Upload a new version of a remote saved group's IDs","openapi":"openapi.yaml POST /v1/saved-groups/{id}/uploads","href":"/api/saved-groups/operation/postSavedGroupUpload"},{"title":"Get a signed URL to upload a remote saved group CSV","openapi":"openapi.yaml POST /v1/saved-groups/{id}/upload-url","href":"/api/saved-groups/operation/postSavedGroupUploadUrl"},{"title":"Report loading a remote saved group upload into a data store","openapi":"openapi.yaml POST /v1/saved-groups/{id}/uploads/{version}/loads","href":"/api/saved-groups/operation/postSavedGroupUploadLoad"},{"title":"Get one upload of a remote saved group","openapi":"openapi.yaml GET /v1/saved-groups/{id}/uploads/{version}","href":"/api/saved-groups/operation/getSavedGroupUpload"},{"title":"Delete an upload of a remote saved group","openapi":"openapi.yaml DELETE /v1/saved-groups/{id}/uploads/{version}","href":"/api/saved-groups/operation/deleteSavedGroupUpload"}]},{"group":"Saved Group Revisions","pages":[{"title":"List saved-group revisions across the organization","openapi":"openapi.yaml GET /v1/saved-groups-revisions","href":"/api/saved-group-revisions/operation/listSavedGroupRevisions"},{"title":"List revisions for a saved group","openapi":"openapi.yaml GET /v1/saved-groups-revisions/{savedGroupId}","href":"/api/saved-group-revisions/operation/getSavedGroupRevisions"},{"title":"Create a draft revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}","href":"/api/saved-group-revisions/operation/postSavedGroupRevision"},{"title":"Get the most recent active draft revision","openapi":"openapi.yaml GET /v1/saved-groups-revisions/{savedGroupId}/latest","href":"/api/saved-group-revisions/operation/getSavedGroupRevisionLatest"},{"title":"Get a single saved group revision","openapi":"openapi.yaml GET /v1/saved-groups-revisions/{savedGroupId}/{version}","href":"/api/saved-group-revisions/operation/getSavedGroupRevision"},{"title":"Update saved group metadata in a draft revision","openapi":"openapi.yaml PUT /v1/saved-groups-revisions/{savedGroupId}/{version}/metadata","href":"/api/saved-group-revisions/operation/putSavedGroupRevisionMetadata"},{"title":"Update the condition of a condition saved group draft revision","openapi":"openapi.yaml PUT /v1/saved-groups-revisions/{savedGroupId}/{version}/condition","href":"/api/saved-group-revisions/operation/putSavedGroupRevisionCondition"},{"title":"Replace the values list in a list saved group draft revision","openapi":"openapi.yaml PUT /v1/saved-groups-revisions/{savedGroupId}/{version}/values","href":"/api/saved-group-revisions/operation/putSavedGroupRevisionValues"},{"title":"Set the upload a remote saved group draft revision uses","openapi":"openapi.yaml PUT /v1/saved-groups-revisions/{savedGroupId}/{version}/upload-version","href":"/api/saved-group-revisions/operation/putSavedGroupRevisionUploadVersion"},{"title":"Stage an archive/unarchive in a draft revision","openapi":"openapi.yaml PUT /v1/saved-groups-revisions/{savedGroupId}/{version}/archive","href":"/api/saved-group-revisions/operation/putSavedGroupRevisionArchive"},{"title":"Append items to a list saved group draft revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/items/add","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionItemsAdd"},{"title":"Remove items from a list saved group draft revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/items/remove","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionItemsRemove"},{"title":"Request review for a draft revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/request-review","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionRequestReview"},{"title":"Submit a review on a draft revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/submit-review","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionSubmitReview"},{"title":"Recall a review request","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/recall-review","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionRecallReview"},{"title":"Reopen a discarded revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/reopen","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionReopen"},{"title":"Schedule (or cancel) a deferred publish","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/schedule-publish","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionSchedulePublish"},{"title":"Retract your own review verdict","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/undo-review","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionUndoReview"},{"title":"Get merge status for a draft revision","openapi":"openapi.yaml GET /v1/saved-groups-revisions/{savedGroupId}/{version}/merge-status","href":"/api/saved-group-revisions/operation/getSavedGroupRevisionMergeStatus"},{"title":"Rebase a draft revision onto the current live saved group","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/rebase","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionRebase"},{"title":"Publish a draft revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/publish","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionPublish"},{"title":"Discard a draft revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/discard","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionDiscard"},{"title":"Revert the saved group to a prior revision","openapi":"openapi.yaml POST /v1/saved-groups-revisions/{savedGroupId}/{version}/revert","href":"/api/saved-group-revisions/operation/postSavedGroupRevisionRevert"}]},{"group":"Constants","tag":"BETA","pages":[{"title":"Get all constants","openapi":"openapi.yaml GET /v1/constants","href":"/api/constants/operation/listConstants"},{"title":"Create a single constant","openapi":"openapi.yaml POST /v1/constants","href":"/api/constants/operation/postConstant"},{"title":"Get features and constants that reference this constant","openapi":"openapi.yaml GET /v1/constants/{key}/references","href":"/api/constants/operation/getConstantReferences"},{"title":"Get a single constant","openapi":"openapi.yaml GET /v1/constants/{key}","href":"/api/constants/operation/getConstant"},{"title":"Partially update a single constant","openapi":"openapi.yaml POST /v1/constants/{key}","href":"/api/constants/operation/updateConstant"},{"title":"Delete a single constant","openapi":"openapi.yaml DELETE /v1/constants/{key}","href":"/api/constants/operation/deleteConstant"},{"title":"Archive a single constant","openapi":"openapi.yaml POST /v1/constants/{key}/archive","href":"/api/constants/operation/archiveConstant"},{"title":"Unarchive a single constant","openapi":"openapi.yaml POST /v1/constants/{key}/unarchive","href":"/api/constants/operation/unarchiveConstant"}]},{"group":"Constant Revisions","tag":"BETA","pages":[{"title":"List constant revisions across the organization","openapi":"openapi.yaml GET /v1/constants-revisions","href":"/api/constant-revisions/operation/listConstantRevisions"},{"title":"List revisions for a constant","openapi":"openapi.yaml GET /v1/constants-revisions/{key}","href":"/api/constant-revisions/operation/getConstantRevisions"},{"title":"Create a draft revision","openapi":"openapi.yaml POST /v1/constants-revisions/{key}","href":"/api/constant-revisions/operation/postConstantRevision"},{"title":"Get the most recent active draft revision","openapi":"openapi.yaml GET /v1/constants-revisions/{key}/latest","href":"/api/constant-revisions/operation/getConstantRevisionLatest"},{"title":"Get a single constant revision","openapi":"openapi.yaml GET /v1/constants-revisions/{key}/{version}","href":"/api/constant-revisions/operation/getConstantRevision"},{"title":"Update constant metadata in a draft revision","openapi":"openapi.yaml PUT /v1/constants-revisions/{key}/{version}/metadata","href":"/api/constant-revisions/operation/putConstantRevisionMetadata"},{"title":"Update the value of a constant draft revision","openapi":"openapi.yaml PUT /v1/constants-revisions/{key}/{version}/value","href":"/api/constant-revisions/operation/putConstantRevisionValue"},{"title":"Stage an archive/unarchive in a draft revision","openapi":"openapi.yaml PUT /v1/constants-revisions/{key}/{version}/archive","href":"/api/constant-revisions/operation/putConstantRevisionArchive"},{"title":"Request review for a draft revision","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/request-review","href":"/api/constant-revisions/operation/postConstantRevisionRequestReview"},{"title":"Submit a review on a draft revision","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/submit-review","href":"/api/constant-revisions/operation/postConstantRevisionSubmitReview"},{"title":"Recall a review request","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/recall-review","href":"/api/constant-revisions/operation/postConstantRevisionRecallReview"},{"title":"Reopen a discarded revision","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/reopen","href":"/api/constant-revisions/operation/postConstantRevisionReopen"},{"title":"Schedule (or cancel) a deferred publish","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/schedule-publish","href":"/api/constant-revisions/operation/postConstantRevisionSchedulePublish"},{"title":"Retract your own review verdict","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/undo-review","href":"/api/constant-revisions/operation/postConstantRevisionUndoReview"},{"title":"Get merge status for a draft revision","openapi":"openapi.yaml GET /v1/constants-revisions/{key}/{version}/merge-status","href":"/api/constant-revisions/operation/getConstantRevisionMergeStatus"},{"title":"Rebase a draft revision onto the current live constant","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/rebase","href":"/api/constant-revisions/operation/postConstantRevisionRebase"},{"title":"Publish a draft revision","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/publish","href":"/api/constant-revisions/operation/postConstantRevisionPublish"},{"title":"Discard a draft revision","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/discard","href":"/api/constant-revisions/operation/postConstantRevisionDiscard"},{"title":"Revert the constant to a prior revision","openapi":"openapi.yaml POST /v1/constants-revisions/{key}/{version}/revert","href":"/api/constant-revisions/operation/postConstantRevisionRevert"}]},{"group":"Configs","tag":"BETA","pages":[{"title":"Get all configs","openapi":"openapi.yaml GET /v1/configs","href":"/api/configs/operation/listConfigs"},{"title":"Create a single config","openapi":"openapi.yaml POST /v1/configs","href":"/api/configs/operation/postConfig"},{"title":"Get features and configs that reference this config","openapi":"openapi.yaml GET /v1/configs/{key}/references","href":"/api/configs/operation/getConfigReferences"},{"title":"Get the feature rules and default values implementing each key","openapi":"openapi.yaml GET /v1/configs/{key}/key-usage","href":"/api/configs/operation/getConfigKeyUsage"},{"title":"Get the full lineage (family tree) for a config","openapi":"openapi.yaml GET /v1/configs/{key}/lineage","href":"/api/configs/operation/getConfigLineage"},{"title":"Verify a config's schema against a source (drift check)","openapi":"openapi.yaml POST /v1/configs/{key}/schema/verify","href":"/api/configs/operation/verifyConfigSchema"},{"title":"Export a config's schema","openapi":"openapi.yaml GET /v1/configs/{key}/schema","href":"/api/configs/operation/getConfigSchema"},{"title":"Get a single config","openapi":"openapi.yaml GET /v1/configs/{key}","href":"/api/configs/operation/getConfig"},{"title":"Partially update a single config","openapi":"openapi.yaml POST /v1/configs/{key}","href":"/api/configs/operation/updateConfig"},{"title":"Delete a single config","openapi":"openapi.yaml DELETE /v1/configs/{key}","href":"/api/configs/operation/deleteConfig"},{"title":"Archive a single config","openapi":"openapi.yaml POST /v1/configs/{key}/archive","href":"/api/configs/operation/archiveConfig"},{"title":"Unarchive a single config","openapi":"openapi.yaml POST /v1/configs/{key}/unarchive","href":"/api/configs/operation/unarchiveConfig"},{"title":"Lock a config at its current published revision","openapi":"openapi.yaml POST /v1/configs/{key}/lock","href":"/api/configs/operation/lockConfig"},{"title":"Unlock a config","openapi":"openapi.yaml POST /v1/configs/{key}/unlock","href":"/api/configs/operation/unlockConfig"}]},{"group":"Config Revisions","tag":"BETA","pages":[{"title":"List config revisions across the organization","openapi":"openapi.yaml GET /v1/configs-revisions","href":"/api/config-revisions/operation/listConfigRevisions"},{"title":"List revisions for a config","openapi":"openapi.yaml GET /v1/configs-revisions/{key}","href":"/api/config-revisions/operation/getConfigRevisions"},{"title":"Create a draft revision","openapi":"openapi.yaml POST /v1/configs-revisions/{key}","href":"/api/config-revisions/operation/postConfigRevision"},{"title":"Get the most recent active draft revision","openapi":"openapi.yaml GET /v1/configs-revisions/{key}/latest","href":"/api/config-revisions/operation/getConfigRevisionLatest"},{"title":"Get a single config revision","openapi":"openapi.yaml GET /v1/configs-revisions/{key}/{version}","href":"/api/config-revisions/operation/getConfigRevision"},{"title":"Update config metadata in a draft revision","openapi":"openapi.yaml PUT /v1/configs-revisions/{key}/{version}/metadata","href":"/api/config-revisions/operation/putConfigRevisionMetadata"},{"title":"Update the value of a config draft revision","openapi":"openapi.yaml PUT /v1/configs-revisions/{key}/{version}/value","href":"/api/config-revisions/operation/putConfigRevisionValue"},{"title":"Set one property of a config draft revision's value","openapi":"openapi.yaml PUT /v1/configs-revisions/{key}/{version}/property","href":"/api/config-revisions/operation/putConfigRevisionProperty"},{"title":"Remove one property from a config draft revision's value","openapi":"openapi.yaml DELETE /v1/configs-revisions/{key}/{version}/property","href":"/api/config-revisions/operation/deleteConfigRevisionProperty"},{"title":"Update or import the schema of a config draft revision","openapi":"openapi.yaml PUT /v1/configs-revisions/{key}/{version}/schema","href":"/api/config-revisions/operation/putConfigRevisionSchema"},{"title":"Set (or update) a config's per-source render projection on a draft","openapi":"openapi.yaml PUT /v1/configs-revisions/{key}/{version}/projection","href":"/api/config-revisions/operation/putConfigRevisionProjection"},{"title":"Remove a config's per-source render projection on a draft","openapi":"openapi.yaml DELETE /v1/configs-revisions/{key}/{version}/projection","href":"/api/config-revisions/operation/deleteConfigRevisionProjection"},{"title":"Stage an archive/unarchive in a draft revision","openapi":"openapi.yaml PUT /v1/configs-revisions/{key}/{version}/archive","href":"/api/config-revisions/operation/putConfigRevisionArchive"},{"title":"Request review for a draft revision","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/request-review","href":"/api/config-revisions/operation/postConfigRevisionRequestReview"},{"title":"Submit a review on a draft revision","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/submit-review","href":"/api/config-revisions/operation/postConfigRevisionSubmitReview"},{"title":"Retract your own review verdict","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/undo-review","href":"/api/config-revisions/operation/postConfigRevisionUndoReview"},{"title":"Recall a review request","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/recall-review","href":"/api/config-revisions/operation/postConfigRevisionRecallReview"},{"title":"Reopen a discarded revision","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/reopen","href":"/api/config-revisions/operation/postConfigRevisionReopen"},{"title":"Schedule (or cancel) a deferred publish","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/schedule-publish","href":"/api/config-revisions/operation/postConfigRevisionSchedulePublish"},{"title":"Get merge status for a draft revision","openapi":"openapi.yaml GET /v1/configs-revisions/{key}/{version}/merge-status","href":"/api/config-revisions/operation/getConfigRevisionMergeStatus"},{"title":"Rebase a draft revision onto the current live config","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/rebase","href":"/api/config-revisions/operation/postConfigRevisionRebase"},{"title":"Publish a draft revision","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/publish","href":"/api/config-revisions/operation/postConfigRevisionPublish"},{"title":"Discard a draft revision","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/discard","href":"/api/config-revisions/operation/postConfigRevisionDiscard"},{"title":"Revert the config to a prior revision","openapi":"openapi.yaml POST /v1/configs-revisions/{key}/{version}/revert","href":"/api/config-revisions/operation/postConfigRevisionRevert"}]},{"group":"Releases","tag":"BETA","pages":[{"title":"Atomically publish revisions across multiple entities","openapi":"openapi.yaml POST /v1/releases/publish-revisions","href":"/api/releases/operation/postReleasePublishRevisions"}]},{"group":"Custom Hooks","pages":[{"title":"Get all custom hooks","openapi":"openapi.yaml GET /v1/custom-hooks","href":"/api/custom-hooks/operation/listCustomHooks"},{"title":"Create a single custom hook","openapi":"openapi.yaml POST /v1/custom-hooks","href":"/api/custom-hooks/operation/postCustomHook"},{"title":"Dry-run hook code in the sandbox","openapi":"openapi.yaml POST /v1/custom-hooks/test","href":"/api/custom-hooks/operation/testCustomHook"},{"title":"Get a single custom hook","openapi":"openapi.yaml GET /v1/custom-hooks/{id}","href":"/api/custom-hooks/operation/getCustomHook"},{"title":"Partially update a single custom hook","openapi":"openapi.yaml POST /v1/custom-hooks/{id}","href":"/api/custom-hooks/operation/updateCustomHook"},{"title":"Delete a single custom hook","openapi":"openapi.yaml DELETE /v1/custom-hooks/{id}","href":"/api/custom-hooks/operation/deleteCustomHook"},{"title":"List a custom hook's version history","openapi":"openapi.yaml GET /v1/custom-hooks/{id}/history","href":"/api/custom-hooks/operation/listCustomHookHistory"},{"title":"Revert a custom hook to a previous version","openapi":"openapi.yaml POST /v1/custom-hooks/{id}/revert","href":"/api/custom-hooks/operation/revertCustomHook"}]},{"group":"Organizations","pages":[{"title":"Get all organizations (only for super admins on multi-org Enterprise Plan only)","openapi":"openapi.yaml GET /v1/organizations","href":"/api/organizations/operation/listOrganizations"},{"title":"Create a single organization (only for super admins on multi-org Enterprise Plan only)","openapi":"openapi.yaml POST /v1/organizations","href":"/api/organizations/operation/postOrganization"},{"title":"Edit a single organization (only for super admins on multi-org Enterprise Plan only)","openapi":"openapi.yaml PUT /v1/organizations/{id}","href":"/api/organizations/operation/putOrganization"}]},{"group":"Members","pages":[{"title":"Get all organization members","openapi":"openapi.yaml GET /v1/members","href":"/api/members/operation/listMembers"},{"title":"Update a member's role","openapi":"openapi.yaml POST /v1/members/{id}/role","href":"/api/members/operation/updateMemberRole"},{"title":"Removes a single user from an organization","openapi":"openapi.yaml DELETE /v1/members/{id}","href":"/api/members/operation/deleteMember"}]},{"group":"Code References","pages":[{"title":"Get list of all code references for the current organization","openapi":"openapi.yaml GET /v1/code-refs","href":"/api/code-references/operation/listCodeRefs"},{"title":"Submit list of code references","openapi":"openapi.yaml POST /v1/code-refs","href":"/api/code-references/operation/postCodeRefs"},{"title":"Get list of code references for a single feature id","openapi":"openapi.yaml GET /v1/code-refs/{id}","href":"/api/code-references/operation/getCodeRefs"}]},{"group":"Archetypes","pages":[{"title":"Get the organization's archetypes","openapi":"openapi.yaml GET /v1/archetypes","href":"/api/archetypes/operation/listArchetypes"},{"title":"Create a single archetype","openapi":"openapi.yaml POST /v1/archetypes","href":"/api/archetypes/operation/postArchetype"},{"title":"Get a single archetype","openapi":"openapi.yaml GET /v1/archetypes/{id}","href":"/api/archetypes/operation/getArchetype"},{"title":"Update a single archetype","openapi":"openapi.yaml PUT /v1/archetypes/{id}","href":"/api/archetypes/operation/putArchetype"},{"title":"Deletes a single archetype","openapi":"openapi.yaml DELETE /v1/archetypes/{id}","href":"/api/archetypes/operation/deleteArchetype"}]},{"group":"Queries","pages":[{"title":"Get a single query","openapi":"openapi.yaml GET /v1/queries/{id}","href":"/api/queries/operation/getQuery"}]},{"group":"Settings","pages":[{"title":"Get organization settings","openapi":"openapi.yaml GET /v1/settings","href":"/api/settings/operation/getSettings"},{"title":"Update approval settings","openapi":"openapi.yaml PUT /v1/settings/approvals","href":"/api/settings/operation/putApprovalSettings"}]},{"group":"Attributes","pages":[{"title":"Get the organization's attributes","openapi":"openapi.yaml GET /v1/attributes","href":"/api/attributes/operation/listAttributes"},{"title":"Create a new attribute","openapi":"openapi.yaml POST /v1/attributes","href":"/api/attributes/operation/postAttribute"},{"title":"Update an attribute","openapi":"openapi.yaml PUT /v1/attributes/{property}","href":"/api/attributes/operation/putAttribute"},{"title":"Deletes a single attribute","openapi":"openapi.yaml DELETE /v1/attributes/{property}","href":"/api/attributes/operation/deleteAttribute"}]},{"group":"Usage","pages":[{"title":"Get metric usage across experiments","openapi":"openapi.yaml GET /v1/usage/metrics","href":"/api/usage/operation/getMetricUsage"}]},{"group":"Meta","pages":[{"title":"Get the GrowthBook server version and build info","openapi":"openapi.yaml GET /v1/version","href":"/api/meta/operation/getVersion"},{"title":"Get a confirmation","openapi":"openapi.yaml GET /v1/confirmations/{id}","href":"/api/meta/operation/getConfirmation"}]},{"group":"Contextual Bandits","tag":"BETA","pages":[{"title":"Get current Contextual Bandit leaf weights and latest event","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/current","href":"/api/ContextualBandits/operation/getContextualBanditCurrentWeights"},{"title":"List Contextual Bandit snapshots","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/snapshots","href":"/api/ContextualBandits/operation/listContextualBanditSnapshots"},{"title":"Get a single Contextual Bandit snapshot","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/snapshots/{snapshotId}","href":"/api/ContextualBandits/operation/getContextualBanditSnapshot"},{"title":"List Contextual Bandit weight-update events","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/events","href":"/api/ContextualBandits/operation/listContextualBanditEvents"},{"title":"Get a single Contextual Bandit weight-update event","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/events/{eventId}","href":"/api/ContextualBandits/operation/getContextualBanditEvent"},{"title":"Get latest Contextual Bandit results","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/results","href":"/api/ContextualBandits/operation/getContextualBanditResults"},{"title":"Get Contextual Bandit run status","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/status","href":"/api/ContextualBandits/operation/getContextualBanditStatus"},{"title":"Get features linked to a Contextual Bandit","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/linked-features","href":"/api/ContextualBandits/operation/getContextualBanditLinkedFeatures"},{"title":"Link a feature to a Contextual Bandit","openapi":"openapi.yaml POST /v1/contextual-bandits/{id}/linked-feature/{featureId}","href":"/api/ContextualBandits/operation/addContextualBanditLinkedFeature"},{"title":"Replace a Contextual Bandit's rule on a linked feature","openapi":"openapi.yaml PUT /v1/contextual-bandits/{id}/linked-feature/{featureId}","href":"/api/ContextualBandits/operation/updateContextualBanditLinkedFeature"},{"title":"Unlink a feature from a Contextual Bandit","openapi":"openapi.yaml DELETE /v1/contextual-bandits/{id}/linked-feature/{featureId}","href":"/api/ContextualBandits/operation/deleteContextualBanditLinkedFeature"},{"title":"Get a single contextualBandit","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}","href":"/api/ContextualBandits/operation/getContextualBandit"},{"title":"Update a single contextualBandit","openapi":"openapi.yaml PUT /v1/contextual-bandits/{id}","href":"/api/ContextualBandits/operation/updateContextualBandit"},{"title":"Delete a single contextualBandit","openapi":"openapi.yaml DELETE /v1/contextual-bandits/{id}","href":"/api/ContextualBandits/operation/deleteContextualBandit"},{"title":"Get all contextualBandits","openapi":"openapi.yaml GET /v1/contextual-bandits","href":"/api/ContextualBandits/operation/listContextualBandits"},{"title":"Create a single contextualBandit","openapi":"openapi.yaml POST /v1/contextual-bandits","href":"/api/ContextualBandits/operation/createContextualBandit"},{"title":"Start a Contextual Bandit","openapi":"openapi.yaml POST /v1/contextual-bandits/{id}/start","href":"/api/ContextualBandits/operation/startContextualBandit"},{"title":"Stop a Contextual Bandit","openapi":"openapi.yaml POST /v1/contextual-bandits/{id}/stop","href":"/api/ContextualBandits/operation/stopContextualBandit"},{"title":"Trigger a Contextual Bandit snapshot refresh","openapi":"openapi.yaml POST /v1/contextual-bandits/{id}/refresh","href":"/api/ContextualBandits/operation/refreshContextualBandit"},{"title":"Add or remove Contextual Bandit variations","openapi":"openapi.yaml POST /v1/contextual-bandits/{id}/variations","href":"/api/ContextualBandits/operation/updateContextualBanditVariations"},{"title":"Cancel a running Contextual Bandit snapshot refresh","openapi":"openapi.yaml POST /v1/contextual-bandits/{id}/cancel","href":"/api/ContextualBandits/operation/cancelContextualBandit"},{"title":"List visual changesets for a Contextual Bandit","openapi":"openapi.yaml GET /v1/contextual-bandits/{id}/visual-changesets","href":"/api/ContextualBandits/operation/listContextualBanditVisualChangesets"},{"title":"Create a visual changeset for a Contextual Bandit","openapi":"openapi.yaml POST /v1/contextual-bandits/{id}/visual-changesets","href":"/api/ContextualBandits/operation/postContextualBanditVisualChangesets"}]},{"group":"Dashboards","pages":[{"title":"Get a single dashboard","openapi":"openapi.yaml GET /v1/dashboards/{id}","href":"/api/Dashboards/operation/getDashboard"},{"title":"Update a single dashboard","openapi":"openapi.yaml PUT /v1/dashboards/{id}","href":"/api/Dashboards/operation/updateDashboard"},{"title":"Delete a single dashboard","openapi":"openapi.yaml DELETE /v1/dashboards/{id}","href":"/api/Dashboards/operation/deleteDashboard"},{"title":"Get all dashboards","openapi":"openapi.yaml GET /v1/dashboards","href":"/api/Dashboards/operation/listDashboards"},{"title":"Create a single dashboard","openapi":"openapi.yaml POST /v1/dashboards","href":"/api/Dashboards/operation/createDashboard"},{"title":"Create a single dashboard","openapi":"openapi.yaml POST /v2/dashboards","href":"/api/Dashboards/operation/createDashboardV2"},{"title":"Get all dashboards for an experiment","openapi":"openapi.yaml GET /v1/dashboards/by-experiment/{experimentId}","href":"/api/Dashboards/operation/getDashboardsForExperiment"}]},{"group":"Contextual Bandit Queries","tag":"BETA","pages":[{"title":"Get a single contextualBanditQuery","openapi":"openapi.yaml GET /v1/contextual-bandit-queries/{id}","href":"/api/ContextualBanditQueries/operation/getContextualBanditQuery"},{"title":"Update a single contextualBanditQuery","openapi":"openapi.yaml PUT /v1/contextual-bandit-queries/{id}","href":"/api/ContextualBanditQueries/operation/updateContextualBanditQuery"},{"title":"Delete a single contextualBanditQuery","openapi":"openapi.yaml DELETE /v1/contextual-bandit-queries/{id}","href":"/api/ContextualBanditQueries/operation/deleteContextualBanditQuery"},{"title":"Get all contextualBanditQueries","openapi":"openapi.yaml GET /v1/contextual-bandit-queries","href":"/api/ContextualBanditQueries/operation/listContextualBanditQueries"},{"title":"Create a single contextualBanditQuery","openapi":"openapi.yaml POST /v1/contextual-bandit-queries","href":"/api/ContextualBanditQueries/operation/createContextualBanditQuery"}]},{"group":"Interleaving Exposure Queries","pages":[{"title":"Get a single interleavingExposureQuery","openapi":"openapi.yaml GET /v1/interleaving-exposure-queries/{id}","href":"/api/InterleavingExposureQueries/operation/getInterleavingExposureQuery"},{"title":"Update a single interleavingExposureQuery","openapi":"openapi.yaml PUT /v1/interleaving-exposure-queries/{id}","href":"/api/InterleavingExposureQueries/operation/updateInterleavingExposureQuery"},{"title":"Delete a single interleavingExposureQuery","openapi":"openapi.yaml DELETE /v1/interleaving-exposure-queries/{id}","href":"/api/InterleavingExposureQueries/operation/deleteInterleavingExposureQuery"},{"title":"Get all interleavingExposureQueries","openapi":"openapi.yaml GET /v1/interleaving-exposure-queries","href":"/api/InterleavingExposureQueries/operation/listInterleavingExposureQueries"},{"title":"Create a single interleavingExposureQuery","openapi":"openapi.yaml POST /v1/interleaving-exposure-queries","href":"/api/InterleavingExposureQueries/operation/createInterleavingExposureQuery"}]},{"group":"Interleaving Experiments","pages":[{"title":"Get a single interleaving","openapi":"openapi.yaml GET /v1/interleavings/{id}","href":"/api/Interleavings/operation/getInterleaving"},{"title":"Update a single interleaving","openapi":"openapi.yaml PUT /v1/interleavings/{id}","href":"/api/Interleavings/operation/updateInterleaving"},{"title":"Delete a single interleaving","openapi":"openapi.yaml DELETE /v1/interleavings/{id}","href":"/api/Interleavings/operation/deleteInterleaving"},{"title":"Get all interleavings","openapi":"openapi.yaml GET /v1/interleavings","href":"/api/Interleavings/operation/listInterleavings"},{"title":"Create a single interleaving","openapi":"openapi.yaml POST /v1/interleavings","href":"/api/Interleavings/operation/createInterleaving"},{"title":"Start an interleaving experiment","openapi":"openapi.yaml POST /v1/interleavings/{id}/start","href":"/api/Interleavings/operation/startInterleaving"},{"title":"Stop an interleaving experiment","openapi":"openapi.yaml POST /v1/interleavings/{id}/stop","href":"/api/Interleavings/operation/stopInterleaving"},{"title":"Refresh interleaving experiment results","openapi":"openapi.yaml POST /v1/interleavings/{id}/refresh","href":"/api/Interleavings/operation/refreshInterleaving"},{"title":"Get the latest interleaving experiment results","openapi":"openapi.yaml GET /v1/interleavings/{id}/results","href":"/api/Interleavings/operation/getInterleavingResults"},{"title":"Get interleaving experiment run status","openapi":"openapi.yaml GET /v1/interleavings/{id}/status","href":"/api/Interleavings/operation/getInterleavingStatus"},{"title":"List interleaving experiment results snapshots","openapi":"openapi.yaml GET /v1/interleavings/{id}/snapshots","href":"/api/Interleavings/operation/listInterleavingSnapshots"},{"title":"Get an interleaving experiment results snapshot","openapi":"openapi.yaml GET /v1/interleavings/{id}/snapshots/{snapshotId}","href":"/api/Interleavings/operation/getInterleavingSnapshot"}]},{"group":"Custom Fields","pages":[{"title":"Get all custom fields","openapi":"openapi.yaml GET /v1/custom-fields","href":"/api/CustomFields/operation/listCustomFields"},{"title":"Create a single customField","openapi":"openapi.yaml POST /v1/custom-fields","href":"/api/CustomFields/operation/createCustomField"},{"title":"Get a single customField","openapi":"openapi.yaml GET /v1/custom-fields/{id}","href":"/api/CustomFields/operation/getCustomField"},{"title":"Update a single customField","openapi":"openapi.yaml PUT /v1/custom-fields/{id}","href":"/api/CustomFields/operation/updateCustomField"},{"title":"Delete a single customField","openapi":"openapi.yaml DELETE /v1/custom-fields/{id}","href":"/api/CustomFields/operation/deleteCustomField"}]},{"group":"Metric Groups","pages":[{"title":"Get a single metricGroup","openapi":"openapi.yaml GET /v1/metric-groups/{id}","href":"/api/MetricGroups/operation/getMetricGroup"},{"title":"Update a single metricGroup","openapi":"openapi.yaml PUT /v1/metric-groups/{id}","href":"/api/MetricGroups/operation/updateMetricGroup"},{"title":"Delete a single metricGroup","openapi":"openapi.yaml DELETE /v1/metric-groups/{id}","href":"/api/MetricGroups/operation/deleteMetricGroup"},{"title":"Get all metricGroups","openapi":"openapi.yaml GET /v1/metric-groups","href":"/api/MetricGroups/operation/listMetricGroups"},{"title":"Create a single metricGroup","openapi":"openapi.yaml POST /v1/metric-groups","href":"/api/MetricGroups/operation/createMetricGroup"}]},{"group":"Teams","pages":[{"title":"Get a single team","openapi":"openapi.yaml GET /v1/teams/{id}","href":"/api/Teams/operation/getTeam"},{"title":"Update a single team","openapi":"openapi.yaml PUT /v1/teams/{id}","href":"/api/Teams/operation/updateTeam"},{"title":"Delete a single team","openapi":"openapi.yaml DELETE /v1/teams/{id}","href":"/api/Teams/operation/deleteTeam"},{"title":"Get all teams","openapi":"openapi.yaml GET /v1/teams","href":"/api/Teams/operation/listTeams"},{"title":"Create a single team","openapi":"openapi.yaml POST /v1/teams","href":"/api/Teams/operation/createTeam"},{"title":"Add members to team","openapi":"openapi.yaml POST /v1/teams/{id}/members","href":"/api/Teams/operation/addTeamMembers"},{"title":"Remove members from team","openapi":"openapi.yaml DELETE /v1/teams/{id}/members","href":"/api/Teams/operation/removeTeamMember"}]},{"group":"Experiment Templates","pages":[{"title":"Get a single experimentTemplate","openapi":"openapi.yaml GET /v1/experiment-templates/{id}","href":"/api/ExperimentTemplates/operation/getExperimentTemplate"},{"title":"Update a single experimentTemplate","openapi":"openapi.yaml PUT /v1/experiment-templates/{id}","href":"/api/ExperimentTemplates/operation/updateExperimentTemplate"},{"title":"Delete a single experimentTemplate","openapi":"openapi.yaml DELETE /v1/experiment-templates/{id}","href":"/api/ExperimentTemplates/operation/deleteExperimentTemplate"},{"title":"Get all experimentTemplates","openapi":"openapi.yaml GET /v1/experiment-templates","href":"/api/ExperimentTemplates/operation/listExperimentTemplates"},{"title":"Create a single experimentTemplate","openapi":"openapi.yaml POST /v1/experiment-templates","href":"/api/ExperimentTemplates/operation/createExperimentTemplate"},{"title":"Bulk create or update experiment templates","openapi":"openapi.yaml POST /v1/experiment-templates/bulk-import","href":"/api/ExperimentTemplates/operation/bulkImportExperimentTemplates"}]},{"group":"Analytics Explorations","pages":[{"title":"Create a Metric based visualization","openapi":"openapi.yaml POST /v1/product-analytics/metric-exploration","href":"/api/AnalyticsExplorations/operation/postMetricExploration"},{"title":"Run a Fact Table based visualization","openapi":"openapi.yaml POST /v1/product-analytics/fact-table-exploration","href":"/api/AnalyticsExplorations/operation/postFactTableExploration"},{"title":"Create a Data Source based visualization","openapi":"openapi.yaml POST /v1/product-analytics/data-source-exploration","href":"/api/AnalyticsExplorations/operation/postDataSourceExploration"},{"title":"Create a SQL based visualization","openapi":"openapi.yaml POST /v1/product-analytics/sql-exploration","href":"/api/AnalyticsExplorations/operation/postSqlExploration"},{"title":"Run a Funnel based visualization","openapi":"openapi.yaml POST /v1/product-analytics/funnel-exploration","href":"/api/AnalyticsExplorations/operation/postFunnelExploration"},{"title":"Run a User Journey based visualization","openapi":"openapi.yaml POST /v1/product-analytics/journey-exploration","href":"/api/AnalyticsExplorations/operation/postJourneyExploration"},{"title":"Search Product Analytics resources","openapi":"openapi.yaml GET /v1/product-analytics/search","href":"/api/AnalyticsExplorations/operation/searchProductAnalyticsResources"},{"title":"List columns available to a Product Analytics exploration","openapi":"openapi.yaml GET /v1/product-analytics/columns","href":"/api/AnalyticsExplorations/operation/getProductAnalyticsColumns"},{"title":"Fetch values for Product Analytics string columns","openapi":"openapi.yaml POST /v1/product-analytics/column-values","href":"/api/AnalyticsExplorations/operation/getProductAnalyticsColumnValues"},{"title":"Get a Product Analytics exploration","openapi":"openapi.yaml GET /v1/product-analytics/explorations/{id}","href":"/api/AnalyticsExplorations/operation/getProductAnalyticsExploration"}]},{"group":"Ramp Schedule Templates","pages":[{"title":"Get a single rampScheduleTemplate","openapi":"openapi.yaml GET /v1/ramp-schedule-templates/{id}","href":"/api/RampScheduleTemplates/operation/getRampScheduleTemplate"},{"title":"Update a single rampScheduleTemplate","openapi":"openapi.yaml PUT /v1/ramp-schedule-templates/{id}","href":"/api/RampScheduleTemplates/operation/updateRampScheduleTemplate"},{"title":"Delete a single rampScheduleTemplate","openapi":"openapi.yaml DELETE /v1/ramp-schedule-templates/{id}","href":"/api/RampScheduleTemplates/operation/deleteRampScheduleTemplate"},{"title":"Get all rampScheduleTemplates","openapi":"openapi.yaml GET /v1/ramp-schedule-templates","href":"/api/RampScheduleTemplates/operation/listRampScheduleTemplates"},{"title":"Create a single rampScheduleTemplate","openapi":"openapi.yaml POST /v1/ramp-schedule-templates","href":"/api/RampScheduleTemplates/operation/createRampScheduleTemplate"}]},{"group":"Learnings","pages":[{"title":"Get a single learning","openapi":"openapi.yaml GET /v1/learnings/{id}","href":"/api/Learnings/operation/getLearning"},{"title":"Update a single learning","openapi":"openapi.yaml PUT /v1/learnings/{id}","href":"/api/Learnings/operation/updateLearning"},{"title":"Delete a single learning","openapi":"openapi.yaml DELETE /v1/learnings/{id}","href":"/api/Learnings/operation/deleteLearning"},{"title":"Get all learnings","openapi":"openapi.yaml GET /v1/learnings","href":"/api/Learnings/operation/listLearnings"},{"title":"Create a single learning","openapi":"openapi.yaml POST /v1/learnings","href":"/api/Learnings/operation/createLearning"},{"title":"Search saved Learnings by meaning rather than keyword","openapi":"openapi.yaml POST /v1/learnings/search","href":"/api/Learnings/operation/searchLearnings"}]},{"group":"Holdouts","pages":[{"title":"Get a single holdout","openapi":"openapi.yaml GET /v1/holdouts/{id}","href":"/api/Holdouts/operation/getHoldout"},{"title":"Update a single holdout","openapi":"openapi.yaml PUT /v1/holdouts/{id}","href":"/api/Holdouts/operation/updateHoldout"},{"title":"Get all holdouts","openapi":"openapi.yaml GET /v1/holdouts","href":"/api/Holdouts/operation/listHoldouts"},{"title":"Create a single holdout","openapi":"openapi.yaml POST /v1/holdouts","href":"/api/Holdouts/operation/createHoldout"},{"title":"Start the Holdout's Active Period","openapi":"openapi.yaml POST /v1/holdouts/{id}/start","href":"/api/Holdouts/operation/startHoldout"},{"title":"Start the Holdout's Analysis Period","openapi":"openapi.yaml POST /v1/holdouts/{id}/start-analysis","href":"/api/Holdouts/operation/startHoldoutAnalysis"},{"title":"Stop a Holdout","openapi":"openapi.yaml POST /v1/holdouts/{id}/stop","href":"/api/Holdouts/operation/stopHoldout"}]},{"group":"Auto Runs","pages":[{"title":"Get all autoRuns","openapi":"openapi.yaml GET /v1/auto-runs","href":"/api/AutoRuns/operation/listAutoRuns"},{"title":"Create a single autoRun","openapi":"openapi.yaml POST /v1/auto-runs","href":"/api/AutoRuns/operation/createAutoRun"},{"title":"Get a single autoRun","openapi":"openapi.yaml GET /v1/auto-runs/{id}","href":"/api/AutoRuns/operation/getAutoRun"},{"title":"Update a single autoRun","openapi":"openapi.yaml PUT /v1/auto-runs/{id}","href":"/api/AutoRuns/operation/updateAutoRun"},{"title":"Record something an auto run created","openapi":"openapi.yaml POST /v1/auto-runs/{id}/artifacts","href":"/api/AutoRuns/operation/appendAutoRunArtifact"}]},{"group":"Populations","tag":"BETA","pages":[{"title":"Get all populations","openapi":"openapi.yaml GET /v1/populations","href":"/api/Populations/operation/listPopulations"},{"title":"Create a single population","openapi":"openapi.yaml POST /v1/populations","href":"/api/Populations/operation/createPopulation"},{"title":"Get a single population","openapi":"openapi.yaml GET /v1/populations/{id}","href":"/api/Populations/operation/getPopulation"},{"title":"Update a single population","openapi":"openapi.yaml PUT /v1/populations/{id}","href":"/api/Populations/operation/updatePopulation"},{"title":"Delete a single population","openapi":"openapi.yaml DELETE /v1/populations/{id}","href":"/api/Populations/operation/deletePopulation"}]}]},{"group":"Models","pages":[{"title":"Aggregated Fact Table","href":"/api/AggregatedFactTable_model"},{"title":"Analytics Exploration","href":"/api/AnalyticsExploration_model"},{"title":"Archetype","href":"/api/Archetype_model"},{"title":"Attribute","href":"/api/Attribute_model"},{"title":"Auto Run","href":"/api/AutoRun_model"},{"title":"Code Ref","href":"/api/CodeRef_model"},{"title":"Config","href":"/api/Config_model"},{"title":"Config Key Usage","href":"/api/ConfigKeyUsage_model"},{"title":"Config Lineage","href":"/api/ConfigLineage_model"},{"title":"Config References","href":"/api/ConfigReferences_model"},{"title":"Config Revision","href":"/api/ConfigRevision_model"},{"title":"Config Revision Activity Log Entry","href":"/api/ConfigRevisionActivityLogEntry_model"},{"title":"Config Revision Ref","href":"/api/ConfigRevisionRef_model"},{"title":"Config Revision Review","href":"/api/ConfigRevisionReview_model"},{"title":"Config Schema Export","href":"/api/ConfigSchemaExport_model"},{"title":"Config Schema Source","href":"/api/ConfigSchemaSource_model"},{"title":"Config Schema Verify","href":"/api/ConfigSchemaVerify_model"},{"title":"Config Schema Warning","href":"/api/ConfigSchemaWarning_model"},{"title":"Confirmation","href":"/api/Confirmation_model"},{"title":"Confirmation Held","href":"/api/ConfirmationHeld_model"},{"title":"Constant","href":"/api/Constant_model"},{"title":"Constant References","href":"/api/ConstantReferences_model"},{"title":"Constant Revision","href":"/api/ConstantRevision_model"},{"title":"Constant Revision Activity Log Entry","href":"/api/ConstantRevisionActivityLogEntry_model"},{"title":"Constant Revision Ref","href":"/api/ConstantRevisionRef_model"},{"title":"Constant Revision Review","href":"/api/ConstantRevisionReview_model"},{"title":"Contextual Bandit","href":"/api/ContextualBandit_model"},{"title":"Contextual Bandit Query","href":"/api/ContextualBanditQuery_model"},{"title":"Custom Field","href":"/api/CustomField_model"},{"title":"Custom Hook","href":"/api/CustomHook_model"},{"title":"Dashboard","href":"/api/Dashboard_model"},{"title":"Data Source","href":"/api/DataSource_model"},{"title":"Dimension","href":"/api/Dimension_model"},{"title":"Environment","href":"/api/Environment_model"},{"title":"Event User","href":"/api/EventUser_model"},{"title":"Experiment","href":"/api/Experiment_model"},{"title":"Experiment Rule","href":"/api/Experiment Rule_model"},{"title":"Experiment Analysis Settings","href":"/api/ExperimentAnalysisSettings_model"},{"title":"Experiment Decision Framework Settings","href":"/api/ExperimentDecisionFrameworkSettings_model"},{"title":"Experiment Metric","href":"/api/ExperimentMetric_model"},{"title":"Experiment Metric Override Entry","href":"/api/ExperimentMetricOverrideEntry_model"},{"title":"Experiment Results","href":"/api/ExperimentResults_model"},{"title":"Experiment Snapshot","href":"/api/ExperimentSnapshot_model"},{"title":"Experiment Template","href":"/api/ExperimentTemplate_model"},{"title":"Experiment With Enhanced Status","href":"/api/ExperimentWithEnhancedStatus_model"},{"title":"Fact Metric","href":"/api/FactMetric_model"},{"title":"Fact Table","href":"/api/FactTable_model"},{"title":"Fact Table Column","href":"/api/FactTableColumn_model"},{"title":"Fact Table Filter","href":"/api/FactTableFilter_model"},{"title":"Feature Base Rule","href":"/api/FeatureBaseRule_model"},{"title":"Feature Contextual Bandit Ref Rule","href":"/api/FeatureContextualBanditRefRule_model"},{"title":"Feature Definition","href":"/api/FeatureDefinition_model"},{"title":"Feature Environment V1","href":"/api/FeatureEnvironmentV1_model"},{"title":"Feature Environment V2","href":"/api/FeatureEnvironmentV2_model"},{"title":"Feature Experiment Ref Rule","href":"/api/FeatureExperimentRefRule_model"},{"title":"Feature Experiment Rule","href":"/api/FeatureExperimentRule_model"},{"title":"Feature Force Rule","href":"/api/FeatureForceRule_model"},{"title":"Feature Revision Ref","href":"/api/FeatureRevisionRef_model"},{"title":"Feature Revision Summary","href":"/api/FeatureRevisionSummary_model"},{"title":"Feature Revision V1","href":"/api/FeatureRevisionV1_model"},{"title":"Feature Revision V2","href":"/api/FeatureRevisionV2_model"},{"title":"Feature Rollout Rule","href":"/api/FeatureRolloutRule_model"},{"title":"Feature Rule V1","href":"/api/FeatureRuleV1_model"},{"title":"Feature Rule V2","href":"/api/FeatureRuleV2_model"},{"title":"Feature Safe Rollout Rule","href":"/api/FeatureSafeRolloutRule_model"},{"title":"Feature V1","href":"/api/FeatureV1_model"},{"title":"Feature V2","href":"/api/FeatureV2_model"},{"title":"Feature With Revisions V1","href":"/api/FeatureWithRevisionsV1_model"},{"title":"Feature With Revisions V2","href":"/api/FeatureWithRevisionsV2_model"},{"title":"Holdout","href":"/api/Holdout_model"},{"title":"Information Schema","href":"/api/InformationSchema_model"},{"title":"Information Schema Table","href":"/api/InformationSchemaTable_model"},{"title":"Interleaving","href":"/api/Interleaving_model"},{"title":"Interleaving Exposure Query","href":"/api/InterleavingExposureQuery_model"},{"title":"Interleaving Snapshot","href":"/api/InterleavingSnapshot_model"},{"title":"Interleaving Snapshot Status","href":"/api/InterleavingSnapshotStatus_model"},{"title":"Learning","href":"/api/Learning_model"},{"title":"Lookback Override","href":"/api/LookbackOverride_model"},{"title":"Member","href":"/api/Member_model"},{"title":"Metric","href":"/api/Metric_model"},{"title":"Metric Analysis","href":"/api/MetricAnalysis_model"},{"title":"Metric Group","href":"/api/MetricGroup_model"},{"title":"Metric Usage","href":"/api/MetricUsage_model"},{"title":"Namespace","href":"/api/Namespace_model"},{"title":"Namespace Experiment Member","href":"/api/NamespaceExperimentMember_model"},{"title":"Organization","href":"/api/Organization_model"},{"title":"Pagination Fields","href":"/api/PaginationFields_model"},{"title":"Population","href":"/api/Population_model"},{"title":"Project","href":"/api/Project_model"},{"title":"Query","href":"/api/Query_model"},{"title":"Ramp Schedule","href":"/api/RampSchedule_model"},{"title":"Ramp Schedule Template","href":"/api/RampScheduleTemplate_model"},{"title":"Report","href":"/api/Report_model"},{"title":"Require Review Rule","href":"/api/RequireReviewRule_model"},{"title":"Require Review Rule Input","href":"/api/RequireReviewRuleInput_model"},{"title":"Revision Id Ref","href":"/api/RevisionIdRef_model"},{"title":"Safe Rollout Rule","href":"/api/Safe Rollout Rule_model"},{"title":"Saved Group","href":"/api/SavedGroup_model"},{"title":"Saved Group Approval Rule","href":"/api/SavedGroupApprovalRule_model"},{"title":"Saved Group Reference Resource","href":"/api/SavedGroupReferenceResource_model"},{"title":"Saved Group References","href":"/api/SavedGroupReferences_model"},{"title":"Saved Group Revision","href":"/api/SavedGroupRevision_model"},{"title":"Saved Group Revision Activity Log Entry","href":"/api/SavedGroupRevisionActivityLogEntry_model"},{"title":"Saved Group Revision Ref","href":"/api/SavedGroupRevisionRef_model"},{"title":"Saved Group Revision Review","href":"/api/SavedGroupRevisionReview_model"},{"title":"Saved Group Upload","href":"/api/SavedGroupUpload_model"},{"title":"Schedule Rule","href":"/api/ScheduleRule_model"},{"title":"Scheduled Stop Plan","href":"/api/ScheduledStopPlan_model"},{"title":"Sdk Connection","href":"/api/SdkConnection_model"},{"title":"Segment","href":"/api/Segment_model"},{"title":"Settings","href":"/api/Settings_model"},{"title":"Targeting Rule","href":"/api/Targeting Rule_model"},{"title":"Targeting Review Rule","href":"/api/TargetingReviewRule_model"},{"title":"Team","href":"/api/Team_model"},{"title":"Visual Change","href":"/api/VisualChange_model"},{"title":"Visual Changeset","href":"/api/VisualChangeset_model"},{"title":"Visual Editor Cb Experiment Stub","href":"/api/VisualEditorCbExperimentStub_model"}]}]}]},"basePath":"","title":"Create a single feature - GrowthBook Documentation","buildId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","deploymentId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","dynamics":["10e4515597","c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["BannerMarkdown-DV-WToSZ.js","dist-CBUH0-zX.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-CR-RHrVC.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","OpenApiReferenceProvider-C-hEh3I2.js","utils-CnF4QiUD.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C7PVNbel.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-8ytevL2A.js","snippetPresets-BT1alx3v.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","Page-C945cI-W.js","ApiExamples-BLXC0i_W.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CyLIGI9_.js","shallow-DC0lGVIW.js","getApiPlaygroundDisplay-CgDQ85tN.js","CodeSnippet-6-I-Gpv9.js","CodeSnippets-BAk1kDdu.js","getPastedJson-B276RuWN.js","icon-BqP8etTm.js","MethodPill-DM6sbxG1.js","DuplicateIcon-PyJglOaE.js","createIcon-CMeOMAc_.js","DynamicMarkdown-BoyYAA8K.js","SectionHeading-DAYv3gvZ.js","axios-vUo_bRtp.js","Markdown-BhTTmazV.js","AssistantPageLink-BmARFYNC.js"]}