Create a draft revision
Deprecated. Use POST /v2/features/:id/revisions instead.
Creates a new draft revision branched from the current live revision. A feature can have multiple concurrent drafts; use this to start an isolated line of edits.
curl -X POST 'https://api.growthbook.io/api/v1/features/{id}/revisions' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/features/{id}/revisions"
payload = {
"comment": "<string>",
"title": "<string>",
"ignoreWarnings": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({comment: '<string>', title: '<string>', ignoreWarnings: true})
};
fetch('https://api.growthbook.io/api/v1/features/{id}/revisions', 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/features/{id}/revisions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'comment' => '<string>',
'title' => '<string>',
'ignoreWarnings' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.growthbook.io/api/v1/features/{id}/revisions"
payload := strings.NewReader("{\n \"comment\": \"<string>\",\n \"title\": \"<string>\",\n \"ignoreWarnings\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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/features/{id}/revisions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"comment\": \"<string>\",\n \"title\": \"<string>\",\n \"ignoreWarnings\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/features/{id}/revisions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"comment\": \"<string>\",\n \"title\": \"<string>\",\n \"ignoreWarnings\": true\n}"
response = http.request(request)
puts response.read_body{
"revision": {
"id": "<string>",
"featureId": "<string>",
"baseVersion": 123,
"version": 123,
"comment": "<string>",
"date": "2023-11-07T05:31:56Z",
"status": "<string>",
"rules": {},
"createdBy": "<string>",
"publishedBy": "<string>",
"defaultValue": "<string>",
"definitions": {},
"environmentsEnabled": {},
"envPrerequisites": {},
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"metadata": {
"description": "<string>",
"owner": "<string>",
"project": "<string>",
"tags": [
"<string>"
],
"neverStale": true,
"valueType": "<string>",
"jsonSchema": {
"schemaType": "schema",
"schema": "<string>",
"simple": {},
"date": "2023-11-07T05:31:56Z",
"enabled": true
},
"customFields": {},
"baseConfig": "<string>"
},
"rampActions": [
{
"mode": "create",
"ruleId": "<string>",
"name": "<string>",
"environment": "<string>",
"templateId": "<string>",
"startActions": [
{
"patch": {
"ruleId": "<string>",
"coverage": 0.5,
"condition": "<string>",
"savedGroups": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allEnvironments": true,
"environments": [
"<string>"
],
"force": "<unknown>",
"enabled": true
},
"targetType": "feature-rule",
"targetId": "<string>"
}
],
"steps": [
{
"interval": 1,
"actions": [
{
"patch": {
"ruleId": "<string>",
"coverage": 0.5,
"condition": "<string>",
"savedGroups": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allEnvironments": true,
"environments": [
"<string>"
],
"force": "<unknown>",
"enabled": true
},
"targetType": "feature-rule",
"targetId": "<string>"
}
],
"approvalNotes": "<string>",
"monitored": true,
"holdConditions": {
"minSampleSize": 123,
"requiresApproval": true
}
}
],
"endActions": [
{
"patch": {
"ruleId": "<string>",
"coverage": 0.5,
"condition": "<string>",
"savedGroups": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allEnvironments": true,
"environments": [
"<string>"
],
"force": "<unknown>",
"enabled": true
},
"targetType": "feature-rule",
"targetId": "<string>"
}
],
"startDate": "2023-11-07T05:31:56Z",
"cutoffDate": "2023-11-07T05:31:56Z",
"monitoringConfig": {
"datasourceId": "<string>",
"exposureQueryId": "<string>",
"guardrailMetricIds": [
"<string>"
],
"signalMetricIds": [
"<string>"
],
"updateScheduleMinutes": 11,
"monitoringMode": "auto",
"autoUpdate": true,
"srmAction": "rollback",
"noTrafficAction": "rollback",
"noTrafficGracePeriodHours": 1,
"multipleExposureAction": "rollback"
},
"lockdownConfig": {
"mode": "none"
},
"requiresStartApproval": true
}
]
}
}Authorizations
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
Query Parameters
If the organization caps concurrent drafts per feature (maxConcurrentDrafts setting), requests at or over the cap are rejected with a 409. Pass true to create the draft anyway.
"true"Body
Set to true to acknowledge the warnings listed in a blocked response and continue. This covers experiment guards, locked dependents, and references affected by an archive. When the organization treats schema failures as warnings, it also covers schema and invariant warnings. It never bypasses a rejected Custom Hook. On revision publish endpoints, it can also force-publish an out-of-date draft when the caller has Bypass draft approvals access.
Response
Resource created
Show child attributes
Show child attributes
Was this page helpful?
curl -X POST 'https://api.growthbook.io/api/v1/features/{id}/revisions' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/features/{id}/revisions"
payload = {
"comment": "<string>",
"title": "<string>",
"ignoreWarnings": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({comment: '<string>', title: '<string>', ignoreWarnings: true})
};
fetch('https://api.growthbook.io/api/v1/features/{id}/revisions', 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/features/{id}/revisions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'comment' => '<string>',
'title' => '<string>',
'ignoreWarnings' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.growthbook.io/api/v1/features/{id}/revisions"
payload := strings.NewReader("{\n \"comment\": \"<string>\",\n \"title\": \"<string>\",\n \"ignoreWarnings\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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/features/{id}/revisions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"comment\": \"<string>\",\n \"title\": \"<string>\",\n \"ignoreWarnings\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/features/{id}/revisions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"comment\": \"<string>\",\n \"title\": \"<string>\",\n \"ignoreWarnings\": true\n}"
response = http.request(request)
puts response.read_body{
"revision": {
"id": "<string>",
"featureId": "<string>",
"baseVersion": 123,
"version": 123,
"comment": "<string>",
"date": "2023-11-07T05:31:56Z",
"status": "<string>",
"rules": {},
"createdBy": "<string>",
"publishedBy": "<string>",
"defaultValue": "<string>",
"definitions": {},
"environmentsEnabled": {},
"envPrerequisites": {},
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"metadata": {
"description": "<string>",
"owner": "<string>",
"project": "<string>",
"tags": [
"<string>"
],
"neverStale": true,
"valueType": "<string>",
"jsonSchema": {
"schemaType": "schema",
"schema": "<string>",
"simple": {},
"date": "2023-11-07T05:31:56Z",
"enabled": true
},
"customFields": {},
"baseConfig": "<string>"
},
"rampActions": [
{
"mode": "create",
"ruleId": "<string>",
"name": "<string>",
"environment": "<string>",
"templateId": "<string>",
"startActions": [
{
"patch": {
"ruleId": "<string>",
"coverage": 0.5,
"condition": "<string>",
"savedGroups": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allEnvironments": true,
"environments": [
"<string>"
],
"force": "<unknown>",
"enabled": true
},
"targetType": "feature-rule",
"targetId": "<string>"
}
],
"steps": [
{
"interval": 1,
"actions": [
{
"patch": {
"ruleId": "<string>",
"coverage": 0.5,
"condition": "<string>",
"savedGroups": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allEnvironments": true,
"environments": [
"<string>"
],
"force": "<unknown>",
"enabled": true
},
"targetType": "feature-rule",
"targetId": "<string>"
}
],
"approvalNotes": "<string>",
"monitored": true,
"holdConditions": {
"minSampleSize": 123,
"requiresApproval": true
}
}
],
"endActions": [
{
"patch": {
"ruleId": "<string>",
"coverage": 0.5,
"condition": "<string>",
"savedGroups": [
{
"match": "all",
"ids": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allEnvironments": true,
"environments": [
"<string>"
],
"force": "<unknown>",
"enabled": true
},
"targetType": "feature-rule",
"targetId": "<string>"
}
],
"startDate": "2023-11-07T05:31:56Z",
"cutoffDate": "2023-11-07T05:31:56Z",
"monitoringConfig": {
"datasourceId": "<string>",
"exposureQueryId": "<string>",
"guardrailMetricIds": [
"<string>"
],
"signalMetricIds": [
"<string>"
],
"updateScheduleMinutes": 11,
"monitoringMode": "auto",
"autoUpdate": true,
"srmAction": "rollback",
"noTrafficAction": "rollback",
"noTrafficGracePeriodHours": 1,
"multipleExposureAction": "rollback"
},
"lockdownConfig": {
"mode": "none"
},
"requiresStartApproval": true
}
]
}
}
