Approve Dynamic Config Review
Approve Dynamic Config Review
https://statsigapi.net/console/v1/dynamic_configs/{id}/reviews/{reviewID}/approveAuthorizations
STATSIG-API-KEYstringrequiredapiKey (header)
Path parameters
idstringrequiredreviewIDstringrequiredBody
application/jsonreasonstringOptional comment recorded with the approval.
max length: 2000Response
application/jsonmessagestringrequiredA simple string explaining the result of the operation.
dataobjectrequiredShow child attributes
review_idstringrequiredUnique ID of the review.
statusstringrequiredLifecycle status of the review.
pendingacceptedrejectedcommittedchanges_requestedpending_webhook_validationfailed_webhook_validationapproved_webhook_validationtypestringrequiredKind of change the review proposes.
rulestoggle_enabledarchivedeleteresaltdisable_reviews_locallyupdate_teamupdate_release_pipelineedit_id_typeupdate_allow_self_approvalupdate_target_applicationsupdate_ownersallowed_reviewersauthorobjectrequiredThe user who created the review.
idstringrequiredemailstringrequirednullablereviewersobject[]requiredRequested reviewers (users and groups).
idstringrequiredkindstringrequiredusergroupdescriptionstringrequiredHuman-readable description of the proposed change.
created_atstringrequiredISO-8601 timestamp of when the review was created.
contentobjectThe 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.
nullabletypestringrequiredSame value as the envelope type, repeated for self-containment.
rulestoggle_enabledarchivedeleteresaltdisable_reviews_locallyupdate_teamupdate_release_pipelineedit_id_typeupdate_allow_self_approvalupdate_target_applicationsupdate_ownersallowed_reviewerscurrentobjectrequiredThe 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.
namestringrequiredThe name of this rule.
passPercentagenumberrequiredOf the users that meet the conditions of this rule, what percent should return true.
min: 0max: 100conditionsobject[]requiredAn array of Condition objects.
targetValueoneOfnullablestring[]number[]stringnumberoperatorstringfieldstringnullablecustomIDstringnullabletypestringrequiredapp_versionbrowser_namebrowser_versioncountrycustom_fieldemailenvironment_tierfails_gatefails_segmentip_addresslocaleos_nameos_versionpasses_gatepasses_segmentpublictimeunit_iduser_iduser_agenturljavascriptdevice_modeltarget_appexperiment_groupenvironmentsstring[]nullableidstringThe Statsig ID of this rule.
baseIDstringThe base ID of this rule, i.e. without any added metadata. Will remain the exact same throughout
returnValueobjectcompletedAutomatedRolloutsobject[]Read-only: Automated rollout phases that have already completed.
timenumberpassPercentnumberrequiredpendingAutomatedRolloutsobject[]Read-only: Automated rollout phases that are scheduled but not yet complete.
timenumberpassPercentnumberrequiredreturnValueJson5stringvariantsobject[]idstringnamestringrequiredpassPercentagenumberrequiredmin: 0max: 100returnValueobjectreturnValueJson5stringis_enabledbooleandefault_valueunknownThe 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_launchedbooleanDynamic 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_payloadunknownDynamic 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_rolloutobjectDynamic 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.
nullableidstringrequiredtarget_valueunknownpercentage_passnumberrequiredformat: doublesaltstringrequiredrolloutsobject[]requirednullabletimenumberrequiredpass_percentnumberrequiredis_completebooleanrequiredsaltstringThe 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.
descriptionstringshow_dev_rulesbooleanshow_staging_rulesbooleansubscribersobject[]Who is notified about alerts on this config (users, teams, Slack channels, PagerDuty on-calls).
typestringrequiredidstringrequiredanalytics_enabledbooleanscheduled_reloadobjectGates 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.
hournumberrequiredformat: doublenullabledaysnumber[]requirednullablereload_typestringrequiredincrementalfullturbo_modebooleanrequirednullableis_archivedbooleanPresent on archive reviews. Archive and unarchive share the external type archive, so this field is what distinguishes them.
id_typestringsecondary_id_typestringnullableidentity_resolution_source_idstringnullabletarget_app_idsstring[]ownersobject[]owner_idstringrequiredowner_typestringrequiredteam_idstringnullableallow_self_approvalbooleanrelease_pipeline_idstringnullableallowed_reviewersobjectWho 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[]requiredgroup_idsstring[]requiredschemastringnullablemonitoring_metricsobject[]namestringrequiredtypestringrequiredmonitoring_metric_tagsobject[]idstringrequiredreal_time_metricsobject[]namestringrequiredtypestringrequiredoverridesobjectid_overridesobject[]requiredidsstring[]requiredgroupIDstringrequiredenvironmentstringnullableunitIDstringnullablecustom_id_overridesobject[]requiredidsstring[]requiredgroupIDstringrequiredenvironmentstringnullableunitIDstringnullableproposedobjectrequiredThe 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.
namestringrequiredThe name of this rule.
passPercentagenumberrequiredOf the users that meet the conditions of this rule, what percent should return true.
min: 0max: 100conditionsobject[]requiredAn array of Condition objects.
targetValueoneOfnullablestring[]number[]stringnumberoperatorstringfieldstringnullablecustomIDstringnullabletypestringrequiredapp_versionbrowser_namebrowser_versioncountrycustom_fieldemailenvironment_tierfails_gatefails_segmentip_addresslocaleos_nameos_versionpasses_gatepasses_segmentpublictimeunit_iduser_iduser_agenturljavascriptdevice_modeltarget_appexperiment_groupenvironmentsstring[]nullableidstringThe Statsig ID of this rule.
baseIDstringThe base ID of this rule, i.e. without any added metadata. Will remain the exact same throughout
returnValueobjectcompletedAutomatedRolloutsobject[]Read-only: Automated rollout phases that have already completed.
timenumberpassPercentnumberrequiredpendingAutomatedRolloutsobject[]Read-only: Automated rollout phases that are scheduled but not yet complete.
timenumberpassPercentnumberrequiredreturnValueJson5stringvariantsobject[]idstringnamestringrequiredpassPercentagenumberrequiredmin: 0max: 100returnValueobjectreturnValueJson5stringis_enabledbooleandefault_valueunknownThe 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_launchedbooleanDynamic 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_payloadunknownDynamic 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_rolloutobjectDynamic 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.
nullableidstringrequiredtarget_valueunknownpercentage_passnumberrequiredformat: doublesaltstringrequiredrolloutsobject[]requirednullabletimenumberrequiredpass_percentnumberrequiredis_completebooleanrequiredsaltstringThe 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.
descriptionstringshow_dev_rulesbooleanshow_staging_rulesbooleansubscribersobject[]Who is notified about alerts on this config (users, teams, Slack channels, PagerDuty on-calls).
typestringrequiredidstringrequiredanalytics_enabledbooleanscheduled_reloadobjectGates 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.
hournumberrequiredformat: doublenullabledaysnumber[]requirednullablereload_typestringrequiredincrementalfullturbo_modebooleanrequirednullableis_archivedbooleanPresent on archive reviews. Archive and unarchive share the external type archive, so this field is what distinguishes them.
id_typestringsecondary_id_typestringnullableidentity_resolution_source_idstringnullabletarget_app_idsstring[]ownersobject[]owner_idstringrequiredowner_typestringrequiredteam_idstringnullableallow_self_approvalbooleanrelease_pipeline_idstringnullableallowed_reviewersobjectWho 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[]requiredgroup_idsstring[]requiredschemastringnullablemonitoring_metricsobject[]namestringrequiredtypestringrequiredmonitoring_metric_tagsobject[]idstringrequiredreal_time_metricsobject[]namestringrequiredtypestringrequiredoverridesobjectid_overridesobject[]requiredidsstring[]requiredgroupIDstringrequiredenvironmentstringnullableunitIDstringnullablecustom_id_overridesobject[]requiredidsstring[]requiredgroupIDstringrequiredenvironmentstringnullableunitIDstringnullableunavailable_reasonstringPresent 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.
snapshot_not_foundsnapshot_unreadablestatusintegerrequired404messagestringrequiredWas this helpful?