API
GrowthBook's API has both public endpoints plus an authenticated REST API beta.
Public Endpoints
Currently, GrowthBook has a single public endpoint, the SDK Endpoint. This is a unique URL that returns your feature definitions, which can be passed into any of the GrowthBook SDKs - front-end, server-side, or mobile.
Using this endpoint is one way to get your feature definitions. The other way is via Webhooks, where we send the same payload to you automatically whenever someone updates a feature in GrowthBook.
Environments
SDK Endpoints are scoped to a single environment (e.g. dev or production).
When you first create a GrowthBook account, we add a default "production" environment for you with a single SDK Endpoint. You can add new environments and SDK Endpoints by going to Features -> Environments.
The SDK Endpoint
In GrowthBook Cloud, the SDK endpoint is served from our global CDN: https://cdn.growthbook.io/api/features/.... If you are self-hosting, you'll want to set up either a CDN or cache layer yourself in front of the GrowthBook API for scalability.
Here is an example response from an SDK endpoint (pretty-printed for readability):
{
"status": 200,
"features": {
"feature-key": {
"defaultValue": true
},
"another-feature": {
"defaultValue": "blue",
"rules": [
{
"condition": {
"browser": "firefox"
},
"force": "green"
}
]
}
}
}
The status field mirrors the HTTP status. The features field has feature definitions indexed by the feature key.
Each feature definition has a default value and optional rules that override the value based on targeting conditions. Rules can also be experiments or rollouts where values are randomly assigned to users.
Project-scoping
If you've set up multiple projects within GrowthBook, you can optionally add a querystring to the SDK endpoint to only include features in a specific project. By default, features from all projects are returned.
To do this, add the querystring ?project={projectId}. You can find the id for your project under Settings > Projects (will start with prj_).
For example:
/api/features/dev_abc123?project=prj_456def
Official SDKs
We offer official SDKs that work with these data structures in a few popular languages with more coming soon.
Authenticated REST API beta
In addition to the public API endpoints, GrowthBook also offers a full REST API for interacting with the GrowthBook application. This is currently in beta as we add more authenticated API routes and features.
All request and response bodies are JSON-encoded.
The API base URL for GrowthBook Cloud is https://api.growthbook.io. For self-hosted deployments, it is the same as your API_HOST environment variable (defaults to http://localhost:3100). The rest of these docs will assume you are using GrowthBook Cloud.
Authentication
We support both the HTTP Basic and Bearer authentication schemes for convenience.
You first need to generate a new Secret Key in GrowthBook by going to Settings -> API Keys.
If using HTTP Basic auth, pass the Secret Key as the username and leave the password blank:
curl https://api.growthbook.io/api/v1 \
-u secret_abc123DEF456:
# The ":" at the end stops curl from asking for a password
If using Bearer auth, pass the Secret Key as the token:
curl https://api.growthbook.io/api/v1 \
-H "Authorization: Bearer secret_abc123DEF456"
Errors
The API may return the following error status codes:
- 400 - Bad Request - Often due to a missing required parameter
- 401 - Unauthorized - No valid API key provided
- 402 - Request Failed - The parameters are valid, but the request failed
- 403 - Forbidden - Provided API key does not have the required access
- 404 - Not Found - Unknown API route or requested resource
- 429 - Too Many Requests - You exceeded the rate limit of 60 requests per minute. Try again later.
- 5XX - Server Error - Something went wrong on GrowthBook's end (these are rare)
The response body will be a JSON object with the following properties:
- message - Information about the error
Pagination
All list methods are paginated and support the querystring parameters:
limit- number to return, between 1 and 100, default10offset- how many to skip, default0
For example:
curl -G https://api.growthbook.io/api/v1/features \
-u secret_abc123DEF456:
-d limit=5
-d offset=10
# Return features 11-15
And the response will contain the fields:
limit- The limit used for the current requestoffset- The offset used for the current requestcount- Number returned in the responsetotal- Total number of itemshasMore-trueif there is another page,falseif there are no more itemsnextOffset- Offset to fetch the next page, ornullif there are no more results
Features
The Feature Object
This object represents a single feature in your account. Features are complex objects with many nested properties.
Typescript Type Definition
interface Feature {
id: string;
archived: boolean;
description: string;
owner: string;
project: string;
dateCreated: string;
dateUpdated: string;
valueType: "boolean" | "number" | "string" | "json";
defaultValue: string;
tags: string[];
environments: {
[key: string]: FeatureEnvironment;
};
revision: {
version: number;
comment: string;
date: string;
publishedBy: string;
};
}
interface FeatureEnvironment {
enabled: boolean;
defaultValue: string;
rules: FeatureRule[];
definition: FeatureDefinition | null;
draft: null | {
enabled: boolean;
defaultValue: string;
rules: FeatureRule[];
definition: FeatureDefinition | null;
};
}
type FeatureRule = ForceRule | RolloutRule | ExperimentRule;
interface ForceRule {
type: "force";
description: string;
condition?: string;
id: string;
enabled?: boolean;
value: string;
}
interface RolloutRule {
type: "rollout";
description: string;
condition?: string;
id: string;
enabled?: boolean;
value: string;
coverage: number;
hashAttribute: string;
}
interface ExperimentRule {
type: "experiment";
description: string;
condition?: string;
id: string;
enabled?: boolean;
trackingKey: string;
hashAttribute: string;
namespace?: {
enabled: boolean;
name: string;
range: [number, number];
};
coverage?: number;
values: {
value: string;
weight: number;
name?: string;
}[];
}
// This is the same format returned from the SDK Endpoints
interface FeatureDefinition {
defaultValue: any;
rules?: FeatureDefinitionRule[];
}
interface FeatureDefinitionRule {
force?: any;
weights?: number[];
variations?: any[];
hashAttribute?: string;
namespace?: [string, number, number];
key?: string;
coverage?: number;
condition?: any;
}
Example JSON object
{
"id": "my-test-feature",
"description": "My test feature!!!",
"archived": false,
"dateCreated": "2022-10-18T21:19:58.288Z",
"dateUpdated": "2022-10-18T21:42:29.835Z",
"defaultValue": "false",
"environments": {
"production": {
"defaultValue": "false",
"enabled": true,
"rules": [
{
"type": "force",
"description": "Turn on for admins",
"id": "fr_75x7w5jn14l9eqd7g7",
"value": "true",
"enabled": true,
"condition": "{\"admin\":true}"
}
],
"draft": null,
"definition": {
"defaultValue": false,
"rules": [
{
"condition": {
"admin": true
},
"force": true
}
]
}
}
},
"owner": "John Smith",
"project": "",
"tags": ["cool-features"],
"valueType": "boolean",
"revision": {
"comment": "",
"date": "2022-10-18T21:22:10.379Z",
"publishedBy": "test@example.com",
"version": 2
}
}
List Features
GET /api/v1/features
This endpoint returns all of the features in your account, sorted by dateCreated in chronological order (oldest first).
curl https://api.growthbook.io/api/v1/features \
-u secret_abc123DEF456:
The reponse body contains a list of features and pagination information.
Typescript Type Definition
interface ListFeaturesResponse {
features: Feature[];
// Pagination info
limit: number;
offset: number;
count: number;
total: number;
hasMore: boolean;
nextOffset: number;
}
Example JSON object
{
"features": [
{
"id": "my-test-feature",
"description": "My test feature!!!",
"archived": false,
"dateCreated": "2022-10-18T21:19:58.288Z",
"dateUpdated": "2022-10-18T21:42:29.835Z",
"defaultValue": "false",
"environments": {
"production": {
"defaultValue": "false",
"enabled": true,
"rules": [],
"draft": null,
"definition": {
"defaultValue": false
}
}
},
"owner": "John Smith",
"project": "",
"tags": ["cool-features"],
"valueType": "boolean",
"revision": {
"comment": "",
"date": "2022-10-18T21:22:10.379Z",
"publishedBy": "test@example.com",
"version": 2
}
}
],
"limit": 1,
"offset": 0,
"count": 1,
"total": 20,
"hasMore": true,
"nextOffset": 1
}
