Create a single fact table
curl -X POST 'https://api.growthbook.io/api/v1/fact-tables' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"Orders","datasource":"ds_abc123","userIdTypes":["id"],"sql":"SELECT * FROM orders"}'import requests
url = "https://api.growthbook.io/api/v1/fact-tables"
payload = {
"name": "<string>",
"datasource": "<string>",
"userIdTypes": ["<string>"],
"sql": "<string>",
"description": "<string>",
"owner": "<string>",
"projects": ["<string>"],
"tags": ["<string>"],
"eventName": "<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({
name: '<string>',
datasource: '<string>',
userIdTypes: ['<string>'],
sql: '<string>',
description: '<string>',
owner: '<string>',
projects: ['<string>'],
tags: ['<string>'],
eventName: '<string>'
})
};
fetch('https://api.growthbook.io/api/v1/fact-tables', 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",
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>',
'datasource' => '<string>',
'userIdTypes' => [
'<string>'
],
'sql' => '<string>',
'description' => '<string>',
'owner' => '<string>',
'projects' => [
'<string>'
],
'tags' => [
'<string>'
],
'eventName' => '<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/fact-tables"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"datasource\": \"<string>\",\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"sql\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"eventName\": \"<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/fact-tables")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"datasource\": \"<string>\",\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"sql\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"eventName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/fact-tables")
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 \"datasource\": \"<string>\",\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"sql\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"eventName\": \"<string>\"\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>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"ownerEmail": "<string>",
"aggregatedFactTableSettings": {
"idTypes": [
"<string>"
],
"updateTime": {
"time": "<string>",
"timezone": "<string>"
},
"lookbackWindow": 123,
"restateChunkDays": 4
},
"eventName": "<string>",
"columns": [
{
"column": "<string>",
"jsonFields": {},
"name": "<string>",
"description": "<string>",
"alwaysInlineFilter": false,
"deleted": false,
"isAutoSliceColumn": false,
"autoSlices": [
"<string>"
],
"lockedAutoSlices": [
"<string>"
],
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z"
}
],
"columnsError": "<string>",
"archived": 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"
Body
The datasource id
List of identifier columns in this table. For example, "id" or "anonymous_id"
The SQL query for this fact table
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
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 event name used in SQL template variables
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' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"Orders","datasource":"ds_abc123","userIdTypes":["id"],"sql":"SELECT * FROM orders"}'import requests
url = "https://api.growthbook.io/api/v1/fact-tables"
payload = {
"name": "<string>",
"datasource": "<string>",
"userIdTypes": ["<string>"],
"sql": "<string>",
"description": "<string>",
"owner": "<string>",
"projects": ["<string>"],
"tags": ["<string>"],
"eventName": "<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({
name: '<string>',
datasource: '<string>',
userIdTypes: ['<string>'],
sql: '<string>',
description: '<string>',
owner: '<string>',
projects: ['<string>'],
tags: ['<string>'],
eventName: '<string>'
})
};
fetch('https://api.growthbook.io/api/v1/fact-tables', 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",
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>',
'datasource' => '<string>',
'userIdTypes' => [
'<string>'
],
'sql' => '<string>',
'description' => '<string>',
'owner' => '<string>',
'projects' => [
'<string>'
],
'tags' => [
'<string>'
],
'eventName' => '<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/fact-tables"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"datasource\": \"<string>\",\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"sql\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"eventName\": \"<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/fact-tables")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"datasource\": \"<string>\",\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"sql\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"eventName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/fact-tables")
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 \"datasource\": \"<string>\",\n \"userIdTypes\": [\n \"<string>\"\n ],\n \"sql\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"tags\": [\n \"<string>\"\n ],\n \"eventName\": \"<string>\"\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>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"ownerEmail": "<string>",
"aggregatedFactTableSettings": {
"idTypes": [
"<string>"
],
"updateTime": {
"time": "<string>",
"timezone": "<string>"
},
"lookbackWindow": 123,
"restateChunkDays": 4
},
"eventName": "<string>",
"columns": [
{
"column": "<string>",
"jsonFields": {},
"name": "<string>",
"description": "<string>",
"alwaysInlineFilter": false,
"deleted": false,
"isAutoSliceColumn": false,
"autoSlices": [
"<string>"
],
"lockedAutoSlices": [
"<string>"
],
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z"
}
],
"columnsError": "<string>",
"archived": true
}
}
