Update a single fact table
curl -X POST 'https://api.growthbook.io/api/v1/fact-tables/abc123' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"New Fact Table Name"}'import requests
url = "https://api.growthbook.io/api/v1/fact-tables/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"owner": "<string>",
"projects": ["<string>"],
"tags": ["<string>"],
"userIdTypes": ["<string>"],
"userIdColumns": {},
"sql": "<string>",
"timestampColumn": "<string>",
"eventName": "<string>",
"columns": [
{
"column": "<string>",
"jsonFields": {},
"name": "<string>",
"description": "<string>",
"alwaysInlineFilter": False,
"deleted": False,
"isAutoSliceColumn": False,
"autoSlices": ["<string>"],
"lockedAutoSlices": ["<string>"],
"isVirtual": False,
"sql": "<string>"
}
],
"archived": 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({
name: '<string>',
description: '<string>',
owner: '<string>',
projects: ['<string>'],
tags: ['<string>'],
userIdTypes: ['<string>'],
userIdColumns: {},
sql: '<string>',
timestampColumn: '<string>',
eventName: '<string>',
columns: [
{
column: '<string>',
jsonFields: {},
name: '<string>',
description: '<string>',
alwaysInlineFilter: false,
deleted: false,
isAutoSliceColumn: false,
autoSlices: ['<string>'],
lockedAutoSlices: ['<string>'],
isVirtual: false,
sql: '<string>'
}
],
archived: true
})
};
fetch('https://api.growthbook.io/api/v1/fact-tables/{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/fact-tables/{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([
'name' => '<string>',
'description' => '<string>',
'owner' => '<string>',
'projects' => [
'<string>'
],
'tags' => [
'<string>'
],
'userIdTypes' => [
'<string>'
],
'userIdColumns' => [
],
'sql' => '<string>',
'timestampColumn' => '<string>',
'eventName' => '<string>',
'columns' => [
[
'column' => '<string>',
'jsonFields' => [
],
'name' => '<string>',
'description' => '<string>',
'alwaysInlineFilter' => false,
'deleted' => false,
'isAutoSliceColumn' => false,
'autoSlices' => [
'<string>'
],
'lockedAutoSlices' => [
'<string>'
],
'isVirtual' => false,
'sql' => '<string>'
]
],
'archived' => 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/v1/fact-tables/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"userIdColumns\": {},\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"eventName\": \"<string>\",\n \"columns\": [\n {\n \"column\": \"<string>\",\n \"jsonFields\": {},\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"alwaysInlineFilter\": false,\n \"deleted\": false,\n \"isAutoSliceColumn\": false,\n \"autoSlices\": [\n \"<string>\"\n ],\n \"lockedAutoSlices\": [\n \"<string>\"\n ],\n \"isVirtual\": false,\n \"sql\": \"<string>\"\n }\n ],\n \"archived\": 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/v1/fact-tables/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"userIdColumns\": {},\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"eventName\": \"<string>\",\n \"columns\": [\n {\n \"column\": \"<string>\",\n \"jsonFields\": {},\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"alwaysInlineFilter\": false,\n \"deleted\": false,\n \"isAutoSliceColumn\": false,\n \"autoSlices\": [\n \"<string>\"\n ],\n \"lockedAutoSlices\": [\n \"<string>\"\n ],\n \"isVirtual\": false,\n \"sql\": \"<string>\"\n }\n ],\n \"archived\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/fact-tables/{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 \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"userIdColumns\": {},\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"eventName\": \"<string>\",\n \"columns\": [\n {\n \"column\": \"<string>\",\n \"jsonFields\": {},\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"alwaysInlineFilter\": false,\n \"deleted\": false,\n \"isAutoSliceColumn\": false,\n \"autoSlices\": [\n \"<string>\"\n ],\n \"lockedAutoSlices\": [\n \"<string>\"\n ],\n \"isVirtual\": false,\n \"sql\": \"<string>\"\n }\n ],\n \"archived\": true\n}"
response = http.request(request)
puts response.read_body{
"factTable": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"owner": "<string>",
"projects": [
"<string>"
],
"tags": [
"<string>"
],
"datasource": "<string>",
"userIdTypes": [
"<string>"
],
"sql": "<string>",
"managedBy": "",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"ownerEmail": "<string>",
"userIdColumns": {},
"aggregatedFactTableSettings": {
"idTypes": [
"<string>"
],
"updateTime": {
"time": "<string>",
"timezone": "<string>"
},
"lookbackWindow": 123,
"restateChunkDays": 4
},
"timestampColumn": "<string>",
"eventName": "<string>",
"columns": [
{
"column": "<string>",
"datatype": "number",
"dataTypeFromWarehouse": "number",
"numberFormat": "",
"jsonFields": {},
"name": "<string>",
"description": "<string>",
"alwaysInlineFilter": false,
"deleted": false,
"isAutoSliceColumn": false,
"autoSlices": [
"<string>"
],
"lockedAutoSlices": [
"<string>"
],
"isVirtual": false,
"sql": "<string>",
"topValues": [
"<string>"
],
"topValuesDate": "2023-11-07T05:31:56Z",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z"
}
],
"columnsError": "<string>",
"columnRefreshPending": true,
"archived": true,
"autoSliceUpdatesEnabled": true
}
}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 fact table
10000The 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 project ids
List of associated tags
List of identifier columns in this table. For example, "id" or "anonymous_id"
Maps an identifier type to the column holding it, for SQL that does not alias its columns to the identifier type names, e.g. {"user_id": "userId"}. May also be a single-level field path into a JSON column (properties.userId). Unmapped types use the identifier type name as the column name.
Show child attributes
Show child attributes
Settings for maintaining shared daily aggregated tables (a subset of userIdTypes plus the daily update time and restate lookback window) used to speed up CUPED. Requires the data pipeline (pipeline-mode) feature.
Show child attributes
Show child attributes
The SQL query for this fact table
The column holding the event timestamp. Must be a date column on this fact table. Defaults to "timestamp" when unset.
The event name used in SQL template variables
Optional array of columns to upsert by column: existing columns are patched, new columns are created, and columns not included are left unchanged. Omit datatype to leave an existing column's type untouched; send "" to reset it for auto-detection; new columns are auto-detected when datatype is omitted or "". Slice-related properties require an enterprise license.
Show child attributes
Show child attributes
Set this to "api" to disable editing in the GrowthBook UI
, api, admin Response
Resource created
Show child attributes
Show child attributes
Was this page helpful?
curl -X POST 'https://api.growthbook.io/api/v1/fact-tables/abc123' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"New Fact Table Name"}'import requests
url = "https://api.growthbook.io/api/v1/fact-tables/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"owner": "<string>",
"projects": ["<string>"],
"tags": ["<string>"],
"userIdTypes": ["<string>"],
"userIdColumns": {},
"sql": "<string>",
"timestampColumn": "<string>",
"eventName": "<string>",
"columns": [
{
"column": "<string>",
"jsonFields": {},
"name": "<string>",
"description": "<string>",
"alwaysInlineFilter": False,
"deleted": False,
"isAutoSliceColumn": False,
"autoSlices": ["<string>"],
"lockedAutoSlices": ["<string>"],
"isVirtual": False,
"sql": "<string>"
}
],
"archived": 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({
name: '<string>',
description: '<string>',
owner: '<string>',
projects: ['<string>'],
tags: ['<string>'],
userIdTypes: ['<string>'],
userIdColumns: {},
sql: '<string>',
timestampColumn: '<string>',
eventName: '<string>',
columns: [
{
column: '<string>',
jsonFields: {},
name: '<string>',
description: '<string>',
alwaysInlineFilter: false,
deleted: false,
isAutoSliceColumn: false,
autoSlices: ['<string>'],
lockedAutoSlices: ['<string>'],
isVirtual: false,
sql: '<string>'
}
],
archived: true
})
};
fetch('https://api.growthbook.io/api/v1/fact-tables/{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/fact-tables/{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([
'name' => '<string>',
'description' => '<string>',
'owner' => '<string>',
'projects' => [
'<string>'
],
'tags' => [
'<string>'
],
'userIdTypes' => [
'<string>'
],
'userIdColumns' => [
],
'sql' => '<string>',
'timestampColumn' => '<string>',
'eventName' => '<string>',
'columns' => [
[
'column' => '<string>',
'jsonFields' => [
],
'name' => '<string>',
'description' => '<string>',
'alwaysInlineFilter' => false,
'deleted' => false,
'isAutoSliceColumn' => false,
'autoSlices' => [
'<string>'
],
'lockedAutoSlices' => [
'<string>'
],
'isVirtual' => false,
'sql' => '<string>'
]
],
'archived' => 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/v1/fact-tables/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"userIdColumns\": {},\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"eventName\": \"<string>\",\n \"columns\": [\n {\n \"column\": \"<string>\",\n \"jsonFields\": {},\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"alwaysInlineFilter\": false,\n \"deleted\": false,\n \"isAutoSliceColumn\": false,\n \"autoSlices\": [\n \"<string>\"\n ],\n \"lockedAutoSlices\": [\n \"<string>\"\n ],\n \"isVirtual\": false,\n \"sql\": \"<string>\"\n }\n ],\n \"archived\": 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/v1/fact-tables/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"userIdColumns\": {},\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"eventName\": \"<string>\",\n \"columns\": [\n {\n \"column\": \"<string>\",\n \"jsonFields\": {},\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"alwaysInlineFilter\": false,\n \"deleted\": false,\n \"isAutoSliceColumn\": false,\n \"autoSlices\": [\n \"<string>\"\n ],\n \"lockedAutoSlices\": [\n \"<string>\"\n ],\n \"isVirtual\": false,\n \"sql\": \"<string>\"\n }\n ],\n \"archived\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/fact-tables/{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 \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"userIdColumns\": {},\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"eventName\": \"<string>\",\n \"columns\": [\n {\n \"column\": \"<string>\",\n \"jsonFields\": {},\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"alwaysInlineFilter\": false,\n \"deleted\": false,\n \"isAutoSliceColumn\": false,\n \"autoSlices\": [\n \"<string>\"\n ],\n \"lockedAutoSlices\": [\n \"<string>\"\n ],\n \"isVirtual\": false,\n \"sql\": \"<string>\"\n }\n ],\n \"archived\": true\n}"
response = http.request(request)
puts response.read_body{
"factTable": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"owner": "<string>",
"projects": [
"<string>"
],
"tags": [
"<string>"
],
"datasource": "<string>",
"userIdTypes": [
"<string>"
],
"sql": "<string>",
"managedBy": "",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"ownerEmail": "<string>",
"userIdColumns": {},
"aggregatedFactTableSettings": {
"idTypes": [
"<string>"
],
"updateTime": {
"time": "<string>",
"timezone": "<string>"
},
"lookbackWindow": 123,
"restateChunkDays": 4
},
"timestampColumn": "<string>",
"eventName": "<string>",
"columns": [
{
"column": "<string>",
"datatype": "number",
"dataTypeFromWarehouse": "number",
"numberFormat": "",
"jsonFields": {},
"name": "<string>",
"description": "<string>",
"alwaysInlineFilter": false,
"deleted": false,
"isAutoSliceColumn": false,
"autoSlices": [
"<string>"
],
"lockedAutoSlices": [
"<string>"
],
"isVirtual": false,
"sql": "<string>",
"topValues": [
"<string>"
],
"topValuesDate": "2023-11-07T05:31:56Z",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z"
}
],
"columnsError": "<string>",
"columnRefreshPending": true,
"archived": true,
"autoSliceUpdatesEnabled": true
}
}
