Upload a new version of a remote saved group's IDs
Records the next version of the group’s IDs. The start and end of the file are checked for one ID per line, then the whole file in the background; loaders trim and deduplicate the IDs. Poll GET /saved-groups/{id}/uploads/{version} until it’s valid, then set the group’s currentUploadVersion with PUT /saved-groups-revisions/{id}/{version}/upload-version to use it. Loaders pick up the group’s version from currentUpload and download it from GET /saved-groups/{id}/uploads/{version}/file, which redirects to a short-lived signed storage URL.
POST
/
v1
/
saved-groups
/
{id}
/
uploads
cURL
curl -X POST 'https://api.growthbook.io/api/v1/saved-groups/abc123/uploads' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"fileKey":"org_abc/remote-saved-groups/grp_123/staging/1234.csv"}'import requests
url = "https://api.growthbook.io/api/v1/saved-groups/{id}/uploads"
payload = {
"fileKey": "<string>",
"fileName": "<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({fileKey: '<string>', fileName: '<string>'})
};
fetch('https://api.growthbook.io/api/v1/saved-groups/{id}/uploads', 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/{id}/uploads",
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([
'fileKey' => '<string>',
'fileName' => '<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/saved-groups/{id}/uploads"
payload := strings.NewReader("{\n \"fileKey\": \"<string>\",\n \"fileName\": \"<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/saved-groups/{id}/uploads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fileKey\": \"<string>\",\n \"fileName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/saved-groups/{id}/uploads")
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 \"fileKey\": \"<string>\",\n \"fileName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"upload": {
"savedGroupId": "<string>",
"version": 123,
"fileName": "<string>",
"size": 123,
"sha256": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"status": {
"type": "pending"
},
"loads": [
{
"storeId": "<string>",
"status": {
"type": "loading"
},
"dateUpdated": "2023-11-07T05:31:56Z"
}
]
}
}{
"confirmation": {
"id": "<string>",
"status": "pending",
"actions": [
{
"action": "feature.create",
"environments": [
"<string>"
]
}
],
"summary": "<string>",
"url": "<string>",
"expiresAt": "<string>",
"response": {
"status": 123,
"body": "<unknown>"
},
"note": "<string>"
},
"message": "<string>"
}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"
Path Parameters
The id of the requested resource
Body
application/json
Response
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/abc123/uploads' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"fileKey":"org_abc/remote-saved-groups/grp_123/staging/1234.csv"}'import requests
url = "https://api.growthbook.io/api/v1/saved-groups/{id}/uploads"
payload = {
"fileKey": "<string>",
"fileName": "<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({fileKey: '<string>', fileName: '<string>'})
};
fetch('https://api.growthbook.io/api/v1/saved-groups/{id}/uploads', 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/{id}/uploads",
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([
'fileKey' => '<string>',
'fileName' => '<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/saved-groups/{id}/uploads"
payload := strings.NewReader("{\n \"fileKey\": \"<string>\",\n \"fileName\": \"<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/saved-groups/{id}/uploads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fileKey\": \"<string>\",\n \"fileName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/saved-groups/{id}/uploads")
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 \"fileKey\": \"<string>\",\n \"fileName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"upload": {
"savedGroupId": "<string>",
"version": 123,
"fileName": "<string>",
"size": 123,
"sha256": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"createdBy": "<string>",
"status": {
"type": "pending"
},
"loads": [
{
"storeId": "<string>",
"status": {
"type": "loading"
},
"dateUpdated": "2023-11-07T05:31:56Z"
}
]
}
}{
"confirmation": {
"id": "<string>",
"status": "pending",
"actions": [
{
"action": "feature.create",
"environments": [
"<string>"
]
}
],
"summary": "<string>",
"url": "<string>",
"expiresAt": "<string>",
"response": {
"status": 123,
"body": "<unknown>"
},
"note": "<string>"
},
"message": "<string>"
}
