Partially update a feature
Deprecated. Use POST /v2/features/:id instead.
Updates any combination of a feature’s metadata (description, owner, tags, project), default value, environment settings (rules, kill switches, enabled state), prerequisites, holdout assignment, or JSON schema validation. All provided fields are merged into the existing feature and the result is immediately published as a new revision.
Returns 403 if the API key lacks permission or if approval rules are enabled for an affected environment and the org setting “REST API always bypasses approval requirements” is off.
curl -X POST 'https://api.growthbook.io/api/v1/features/{id}' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/features/{id}"
payload = {
"description": "<string>",
"archived": True,
"project": "<string>",
"owner": "<string>",
"defaultValue": "<string>",
"tags": ["<string>"],
"environments": {},
"prerequisites": ["<string>"],
"jsonSchema": "<string>",
"customFields": {},
"holdout": {
"id": "<string>",
"value": "<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({
description: '<string>',
archived: true,
project: '<string>',
owner: '<string>',
defaultValue: '<string>',
tags: ['<string>'],
environments: {},
prerequisites: ['<string>'],
jsonSchema: '<string>',
customFields: {},
holdout: {id: '<string>', value: '<string>'}
})
};
fetch('https://api.growthbook.io/api/v1/features/{id}', 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}",
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([
'description' => '<string>',
'archived' => true,
'project' => '<string>',
'owner' => '<string>',
'defaultValue' => '<string>',
'tags' => [
'<string>'
],
'environments' => [
],
'prerequisites' => [
'<string>'
],
'jsonSchema' => '<string>',
'customFields' => [
],
'holdout' => [
'id' => '<string>',
'value' => '<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}"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"archived\": true,\n \"project\": \"<string>\",\n \"owner\": \"<string>\",\n \"defaultValue\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"environments\": {},\n \"prerequisites\": [\n \"<string>\"\n ],\n \"jsonSchema\": \"<string>\",\n \"customFields\": {},\n \"holdout\": {\n \"id\": \"<string>\",\n \"value\": \"<string>\"\n }\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}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"archived\": true,\n \"project\": \"<string>\",\n \"owner\": \"<string>\",\n \"defaultValue\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"environments\": {},\n \"prerequisites\": [\n \"<string>\"\n ],\n \"jsonSchema\": \"<string>\",\n \"customFields\": {},\n \"holdout\": {\n \"id\": \"<string>\",\n \"value\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/features/{id}")
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 \"description\": \"<string>\",\n \"archived\": true,\n \"project\": \"<string>\",\n \"owner\": \"<string>\",\n \"defaultValue\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"environments\": {},\n \"prerequisites\": [\n \"<string>\"\n ],\n \"jsonSchema\": \"<string>\",\n \"customFields\": {},\n \"holdout\": {\n \"id\": \"<string>\",\n \"value\": \"<string>\"\n }\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
Body
Description of the feature
10000An associated project ID
The userId or email address of the owner. If an email address is provided, it will be used to look up the userId of the matching organization member. If an ID is provided, it will be validated as existing in the organization.
List of associated tags. Will override tags completely with submitted list
Show child attributes
Show child attributes
Feature IDs. Each feature must evaluate to true
Use JSON schema to validate the payload of a JSON-type feature value (enterprise only).
Show child attributes
Show child attributes
Holdout to assign this feature to. Pass null to remove the feature from its current holdout. Omit the field entirely to leave the holdout unchanged.
Show child attributes
Show child attributes
Response
Resource created
Show child attributes
Show child attributes
Was this page helpful?
curl -X POST 'https://api.growthbook.io/api/v1/features/{id}' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/features/{id}"
payload = {
"description": "<string>",
"archived": True,
"project": "<string>",
"owner": "<string>",
"defaultValue": "<string>",
"tags": ["<string>"],
"environments": {},
"prerequisites": ["<string>"],
"jsonSchema": "<string>",
"customFields": {},
"holdout": {
"id": "<string>",
"value": "<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({
description: '<string>',
archived: true,
project: '<string>',
owner: '<string>',
defaultValue: '<string>',
tags: ['<string>'],
environments: {},
prerequisites: ['<string>'],
jsonSchema: '<string>',
customFields: {},
holdout: {id: '<string>', value: '<string>'}
})
};
fetch('https://api.growthbook.io/api/v1/features/{id}', 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}",
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([
'description' => '<string>',
'archived' => true,
'project' => '<string>',
'owner' => '<string>',
'defaultValue' => '<string>',
'tags' => [
'<string>'
],
'environments' => [
],
'prerequisites' => [
'<string>'
],
'jsonSchema' => '<string>',
'customFields' => [
],
'holdout' => [
'id' => '<string>',
'value' => '<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}"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"archived\": true,\n \"project\": \"<string>\",\n \"owner\": \"<string>\",\n \"defaultValue\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"environments\": {},\n \"prerequisites\": [\n \"<string>\"\n ],\n \"jsonSchema\": \"<string>\",\n \"customFields\": {},\n \"holdout\": {\n \"id\": \"<string>\",\n \"value\": \"<string>\"\n }\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}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"archived\": true,\n \"project\": \"<string>\",\n \"owner\": \"<string>\",\n \"defaultValue\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"environments\": {},\n \"prerequisites\": [\n \"<string>\"\n ],\n \"jsonSchema\": \"<string>\",\n \"customFields\": {},\n \"holdout\": {\n \"id\": \"<string>\",\n \"value\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/features/{id}")
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 \"description\": \"<string>\",\n \"archived\": true,\n \"project\": \"<string>\",\n \"owner\": \"<string>\",\n \"defaultValue\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"environments\": {},\n \"prerequisites\": [\n \"<string>\"\n ],\n \"jsonSchema\": \"<string>\",\n \"customFields\": {},\n \"holdout\": {\n \"id\": \"<string>\",\n \"value\": \"<string>\"\n }\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>"
}
}
}
