Create Dynamic Config Review

Create Dynamic Config Review

posthttps://statsigapi.net/console/v1/dynamic_configs/{id}/reviews

Authorizations

STATSIG-API-KEYstringrequired

apiKey (header)

Path parameters

idstringrequired

Body

application/json
descriptionstringrequired

Human-readable description of the proposed change.

Constraints:min length: 1max length: 2000
reviewer_idsstring[]

User IDs to request review from.

Default:[]
reviewer_group_idsstring[]

Reviewer group IDs to request review from.

Default:[]
changeobjectrequired

The proposed change. Provide exactly one change slot: the content bundle (rules and/or default_value), one verb/metadata field, or restore.

Show child attributes
rulesobject[]

Proposed full rule set for the dynamic config. Same shape as the DC update contract.

namestringrequired

The name of this rule.

passPercentagenumber

Of the users that meet the conditions of this rule, what percent should return true.

Constraints:min: 0max: 100
conditionsobject[]required

An array of Condition objects.

targetValueoneOf
Constraints:nullablestring[]number[]stringnumber
operatorstring
fieldstring
Constraints:nullable
customIDstring
Constraints:nullable
typestringrequired
Allowed values:app_versionbrowser_namebrowser_versioncountrycustom_fieldemailenvironment_tierfails_gatefails_segmentip_addresslocaleos_nameos_versionpasses_gatepasses_segmentpublictimeunit_iduser_iduser_agenturljavascriptdevice_modeltarget_appexperiment_group
environmentsstring[]
Constraints:nullable
idstring

The Statsig ID of this rule.

baseIDstring

The base ID of this rule, i.e. without any added metadata. Will remain the exact same throughout

returnValueobject
completedAutomatedRolloutsobject[]

Read-only: Automated rollout phases that have already completed.

timenumber
passPercentnumberrequired
pendingAutomatedRolloutsobject[]

Read-only: Automated rollout phases that are scheduled but not yet complete.

timenumber
passPercentnumberrequired
returnValueJson5string
variantsobject[]
idstring
namestringrequired
passPercentagenumberrequired
Constraints:min: 0max: 100
returnValueobject
returnValueJson5string
default_valueobject

Proposed default value for the dynamic config as a JSON object.

is_enabledboolean

Proposed enabled state for the dynamic config. An explicit target, not a toggle.

is_archivedboolean

Proposed archived state for the dynamic config. true archives, false unarchives.

deleteboolean

Delete the dynamic config. Set to true.

Allowed values:true
resaltboolean

Re-randomize the dynamic config's salt. Set to true.

Allowed values:true
disable_reviews_locallyboolean

Stop requiring review on this dynamic config. Set to true.

Allowed values:true
restoreobject

Revert to a prior committed snapshot (review type rules).

snapshot_idstringrequired

Snapshot ID (SUID) of the committed historical state to restore.

Constraints:min length: 1
release_pipeline_idstring

Set or clear the dynamic config's release pipeline (review type update_release_pipeline). Pass a pipeline ID to attach, or null to detach.

Constraints:nullablemin length: 1
id_typestring

Change the dynamic config's primary unit ID type (review type edit_id_type).

Constraints:min length: 1
allow_self_approvalboolean

Whether this dynamic config's reviews may be self-approved (review type update_allow_self_approval).

target_app_idsstring[]

Replace the dynamic config's target applications (review type update_target_applications).

allowed_reviewersobject

Set who may review this dynamic config (review type allowed_reviewers).

user_idsstring[]

User IDs allowed to review. Replaces the existing set.

group_idsstring[]

Reviewer group IDs allowed to review. Replaces the existing set.

Response

application/json
201· The created dynamic config review.
messagestringrequired

A simple string explaining the result of the operation.

dataobjectrequired
Show child attributes
review_idstringrequired

Unique ID of the review.

statusstringrequired

Lifecycle status of the review.

Allowed values:pendingacceptedrejectedcommittedchanges_requestedpending_webhook_validationfailed_webhook_validationapproved_webhook_validation
typestringrequired

Kind of change the review proposes.

Allowed values:rulestoggle_enabledarchivedeleteresaltdisable_reviews_locallyupdate_teamupdate_release_pipelineedit_id_typeupdate_allow_self_approvalupdate_target_applicationsupdate_ownersallowed_reviewers
authorobjectrequired

