Revert a feature to a specific revision
Deprecated. Use POST /v2/features/:id/revert instead.
Creates a new revision whose rules and values match a previously-published revision, then immediately publishes it. This leaves a clear audit trail of the revert action in the revision history.
Returns 403 if the API key lacks permission, or if approval rules are enabled for an affected environment and neither the “REST API always bypasses approval requirements” nor the “Allow reverts without approval” org setting is enabled.
Returns 422 with a list of warnings if the restored values no longer validate against the feature’s current value type or JSON schema. Re-submit with ?ignoreWarnings=true to revert anyway.
curl -X POST 'https://api.growthbook.io/api/v1/features/{id}/revert' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"revision":3,"comment":"Bug found"}'import requests
url = "https://api.growthbook.io/api/v1/features/{id}/revert"
payload = {
"revision": 123,
"comment": "<string>"
}
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({revision: 123, comment: '<string>'})
};
fetch('https://api.growthbook.io/api/v1/features/{id}/revert', 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}/revert",
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([
'revision' => 123,
'comment' => '<string>'
]),
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}/revert"
payload := strings.NewReader("{\n \"revision\": 123,\n \"comment\": \"<string>\"\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}/revert")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"revision\": 123,\n \"comment\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/features/{id}/revert")
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 \"revision\": 123,\n \"comment\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"feature": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"archived": true,
"description": "<string>",
"owner": "<string>",
"project": "<string>",
"defaultValue": "<string>",
"tags": [
"<string>"
],
"environments": {},
"revision": {
"version": 123,
"comment": "<string>",
"date": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"publishedBy": "<string>"
},
"ownerEmail": "<string>",
"prerequisites": [
"<string>"
],
"customFields": {},
"holdout": {
"id": "<string>",
"value": "<string>"
}
}
}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
The id of the requested resource
Response
Resource created
Show child attributes
Show child attributes
Was this page helpful?
curl -X POST 'https://api.growthbook.io/api/v1/features/{id}/revert' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"revision":3,"comment":"Bug found"}'import requests
url = "https://api.growthbook.io/api/v1/features/{id}/revert"
payload = {
"revision": 123,
"comment": "<string>"
}
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({revision: 123, comment: '<string>'})
};
fetch('https://api.growthbook.io/api/v1/features/{id}/revert', 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}/revert",
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([
'revision' => 123,
'comment' => '<string>'
]),
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}/revert"
payload := strings.NewReader("{\n \"revision\": 123,\n \"comment\": \"<string>\"\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}/revert")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"revision\": 123,\n \"comment\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/features/{id}/revert")
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 \"revision\": 123,\n \"comment\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"feature": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"archived": true,
"description": "<string>",
"owner": "<string>",
"project": "<string>",
"defaultValue": "<string>",
"tags": [
"<string>"
],
"environments": {},
"revision": {
"version": 123,
"comment": "<string>",
"date": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"publishedBy": "<string>"
},
"ownerEmail": "<string>",
"prerequisites": [
"<string>"
],
"customFields": {},
"holdout": {
"id": "<string>",
"value": "<string>"
}
}
}
