Approve Experiment Review

Approve Experiment Review

puthttps://statsigapi.net/console/v1/experiments/{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 experiment 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:startstoppauserestartabandonarchivedeletemake_decisionupdate_settingsupdate_overridesupdate_target_applicationsupdate_allowed_reviewersupdate_default_impact_multiplierscheduled_startscheduled_start_editdisable_reviews_locallyrolloutschedule_rolloutreallocatechange_enabled_groupsunarchiveupdate_ownersupdate_team
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 this review would apply, as { current, proposed } over exactly the fields committing the review would write. current is the live value read at request time; where commit treats an unset argument as "leave unchanged", proposed repeats the live value rather than a default. Populated on single-review responses only — list responses omit it so a page of reviews does not pay an extra read per row. When the review does propose something but it could not be read back, content is PRESENT with unavailable_reason set and both value objects empty, never null — so "this type proposes nothing" stays distinguishable from "we cannot tell you what this would do". This surface's reasons are review_data_unavailable (the stored change data is missing or does not match the type the review declares; expected on legacy rows) and content_unreadable (the data is present but the before/after could not be assembled; a logged server-side fault). null when the review type is a bare action with no recoverable proposed value: stop, pause, restart, reallocate, delete, disable_reviews_locally (always), start (unless the review carries a backdated start date that commit will actually write — analysis-only experiments on warehouse-native projects), scheduled_start_edit when new_time is ignore (commit is a no-op), and update_settings on an autotune (the stored settings have no experiment-contract shape). Every other type carries content, including archive, unarchive, update_owners, update_team, change_enabled_groups and update_allowed_reviewers, for which the Console currently shows no before/after. Keys by type: archive/unarchive -> archived, allocation (archiving a layer-bound experiment zeroes its allocation); abandon -> decision_note_title, decision_reason; start -> start_time; scheduled_start/scheduled_start_edit -> start_time; rollout -> group_id, rollout_percentage, rollout_phases, has_upcoming_automated_rollout; schedule_rollout -> group_id, rollout_phases; make_decision -> winning_group_id, decision_note_title, decision_reason, and on experiments overrides, id_overrides, inline_targeting_rules_json, targeting_gate_id; update_overrides -> overrides, id_overrides, allow_overrides_in_pulse; update_target_applications -> target_app_ids; update_default_impact_multiplier -> default_impact_multiplier; update_owners -> owners; update_team -> team_id, allowed_reviewer_user_ids, allowed_reviewer_group_ids (moving to a team whose approval mode is admin_only/team_only widens who may approve future reviews); update_allowed_reviewers -> allowed_reviewer_user_ids, allowed_reviewer_group_ids; change_enabled_groups -> groups (the full list, with the delta applied); update_settings -> a single settings object holding the full resolved settings set, including overrides, idOverrides, allowOverridesInPulse and customScorecardSections.

Constraints:nullable
typestringrequired

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

Allowed values:startstoppauserestartabandonarchivedeletemake_decisionupdate_settingsupdate_overridesupdate_target_applicationsupdate_allowed_reviewersupdate_default_impact_multiplierscheduled_startscheduled_start_editdisable_reviews_locallyrolloutschedule_rolloutreallocatechange_enabled_groupsunarchiveupdate_ownersupdate_team
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.

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.

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". review_data_unavailable: the review's stored change data is missing, or does not match the type the review declares — expected on legacy rows. content_unreadable: the data is present but the before/after could not be assembled; that is a server-side fault and is logged.

Allowed values:review_data_unavailablecontent_unreadable

Was this helpful?