curl --request POST \
--url https://statsigapi.net/console/v1/experiments/assignment_sources \
--header 'Content-Type: application/json' \
--header 'STATSIG-API-KEY: <api-key>' \
--data '
{
"name": "<string>",
"sql": "<string>",
"timestampColumn": "<string>",
"experimentIDColumn": "<string>",
"groupIDColumn": "<string>",
"idTypeMapping": [
{
"statsigUnitID": "<string>",
"column": "<string>"
}
],
"description": "<string>",
"isVerified": true,
"tags": [
"<string>"
],
"isReadOnly": true,
"owner": {
"ownerID": "user123",
"ownerType": "USER",
"ownerName": "John Doe",
"ownerEmail": "owner123@test.com"
}
}
'import requests
url = "https://statsigapi.net/console/v1/experiments/assignment_sources"
payload = {
"name": "<string>",
"sql": "<string>",
"timestampColumn": "<string>",
"experimentIDColumn": "<string>",
"groupIDColumn": "<string>",
"idTypeMapping": [
{
"statsigUnitID": "<string>",
"column": "<string>"
}
],
"description": "<string>",
"isVerified": True,
"tags": ["<string>"],
"isReadOnly": True,
"owner": {
"ownerID": "user123",
"ownerType": "USER",
"ownerName": "John Doe",
"ownerEmail": "owner123@test.com"
}
}
headers = {
"STATSIG-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'STATSIG-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
sql: '<string>',
timestampColumn: '<string>',
experimentIDColumn: '<string>',
groupIDColumn: '<string>',
idTypeMapping: [{statsigUnitID: '<string>', column: '<string>'}],
description: '<string>',
isVerified: true,
tags: ['<string>'],
isReadOnly: true,
owner: {
ownerID: 'user123',
ownerType: 'USER',
ownerName: 'John Doe',
ownerEmail: 'owner123@test.com'
}
})
};
fetch('https://statsigapi.net/console/v1/experiments/assignment_sources', 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://statsigapi.net/console/v1/experiments/assignment_sources",
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([
'name' => '<string>',
'sql' => '<string>',
'timestampColumn' => '<string>',
'experimentIDColumn' => '<string>',
'groupIDColumn' => '<string>',
'idTypeMapping' => [
[
'statsigUnitID' => '<string>',
'column' => '<string>'
]
],
'description' => '<string>',
'isVerified' => true,
'tags' => [
'<string>'
],
'isReadOnly' => true,
'owner' => [
'ownerID' => 'user123',
'ownerType' => 'USER',
'ownerName' => 'John Doe',
'ownerEmail' => 'owner123@test.com'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"STATSIG-API-KEY: <api-key>"
],
]);
$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://statsigapi.net/console/v1/experiments/assignment_sources"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"experimentIDColumn\": \"<string>\",\n \"groupIDColumn\": \"<string>\",\n \"idTypeMapping\": [\n {\n \"statsigUnitID\": \"<string>\",\n \"column\": \"<string>\"\n }\n ],\n \"description\": \"<string>\",\n \"isVerified\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"isReadOnly\": true,\n \"owner\": {\n \"ownerID\": \"user123\",\n \"ownerType\": \"USER\",\n \"ownerName\": \"John Doe\",\n \"ownerEmail\": \"owner123@test.com\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("STATSIG-API-KEY", "<api-key>")
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://statsigapi.net/console/v1/experiments/assignment_sources")
.header("STATSIG-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"experimentIDColumn\": \"<string>\",\n \"groupIDColumn\": \"<string>\",\n \"idTypeMapping\": [\n {\n \"statsigUnitID\": \"<string>\",\n \"column\": \"<string>\"\n }\n ],\n \"description\": \"<string>\",\n \"isVerified\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"isReadOnly\": true,\n \"owner\": {\n \"ownerID\": \"user123\",\n \"ownerType\": \"USER\",\n \"ownerName\": \"John Doe\",\n \"ownerEmail\": \"owner123@test.com\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://statsigapi.net/console/v1/experiments/assignment_sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["STATSIG-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"experimentIDColumn\": \"<string>\",\n \"groupIDColumn\": \"<string>\",\n \"idTypeMapping\": [\n {\n \"statsigUnitID\": \"<string>\",\n \"column\": \"<string>\"\n }\n ],\n \"description\": \"<string>\",\n \"isVerified\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"isReadOnly\": true,\n \"owner\": {\n \"ownerID\": \"user123\",\n \"ownerType\": \"USER\",\n \"ownerName\": \"John Doe\",\n \"ownerEmail\": \"owner123@test.com\"\n }\n}"
response = http.request(request)
puts response.read_body{
"message": "Assignment Source created successfully",
"data": {
"name": "exposures4",
"description": "",
"tags": [],
"sql": "SELECT * FROM shoppy-sales.experiment_data.exposures",
"timestampColumn": "ts",
"groupIDColumn": "group_id",
"experimentIDColumn": "experiment_name",
"idTypeMapping": [
{
"statsigUnitID": "stableID",
"column": "user_id"
}
]
}
}{
"status": 400,
"message": "Invalid request. Please check the request input and try again."
}{
"status": 401,
"message": "This endpoint only accepts an active CONSOLE key, but an invalid key was sent. Key: console-xxxXXXxxxXXXxxx"
}Create Assignment Source
curl --request POST \
--url https://statsigapi.net/console/v1/experiments/assignment_sources \
--header 'Content-Type: application/json' \
--header 'STATSIG-API-KEY: <api-key>' \
--data '
{
"name": "<string>",
"sql": "<string>",
"timestampColumn": "<string>",
"experimentIDColumn": "<string>",
"groupIDColumn": "<string>",
"idTypeMapping": [
{
"statsigUnitID": "<string>",
"column": "<string>"
}
],
"description": "<string>",
"isVerified": true,
"tags": [
"<string>"
],
"isReadOnly": true,
"owner": {
"ownerID": "user123",
"ownerType": "USER",
"ownerName": "John Doe",
"ownerEmail": "owner123@test.com"
}
}
'import requests
url = "https://statsigapi.net/console/v1/experiments/assignment_sources"
payload = {
"name": "<string>",
"sql": "<string>",
"timestampColumn": "<string>",
"experimentIDColumn": "<string>",
"groupIDColumn": "<string>",
"idTypeMapping": [
{
"statsigUnitID": "<string>",
"column": "<string>"
}
],
"description": "<string>",
"isVerified": True,
"tags": ["<string>"],
"isReadOnly": True,
"owner": {
"ownerID": "user123",
"ownerType": "USER",
"ownerName": "John Doe",
"ownerEmail": "owner123@test.com"
}
}
headers = {
"STATSIG-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'STATSIG-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
sql: '<string>',
timestampColumn: '<string>',
experimentIDColumn: '<string>',
groupIDColumn: '<string>',
idTypeMapping: [{statsigUnitID: '<string>', column: '<string>'}],
description: '<string>',
isVerified: true,
tags: ['<string>'],
isReadOnly: true,
owner: {
ownerID: 'user123',
ownerType: 'USER',
ownerName: 'John Doe',
ownerEmail: 'owner123@test.com'
}
})
};
fetch('https://statsigapi.net/console/v1/experiments/assignment_sources', 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://statsigapi.net/console/v1/experiments/assignment_sources",
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([
'name' => '<string>',
'sql' => '<string>',
'timestampColumn' => '<string>',
'experimentIDColumn' => '<string>',
'groupIDColumn' => '<string>',
'idTypeMapping' => [
[
'statsigUnitID' => '<string>',
'column' => '<string>'
]
],
'description' => '<string>',
'isVerified' => true,
'tags' => [
'<string>'
],
'isReadOnly' => true,
'owner' => [
'ownerID' => 'user123',
'ownerType' => 'USER',
'ownerName' => 'John Doe',
'ownerEmail' => 'owner123@test.com'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"STATSIG-API-KEY: <api-key>"
],
]);
$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://statsigapi.net/console/v1/experiments/assignment_sources"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"experimentIDColumn\": \"<string>\",\n \"groupIDColumn\": \"<string>\",\n \"idTypeMapping\": [\n {\n \"statsigUnitID\": \"<string>\",\n \"column\": \"<string>\"\n }\n ],\n \"description\": \"<string>\",\n \"isVerified\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"isReadOnly\": true,\n \"owner\": {\n \"ownerID\": \"user123\",\n \"ownerType\": \"USER\",\n \"ownerName\": \"John Doe\",\n \"ownerEmail\": \"owner123@test.com\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("STATSIG-API-KEY", "<api-key>")
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://statsigapi.net/console/v1/experiments/assignment_sources")
.header("STATSIG-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"experimentIDColumn\": \"<string>\",\n \"groupIDColumn\": \"<string>\",\n \"idTypeMapping\": [\n {\n \"statsigUnitID\": \"<string>\",\n \"column\": \"<string>\"\n }\n ],\n \"description\": \"<string>\",\n \"isVerified\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"isReadOnly\": true,\n \"owner\": {\n \"ownerID\": \"user123\",\n \"ownerType\": \"USER\",\n \"ownerName\": \"John Doe\",\n \"ownerEmail\": \"owner123@test.com\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://statsigapi.net/console/v1/experiments/assignment_sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["STATSIG-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"sql\": \"<string>\",\n \"timestampColumn\": \"<string>\",\n \"experimentIDColumn\": \"<string>\",\n \"groupIDColumn\": \"<string>\",\n \"idTypeMapping\": [\n {\n \"statsigUnitID\": \"<string>\",\n \"column\": \"<string>\"\n }\n ],\n \"description\": \"<string>\",\n \"isVerified\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"isReadOnly\": true,\n \"owner\": {\n \"ownerID\": \"user123\",\n \"ownerType\": \"USER\",\n \"ownerName\": \"John Doe\",\n \"ownerEmail\": \"owner123@test.com\"\n }\n}"
response = http.request(request)
puts response.read_body{
"message": "Assignment Source created successfully",
"data": {
"name": "exposures4",
"description": "",
"tags": [],
"sql": "SELECT * FROM shoppy-sales.experiment_data.exposures",
"timestampColumn": "ts",
"groupIDColumn": "group_id",
"experimentIDColumn": "experiment_name",
"idTypeMapping": [
{
"statsigUnitID": "stableID",
"column": "user_id"
}
]
}
}{
"status": 400,
"message": "Invalid request. Please check the request input and try again."
}{
"status": 401,
"message": "This endpoint only accepts an active CONSOLE key, but an invalid key was sent. Key: console-xxxXXXxxxXXXxxx"
}Authorizations
Headers
Optional header to respect review settings for mutation endpoints.
Body
Unique identifier for the assignment source.
SQL query defining the data source for assignments.
Column name representing the timestamp of assignments.
Column name for the experiment ID associated with the assignments.
Column name for the group ID linked to the assignments.
Mappings of Statsig units to their respective columns.
Show child attributes
Show child attributes
Optional detailed context for the assignment source.
Marks the assignment source as verified for internal trustworthiness.
Optional tags for categorization.
Specifies if the source can only be edited via the Console API.
Schema for owner data including ID, type, name. Note that if Entity is created by CONSOLE API, owner will be undefined.
Show child attributes
Show child attributes
{
"ownerID": "user123",
"ownerType": "USER",
"ownerName": "John Doe",
"ownerEmail": "owner123@test.com"
}

