Experiments-2
For instructions on how to authenticate to use this endpoint, see API overview.
Endpoints
POST | |
POST | |
POST | |
POST | |
POST | |
POST | |
POST | |
GET | |
GET | |
GET |
Create experiments end
End a running experiment without shipping a variant.
Sets end_date to now and marks the experiment as stopped. The feature flag is NOT modified — users continue to see their assigned variants and exposure events ($feature_flag_called) continue to be recorded. However, only data up to end_date is included in experiment results.
Use this when:
- You want to freeze the results window without changing which variant users see.
- A variant was already shipped manually via the feature flag UI and the experiment just needs to be marked complete.
The end_date can be adjusted after ending via PATCH if it needs to be backdated (e.g. to match when the flag was actually paused).
Other options:
- Use ship_variant to end the experiment AND roll out a single variant to 100%% of users.
- Use pause to deactivate the flag without ending the experiment (stops variant assignment but does not freeze results).
Returns 400 if the experiment is not running.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Request parameters
- conclusion
- conclusion_commentstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /endExample response
Status 200
Create experiments end
End a running experiment without shipping a variant.
Sets end_date to now and marks the experiment as stopped. The feature flag is NOT modified — users continue to see their assigned variants and exposure events ($feature_flag_called) continue to be recorded. However, only data up to end_date is included in experiment results.
Use this when:
- You want to freeze the results window without changing which variant users see.
- A variant was already shipped manually via the feature flag UI and the experiment just needs to be marked complete.
The end_date can be adjusted after ending via PATCH if it needs to be backdated (e.g. to match when the flag was actually paused).
Other options:
- Use ship_variant to end the experiment AND roll out a single variant to 100%% of users.
- Use pause to deactivate the flag without ending the experiment (stops variant assignment but does not freeze results).
Returns 400 if the experiment is not running.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Request parameters
- conclusion
- conclusion_commentstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /endExample response
Status 200
Create experiments launch
Launch a draft experiment.
Validates the experiment is in draft state, activates its linked feature flag, sets start_date to the current server time, and transitions the experiment to running. Returns 400 if the experiment has already been launched or if the feature flag configuration is invalid (e.g. missing "control" variant or fewer than 2 variants).
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /launchExample response
Status 200
Create experiments launch
Launch a draft experiment.
Validates the experiment is in draft state, activates its linked feature flag, sets start_date to the current server time, and transitions the experiment to running. Returns 400 if the experiment has already been launched or if the feature flag configuration is invalid (e.g. missing "control" variant or fewer than 2 variants).
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /launchExample response
Status 200
Create experiments pause
Pause a running experiment.
Deactivates the linked feature flag so it is no longer returned by the /decide endpoint. Users fall back to the application default (typically the control experience), and no new exposure events are recorded (i.e. $feature_flag_called is not fired). Returns 400 if the experiment is not running or is already paused.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /pauseExample response
Status 200
Create experiments pause
Pause a running experiment.
Deactivates the linked feature flag so it is no longer returned by the /decide endpoint. Users fall back to the application default (typically the control experience), and no new exposure events are recorded (i.e. $feature_flag_called is not fired). Returns 400 if the experiment is not running or is already paused.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /pauseExample response
Status 200
Create experiments recalculate timeseries
Mixin for ViewSets to handle ApprovalRequired exceptions from decorated serializers.
This mixin intercepts ApprovalRequired exceptions raised by the @approval_gate decorator on serializer methods and converts them into proper HTTP 409 Conflict responses with change request details.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Request parameters
- namestring
- descriptionstring
- start_datestring
- end_datestring
- feature_flag_keystring
- holdout_idinteger
- parameters
- secondary_metrics
- saved_metrics_idsarray
- filters
- archivedbooleanDefault:
false - deletedboolean
- type
- exposure_criteria
- metrics
- metrics_secondary
- stats_config
- scheduling_config
- allow_unknown_eventsbooleanDefault:
false - _create_in_folderstring
- conclusion
- conclusion_commentstring
- primary_metrics_ordered_uuids
- secondary_metrics_ordered_uuids
- only_count_matured_usersboolean
- update_feature_flag_paramsbooleanDefault:
false
Example request
POST /api /projects /:project_id /experiments /:id /recalculate_timeseriesExample response
Status 200 No response body
Create experiments recalculate timeseries
Mixin for ViewSets to handle ApprovalRequired exceptions from decorated serializers.
This mixin intercepts ApprovalRequired exceptions raised by the @approval_gate decorator on serializer methods and converts them into proper HTTP 409 Conflict responses with change request details.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Request parameters
- namestring
- descriptionstring
- start_datestring
- end_datestring
- feature_flag_keystring
- holdout_idinteger
- parameters
- secondary_metrics
- saved_metrics_idsarray
- filters
- archivedbooleanDefault:
false - deletedboolean
- type
- exposure_criteria
- metrics
- metrics_secondary
- stats_config
- scheduling_config
- allow_unknown_eventsbooleanDefault:
false - _create_in_folderstring
- conclusion
- conclusion_commentstring
- primary_metrics_ordered_uuids
- secondary_metrics_ordered_uuids
- only_count_matured_usersboolean
- update_feature_flag_paramsbooleanDefault:
false
Example request
POST /api /projects /:project_id /experiments /:id /recalculate_timeseriesExample response
Status 200 No response body
Create experiments reset
Reset an experiment back to draft state.
Clears start/end dates, conclusion, and archived flag. The feature flag is left unchanged — users continue to see their assigned variants.
Previously collected events still exist but won't be included in results unless the start date is manually adjusted after re-launch.
Returns 400 if the experiment is already in draft state.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /resetExample response
Status 200
Create experiments reset
Reset an experiment back to draft state.
Clears start/end dates, conclusion, and archived flag. The feature flag is left unchanged — users continue to see their assigned variants.
Previously collected events still exist but won't be included in results unless the start date is manually adjusted after re-launch.
Returns 400 if the experiment is already in draft state.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /resetExample response
Status 200
Create experiments resume
Resume a paused experiment.
Reactivates the linked feature flag so it is returned by /decide again. Users are re-bucketed deterministically into the same variants they had before the pause, and exposure tracking resumes. Returns 400 if the experiment is not running or is not paused.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /resumeExample response
Status 200
Create experiments resume
Resume a paused experiment.
Reactivates the linked feature flag so it is returned by /decide again. Users are re-bucketed deterministically into the same variants they had before the pause, and exposure tracking resumes. Returns 400 if the experiment is not running or is not paused.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Response
Example request
POST /api /projects /:project_id /experiments /:id /resumeExample response
Status 200
Create experiments ship variant
Ship a variant to 100% of users and (optionally) end the experiment.
Rewrites the feature flag so that the selected variant is served to everyone. Existing release conditions (flag groups) are preserved so the change can be rolled back by deleting the auto-added release condition in the feature flag UI.
Can be called on both running and stopped experiments. If the experiment is still running, it will also be ended (end_date set and status marked as stopped). If the experiment has already ended, only the flag is rewritten - this supports the "end first, ship later" workflow.
If an approval policy requires review before changes on the flag take effect, the API returns 409 with a change_request_id. The experiment is NOT ended until the change request is approved and the user retries.
Returns 400 if the experiment is in draft state, the variant_key is not found on the flag, or the experiment has no linked feature flag.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Request parameters
- conclusion
- conclusion_commentstring
- variant_keystring
Response
Example request
POST /api /projects /:project_id /experiments /:id /ship_variantExample response
Status 200
Create experiments ship variant
Ship a variant to 100% of users and (optionally) end the experiment.
Rewrites the feature flag so that the selected variant is served to everyone. Existing release conditions (flag groups) are preserved so the change can be rolled back by deleting the auto-added release condition in the feature flag UI.
Can be called on both running and stopped experiments. If the experiment is still running, it will also be ended (end_date set and status marked as stopped). If the experiment has already ended, only the flag is rewritten - this supports the "end first, ship later" workflow.
If an approval policy requires review before changes on the flag take effect, the API returns 409 with a change_request_id. The experiment is NOT ended until the change request is approved and the user retries.
Returns 400 if the experiment is in draft state, the variant_key is not found on the flag, or the experiment has no linked feature flag.
Required API key scopes
experiment:writePath parameters
- idinteger
- project_idstring
Request parameters
- conclusion
- conclusion_commentstring
- variant_keystring
Response
Example request
POST /api /projects /:project_id /experiments /:id /ship_variantExample response
Status 200
Retrieve experiments timeseries results
Mixin for ViewSets to handle ApprovalRequired exceptions from decorated serializers.
This mixin intercepts ApprovalRequired exceptions raised by the @approval_gate decorator on serializer methods and converts them into proper HTTP 409 Conflict responses with change request details.
Required API key scopes
experiment:readPath parameters
- idinteger
- project_idstring
Example request
GET /api /projects /:project_id /experiments /:id /timeseries_resultsExample response
Status 200 No response body
Retrieve experiments timeseries results
Mixin for ViewSets to handle ApprovalRequired exceptions from decorated serializers.
This mixin intercepts ApprovalRequired exceptions raised by the @approval_gate decorator on serializer methods and converts them into proper HTTP 409 Conflict responses with change request details.
Required API key scopes
experiment:readPath parameters
- idinteger
- project_idstring
Example request
GET /api /projects /:project_id /experiments /:id /timeseries_resultsExample response
Status 200 No response body
Retrieve experiments eligible feature flags
Returns a paginated list of feature flags eligible for use in experiments.
Eligible flags must:
- Be multivariate with at least 2 variants
- Have "control" as the first variant key
Query parameters:
- search: Filter by flag key or name (case insensitive)
- limit: Number of results per page (default: 20)
- offset: Pagination offset (default: 0)
- active: Filter by active status ("true" or "false")
- created_by_id: Filter by creator user ID
- order: Sort order field
- evaluation_runtime: Filter by evaluation runtime
- has_evaluation_contexts: Filter by presence of evaluation contexts ("true" or "false")
Required API key scopes
feature_flag:readPath parameters
- project_idstring
Example request
GET /api /projects /:project_id /experiments /eligible_feature_flagsExample response
Status 200 No response body
Retrieve experiments eligible feature flags
Returns a paginated list of feature flags eligible for use in experiments.
Eligible flags must:
- Be multivariate with at least 2 variants
- Have "control" as the first variant key
Query parameters:
- search: Filter by flag key or name (case insensitive)
- limit: Number of results per page (default: 20)
- offset: Pagination offset (default: 0)
- active: Filter by active status ("true" or "false")
- created_by_id: Filter by creator user ID
- order: Sort order field
- evaluation_runtime: Filter by evaluation runtime
- has_evaluation_contexts: Filter by presence of evaluation contexts ("true" or "false")
Required API key scopes
feature_flag:readPath parameters
- project_idstring
Example request
GET /api /projects /:project_id /experiments /eligible_feature_flagsExample response
Status 200 No response body
Retrieve experiments requires flag implementation
Mixin for ViewSets to handle ApprovalRequired exceptions from decorated serializers.
This mixin intercepts ApprovalRequired exceptions raised by the @approval_gate decorator on serializer methods and converts them into proper HTTP 409 Conflict responses with change request details.
Required API key scopes
experiment:readPath parameters
- project_idstring
Example request
GET /api /projects /:project_id /experiments /requires_flag_implementationExample response
Status 200 No response body
Retrieve experiments requires flag implementation
Mixin for ViewSets to handle ApprovalRequired exceptions from decorated serializers.
This mixin intercepts ApprovalRequired exceptions raised by the @approval_gate decorator on serializer methods and converts them into proper HTTP 409 Conflict responses with change request details.
Required API key scopes
experiment:readPath parameters
- project_idstring
Example request
GET /api /projects /:project_id /experiments /requires_flag_implementation