Move the holdout into an analysis phase. New Feature Flags and Experiments can no longer be added, but existing traffic splits remain active for existing and new traffic. Results exclude data from before the analysis period so you can measure the cumulative impact after changes are frozen.
POST
/
v1
/
holdouts
/
{id}
/
start-analysis
cURL
curl -X POST 'https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"holdout": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"name": "<string>",
"description": "<string>",
"projects": [
"<string>"
],
"owner": "<string>",
"tags": [
"<string>"
],
"archived": true,
"stage": "draft",
"trackingKey": "<string>",
"experimentId": "<string>",
"skipAsDefaultHoldout": true,
"holdoutSize": -0.5,
"hashAttribute": "<string>",
"targetingCondition": "<string>",
"datasourceId": "<string>",
"assignmentQueryId": "<string>",
"goalMetrics": [
"<string>"
],
"secondaryMetrics": [
"<string>"
],
"variations": [
{
"variationId": "<string>",
"key": "<string>",
"name": "<string>",
"description": "<string>"
}
],
"environments": {},
"linkedFeatures": [
{
"id": "<string>",
"dateAdded": "2023-11-07T05:31:56Z"
}
],
"linkedExperiments": [
{
"id": "<string>",
"dateAdded": "2023-11-07T05:31:56Z"
}
],
"ownerEmail": "<string>",
"savedGroupTargeting": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"statsEngine": "bayesian",
"dateStarted": "2023-11-07T05:31:56Z",
"analysisStartDate": "2023-11-07T05:31:56Z",
"dateStopped": "2023-11-07T05:31:56Z",
"statusUpdateSchedule": {
"startAt": "2023-11-07T05:31:56Z",
"startAnalysisPeriodAt": "2023-11-07T05:31:56Z",
"stopAt": "2023-11-07T05:31:56Z"
},
"nextScheduledStatusUpdate": {
"type": "start",
"date": "2023-11-07T05:31:56Z"
}
}
}{
"message": "<string>",
"code": "invalid_status",
"details": {
"currentStatus": "<string>",
"expectedStatuses": [
"<string>"
]
}
}Authorizations
bearerAuthbasicAuth
If using Bearer auth, pass the Secret Key as the token:
curl https://api.growthbook.io/api/v1/features -H "Authorization: Bearer secret_abc123DEF456"
Path Parameters
Response
Resource created
Show child attributes
Show child attributes
Was this page helpful?
⌘I
cURL
curl -X POST 'https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/holdouts/{id}/start-analysis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"holdout": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"name": "<string>",
"description": "<string>",
"projects": [
"<string>"
],
"owner": "<string>",
"tags": [
"<string>"
],
"archived": true,
"stage": "draft",
"trackingKey": "<string>",
"experimentId": "<string>",
"skipAsDefaultHoldout": true,
"holdoutSize": -0.5,
"hashAttribute": "<string>",
"targetingCondition": "<string>",
"datasourceId": "<string>",
"assignmentQueryId": "<string>",
"goalMetrics": [
"<string>"
],
"secondaryMetrics": [
"<string>"
],
"variations": [
{
"variationId": "<string>",
"key": "<string>",
"name": "<string>",
"description": "<string>"
}
],
"environments": {},
"linkedFeatures": [
{
"id": "<string>",
"dateAdded": "2023-11-07T05:31:56Z"
}
],
"linkedExperiments": [
{
"id": "<string>",
"dateAdded": "2023-11-07T05:31:56Z"
}
],
"ownerEmail": "<string>",
"savedGroupTargeting": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"statsEngine": "bayesian",
"dateStarted": "2023-11-07T05:31:56Z",
"analysisStartDate": "2023-11-07T05:31:56Z",
"dateStopped": "2023-11-07T05:31:56Z",
"statusUpdateSchedule": {
"startAt": "2023-11-07T05:31:56Z",
"startAnalysisPeriodAt": "2023-11-07T05:31:56Z",
"stopAt": "2023-11-07T05:31:56Z"
},
"nextScheduledStatusUpdate": {
"type": "start",
"date": "2023-11-07T05:31:56Z"
}
}
}{
"message": "<string>",
"code": "invalid_status",
"details": {
"currentStatus": "<string>",
"expectedStatuses": [
"<string>"
]
}
}
