Create a single dashboard
Deprecated. Use POST /v2/dashboards instead.
This endpoint does not accept an owner and always assigns the dashboard to the authenticated user. A dashboard created with an organization secret API key, which has no associated user, therefore has no owner. The v2 endpoint accepts an owner (userId or email) and requires one when authenticating with an organization secret API key.
curl -X POST 'https://api.growthbook.io/api/v1/dashboards' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/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>"
}
}
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>'}
})
};
fetch('https://api.growthbook.io/api/v1/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/v1/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>'
]
]),
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/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}")
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/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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/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}"
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
Response
Resource created
Show child attributes
Show child attributes
Was this page helpful?
curl -X POST 'https://api.growthbook.io/api/v1/dashboards' \
-H 'Authorization: Bearer YOUR_API_KEY'import requests
url = "https://api.growthbook.io/api/v1/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>"
}
}
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>'}
})
};
fetch('https://api.growthbook.io/api/v1/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/v1/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>'
]
]),
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/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}")
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/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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/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}"
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>"
}
}
