Create Experiment Review
Create Experiment Review
https://statsigapi.net/console/v1/experiments/{id}/reviewsAuthorizations
STATSIG-API-KEYstringrequiredapiKey (header)
Path parameters
idstringrequiredBody
application/jsontypestringrequiredThe kind of experiment change the review proposes.
startstoppauserestartabandonarchivedeletemake_decisionrolloutschedule_rolloutreallocatechange_enabled_groupsunarchiveupdate_ownersupdate_teamupdate_settingsupdate_overridesupdate_target_applicationsupdate_allowed_reviewersupdate_default_impact_multiplierscheduled_startscheduled_start_editscheduled_stopscheduled_stop_editdisable_reviews_locallydescriptionstringHuman-readable description of the proposed change. Optional; recorded empty when omitted (e.g. update_owners, mirroring the console owner-edit flow, which collects no description).
max length: 2000reviewer_idsstring[]User IDs to request review from.
[]reviewer_group_idsstring[]Reviewer group IDs to request review from.
[]reasonstringOptional reason recorded with the change, applied when committed (e.g. stop / pause / abandon / decision reason).
max length: 2000winning_group_idstringFor make_decision: the group to ship. Required.
remove_targetingbooleanFor make_decision: drop targeting on ship (default false).
remove_overridesbooleanFor make_decision: drop overrides on ship (default false).
start_datestringFor start: optional scheduled start date.
stop_timeintegerEpoch-ms time to stop the experiment. Required with stop_action_type for scheduled_stop. For start: optional, and must be sent together with stop_action_type. For scheduled_stop_edit: the new stop time, or null to cancel the pending stop (its action is left unchanged).
format: int64nullablestop_action_typestringWhat the scheduled stop does: pause stops new assignments (Stop New Assignments); stop concludes the experiment and defers the decision (Conclude & Defer Decision). Required with stop_time for scheduled_stop; sent with stop_time for start. For scheduled_stop_edit: the new action; omit to keep the pending action.
pausestopgroup_idstringFor rollout / schedule_rollout: the group to roll out. Required.
rollout_percentagenumberFor rollout: the pass percentage to roll the group out to. Required.
format: doublemin: 0max: 100clear_phasesbooleanFor rollout: clear any scheduled rollout phases (default false).
rollout_phasesobject[]For schedule_rollout: the ordered rollout phases to schedule. Required.
Show child attributes
percentagenumberrequiredPass percentage for this phase (0–100).
min: 0max: 100timenumberAbsolute start time of the phase (epoch ms).
time_stringstringHuman-readable start time of the phase.
is_completebooleanWhether this phase is already complete (default false).
phase_duration_msnumberDuration of the phase, used for progressive rollouts.
enabled_group_namesstring[]For change_enabled_groups: group names to enable.
disabled_group_namesstring[]For change_enabled_groups: group names to disable.
ownersobject[]For update_owners: the replacement owner set. Required.
Show child attributes
owner_idstringrequiredID of the owner (user ID or SDK key ID).
min length: 1owner_typestringKind of owner. Defaults to user.
usersdk_keyteam_idstringFor update_team: the team to assign, or null to clear it.
nullablemin length: 1default_impact_multipliernumberFor update_default_impact_multiplier: the new multiplier. Required.
format: doubletarget_app_idsstring[]For update_target_applications: the full set of target application IDs. Required.
allowed_reviewer_user_idsstring[]For update_allowed_reviewers: the full set of allowed reviewer user IDs.
allowed_reviewer_group_idsstring[]For update_allowed_reviewers: the full set of allowed reviewer group IDs.
start_timeintegerFor scheduled_start: epoch-ms time to schedule the start. Required.
format: int64new_timeintegerFor scheduled_start_edit: epoch-ms time to reschedule the start to. Required.
format: int64overridesobject[]For update_overrides: the full set of gate/segment overrides. Omit to preserve the experiment’s current overrides; send [] to clear them.
Show child attributes
typestringrequiredgatesegmentgroup_idstringrequirednamestringrequiredenvironmentstringnullableid_overridesobject[]For update_overrides: the full set of ID overrides. Omit to preserve the experiment’s current ID overrides; send [] to clear them.
Show child attributes
idsstring[]requiredgroup_idstringrequiredenvironmentstringnullableunit_typestringnullableallow_overrides_in_pulsebooleanFor update_overrides: whether overridden units are included in Pulse. Omit to preserve the current setting.
settingsobjectFor update_settings: the experiment settings to change, matching the PATCH /console/v1/experiments/:id body. Required for update_settings. Fields omitted from the payload keep the experiment’s current values. A group sent by name, without size or parameterValues, keeps that group’s current size and parameters.
Show child attributes
namestringThe display name of the experiment
min length: 3max length: 100pattern: ^[a-zA-Z0-9_\- ]*$descriptionstringA helpful summary of what this experiment does
max length: 1000idTypestringThe type of ID which the experiment is based on
secondaryIDTypestringThe secondary ID type for the experiment used in WHN for ID resolution
nullableidentifierMappingModestringThe identifier mapping mode for the experiment used in WHN for ID resolution
strictOneToOnefirstTouchOneToManylastTouchOneToManyidentityResolutionSourcestringThe identity resolution entity property source for the experiment used in WHN for ID resolution
nullablehypothesisstringA statement that will be tested by this experiment
linksobject[]Links to relevant documentation or resources
urlstringrequiredThe URL of the link
format: urititlestringThe title of the link
externalEventsobject[]namestringrequiredtimestampnumberrequiredcontrolGroupIDstringOptional control group ID
allocationnumberPercent of layer allocated to this experiment
format: doublemin: 0max: 100userBucketsnumber[]primaryMetricTagsstring[]Primary metric tags for the experiment
secondaryMetricTagsstring[]Secondary metric tags for the experiment
primaryMetricsobject[]Main metrics needed to evaluate your hypothesis
namestringrequiredThe metric name.
typestringrequiredThe metric type.
directionstringThe expected direction for one-sided testing (a feature to only measure metric movements in a single direction)
increasedecreasehypothesizedValuenumberThe comparison value for the one-sample testing (a feature to use a fixed baseline as the control value)
secondaryMetricsobject[]Additional metrics to monitor that might impact the analysis or final decision of the experiment
namestringrequiredThe metric name.
typestringrequiredThe metric type.
directionstringThe expected direction for one-sided testing (a feature to only measure metric movements in a single direction)
increasedecreasehypothesizedValuenumberThe comparison value for the one-sample testing (a feature to use a fixed baseline as the control value)
otherMetricsobject[]Additional metrics you want to investigate or learn from. The usual corrections applied to Primary and Secondary metrics are not applied to these.
namestringrequiredThe metric name.
typestringrequiredThe metric type.
directionstringThe expected direction for one-sided testing (a feature to only measure metric movements in a single direction)
increasedecreasehypothesizedValuenumberThe comparison value for the one-sample testing (a feature to use a fixed baseline as the control value)
targetAppsoneOfTarget apps assigned to this experiment
stringstring[]tagsstring[]Tags associated with the experiment
durationintegerExpected length of the experiment in days. Create and update accept duration or targetExposures, not both. On update, sending duration clears a stored targetExposures. Omit the field to keep the stored value. null is not accepted.
format: int64min: 1targetExposuresintegerExposure count that ends the experiment. On update, sending targetExposures clears a stored duration. Omit the field to keep the stored value. null is not accepted.
format: int64min: 1targetingGateIDstringRestrict your experiment to users passing the selected feature gate
nullableinlineTargetingRulesobject[]Replaces inline targeting with these rules. Conditions in a rule use AND; rules use ordered evaluation. Set to [] to remove targeting. Omit on update to keep existing targeting. Providing this field switches from gate to inline targeting; you can't also set a nonempty targetingGateID. Use passes_segment, fails_segment, passes_gate, or fails_gate with the segment or gate name ID as targetValue.
[{"name":"Eligible users","passPercentage":100,"conditions":[{"type":"passes_segment","targetValue":"paid_users"}]}]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[]stringnumberoperatorstringanynoneany_case_sensitivenone_case_sensitivestr_contains_anystr_contains_nonegtltltegteversion_gtversion_ltversion_gteversion_lteversion_eqafterbeforeonis_nullis_not_nullstr_matchesencoded_anyarray_contains_anyarray_contains_nonearray_contains_allnot_array_contains_allfieldstringnullablecustomIDstringnullabletypestringrequiredapp_versionbrowser_namebrowser_versioncountrycustom_fieldemailenvironment_tierfails_gatefails_segmentip_addresslocaleos_nameos_versionpasses_gatepasses_segmentpublictimeunit_iduser_iduser_agenturljavascriptdevice_modeltarget_appexperiment_groupenvironmentsstring[]The environments this rule is enabled for.
nullableidstringThe Statsig ID of this rule.
baseIDstringThe base ID of this rule, i.e. without any added metadata. Will remain the exact same throughout
sequentialTestingbooleanApply sequential testing?
bonferroniCorrectionbooleanIs Bonferroni correction applied per variant?
bonferroniCorrectionPerMetricbooleanIs Bonferroni correction applied per metric?
benjaminiHochbergPerVariantbooleanIs Benjamini-Hochberg procedure applied per variant?
benjaminiHochbergPerMetricbooleanIs Benjamini-Hochberg procedure applied per metric?
benjaminiPrimaryMetricsOnlybooleanIs Benjamini-Hochberg procedure applied for primary metrics only?
defaultConfidenceIntervalstringDefault error margin used for results
8090959899defaultRollupWindowintegerDefault rollup window in days for experiment results. Use -1 for cumulative. Only -1, 1, and 7 allowed for cloud experiments.
format: int64defaultChanceToBeatThresholdnumberDefault chance-to-beat threshold used for Bayesian results.
format: doublebayesianPriorsobject[]Bayesian prior settings by metric.
metricobjectrequirednamestringrequiredtypestringrequiredpriorMeannumberrequiredpriorStdDevnumberrequiredmin: 0manualQualityScoresobject[]Up to 10 manually set quality scores for an experiment. The scores and weights will be added to the existing weights and scores, and then weights will be renormalized to 100. This can be set via the Statsig Console API. If targeting a default check, the weight of the check will be updated, but not the status or description. A default score can be removed by setting the weight to 0. The default score identifiers are one of: HYPOTHESIS_LENGTH, BALANCED_EXPOSURE, PRIMARY_METRICS_LENGTH, COMPARISON_CORRECTION, GUARDRAIL_METRIC_TAGS, SUFFICIENT_SAMPLE, POWER_ANALYSIS, SEQUENTIAL_TESTING
criteriaNameoneOfrequiredstringstatusstringrequiredPASSEDFAILEDWARNINGcriteriaDescriptionstringrequiredscorenumberrequiredweightnumberrequiredstatusstringThe current status of the experiment
activesetupdecision_madeabandonedarchivedexperiment_stoppedassignment_stoppedlaunchedGroupIDstringID of the launched group, null otherwise
nullableassignmentSourceNamestringSource name of the assignment
assignmentSourceExperimentNamestringName of the source experiment for assignment
creatorIDstringThe Statsig ID of the creator of this experiment
nullablecreatorEmailstringThe email of the creator of this experiment
nullableisAnalysisOnlybooleanFor Warehouse Native
nullableteamstringThe team name associated with the experiment, Enterprise only.
nullableteamIDstringThe team ID associated with the experiment, Enterprise only.
nullableallocationDurationintegerWarehouse Native Only - Allocation duration in days
format: int64nullablemin: 1cohortedAnalysisDurationintegerWarehouse Native Only - Cohorted analysis duration in days
format: int64min: 1cohortedMetricsMatureAfterEndbooleanWarehouse Native Only - Allow cohort metrics to mature after experiment end
cohortWaitUntilEndToIncludebooleanWarehouse Native Only - Whether to filter to units whose experiment cohort analysis duration is complete, if cohortedAnalysisDuration exists
fixedAnalysisDurationintegerFixed analysis duration in days
format: int64min: 1scheduledReloadHourintegerWarehouse Native only - UTC hour at which to run scheduled pulse loads
format: int64nullablemin: 0max: 23scheduledReloadTypestringWarehouse Native only - reload type for scheduled reloads
fullincrementalscheduledReloadDaysinteger[]Warehouse Native only - days on which to run scheduled reloads from 0 to 6, 0 meaning Sunday. Null to run reloads on all days.
nullableturboModebooleanWarehouse Native only - whether to run scheduled reloads with Turbo mode.
autoLoadToplineImpactbooleanWarehouse Native only - whether to automatically run topline and projected launch impact calculations when reloading experiments.
analysisEndTimestringWarehouse Native only - end time for analysis only experiments
assignmentSourceFiltersobject[]Array of criteria for filtering assignment sources.
columnstringColumn to filter on.
conditionstringrequiredinnot_in=><>=<=is_nullnon_nullcontainsnot_containssql_filterstarts_withends_withafter_exposurebefore_exposureis_trueis_falsevaluesstring[]Optional array of values for the criterion to match against.
analyticsTypestringThe mode of analysis for the experiment, e.g frequentist, bayesian, sprt
frequentistbayesiansprtdefaultSPRTPowerParamnumberSPRT power parameter percentage used as the default for experiment analysis.
format: doubledefaultSPRTMDEnumberDefault MDE value for every metric if one isn't provided. Only used in manual mode.
format: doublesprtBaselineModestringIn manual mode, mde/mean/stdDev must be provided for every metric in the experiment. In in_experiment_control, only the mde is needed for every metric, or the defaultSPRTMDE field must be passed.
manualin_experiment_controlsprtMDESettingsobject[]The SPRT values for use in the experiment.
metricKeystringrequiredgroupSettingsobject[]requiredgroupKeystringrequiredmdenumberrequiredmeannumberstdDevnumberisSidecarbooleanWhether this is a Statsig Sidecar experiment. sidecarEditorURL, sidecarURLFilters, sidecarDisableAutoRun, and sidecarPrerunScript are saved only when this is true.
sidecarEditorURLstringSidecar (Visual Editor) only: the URL of the page being modified. The Visual Editor cannot open without it, and it must be an http or https URL.
sidecarURLFiltersobject[]Sidecar (Visual Editor) only: filters on the current URL used to determine whether the experiment should be applied. Each entry looks like { "type": "contains", "value": "/pricing" }, where type is contains, equals, regex, or path. Put type inside each filter object, not alongside the array.
typestringrequiredcontainsequalsregexpathvaluestringrequiredsidecarDisableAutoRunbooleanSidecar (Visual Editor) only: whether to disable auto-running the experiment on page load. By default the experiment auto runs.
sidecarPrerunScriptstringSidecar (Visual Editor) only: a script to run before the experiment starts. Send null to clear it.
nullabledecisionReasonstringExperiment notes reported after experiment completes
preComputedUserDimensionsobject[]User dimensions that will be computed for every metric in WHN
propertySourcestringnamestringrequiredcureCovariatesobject[]CURE Covariates to use in this experiment
namestringrequiredtypestringrequiredstratifiedSamplingobjectThe stratified sampling settings for the experiment
nullablestatusstringrequiredpendingsuccesserrormetricobjectnamestringrequiredtypestringstartDatestringrequiredendDatestringrequiredentityPropertySourceobjectpropertySourceNamestringrequiredcolumnstringrequiredcsvobjectoriginalstringrequiredidentifierstringrequireduseStratifiedSaltbooleanWhether successful stratified sampling is currently used for experiment assignment.
useUnitsbooleanWhether stratified sampling was configured to use allocated units directly.
deltaReductionnumberObserved reduction in delta after running stratified sampling.
format: doublespreadReductionnumberObserved reduction in spread after running stratified sampling.
format: doubleenabledNonProdEnvironmentsstring[]groupsobject[]namestringrequiredidstringnullablesizenumbermin: 0max: 100parameterValuesobjectA map of parameter name to the value this group serves. Sidecar (Visual Editor) experiments also return sidecarURLFilters, sidecarDisableAutoRun, sidecarPrerunScript, and sidecarExperimentName here, copied from the experiment itself on read. Sending them here does nothing; set them as experiment fields instead.
disabledbooleandescriptionstringforeignGroupIDstringhighlightedbooleanMarks this experiment group as highlighted in analysis views. Highlighted groups are prioritized (shown first) and can be used to filter.
Response
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.
startstoppauserestartabandonarchivedeletemake_decisionupdate_settingsupdate_overridesupdate_target_applicationsupdate_allowed_reviewersupdate_default_impact_multiplierscheduled_startscheduled_start_editscheduled_stopscheduled_stop_editset_scheduledisable_reviews_locallyrolloutschedule_rolloutreallocatechange_enabled_groupsunarchiveupdate_ownersupdate_teamauthorobjectrequiredThe 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 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 — or a scheduled stop), scheduled_start_edit when new_time is ignore (commit is a no-op), scheduled_stop_edit when new_time is ignore and no action type is set (commit is a no-op), scheduled_stop/scheduled_stop_edit on an autotune, 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 for a backdated start, and stop_time, stop_action_type when a stop is scheduled with the start (current is the pending scheduled stop it replaces); scheduled_start/scheduled_start_edit -> start_time; scheduled_stop/scheduled_stop_edit -> stop_time, stop_action_type (pause stops new assignments, stop concludes the experiment and defers the decision; current is the pending scheduled stop, both null when none is pending; cancelling proposes both null); set_schedule -> start_time when a start is set, and stop_time, stop_action_type when a stop is set (an omitted side is left out; an omitted stop field repeats the pending value); null on an autotune when a stop is included; 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.
nullabletypestringrequiredSame value as the envelope type, repeated for self-containment.
startstoppauserestartabandonarchivedeletemake_decisionupdate_settingsupdate_overridesupdate_target_applicationsupdate_allowed_reviewersupdate_default_impact_multiplierscheduled_startscheduled_start_editscheduled_stopscheduled_stop_editset_scheduledisable_reviews_locallyrolloutschedule_rolloutreallocatechange_enabled_groupsunarchiveupdate_ownersupdate_teamcurrentobjectrequiredThe 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.
proposedobjectrequiredThe 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_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". 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.
review_data_unavailablecontent_unreadableWas this helpful?
For AI agents: a documentation index is available at /llms.txt. Append .md to any page URL for markdown, or send Accept: text/markdown.