Update a metric
curl -X PUT 'https://api.growthbook.io/api/v1/metrics/abc123' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"net revenue","description":"revenue minus lacroix spend"}'import requests
url = "https://api.growthbook.io/api/v1/metrics/{id}"
payload = {
"owner": "<string>",
"name": "<string>",
"description": "<string>",
"tags": ["<string>"],
"projects": ["<string>"],
"archived": True,
"behavior": {
"cap": 1,
"capValue": 1,
"conversionWindowStart": 123,
"conversionWindowEnd": 123,
"riskThresholdSuccess": 1,
"riskThresholdDanger": 1,
"minPercentChange": 1,
"maxPercentChange": 1,
"minSampleSize": 1,
"targetMDE": 1
},
"sql": {
"identifierTypes": ["<string>"],
"conversionSQL": "<string>",
"userAggregationSQL": "<string>",
"denominatorMetricId": "<string>"
},
"sqlBuilder": {
"identifierTypeColumns": [
{
"identifierType": "<string>",
"columnName": "<string>"
}
],
"tableName": "<string>",
"valueColumnName": "<string>",
"timestampColumnName": "<string>",
"conditions": [
{
"column": "<string>",
"operator": "<string>",
"value": "<string>"
}
]
},
"mixpanel": {
"eventName": "<string>",
"eventValue": "<string>",
"userAggregation": "<string>",
"conditions": [
{
"property": "<string>",
"operator": "<string>",
"value": "<string>"
}
]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
owner: '<string>',
name: '<string>',
description: '<string>',
tags: ['<string>'],
projects: ['<string>'],
archived: true,
behavior: {
cap: 1,
capValue: 1,
conversionWindowStart: 123,
conversionWindowEnd: 123,
riskThresholdSuccess: 1,
riskThresholdDanger: 1,
minPercentChange: 1,
maxPercentChange: 1,
minSampleSize: 1,
targetMDE: 1
},
sql: {
identifierTypes: ['<string>'],
conversionSQL: '<string>',
userAggregationSQL: '<string>',
denominatorMetricId: '<string>'
},
sqlBuilder: {
identifierTypeColumns: [{identifierType: '<string>', columnName: '<string>'}],
tableName: '<string>',
valueColumnName: '<string>',
timestampColumnName: '<string>',
conditions: [{column: '<string>', operator: '<string>', value: '<string>'}]
},
mixpanel: {
eventName: '<string>',
eventValue: '<string>',
userAggregation: '<string>',
conditions: [{property: '<string>', operator: '<string>', value: '<string>'}]
}
})
};
fetch('https://api.growthbook.io/api/v1/metrics/{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/metrics/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'owner' => '<string>',
'name' => '<string>',
'description' => '<string>',
'tags' => [
'<string>'
],
'projects' => [
'<string>'
],
'archived' => true,
'behavior' => [
'cap' => 1,
'capValue' => 1,
'conversionWindowStart' => 123,
'conversionWindowEnd' => 123,
'riskThresholdSuccess' => 1,
'riskThresholdDanger' => 1,
'minPercentChange' => 1,
'maxPercentChange' => 1,
'minSampleSize' => 1,
'targetMDE' => 1
],
'sql' => [
'identifierTypes' => [
'<string>'
],
'conversionSQL' => '<string>',
'userAggregationSQL' => '<string>',
'denominatorMetricId' => '<string>'
],
'sqlBuilder' => [
'identifierTypeColumns' => [
[
'identifierType' => '<string>',
'columnName' => '<string>'
]
],
'tableName' => '<string>',
'valueColumnName' => '<string>',
'timestampColumnName' => '<string>',
'conditions' => [
[
'column' => '<string>',
'operator' => '<string>',
'value' => '<string>'
]
]
],
'mixpanel' => [
'eventName' => '<string>',
'eventValue' => '<string>',
'userAggregation' => '<string>',
'conditions' => [
[
'property' => '<string>',
'operator' => '<string>',
'value' => '<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/metrics/{id}"
payload := strings.NewReader("{\n \"owner\": \"<string>\",\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"projects\": [\n \"<string>\"\n ],\n \"archived\": true,\n \"behavior\": {\n \"cap\": 1,\n \"capValue\": 1,\n \"conversionWindowStart\": 123,\n \"conversionWindowEnd\": 123,\n \"riskThresholdSuccess\": 1,\n \"riskThresholdDanger\": 1,\n \"minPercentChange\": 1,\n \"maxPercentChange\": 1,\n \"minSampleSize\": 1,\n \"targetMDE\": 1\n },\n \"sql\": {\n \"identifierTypes\": [\n \"<string>\"\n ],\n \"conversionSQL\": \"<string>\",\n \"userAggregationSQL\": \"<string>\",\n \"denominatorMetricId\": \"<string>\"\n },\n \"sqlBuilder\": {\n \"identifierTypeColumns\": [\n {\n \"identifierType\": \"<string>\",\n \"columnName\": \"<string>\"\n }\n ],\n \"tableName\": \"<string>\",\n \"valueColumnName\": \"<string>\",\n \"timestampColumnName\": \"<string>\",\n \"conditions\": [\n {\n \"column\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"mixpanel\": {\n \"eventName\": \"<string>\",\n \"eventValue\": \"<string>\",\n \"userAggregation\": \"<string>\",\n \"conditions\": [\n {\n \"property\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.growthbook.io/api/v1/metrics/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"owner\": \"<string>\",\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"projects\": [\n \"<string>\"\n ],\n \"archived\": true,\n \"behavior\": {\n \"cap\": 1,\n \"capValue\": 1,\n \"conversionWindowStart\": 123,\n \"conversionWindowEnd\": 123,\n \"riskThresholdSuccess\": 1,\n \"riskThresholdDanger\": 1,\n \"minPercentChange\": 1,\n \"maxPercentChange\": 1,\n \"minSampleSize\": 1,\n \"targetMDE\": 1\n },\n \"sql\": {\n \"identifierTypes\": [\n \"<string>\"\n ],\n \"conversionSQL\": \"<string>\",\n \"userAggregationSQL\": \"<string>\",\n \"denominatorMetricId\": \"<string>\"\n },\n \"sqlBuilder\": {\n \"identifierTypeColumns\": [\n {\n \"identifierType\": \"<string>\",\n \"columnName\": \"<string>\"\n }\n ],\n \"tableName\": \"<string>\",\n \"valueColumnName\": \"<string>\",\n \"timestampColumnName\": \"<string>\",\n \"conditions\": [\n {\n \"column\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"mixpanel\": {\n \"eventName\": \"<string>\",\n \"eventValue\": \"<string>\",\n \"userAggregation\": \"<string>\",\n \"conditions\": [\n {\n \"property\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/metrics/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"owner\": \"<string>\",\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"projects\": [\n \"<string>\"\n ],\n \"archived\": true,\n \"behavior\": {\n \"cap\": 1,\n \"capValue\": 1,\n \"conversionWindowStart\": 123,\n \"conversionWindowEnd\": 123,\n \"riskThresholdSuccess\": 1,\n \"riskThresholdDanger\": 1,\n \"minPercentChange\": 1,\n \"maxPercentChange\": 1,\n \"minSampleSize\": 1,\n \"targetMDE\": 1\n },\n \"sql\": {\n \"identifierTypes\": [\n \"<string>\"\n ],\n \"conversionSQL\": \"<string>\",\n \"userAggregationSQL\": \"<string>\",\n \"denominatorMetricId\": \"<string>\"\n },\n \"sqlBuilder\": {\n \"identifierTypeColumns\": [\n {\n \"identifierType\": \"<string>\",\n \"columnName\": \"<string>\"\n }\n ],\n \"tableName\": \"<string>\",\n \"valueColumnName\": \"<string>\",\n \"timestampColumnName\": \"<string>\",\n \"conditions\": [\n {\n \"column\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"mixpanel\": {\n \"eventName\": \"<string>\",\n \"eventValue\": \"<string>\",\n \"userAggregation\": \"<string>\",\n \"conditions\": [\n {\n \"property\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"updatedId": "<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"
Path Parameters
The id of the requested resource
Body
Where this metric must be managed from. If not set (empty string), it can be managed from anywhere. If set to "api", it can be managed via the API only. Please note that we have deprecated support for setting the managedBy property to "admin". Your existing Legacy Metrics with this value will continue to work, but we suggest migrating to Fact Metrics instead.
, api, admin 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.
Name of the metric
Description of the metric
10000Type of metric. See Metrics documentation
binomial, count, duration, revenue List of tags
List of project IDs for projects that can access this metric
Show child attributes
Show child attributes
Preferred way to define SQL. Only one of sql, sqlBuilder or mixpanel allowed.
Show child attributes
Show child attributes
An alternative way to specify a SQL metric, rather than a full query. Using sql is preferred to sqlBuilder. Only one of sql, sqlBuilder or mixpanel allowed
Show child attributes
Show child attributes
Only use for MixPanel (non-SQL) Data Sources. Only one of sql, sqlBuilder or mixpanel allowed.
Show child attributes
Show child attributes
Response
Resource updated
Was this page helpful?
curl -X PUT 'https://api.growthbook.io/api/v1/metrics/abc123' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"name":"net revenue","description":"revenue minus lacroix spend"}'import requests
url = "https://api.growthbook.io/api/v1/metrics/{id}"
payload = {
"owner": "<string>",
"name": "<string>",
"description": "<string>",
"tags": ["<string>"],
"projects": ["<string>"],
"archived": True,
"behavior": {
"cap": 1,
"capValue": 1,
"conversionWindowStart": 123,
"conversionWindowEnd": 123,
"riskThresholdSuccess": 1,
"riskThresholdDanger": 1,
"minPercentChange": 1,
"maxPercentChange": 1,
"minSampleSize": 1,
"targetMDE": 1
},
"sql": {
"identifierTypes": ["<string>"],
"conversionSQL": "<string>",
"userAggregationSQL": "<string>",
"denominatorMetricId": "<string>"
},
"sqlBuilder": {
"identifierTypeColumns": [
{
"identifierType": "<string>",
"columnName": "<string>"
}
],
"tableName": "<string>",
"valueColumnName": "<string>",
"timestampColumnName": "<string>",
"conditions": [
{
"column": "<string>",
"operator": "<string>",
"value": "<string>"
}
]
},
"mixpanel": {
"eventName": "<string>",
"eventValue": "<string>",
"userAggregation": "<string>",
"conditions": [
{
"property": "<string>",
"operator": "<string>",
"value": "<string>"
}
]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
owner: '<string>',
name: '<string>',
description: '<string>',
tags: ['<string>'],
projects: ['<string>'],
archived: true,
behavior: {
cap: 1,
capValue: 1,
conversionWindowStart: 123,
conversionWindowEnd: 123,
riskThresholdSuccess: 1,
riskThresholdDanger: 1,
minPercentChange: 1,
maxPercentChange: 1,
minSampleSize: 1,
targetMDE: 1
},
sql: {
identifierTypes: ['<string>'],
conversionSQL: '<string>',
userAggregationSQL: '<string>',
denominatorMetricId: '<string>'
},
sqlBuilder: {
identifierTypeColumns: [{identifierType: '<string>', columnName: '<string>'}],
tableName: '<string>',
valueColumnName: '<string>',
timestampColumnName: '<string>',
conditions: [{column: '<string>', operator: '<string>', value: '<string>'}]
},
mixpanel: {
eventName: '<string>',
eventValue: '<string>',
userAggregation: '<string>',
conditions: [{property: '<string>', operator: '<string>', value: '<string>'}]
}
})
};
fetch('https://api.growthbook.io/api/v1/metrics/{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/metrics/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'owner' => '<string>',
'name' => '<string>',
'description' => '<string>',
'tags' => [
'<string>'
],
'projects' => [
'<string>'
],
'archived' => true,
'behavior' => [
'cap' => 1,
'capValue' => 1,
'conversionWindowStart' => 123,
'conversionWindowEnd' => 123,
'riskThresholdSuccess' => 1,
'riskThresholdDanger' => 1,
'minPercentChange' => 1,
'maxPercentChange' => 1,
'minSampleSize' => 1,
'targetMDE' => 1
],
'sql' => [
'identifierTypes' => [
'<string>'
],
'conversionSQL' => '<string>',
'userAggregationSQL' => '<string>',
'denominatorMetricId' => '<string>'
],
'sqlBuilder' => [
'identifierTypeColumns' => [
[
'identifierType' => '<string>',
'columnName' => '<string>'
]
],
'tableName' => '<string>',
'valueColumnName' => '<string>',
'timestampColumnName' => '<string>',
'conditions' => [
[
'column' => '<string>',
'operator' => '<string>',
'value' => '<string>'
]
]
],
'mixpanel' => [
'eventName' => '<string>',
'eventValue' => '<string>',
'userAggregation' => '<string>',
'conditions' => [
[
'property' => '<string>',
'operator' => '<string>',
'value' => '<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/metrics/{id}"
payload := strings.NewReader("{\n \"owner\": \"<string>\",\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"projects\": [\n \"<string>\"\n ],\n \"archived\": true,\n \"behavior\": {\n \"cap\": 1,\n \"capValue\": 1,\n \"conversionWindowStart\": 123,\n \"conversionWindowEnd\": 123,\n \"riskThresholdSuccess\": 1,\n \"riskThresholdDanger\": 1,\n \"minPercentChange\": 1,\n \"maxPercentChange\": 1,\n \"minSampleSize\": 1,\n \"targetMDE\": 1\n },\n \"sql\": {\n \"identifierTypes\": [\n \"<string>\"\n ],\n \"conversionSQL\": \"<string>\",\n \"userAggregationSQL\": \"<string>\",\n \"denominatorMetricId\": \"<string>\"\n },\n \"sqlBuilder\": {\n \"identifierTypeColumns\": [\n {\n \"identifierType\": \"<string>\",\n \"columnName\": \"<string>\"\n }\n ],\n \"tableName\": \"<string>\",\n \"valueColumnName\": \"<string>\",\n \"timestampColumnName\": \"<string>\",\n \"conditions\": [\n {\n \"column\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"mixpanel\": {\n \"eventName\": \"<string>\",\n \"eventValue\": \"<string>\",\n \"userAggregation\": \"<string>\",\n \"conditions\": [\n {\n \"property\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.growthbook.io/api/v1/metrics/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"owner\": \"<string>\",\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"projects\": [\n \"<string>\"\n ],\n \"archived\": true,\n \"behavior\": {\n \"cap\": 1,\n \"capValue\": 1,\n \"conversionWindowStart\": 123,\n \"conversionWindowEnd\": 123,\n \"riskThresholdSuccess\": 1,\n \"riskThresholdDanger\": 1,\n \"minPercentChange\": 1,\n \"maxPercentChange\": 1,\n \"minSampleSize\": 1,\n \"targetMDE\": 1\n },\n \"sql\": {\n \"identifierTypes\": [\n \"<string>\"\n ],\n \"conversionSQL\": \"<string>\",\n \"userAggregationSQL\": \"<string>\",\n \"denominatorMetricId\": \"<string>\"\n },\n \"sqlBuilder\": {\n \"identifierTypeColumns\": [\n {\n \"identifierType\": \"<string>\",\n \"columnName\": \"<string>\"\n }\n ],\n \"tableName\": \"<string>\",\n \"valueColumnName\": \"<string>\",\n \"timestampColumnName\": \"<string>\",\n \"conditions\": [\n {\n \"column\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"mixpanel\": {\n \"eventName\": \"<string>\",\n \"eventValue\": \"<string>\",\n \"userAggregation\": \"<string>\",\n \"conditions\": [\n {\n \"property\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/metrics/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"owner\": \"<string>\",\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"projects\": [\n \"<string>\"\n ],\n \"archived\": true,\n \"behavior\": {\n \"cap\": 1,\n \"capValue\": 1,\n \"conversionWindowStart\": 123,\n \"conversionWindowEnd\": 123,\n \"riskThresholdSuccess\": 1,\n \"riskThresholdDanger\": 1,\n \"minPercentChange\": 1,\n \"maxPercentChange\": 1,\n \"minSampleSize\": 1,\n \"targetMDE\": 1\n },\n \"sql\": {\n \"identifierTypes\": [\n \"<string>\"\n ],\n \"conversionSQL\": \"<string>\",\n \"userAggregationSQL\": \"<string>\",\n \"denominatorMetricId\": \"<string>\"\n },\n \"sqlBuilder\": {\n \"identifierTypeColumns\": [\n {\n \"identifierType\": \"<string>\",\n \"columnName\": \"<string>\"\n }\n ],\n \"tableName\": \"<string>\",\n \"valueColumnName\": \"<string>\",\n \"timestampColumnName\": \"<string>\",\n \"conditions\": [\n {\n \"column\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"mixpanel\": {\n \"eventName\": \"<string>\",\n \"eventValue\": \"<string>\",\n \"userAggregation\": \"<string>\",\n \"conditions\": [\n {\n \"property\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"updatedId": "<string>"
}