The user who created the review.

idstringrequired
emailstringrequired
Constraints:nullable
reviewersobject[]required

Requested reviewers (users and groups).

idstringrequired
kindstringrequired
Allowed values:usergroup
descriptionstringrequired

Human-readable description of the proposed change.

created_atstringrequired

ISO-8601 timestamp of when the review was created.

contentobject

The proposed change, as a current / proposed pair over only the fields this review type updates. null means — and only ever means — that this review type carries no proposed value (delete, resalt, disable_reviews_locally); those are fully described by type. When the change exists but could not be read back, content is present with an unavailable_reason instead, so the two cases stay distinguishable. Only populated on single-review responses (get / create / edit / approve / reject); the list endpoint omits it entirely rather than paying a snapshot read per row.

Constraints:nullable
typestringrequired

Same value as the envelope type, repeated for self-containment.

Allowed values:rulestoggle_enabledarchivedeleteresaltdisable_reviews_locallyupdate_teamupdate_release_pipelineedit_id_typeupdate_allow_self_approvalupdate_target_applicationsupdate_ownersallowed_reviewers
currentobjectrequired

The entity's live value at read time, for each field this review type updates. Matches the Console's "Original Version (Before)" column for pending reviews. This is NOT status-dependent: for a committed or rejected review it is still the live entity as it stands now, which for a committed review normally equals proposed.

rulesobject[]

The FULL rule array for this side, not just the rules that changed — commit replaces the array wholesale and rule order is evaluation-significant. Rules are serialized exactly as the entity's own read endpoint returns them, so this can be diffed against it with no translation: gates match GET /gates/{id} (no returnValue/returnValueJson5/variants — a gate rule has no return value), dynamic configs match GET /dynamic_configs/{id} and do carry those three.

namestringrequired

The name of this rule.

passPercentagenumberrequired

Of the users that meet the conditions of this rule, what percent should return true.

Constraints:min: 0max: 100
conditionsobject[]required

An array of Condition objects.

targetValueoneOf
Constraints:nullablestring[]number[]stringnumber
operatorstring
fieldstring
Constraints:nullable
customIDstring
Constraints:nullable
typestringrequired
Allowed values:app_versionbrowser_namebrowser_versioncountrycustom_fieldemailenvironment_tierfails_gatefails_segmentip_addresslocaleos_nameos_versionpasses_gatepasses_segmentpublictimeunit_iduser_iduser_agenturljavascriptdevice_modeltarget_appexperiment_group
environmentsstring[]
Constraints:nullable
idstring

The Statsig ID of this rule.

baseIDstring

The base ID of this rule, i.e. without any added metadata. Will remain the exact same throughout

returnValueobject
completedAutomatedRolloutsobject[]

Read-only: Automated rollout phases that have already completed.

timenumber
passPercentnumberrequired
pendingAutomatedRolloutsobject[]

Read-only: Automated rollout phases that are scheduled but not yet complete.

timenumber
passPercentnumberrequired
returnValueJson5string
variantsobject[]
idstring
namestringrequired
passPercentagenumberrequired
Constraints:min: 0max: 100
returnValueobject
returnValueJson5string
is_enabledboolean
default_valueunknown

The config's default value. Parsed JSON when parseable, otherwise the raw stored string. For a gate this is the launch flag: true means "launched" (serve the gate to everyone), false means plain enabled/disabled.

is_launchedboolean

Dynamic configs only. Whether the config is serving its launched payload to every user, bypassing rules. Derived: a dynamic config is launched when it is disabled AND has a launched payload. This is the dynamic-config equivalent of a gate's default_value: true, and it is what a dynamic config toggle_enabled review actually moves — default_value plays no part in that decision.

launched_payloadunknown

Dynamic configs only. The value served to every user while the config is launched; null when it is not launched. Parsed JSON when parseable. Omitted entirely for secret dynamic configs — unlike default_value, the launched payload has no ciphertext-preserving accessor, so surfacing it would put a secret in cleartext on a response that GET /console/v1/dynamic_configs/{id} never returns it on. Use is_launched to see the state change for those.

default_value_gradual_rolloutobject

Dynamic configs only. The in-progress partial rollout of a new default value, or null when there is none. Omitted for secret dynamic configs: the target value is stored unencrypted inside the snapshot, so it is suppressed for the same reason as launched_payload.

