Dry-run hook code in the sandbox
POST
/
v1
/
custom-hooks
/
test
cURL
curl -X POST 'https://api.growthbook.io/api/v1/custom-hooks/test' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"functionBody":"if (!feature.description) throw new Error(\"No description\");","functionArgs":{"feature":{"id":"my-feature","description":""}}}'import requests
url = "https://api.growthbook.io/api/v1/custom-hooks/test"
payload = {
"functionBody": "<string>",
"functionArgs": {},
"originalFunctionArgs": {},
"entityId": "<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({
functionBody: '<string>',
functionArgs: {},
originalFunctionArgs: {},
entityId: '<string>'
})
};
fetch('https://api.growthbook.io/api/v1/custom-hooks/test', 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/custom-hooks/test",
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([
'functionBody' => '<string>',
'functionArgs' => [
],
'originalFunctionArgs' => [
],
'entityId' => '<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/custom-hooks/test"
payload := strings.NewReader("{\n \"functionBody\": \"<string>\",\n \"functionArgs\": {},\n \"originalFunctionArgs\": {},\n \"entityId\": \"<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/custom-hooks/test")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"functionBody\": \"<string>\",\n \"functionArgs\": {},\n \"originalFunctionArgs\": {},\n \"entityId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/custom-hooks/test")
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 \"functionBody\": \"<string>\",\n \"functionArgs\": {},\n \"originalFunctionArgs\": {},\n \"entityId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"returnVal": "<string>",
"error": "<string>",
"warnings": [
"<string>"
],
"log": "<string>",
"suppressed": {
"error": "<string>",
"warnings": [
"<string>"
]
}
}Authorizations
bearerAuthbasicAuth
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
application/json
JavaScript function body to execute in the sandbox
Arguments exposed to the function as named globals (e.g. feature, config, revision)
Show child attributes
Show child attributes
State before the change. When supplied, the hook also runs against it and Incremental Changes Only suppression is applied to the result.
Show child attributes
Show child attributes
Available options:
feature, config, experiment Response
200 - application/json
Resource created
Was this page helpful?
⌘I
cURL
curl -X POST 'https://api.growthbook.io/api/v1/custom-hooks/test' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"functionBody":"if (!feature.description) throw new Error(\"No description\");","functionArgs":{"feature":{"id":"my-feature","description":""}}}'import requests
url = "https://api.growthbook.io/api/v1/custom-hooks/test"
payload = {
"functionBody": "<string>",
"functionArgs": {},
"originalFunctionArgs": {},
"entityId": "<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({
functionBody: '<string>',
functionArgs: {},
originalFunctionArgs: {},
entityId: '<string>'
})
};
fetch('https://api.growthbook.io/api/v1/custom-hooks/test', 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/custom-hooks/test",
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([
'functionBody' => '<string>',
'functionArgs' => [
],
'originalFunctionArgs' => [
],
'entityId' => '<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/custom-hooks/test"
payload := strings.NewReader("{\n \"functionBody\": \"<string>\",\n \"functionArgs\": {},\n \"originalFunctionArgs\": {},\n \"entityId\": \"<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/custom-hooks/test")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"functionBody\": \"<string>\",\n \"functionArgs\": {},\n \"originalFunctionArgs\": {},\n \"entityId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.growthbook.io/api/v1/custom-hooks/test")
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 \"functionBody\": \"<string>\",\n \"functionArgs\": {},\n \"originalFunctionArgs\": {},\n \"entityId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"returnVal": "<string>",
"error": "<string>",
"warnings": [
"<string>"
],
"log": "<string>",
"suppressed": {
"error": "<string>",
"warnings": [
"<string>"
]
}
}
