Rebase a draft revision onto the current live version
Updates the draft’s base revision to match the currently-live revision, applying the draft’s changes on top. Supply conflictResolutions to resolve conflicting items individually — including per-rule (rules.<ruleId>) and rule-order (rules.order) conflicts. Supply expectedLiveVersion and/or expectedDraftDateUpdated (both returned by merge-status and rebase preview) to fail fast with 409 if either side changes between conflict review and submission. Unresolved conflicts also respond with 409.
curl -X POST 'https://api.growthbook.io/api/v2/features/{id}/revisions/{version}/rebase' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v2/features/{id}/revisions/{version}/rebase"
payload = {
"conflictResolutions": {},
"expectedLiveVersion": 123,
"expectedDraftDateUpdated": "<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({
conflictResolutions: {},
expectedLiveVersion: 123,
expectedDraftDateUpdated: '<string>',
ignoreWarnings: true
})
};
fetch('https://api.growthbook.io/api/v2/features/{id}/revisions/{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/v2/features/{id}/revisions/{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' => [
],
'expectedLiveVersion' => 123,
'expectedDraftDateUpdated' => '<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/v2/features/{id}/revisions/{version}/rebase"
payload := strings.NewReader("{\n \"conflictResolutions\": {},\n \"expectedLiveVersion\": 123,\n \"expectedDraftDateUpdated\": \"<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/v2/features/{id}/revisions/{version}/rebase")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conflictResolutions\": {},\n \"expectedLiveVersion\": 123,\n \"expectedDraftDateUpdated\": \"<string>\",\n \"ignoreWarnings\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v2/features/{id}/revisions/{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 \"expectedLiveVersion\": 123,\n \"expectedDraftDateUpdated\": \"<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": [
{
"description": "<string>",
"id": "<string>",
"enabled": true,
"type": "force",
"value": "<string>",
"allEnvironments": true,
"condition": "<string>",
"scheduleRules": [
{
"enabled": true,
"timestamp": "2023-11-07T05:31:56Z"
}
],
"scheduleType": "none",
"rampScheduleId": "<string>",
"savedGroupTargeting": [
{
"matchType": "all",
"savedGroups": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allProjects": true,
"projects": [
"<string>"
],
"sparse": true,
"config": "<string>",
"environments": [
"<string>"
],
"pendingRamp": "create"
}
],
"createdBy": {
"type": "dashboard",
"id": "<string>",
"name": "<string>",
"email": "<string>"
},
"publishedBy": {
"type": "dashboard",
"id": "<string>",
"name": "<string>",
"email": "<string>"
},
"defaultValue": "<string>",
"defaultValueConfig": "<string>",
"definitions": {},
"environmentsEnabled": {},
"envPrerequisites": {},
"prerequisites": [
{
"id": "<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
}
],
"autoPublishOnApproval": true,
"scheduledPublishAt": "2023-11-07T05:31:56Z",
"scheduledPublishLockEdits": true,
"scheduledPublishLockOthers": true,
"scheduledPublishBypassApproval": true,
"scheduledPublishLastError": "<string>",
"autoPublishEnabledBy": "<string>",
"scheduledPublishAttempts": 123,
"scheduledPublishGaveUpAt": "2023-11-07T05:31:56Z",
"reviews": [
{
"userId": "<string>",
"status": "approved",
"timestamp": "2023-11-07T05:31:56Z",
"user": {
"type": "dashboard",
"id": "<string>",
"name": "<string>",
"email": "<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"
Body
Map of conflict key → resolution. Keys come from the returned conflicts: defaultValue, prerequisites, archived, holdout, environmentsEnabled.<env>, metadata.<field>, rules.<ruleId>, and rules.order. overwrite keeps the draft's version of that item; discard keeps live's. The blanket rules key applies one strategy to all rule-level conflicts.
Show child attributes
Show child attributes
Optimistic-concurrency guard: the live version the resolutions were authored against (as returned by merge-status or rebase preview). If live has since moved, the request fails with 409 instead of applying resolutions to different conflicts.
Optimistic-concurrency guard for the draft side: the draft's draftDateUpdated timestamp as returned by merge-status or rebase preview. If the draft has been modified since (e.g. by a co-author), the request fails with 409 instead of applying resolutions against changed draft content.
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/v2/features/{id}/revisions/{version}/rebase' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v2/features/{id}/revisions/{version}/rebase"
payload = {
"conflictResolutions": {},
"expectedLiveVersion": 123,
"expectedDraftDateUpdated": "<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({
conflictResolutions: {},
expectedLiveVersion: 123,
expectedDraftDateUpdated: '<string>',
ignoreWarnings: true
})
};
fetch('https://api.growthbook.io/api/v2/features/{id}/revisions/{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/v2/features/{id}/revisions/{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' => [
],
'expectedLiveVersion' => 123,
'expectedDraftDateUpdated' => '<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/v2/features/{id}/revisions/{version}/rebase"
payload := strings.NewReader("{\n \"conflictResolutions\": {},\n \"expectedLiveVersion\": 123,\n \"expectedDraftDateUpdated\": \"<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/v2/features/{id}/revisions/{version}/rebase")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"conflictResolutions\": {},\n \"expectedLiveVersion\": 123,\n \"expectedDraftDateUpdated\": \"<string>\",\n \"ignoreWarnings\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v2/features/{id}/revisions/{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 \"expectedLiveVersion\": 123,\n \"expectedDraftDateUpdated\": \"<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": [
{
"description": "<string>",
"id": "<string>",
"enabled": true,
"type": "force",
"value": "<string>",
"allEnvironments": true,
"condition": "<string>",
"scheduleRules": [
{
"enabled": true,
"timestamp": "2023-11-07T05:31:56Z"
}
],
"scheduleType": "none",
"rampScheduleId": "<string>",
"savedGroupTargeting": [
{
"matchType": "all",
"savedGroups": [
"<string>"
]
}
],
"prerequisites": [
{
"id": "<string>",
"condition": "<string>"
}
],
"allProjects": true,
"projects": [
"<string>"
],
"sparse": true,
"config": "<string>",
"environments": [
"<string>"
],
"pendingRamp": "create"
}
],
"createdBy": {
"type": "dashboard",
"id": "<string>",
"name": "<string>",
"email": "<string>"
},
"publishedBy": {
"type": "dashboard",
"id": "<string>",
"name": "<string>",
"email": "<string>"
},
"defaultValue": "<string>",
"defaultValueConfig": "<string>",
"definitions": {},
"environmentsEnabled": {},
"envPrerequisites": {},
"prerequisites": [
{
"id": "<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
}
],
"autoPublishOnApproval": true,
"scheduledPublishAt": "2023-11-07T05:31:56Z",
"scheduledPublishLockEdits": true,
"scheduledPublishLockOthers": true,
"scheduledPublishBypassApproval": true,
"scheduledPublishLastError": "<string>",
"autoPublishEnabledBy": "<string>",
"scheduledPublishAttempts": 123,
"scheduledPublishGaveUpAt": "2023-11-07T05:31:56Z",
"reviews": [
{
"userId": "<string>",
"status": "approved",
"timestamp": "2023-11-07T05:31:56Z",
"user": {
"type": "dashboard",
"id": "<string>",
"name": "<string>",
"email": "<string>"
}
}
]
}
}
