curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/companies/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"phone": "<string>",
"parentCompanyId": "<string>",
"privacyPolicyAccepted": true,
"termsOfServiceAccepted": true,
"website": "<string>",
"appstoreUrl": "<string>",
"category": "<string>",
"companyStage": "<string>",
"hireRange": "<string>",
"companyNiche": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"country": "<string>"
},
"instagram": "<string>",
"linkedin": "<string>",
"tiktok": "<string>",
"profileImageUrl": "<string>",
"createRequestId": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/companies/create"
payload = {
"name": "<string>",
"phone": "<string>",
"parentCompanyId": "<string>",
"privacyPolicyAccepted": True,
"termsOfServiceAccepted": True,
"website": "<string>",
"appstoreUrl": "<string>",
"category": "<string>",
"companyStage": "<string>",
"hireRange": "<string>",
"companyNiche": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"country": "<string>"
},
"instagram": "<string>",
"linkedin": "<string>",
"tiktok": "<string>",
"profileImageUrl": "<string>",
"createRequestId": "<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({
name: '<string>',
phone: '<string>',
parentCompanyId: '<string>',
privacyPolicyAccepted: true,
termsOfServiceAccepted: true,
website: '<string>',
appstoreUrl: '<string>',
category: '<string>',
companyStage: '<string>',
hireRange: '<string>',
companyNiche: '<string>',
address: {
line1: '<string>',
line2: '<string>',
city: '<string>',
state: '<string>',
postal_code: '<string>',
country: '<string>'
},
instagram: '<string>',
linkedin: '<string>',
tiktok: '<string>',
profileImageUrl: '<string>',
createRequestId: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/companies/create', 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://app.sideshift.app/api/oauth/v1/companies/create",
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>',
'phone' => '<string>',
'parentCompanyId' => '<string>',
'privacyPolicyAccepted' => true,
'termsOfServiceAccepted' => true,
'website' => '<string>',
'appstoreUrl' => '<string>',
'category' => '<string>',
'companyStage' => '<string>',
'hireRange' => '<string>',
'companyNiche' => '<string>',
'address' => [
'line1' => '<string>',
'line2' => '<string>',
'city' => '<string>',
'state' => '<string>',
'postal_code' => '<string>',
'country' => '<string>'
],
'instagram' => '<string>',
'linkedin' => '<string>',
'tiktok' => '<string>',
'profileImageUrl' => '<string>',
'createRequestId' => '<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://app.sideshift.app/api/oauth/v1/companies/create"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"parentCompanyId\": \"<string>\",\n \"privacyPolicyAccepted\": true,\n \"termsOfServiceAccepted\": true,\n \"website\": \"<string>\",\n \"appstoreUrl\": \"<string>\",\n \"category\": \"<string>\",\n \"companyStage\": \"<string>\",\n \"hireRange\": \"<string>\",\n \"companyNiche\": \"<string>\",\n \"address\": {\n \"line1\": \"<string>\",\n \"line2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\"\n },\n \"instagram\": \"<string>\",\n \"linkedin\": \"<string>\",\n \"tiktok\": \"<string>\",\n \"profileImageUrl\": \"<string>\",\n \"createRequestId\": \"<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://app.sideshift.app/api/oauth/v1/companies/create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"parentCompanyId\": \"<string>\",\n \"privacyPolicyAccepted\": true,\n \"termsOfServiceAccepted\": true,\n \"website\": \"<string>\",\n \"appstoreUrl\": \"<string>\",\n \"category\": \"<string>\",\n \"companyStage\": \"<string>\",\n \"hireRange\": \"<string>\",\n \"companyNiche\": \"<string>\",\n \"address\": {\n \"line1\": \"<string>\",\n \"line2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\"\n },\n \"instagram\": \"<string>\",\n \"linkedin\": \"<string>\",\n \"tiktok\": \"<string>\",\n \"profileImageUrl\": \"<string>\",\n \"createRequestId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/companies/create")
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 \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"parentCompanyId\": \"<string>\",\n \"privacyPolicyAccepted\": true,\n \"termsOfServiceAccepted\": true,\n \"website\": \"<string>\",\n \"appstoreUrl\": \"<string>\",\n \"category\": \"<string>\",\n \"companyStage\": \"<string>\",\n \"hireRange\": \"<string>\",\n \"companyNiche\": \"<string>\",\n \"address\": {\n \"line1\": \"<string>\",\n \"line2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\"\n },\n \"instagram\": \"<string>\",\n \"linkedin\": \"<string>\",\n \"tiktok\": \"<string>\",\n \"profileImageUrl\": \"<string>\",\n \"createRequestId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"success": true,
"companyId": "<string>",
"stripeCustomerId": "<string>",
"requiresPerClientCheckout": true,
"isFreeClient": true,
"message": "<string>",
"idempotent": true
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Create a company
create a company / agency sub-account. Requires the settings:write scope.
curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/companies/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"phone": "<string>",
"parentCompanyId": "<string>",
"privacyPolicyAccepted": true,
"termsOfServiceAccepted": true,
"website": "<string>",
"appstoreUrl": "<string>",
"category": "<string>",
"companyStage": "<string>",
"hireRange": "<string>",
"companyNiche": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"country": "<string>"
},
"instagram": "<string>",
"linkedin": "<string>",
"tiktok": "<string>",
"profileImageUrl": "<string>",
"createRequestId": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/companies/create"
payload = {
"name": "<string>",
"phone": "<string>",
"parentCompanyId": "<string>",
"privacyPolicyAccepted": True,
"termsOfServiceAccepted": True,
"website": "<string>",
"appstoreUrl": "<string>",
"category": "<string>",
"companyStage": "<string>",
"hireRange": "<string>",
"companyNiche": "<string>",
"address": {
"line1": "<string>",
"line2": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"country": "<string>"
},
"instagram": "<string>",
"linkedin": "<string>",
"tiktok": "<string>",
"profileImageUrl": "<string>",
"createRequestId": "<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({
name: '<string>',
phone: '<string>',
parentCompanyId: '<string>',
privacyPolicyAccepted: true,
termsOfServiceAccepted: true,
website: '<string>',
appstoreUrl: '<string>',
category: '<string>',
companyStage: '<string>',
hireRange: '<string>',
companyNiche: '<string>',
address: {
line1: '<string>',
line2: '<string>',
city: '<string>',
state: '<string>',
postal_code: '<string>',
country: '<string>'
},
instagram: '<string>',
linkedin: '<string>',
tiktok: '<string>',
profileImageUrl: '<string>',
createRequestId: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/companies/create', 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://app.sideshift.app/api/oauth/v1/companies/create",
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>',
'phone' => '<string>',
'parentCompanyId' => '<string>',
'privacyPolicyAccepted' => true,
'termsOfServiceAccepted' => true,
'website' => '<string>',
'appstoreUrl' => '<string>',
'category' => '<string>',
'companyStage' => '<string>',
'hireRange' => '<string>',
'companyNiche' => '<string>',
'address' => [
'line1' => '<string>',
'line2' => '<string>',
'city' => '<string>',
'state' => '<string>',
'postal_code' => '<string>',
'country' => '<string>'
],
'instagram' => '<string>',
'linkedin' => '<string>',
'tiktok' => '<string>',
'profileImageUrl' => '<string>',
'createRequestId' => '<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://app.sideshift.app/api/oauth/v1/companies/create"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"parentCompanyId\": \"<string>\",\n \"privacyPolicyAccepted\": true,\n \"termsOfServiceAccepted\": true,\n \"website\": \"<string>\",\n \"appstoreUrl\": \"<string>\",\n \"category\": \"<string>\",\n \"companyStage\": \"<string>\",\n \"hireRange\": \"<string>\",\n \"companyNiche\": \"<string>\",\n \"address\": {\n \"line1\": \"<string>\",\n \"line2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\"\n },\n \"instagram\": \"<string>\",\n \"linkedin\": \"<string>\",\n \"tiktok\": \"<string>\",\n \"profileImageUrl\": \"<string>\",\n \"createRequestId\": \"<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://app.sideshift.app/api/oauth/v1/companies/create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"parentCompanyId\": \"<string>\",\n \"privacyPolicyAccepted\": true,\n \"termsOfServiceAccepted\": true,\n \"website\": \"<string>\",\n \"appstoreUrl\": \"<string>\",\n \"category\": \"<string>\",\n \"companyStage\": \"<string>\",\n \"hireRange\": \"<string>\",\n \"companyNiche\": \"<string>\",\n \"address\": {\n \"line1\": \"<string>\",\n \"line2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\"\n },\n \"instagram\": \"<string>\",\n \"linkedin\": \"<string>\",\n \"tiktok\": \"<string>\",\n \"profileImageUrl\": \"<string>\",\n \"createRequestId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/companies/create")
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 \"name\": \"<string>\",\n \"phone\": \"<string>\",\n \"parentCompanyId\": \"<string>\",\n \"privacyPolicyAccepted\": true,\n \"termsOfServiceAccepted\": true,\n \"website\": \"<string>\",\n \"appstoreUrl\": \"<string>\",\n \"category\": \"<string>\",\n \"companyStage\": \"<string>\",\n \"hireRange\": \"<string>\",\n \"companyNiche\": \"<string>\",\n \"address\": {\n \"line1\": \"<string>\",\n \"line2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\"\n },\n \"instagram\": \"<string>\",\n \"linkedin\": \"<string>\",\n \"tiktok\": \"<string>\",\n \"profileImageUrl\": \"<string>\",\n \"createRequestId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"success": true,
"companyId": "<string>",
"stripeCustomerId": "<string>",
"requiresPerClientCheckout": true,
"isFreeClient": true,
"message": "<string>",
"idempotent": true
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Authorizations
OAuth 2.1 authorization code + PKCE (S256). Tokens are tenant-bound (company_id) and scoped. Discover endpoints via /.well-known/oauth-authorization-server.
Body
Create an agency subaccount under the token tenant. The token is confined to one company, so parentCompanyId is required and must equal your own company id (the server rejects anything else). Only an agency-parent caller may create subaccounts. Unrecognized fields are passed through.
Subaccount company name (required).
1Company phone number (required).
1Parent agency id — must equal the token tenant's company id; OAuth clamps it to your own company.
Must be true — the owner accepts the privacy policy.
Must be true — the owner accepts the terms of service.
Company website URL.
Company App Store URL.
Company category.
Company stage (e.g. 'seed', 'growth').
Company hiring range.
Company niche.
Company address.
Show child attributes
Show child attributes
Instagram handle.
LinkedIn URL.
TikTok handle.
Company profile image URL.
Optional idempotency key for subaccount creation (8-128 chars, [A-Za-z0-9_-]); enables idempotent retries.
Response
The created agency subaccount's id, Stripe customer id, and billing flags. (Route returns HTTP 201; manifest successCode is 200.)
Result of creating an agency subaccount.
Show child attributes
Show child attributes