Constraints:nullable
idstringrequired
target_valueunknown
percentage_passnumberrequired
Constraints:format: double
saltstringrequired
rolloutsobject[]required
Constraints:nullable
timenumberrequired
pass_percentnumberrequired
is_completebooleanrequired
saltstring

The bucketing salt. Present when committing would change it — which re-buckets every user in every percentage rollout on this config, even though no rule text moved. A restore review that reverts past a resalt is the case to watch for.

descriptionstring
show_dev_rulesboolean
show_staging_rulesboolean
subscribersobject[]

Who is notified about alerts on this config (users, teams, Slack channels, PagerDuty on-calls).

typestringrequired
idstringrequired
analytics_enabledboolean
scheduled_reloadobject

Gates only. The DWH-native scheduled-reload settings, which commit writes as a unit. Absent on non-warehouse-native projects, where none of it is set on either side.

hournumberrequired
Constraints:format: doublenullable
daysnumber[]required
Constraints:nullable
reload_typestringrequired
Allowed values:incrementalfull
turbo_modebooleanrequired
Constraints:nullable
is_archivedboolean

Present on archive reviews. Archive and unarchive share the external type archive, so this field is what distinguishes them.

id_typestring
secondary_id_typestring
Constraints:nullable
identity_resolution_source_idstring
Constraints:nullable
target_app_idsstring[]
ownersobject[]
owner_idstringrequired
owner_typestringrequired
team_idstring
Constraints:nullable
allow_self_approvalboolean
release_pipeline_idstring
Constraints:nullable
allowed_reviewersobject

Who may approve reviews on this config. Carried by allowed_reviewers reviews, which set it outright, and ALSO by update_team reviews, which can widen it as a side effect: moving a config onto a team whose review-approval mode is admin_only appends that team's admins to user_ids, and team_only appends the team itself to group_ids. Identical values on both sides of an update_team review mean that move grants no new approval rights.

user_idsstring[]required
group_idsstring[]required
schemastring
Constraints:nullable
monitoring_metricsobject[]
namestringrequired
typestringrequired
monitoring_metric_tagsobject[]
idstringrequired
real_time_metricsobject[]
namestringrequired
typestringrequired
overridesobject
id_overridesobject[]required
idsstring[]required
groupIDstringrequired
environmentstring
Constraints:nullable
unitIDstring
Constraints:nullable
custom_id_overridesobject[]required
idsstring[]required
groupIDstringrequired
environmentstring
Constraints:nullable
unitIDstring
Constraints:nullable
proposedobjectrequired

The value this review proposes — what commit will apply. Carries exactly the same keys as current. Array-valued fields carry the full array on both sides, never only the changed elements.

rulesobject[]

The FULL rule array for this side, not just the rules that changed — commit replaces the array wholesale and rule order is evaluation-significant. Rules are serialized exactly as the entity's own read endpoint returns them, so this can be diffed against it with no translation: gates match GET /gates/{id} (no returnValue/returnValueJson5/variants — a gate rule has no return value), dynamic configs match GET /dynamic_configs/{id} and do carry those three.

namestringrequired

The name of this rule.

passPercentagenumberrequired

Of the users that meet the conditions of this rule, what percent should return true.

Constraints:min: 0max: 100
conditionsobject[]required

An array of Condition objects.

targetValueoneOf
Constraints:nullablestring[]number[]stringnumber
operatorstring
fieldstring
Constraints:nullable
customIDstring
Constraints:nullable
typestringrequired
Allowed values:app_versionbrowser_namebrowser_versioncountrycustom_fieldemailenvironment_tierfails_gatefails_segmentip_addresslocaleos_nameos_versionpasses_gatepasses_segmentpublictimeunit_iduser_iduser_agenturljavascriptdevice_modeltarget_appexperiment_group
environmentsstring[]
Constraints:nullable
idstring

The Statsig ID of this rule.

baseIDstring

The base ID of this rule, i.e. without any added metadata. Will remain the exact same throughout

returnValueobject
completedAutomatedRolloutsobject[]

Read-only: Automated rollout phases that have already completed.

timenumber
passPercentnumberrequired
pendingAutomatedRolloutsobject[]

Read-only: Automated rollout phases that are scheduled but not yet complete.

