curl --request GET \
--url https://app.sideshift.app/api/oauth/v1/analytics/kpis \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sideshift.app/api/oauth/v1/analytics/kpis"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.sideshift.app/api/oauth/v1/analytics/kpis', 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/analytics/kpis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/oauth/v1/analytics/kpis"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.sideshift.app/api/oauth/v1/analytics/kpis")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/analytics/kpis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"programs": {
"total": 3,
"active": 123,
"draft": 123,
"paused": 123,
"completed": 123,
"archived": 123
},
"contracts": {
"total": 3,
"active": 123,
"pending": 123,
"completed": 123,
"declined": 123,
"cancelled": 123,
"expired": 123
},
"posts": {
"total": 3,
"totalViews": 3,
"totalLikes": 3,
"totalComments": 3,
"totalShares": 3,
"totalBookmarks": 3
},
"creators": {
"total": 3,
"withActiveContracts": 123
}
}
}{
"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_..."
}
}Dashboard KPIs
Dashboard KPI blocks (programs, contracts, posts, creators) for the request’s effective company. Requires the analytics:read scope.
curl --request GET \
--url https://app.sideshift.app/api/oauth/v1/analytics/kpis \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sideshift.app/api/oauth/v1/analytics/kpis"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.sideshift.app/api/oauth/v1/analytics/kpis', 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/analytics/kpis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/oauth/v1/analytics/kpis"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.sideshift.app/api/oauth/v1/analytics/kpis")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/analytics/kpis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"programs": {
"total": 3,
"active": 123,
"draft": 123,
"paused": 123,
"completed": 123,
"archived": 123
},
"contracts": {
"total": 3,
"active": 123,
"pending": 123,
"completed": 123,
"declined": 123,
"cancelled": 123,
"expired": 123
},
"posts": {
"total": 3,
"totalViews": 3,
"totalLikes": 3,
"totalComments": 3,
"totalShares": 3,
"totalBookmarks": 3
},
"creators": {
"total": 3,
"withActiveContracts": 123
}
}
}{
"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.
Headers
OAuth human grants and scoped Platform API keys can act on one direct agency sub-account included in their explicit delegation. Current parent relationship, authorizing person access, child scope ceiling, and subscription eligibility are checked. Omit this header to act on the connected company. Machine client_credentials tokens do not carry delegation. Query parameters such as companyId, company_id, client, and subaccountId are not general tenant selectors where an endpoint does not explicitly document them.
Response
Success. Returns the resource envelope.
Show child attributes
Show child attributes