Create a single dashboard
curl -X POST 'https://api.growthbook.io/api/v2/dashboards' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v2/dashboards"
payload = {
"title": "<string>",
"enableAutoUpdates": True,
"blocks": [
{
"type": "markdown",
"title": "<string>",
"description": "<string>",
"content": "<string>",
"snapshotId": "<string>"
}
],
"updateSchedule": {
"type": "stale",
"hours": 123
},
"experimentId": "<string>",
"projects": ["<string>"],
"globalControls": {
"projects": ["<string>"],
"experimentSearchString": "<string>"
},
"owner": "<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({
title: '<string>',
enableAutoUpdates: true,
blocks: [
{
type: 'markdown',
title: '<string>',
description: '<string>',
content: '<string>',
snapshotId: '<string>'
}
],
updateSchedule: {type: 'stale', hours: 123},
experimentId: '<string>',
projects: ['<string>'],
globalControls: {projects: ['<string>'], experimentSearchString: '<string>'},
owner: '<string>'
})
};
fetch('https://api.growthbook.io/api/v2/dashboards', 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/dashboards",
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([
'title' => '<string>',
'enableAutoUpdates' => true,
'blocks' => [
[
'type' => 'markdown',
'title' => '<string>',
'description' => '<string>',
'content' => '<string>',
'snapshotId' => '<string>'
]
],
'updateSchedule' => [
'type' => 'stale',
'hours' => 123
],
'experimentId' => '<string>',
'projects' => [
'<string>'
],
'globalControls' => [
'projects' => [
'<string>'
],
'experimentSearchString' => '<string>'
],
'owner' => '<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/v2/dashboards"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"enableAutoUpdates\": true,\n \"blocks\": [\n {\n \"type\": \"markdown\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"content\": \"<string>\",\n \"snapshotId\": \"<string>\"\n }\n ],\n \"updateSchedule\": {\n \"type\": \"stale\",\n \"hours\": 123\n },\n \"experimentId\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"globalControls\": {\n \"projects\": [\n \"<string>\"\n ],\n \"experimentSearchString\": \"<string>\"\n },\n \"owner\": \"<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/v2/dashboards")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"enableAutoUpdates\": true,\n \"blocks\": [\n {\n \"type\": \"markdown\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"content\": \"<string>\",\n \"snapshotId\": \"<string>\"\n }\n ],\n \"updateSchedule\": {\n \"type\": \"stale\",\n \"hours\": 123\n },\n \"experimentId\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"globalControls\": {\n \"projects\": [\n \"<string>\"\n ],\n \"experimentSearchString\": \"<string>\"\n },\n \"owner\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v2/dashboards")
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 \"title\": \"<string>\",\n \"enableAutoUpdates\": true,\n \"blocks\": [\n {\n \"type\": \"markdown\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"content\": \"<string>\",\n \"snapshotId\": \"<string>\"\n }\n ],\n \"updateSchedule\": {\n \"type\": \"stale\",\n \"hours\": 123\n },\n \"experimentId\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"globalControls\": {\n \"projects\": [\n \"<string>\"\n ],\n \"experimentSearchString\": \"<string>\"\n },\n \"owner\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"dashboard": {
"id": "<string>",
"uid": "<string>",
"organization": "<string>",
"isDefault": true,
"isDeleted": true,
"userId": "<string>",
"editLevel": "published",
"shareLevel": "published",
"enableAutoUpdates": true,
"title": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"blocks": [
{
"organization": "<string>",
"id": "<string>",
"uid": "<string>",
"type": "metric-explorer",
"title": "<string>",
"description": "<string>",
"factMetricId": "<string>",
"visualizationType": "histogram",
"valueType": "avg",
"metricAnalysisId": "<string>",
"analysisSettings": {
"userIdType": "<string>",
"lookbackDays": 123,
"populationType": "metric",
"populationId": "<string>",
"startDate": "<string>",
"endDate": "<string>",
"additionalNumeratorFilters": [
"<string>"
],
"additionalDenominatorFilters": [
"<string>"
]
},
"snapshotId": "<string>",
"layout": {
"x": 11,
"y": 1,
"w": 12,
"h": 2,
"static": true
},
"comparison": {
"enabled": true,
"mode": "previousPeriod",
"previousTimeFrame": {
"predefined": "today",
"lookbackValue": 123,
"lookbackUnit": "hour",
"startDate": "<string>",
"endDate": "<string>"
}
},
"comparisonMetricAnalysisId": "<string>"
}
],
"owner": "<string>",
"experimentId": "<string>",
"updateSchedule": {
"type": "stale",
"hours": 123
},
"globalControls": {
"dateRange": {
"predefined": "today",
"lookbackValue": 123,
"lookbackUnit": "hour",
"startDate": "<string>",
"endDate": "<string>"
},
"dateGranularity": "auto",
"projects": [
"<string>"
],
"experimentSearchString": "<string>"
},
"comparison": {
"enabled": true,
"mode": "previousPeriod",
"previousTimeFrame": {
"predefined": "today",
"lookbackValue": 123,
"lookbackUnit": "hour",
"startDate": "<string>",
"endDate": "<string>"
}
},
"grid": {
"cols": 24,
"rowHeight": 40
},
"projects": [
"<string>"
],
"nextUpdate": "2023-11-07T05:31:56Z",
"lastUpdated": "2023-11-07T05:31:56Z",
"ownerEmail": "<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
The display name of the Dashboard
Dashboards that are "published" are editable by organization members with appropriate permissions
published, private General Dashboards only. Dashboards that are "published" are viewable by organization members with appropriate permissions
published, private If enabled for a General Dashboard, also requires an updateSchedule
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
- Option 11
- Option 12
- Option 13
- Option 14
- Option 15
- Option 16
- Option 17
Show child attributes
Show child attributes
General Dashboards only. Experiment Dashboards update based on the parent experiment instead
- Option 1
- Option 2
Show child attributes
Show child attributes
The parent experiment for an Experiment Dashboard, or undefined for a general dashboard
General Dashboards only, Experiment Dashboards use the experiment's projects
Show child attributes
Show child attributes
Dashboard-wide compare-to-previous-period. Takes precedence over any per-block comparison.
Show child attributes
Show child attributes
The 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. Optional when authenticating with a Personal Access Token (PAT): when omitted, the owner defaults to the PAT's user. Required when authenticating with an organization secret API key (which has no associated user): omitting it fails with a 400. A private dashboard created with an organization secret API key can only be retrieved or updated using its owner's Personal Access Token (PAT).
1Response
Resource created
Show child attributes
Show child attributes
Was this page helpful?
curl -X POST 'https://api.growthbook.io/api/v2/dashboards' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v2/dashboards"
payload = {
"title": "<string>",
"enableAutoUpdates": True,
"blocks": [
{
"type": "markdown",
"title": "<string>",
"description": "<string>",
"content": "<string>",
"snapshotId": "<string>"
}
],
"updateSchedule": {
"type": "stale",
"hours": 123
},
"experimentId": "<string>",
"projects": ["<string>"],
"globalControls": {
"projects": ["<string>"],
"experimentSearchString": "<string>"
},
"owner": "<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({
title: '<string>',
enableAutoUpdates: true,
blocks: [
{
type: 'markdown',
title: '<string>',
description: '<string>',
content: '<string>',
snapshotId: '<string>'
}
],
updateSchedule: {type: 'stale', hours: 123},
experimentId: '<string>',
projects: ['<string>'],
globalControls: {projects: ['<string>'], experimentSearchString: '<string>'},
owner: '<string>'
})
};
fetch('https://api.growthbook.io/api/v2/dashboards', 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/dashboards",
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([
'title' => '<string>',
'enableAutoUpdates' => true,
'blocks' => [
[
'type' => 'markdown',
'title' => '<string>',
'description' => '<string>',
'content' => '<string>',
'snapshotId' => '<string>'
]
],
'updateSchedule' => [
'type' => 'stale',
'hours' => 123
],
'experimentId' => '<string>',
'projects' => [
'<string>'
],
'globalControls' => [
'projects' => [
'<string>'
],
'experimentSearchString' => '<string>'
],
'owner' => '<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/v2/dashboards"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"enableAutoUpdates\": true,\n \"blocks\": [\n {\n \"type\": \"markdown\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"content\": \"<string>\",\n \"snapshotId\": \"<string>\"\n }\n ],\n \"updateSchedule\": {\n \"type\": \"stale\",\n \"hours\": 123\n },\n \"experimentId\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"globalControls\": {\n \"projects\": [\n \"<string>\"\n ],\n \"experimentSearchString\": \"<string>\"\n },\n \"owner\": \"<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/v2/dashboards")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"enableAutoUpdates\": true,\n \"blocks\": [\n {\n \"type\": \"markdown\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"content\": \"<string>\",\n \"snapshotId\": \"<string>\"\n }\n ],\n \"updateSchedule\": {\n \"type\": \"stale\",\n \"hours\": 123\n },\n \"experimentId\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"globalControls\": {\n \"projects\": [\n \"<string>\"\n ],\n \"experimentSearchString\": \"<string>\"\n },\n \"owner\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v2/dashboards")
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 \"title\": \"<string>\",\n \"enableAutoUpdates\": true,\n \"blocks\": [\n {\n \"type\": \"markdown\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"content\": \"<string>\",\n \"snapshotId\": \"<string>\"\n }\n ],\n \"updateSchedule\": {\n \"type\": \"stale\",\n \"hours\": 123\n },\n \"experimentId\": \"<string>\",\n \"projects\": [\n \"<string>\"\n ],\n \"globalControls\": {\n \"projects\": [\n \"<string>\"\n ],\n \"experimentSearchString\": \"<string>\"\n },\n \"owner\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"dashboard": {
"id": "<string>",
"uid": "<string>",
"organization": "<string>",
"isDefault": true,
"isDeleted": true,
"userId": "<string>",
"editLevel": "published",
"shareLevel": "published",
"enableAutoUpdates": true,
"title": "<string>",
"dateCreated": "2023-11-07T05:31:56Z",
"dateUpdated": "2023-11-07T05:31:56Z",
"blocks": [
{
"organization": "<string>",
"id": "<string>",
"uid": "<string>",
"type": "metric-explorer",
"title": "<string>",
"description": "<string>",
"factMetricId": "<string>",
"visualizationType": "histogram",
"valueType": "avg",
"metricAnalysisId": "<string>",
"analysisSettings": {
"userIdType": "<string>",
"lookbackDays": 123,
"populationType": "metric",
"populationId": "<string>",
"startDate": "<string>",
"endDate": "<string>",
"additionalNumeratorFilters": [
"<string>"
],
"additionalDenominatorFilters": [
"<string>"
]
},
"snapshotId": "<string>",
"layout": {
"x": 11,
"y": 1,
"w": 12,
"h": 2,
"static": true
},
"comparison": {
"enabled": true,
"mode": "previousPeriod",
"previousTimeFrame": {
"predefined": "today",
"lookbackValue": 123,
"lookbackUnit": "hour",
"startDate": "<string>",
"endDate": "<string>"
}
},
"comparisonMetricAnalysisId": "<string>"
}
],
"owner": "<string>",
"experimentId": "<string>",
"updateSchedule": {
"type": "stale",
"hours": 123
},
"globalControls": {
"dateRange": {
"predefined": "today",
"lookbackValue": 123,
"lookbackUnit": "hour",
"startDate": "<string>",
"endDate": "<string>"
},
"dateGranularity": "auto",
"projects": [
"<string>"
],
"experimentSearchString": "<string>"
},
"comparison": {
"enabled": true,
"mode": "previousPeriod",
"previousTimeFrame": {
"predefined": "today",
"lookbackValue": 123,
"lookbackUnit": "hour",
"startDate": "<string>",
"endDate": "<string>"
}
},
"grid": {
"cols": 24,
"rowHeight": 40
},
"projects": [
"<string>"
],
"nextUpdate": "2023-11-07T05:31:56Z",
"lastUpdated": "2023-11-07T05:31:56Z",
"ownerEmail": "<string>"
}
}
