curl --request GET \
--url https://app.sideshift.app/api/v1/analytics/accounts \
--header 'x-api-key: <api-key>'import requests
url = "https://app.sideshift.app/api/v1/analytics/accounts"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.sideshift.app/api/v1/analytics/accounts', 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/v1/analytics/accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-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"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/v1/analytics/accounts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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/v1/analytics/accounts")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/analytics/accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"handle": "<string>",
"platform": "<string>",
"contractorId": "<string>",
"contractorName": "<string>",
"isGhostHandle": true,
"totalPosts": 123,
"totalViews": 123,
"totalLikes": 123,
"totalComments": 123,
"totalShares": 123,
"totalBookmarks": 123,
"totalEngagement": 123,
"totalEarnings": 123,
"paidPosts": 123,
"unpaidPosts": 123,
"engagementRate": 123,
"averageViewsPerPost": 123,
"averageEngagementPerPost": 123,
"contracts": [
"<string>"
],
"programs": [
"<string>"
],
"contractCount": 123,
"programCount": 123,
"firstPostDate": 123,
"lastPostDate": 123
}
],
"page": 123,
"limit": 123,
"total": 123,
"totalPages": 123,
"summary": {
"totalAccounts": 123,
"totalPosts": 123,
"totalViews": 123,
"totalLikes": 123,
"totalEngagement": 123,
"averageEngagementRate": 123,
"totalEarnings": 123,
"platformBreakdown": {},
"ghostHandles": 123,
"realHandles": 123
}
}List all tracked accounts
Retrieve all tracked social media accounts with aggregated analytics.
Groups posts by social media handle and platform, providing comprehensive metrics per account.
Agency accounts can pass scope=agency to aggregate accounts across the
parent agency and every subaccount.
curl --request GET \
--url https://app.sideshift.app/api/v1/analytics/accounts \
--header 'x-api-key: <api-key>'import requests
url = "https://app.sideshift.app/api/v1/analytics/accounts"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.sideshift.app/api/v1/analytics/accounts', 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/v1/analytics/accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-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"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/v1/analytics/accounts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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/v1/analytics/accounts")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/v1/analytics/accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"handle": "<string>",
"platform": "<string>",
"contractorId": "<string>",
"contractorName": "<string>",
"isGhostHandle": true,
"totalPosts": 123,
"totalViews": 123,
"totalLikes": 123,
"totalComments": 123,
"totalShares": 123,
"totalBookmarks": 123,
"totalEngagement": 123,
"totalEarnings": 123,
"paidPosts": 123,
"unpaidPosts": 123,
"engagementRate": 123,
"averageViewsPerPost": 123,
"averageEngagementPerPost": 123,
"contracts": [
"<string>"
],
"programs": [
"<string>"
],
"contractCount": 123,
"programCount": 123,
"firstPostDate": 123,
"lastPostDate": 123
}
],
"page": 123,
"limit": 123,
"total": 123,
"totalPages": 123,
"summary": {
"totalAccounts": 123,
"totalPosts": 123,
"totalViews": 123,
"totalLikes": 123,
"totalEngagement": 123,
"averageEngagementRate": 123,
"totalEarnings": 123,
"platformBreakdown": {},
"ghostHandles": 123,
"realHandles": 123
}
}Authorizations
API key for authentication. Get yours from Settings → Integrations. A key created by a team member acts as that member and follows their current team permissions; a request outside those permissions returns 403 { "error": "insufficient_scope", "scope": "<required>" }.
Query Parameters
Data scope. company (default) returns only the authenticated
company's own data. agency returns the union of the parent agency
plus every subaccount — use this to pull analytics across all brands.
scope=agency requires an API key belonging to a parent agency
account (an account with isAgency=true and no parent). Passing it with
a non-agency or subaccount key returns 403.
company, agency x <= 100Filter by platform. Repeat the parameter for several.
Filter by campaign. Repeat the parameter for several. program is the legacy alias and is only consulted when programId is absent.
Legacy alias for programId. Ignored when programId is present.
Filter by creator. Repeat the parameter for several. creator is the legacy alias and is only consulted when creatorId is absent.
Legacy alias for creatorId. Ignored when creatorId is present.
Restrict to campaigns in this state. Unrecognised values are ignored.
active, all, archived Inclusive start of the date window, YYYY-MM-DD, interpreted at 00:00:00Z.
Inclusive end of the date window, YYYY-MM-DD, interpreted at 23:59:59Z.
Whether unclaimed (ghost) handles are counted. Defaults to all.
all, include, exclude Pass true to drop posts that have since been deleted. Any other value is false.
Restrict to posts in this review state.
all, approved, rejected, unreviewed Only include posts with at least this many views. A value of 0 is a no-op.
x >= 0Only include posts with at most this many views. A value of 0 is a no-op.
x >= 0Restrict to creators in these account groups. Repeat for several. Intersected with creatorId, so passing both with no overlap matches nothing.
totalViews, totalPosts, engagementRate, creator asc, desc