Rebase a draft revision onto the current live saved group
Updates the draft’s base snapshot to the current live state, applying the draft’s changes on top. Supply conflictResolutions to resolve any conflicting fields. Strategies are overwrite (use the draft’s value), discard (keep the live value), or union (merge arrays — use only on values). Optimistic locking is not enforced by this endpoint; callers who need strict locking should call merge-status before and after.
POST
/
v1
/
saved-groups-revisions
/
{savedGroupId}
/
{version}
/
rebase
cURL
curl -X POST 'https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase"
payload = {
"conflictResolutions": {},
"customValues": {}
}
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({conflictResolutions: {}, customValues: {}})
};
fetch('https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase', 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/saved-groups-revisions/{savedGroupId}/{version}/rebase",
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([
'conflictResolutions' => [
],
'customValues' => [
]
]),
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/saved-groups-revisions/{savedGroupId}/{version}/rebase"
payload := strings.NewReader("{\n \"conflictResolutions\": {},\n \"customValues\": {}\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/saved-groups-revisions/{savedGroupId}/{version}/rebase")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conflictResolutions\": {},\n \"customValues\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase")
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 \"conflictResolutions\": {},\n \"customValues\": {}\n}"
response = http.request(request)
puts response.read_body{
"revision": {
"id": "<string>",
"authorId": "<string>",
"reviews": [
{
"id": "<string>",
"userId": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"comment": "<string>"
}
],
"activityLog": [
{
"id": "<string>",
"userId": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"description": "<string>",
"proposedChangesSnapshot": [
{
"op": "add",
"path": "<string>",
"value": "<unknown>"
}
],
"targetSnapshot": "<unknown>"
}
],
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"baseSavedGroup": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"name": "<string>",
"owner": "<string>",
"ownerEmail": "<string>",
"condition": "<string>",
"attributeKey": "<string>",
"values": [
"<string>"
],
"description": "<string>",
"projects": [
"<string>"
],
"archived": true,
"useEmptyListGroup": true
},
"proposedSavedGroup": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"name": "<string>",
"owner": "<string>",
"ownerEmail": "<string>",
"condition": "<string>",
"attributeKey": "<string>",
"values": [
"<string>"
],
"description": "<string>",
"projects": [
"<string>"
],
"archived": true,
"useEmptyListGroup": true
},
"proposedChanges": [
{
"op": "add",
"path": "<string>",
"value": "<unknown>"
}
],
"version": 123,
"title": "<string>",
"authorEmail": "<string>",
"contributors": [
"<string>"
],
"revertedFrom": "<string>",
"resolution": {
"userId": "<string>",
"dateCreated": "2023-11-07T05:31:56Z"
}
}
}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"
Body
application/json
Response
200 - application/json
Resource created
Show child attributes
Show child attributes
Was this page helpful?
⌘I
cURL
curl -X POST 'https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase"
payload = {
"conflictResolutions": {},
"customValues": {}
}
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({conflictResolutions: {}, customValues: {}})
};
fetch('https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase', 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/saved-groups-revisions/{savedGroupId}/{version}/rebase",
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([
'conflictResolutions' => [
],
'customValues' => [
]
]),
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/saved-groups-revisions/{savedGroupId}/{version}/rebase"
payload := strings.NewReader("{\n \"conflictResolutions\": {},\n \"customValues\": {}\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/saved-groups-revisions/{savedGroupId}/{version}/rebase")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conflictResolutions\": {},\n \"customValues\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/saved-groups-revisions/{savedGroupId}/{version}/rebase")
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 \"conflictResolutions\": {},\n \"customValues\": {}\n}"
response = http.request(request)
puts response.read_body{
"revision": {
"id": "<string>",
"authorId": "<string>",
"reviews": [
{
"id": "<string>",
"userId": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"comment": "<string>"
}
],
"activityLog": [
{
"id": "<string>",
"userId": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"description": "<string>",
"proposedChangesSnapshot": [
{
"op": "add",
"path": "<string>",
"value": "<unknown>"
}
],
"targetSnapshot": "<unknown>"
}
],
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"baseSavedGroup": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"name": "<string>",
"owner": "<string>",
"ownerEmail": "<string>",
"condition": "<string>",
"attributeKey": "<string>",
"values": [
"<string>"
],
"description": "<string>",
"projects": [
"<string>"
],
"archived": true,
"useEmptyListGroup": true
},
"proposedSavedGroup": {
"id": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"name": "<string>",
"owner": "<string>",
"ownerEmail": "<string>",
"condition": "<string>",
"attributeKey": "<string>",
"values": [
"<string>"
],
"description": "<string>",
"projects": [
"<string>"
],
"archived": true,
"useEmptyListGroup": true
},
"proposedChanges": [
{
"op": "add",
"path": "<string>",
"value": "<unknown>"
}
],
"version": 123,
"title": "<string>",
"authorEmail": "<string>",
"contributors": [
"<string>"
],
"revertedFrom": "<string>",
"resolution": {
"userId": "<string>",
"dateCreated": "2023-11-07T05:31:56Z"
}
}
}