timenumber
passPercentnumberrequired
returnValueJson5string
variantsobject[]
idstring
namestringrequired
passPercentagenumberrequired
Constraints:min: 0max: 100
returnValueobject
returnValueJson5string
is_enabledboolean
default_valueunknown

The config's default value. Parsed JSON when parseable, otherwise the raw stored string. For a gate this is the launch flag: true means "launched" (serve the gate to everyone), false means plain enabled/disabled.

is_launchedboolean

Dynamic configs only. Whether the config is serving its launched payload to every user, bypassing rules. Derived: a dynamic config is launched when it is disabled AND has a launched payload. This is the dynamic-config equivalent of a gate's default_value: true, and it is what a dynamic config toggle_enabled review actually moves — default_value plays no part in that decision.

launched_payloadunknown

Dynamic configs only. The value served to every user while the config is launched; null when it is not launched. Parsed JSON when parseable. Omitted entirely for secret dynamic configs — unlike default_value, the launched payload has no ciphertext-preserving accessor, so surfacing it would put a secret in cleartext on a response that GET /console/v1/dynamic_configs/{id} never returns it on. Use is_launched to see the state change for those.

default_value_gradual_rolloutobject

Dynamic configs only. The in-progress partial rollout of a new default value, or null when there is none. Omitted for secret dynamic configs: the target value is stored unencrypted inside the snapshot, so it is suppressed for the same reason as launched_payload.

Constraints:nullable
idstringrequired
target_valueunknown
percentage_passnumberrequired
Constraints:format: double
saltstringrequired
rolloutsobject[]required
Constraints:nullable
timenumberrequired
pass_percentnumberrequired
is_completebooleanrequired
saltstring

The bucketing salt. Present when committing would change it — which re-buckets every user in every percentage rollout on this config, even though no rule text moved. A restore review that reverts past a resalt is the case to watch for.

descriptionstring
show_dev_rulesboolean
show_staging_rulesboolean
subscribersobject[]

Who is notified about alerts on this config (users, teams, Slack channels, PagerDuty on-calls).

typestringrequired
idstringrequired
analytics_enabledboolean
scheduled_reloadobject

Gates only. The DWH-native scheduled-reload settings, which commit writes as a unit. Absent on non-warehouse-native projects, where none of it is set on either side.

hournumberrequired
Constraints:format: doublenullable
daysnumber[]required
Constraints:nullable
reload_typestringrequired
Allowed values:incrementalfull
turbo_modebooleanrequired
Constraints:nullable
is_archivedboolean

Present on archive reviews. Archive and unarchive share the external type archive, so this field is what distinguishes them.

id_typestring
secondary_id_typestring
Constraints:nullable
identity_resolution_source_idstring
Constraints:nullable
target_app_idsstring[]
ownersobject[]
owner_idstringrequired
owner_typestringrequired
team_idstring
Constraints:nullable
allow_self_approvalboolean
release_pipeline_idstring
Constraints:nullable
allowed_reviewersobject

Who may approve reviews on this config. Carried by allowed_reviewers reviews, which set it outright, and ALSO by update_team reviews, which can widen it as a side effect: moving a config onto a team whose review-approval mode is admin_only appends that team's admins to user_ids, and team_only appends the team itself to group_ids. Identical values on both sides of an update_team review mean that move grants no new approval rights.

user_idsstring[]required
group_idsstring[]required
schemastring
Constraints:nullable
monitoring_metricsobject[]
namestringrequired
typestringrequired
monitoring_metric_tagsobject[]
idstringrequired
real_time_metricsobject[]
namestringrequired
typestringrequired
overridesobject
id_overridesobject[]required
idsstring[]required
groupIDstringrequired
environmentstring
Constraints:nullable
unitIDstring
Constraints:nullable
custom_id_overridesobject[]required
idsstring[]required
groupIDstringrequired
environmentstring
Constraints:nullable
unitIDstring
Constraints:nullable
unavailable_reasonstring

Present ONLY when the change could not be read back, in which case current and proposed are both empty objects and carry no meaning. This exists so that "this review type has nothing to propose" (content: null) is never confused with "we could not tell you what this review would do". snapshot_not_found: the review's snapshot no longer exists — expected for old reviews, whose snapshots are pruned as the config accumulates newer ones. snapshot_unreadable: the snapshot exists but could not be read or serialized; that is a server-side fault and is logged.

Allowed values:snapshot_not_foundsnapshot_unreadable

Was this helpful?