Approve Dynamic Config Review

Approve Dynamic Config Review

puthttps://statsigapi.net/console/v1/dynamic_configs/{id}/reviews/{reviewID}/approve

Authorizations

STATSIG-API-KEYstringrequired

apiKey (header)

Path parameters

idstringrequired
reviewIDstringrequired

Body

application/json
reasonstring

Optional comment recorded with the approval.

Constraints:max length: 2000

Response

application/json
200· The approved 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
404· Not Found. The requested resource could not be found.
statusintegerrequired
Allowed values:404
messagestringrequired

Was this helpful?