import { OctosparkClient } from '@octospark/sdk'
const client = new OctosparkClient({
token: process.env.OCTOSPARK_TOKEN
})
const response = await client.social.getAnalyticsAggregates({
teamId: process.env.OCTOSPARK_TEAM_ID ?? "teamId",
query: {
"from": process.env.OCTOSPARK_FROM ?? "from",
"to": process.env.OCTOSPARK_TO ?? "to",
},
})import os
from octospark_sdk import OctosparkClient
client = OctosparkClient(token=os.environ["OCTOSPARK_TOKEN"])
response = client.social.get_analytics_aggregates(
teamId=os.environ.get("OCTOSPARK_TEAM_ID", "teamId"),
query={
"from": os.environ.get("OCTOSPARK_FROM", "from"),
"to": os.environ.get("OCTOSPARK_TO", "to"),
}
)octospark analytics summary \
--request '{"path":{"teamId":"teamId"},"query":{"from":"from","to":"to"}}'use reqwest::Client;
use std::env;
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let client = Client::new();
let base_url = env::var("OCTOSPARK_API_URL").unwrap_or_else(|_| "https://api.octospark.ai".to_string());
let team_id = env::var("OCTOSPARK_TEAM_ID").unwrap_or_else(|_| "teamId".to_string());
let from = env::var("OCTOSPARK_FROM").unwrap_or_else(|_| "from".to_string());
let to = env::var("OCTOSPARK_TO").unwrap_or_else(|_| "to".to_string());
let url = format!("{}/v1/teams/{}/analytics/aggregates", base_url.trim_end_matches('/'), team_id);
let token = env::var("OCTOSPARK_TOKEN").expect("OCTOSPARK_TOKEN");
let mut request = client.get(url).bearer_auth(token);
let query = [("from", from.as_str()), ("to", to.as_str())];
request = request.query(&query);
let response = request.send().await?;
println!("{}", response.text().await?);
Ok(())
}import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
Future<void> main() async {
final baseUrl = Platform.environment['OCTOSPARK_API_URL'] ?? 'https://api.octospark.ai';
final token = Platform.environment['OCTOSPARK_TOKEN'];
final teamId = Platform.environment['OCTOSPARK_TEAM_ID'] ?? 'teamId';
final from = Platform.environment['OCTOSPARK_FROM'] ?? 'from';
final to = Platform.environment['OCTOSPARK_TO'] ?? 'to';
final url = '${baseUrl.replaceFirst(RegExp(r'/$'), '')}/v1/teams/$teamId/analytics/aggregates';
final uri = Uri.parse(url).replace(queryParameters: {
'from': from,
'to': to,
});
final headers = {
'Authorization': 'Bearer $token',
};
final response = await http.get(
uri,
headers: headers,
);
print(response.body);
}curl --request GET \
--url https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates \
--header 'Authorization: Bearer <token>'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates",
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://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates"
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://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")
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$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$response = Invoke-WebRequest -Uri 'https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates' -Method GET -Headers $headersimport Foundation
let url = URL(string: "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.timeoutInterval = 10
request.allHTTPHeaderFields = ["Authorization": "Bearer <token>"]
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);val client = OkHttpClient()
val request = Request.Builder()
.url("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")
.get()
.addHeader("Authorization", "Bearer <token>")
.build()
val response = client.newCall(request).execute(){
"period": {
"from": "<string>",
"to": "<string>"
},
"totals": {
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"reachCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
},
"byPlatform": [
{
"platform": "x",
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"reachCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
}
],
"byWeek": [
{
"weekStart": "<string>",
"platform": "x",
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
}
],
"byDay": [
{
"date": "<string>",
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
}
]
}{
"issues": [
{
"_tag": "Pointer",
"path": [
"<string>"
],
"message": "<string>"
}
],
"message": "<string>",
"_tag": "HttpApiDecodeError"
}{
"message": "<string>",
"_tag": "Unauthorized"
}{
"message": "<string>",
"_tag": "PaymentRequired"
}{
"message": "<string>",
"_tag": "Forbidden"
}{
"message": "<string>",
"_tag": "NotFound"
}{
"message": "<string>",
"_tag": "Conflict",
"code": "<string>",
"currentRevision": 123
}{
"message": "<string>",
"code": "<string>",
"_tag": "UnprocessableEntity"
}{
"message": "<string>",
"_tag": "TooManyRequests",
"code": "<string>",
"retryAfterSeconds": 123
}{
"message": "<string>",
"_tag": "InternalError"
}Analytics aggregates
Return team-wide analytics aggregated across posts and accounts for a time window, read from stored metrics. Free: no credits spent and no live provider calls. Use listAccountAnalytics for per-account breakdowns or listPostPerformance for per-post metrics.
import { OctosparkClient } from '@octospark/sdk'
const client = new OctosparkClient({
token: process.env.OCTOSPARK_TOKEN
})
const response = await client.social.getAnalyticsAggregates({
teamId: process.env.OCTOSPARK_TEAM_ID ?? "teamId",
query: {
"from": process.env.OCTOSPARK_FROM ?? "from",
"to": process.env.OCTOSPARK_TO ?? "to",
},
})import os
from octospark_sdk import OctosparkClient
client = OctosparkClient(token=os.environ["OCTOSPARK_TOKEN"])
response = client.social.get_analytics_aggregates(
teamId=os.environ.get("OCTOSPARK_TEAM_ID", "teamId"),
query={
"from": os.environ.get("OCTOSPARK_FROM", "from"),
"to": os.environ.get("OCTOSPARK_TO", "to"),
}
)octospark analytics summary \
--request '{"path":{"teamId":"teamId"},"query":{"from":"from","to":"to"}}'use reqwest::Client;
use std::env;
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let client = Client::new();
let base_url = env::var("OCTOSPARK_API_URL").unwrap_or_else(|_| "https://api.octospark.ai".to_string());
let team_id = env::var("OCTOSPARK_TEAM_ID").unwrap_or_else(|_| "teamId".to_string());
let from = env::var("OCTOSPARK_FROM").unwrap_or_else(|_| "from".to_string());
let to = env::var("OCTOSPARK_TO").unwrap_or_else(|_| "to".to_string());
let url = format!("{}/v1/teams/{}/analytics/aggregates", base_url.trim_end_matches('/'), team_id);
let token = env::var("OCTOSPARK_TOKEN").expect("OCTOSPARK_TOKEN");
let mut request = client.get(url).bearer_auth(token);
let query = [("from", from.as_str()), ("to", to.as_str())];
request = request.query(&query);
let response = request.send().await?;
println!("{}", response.text().await?);
Ok(())
}import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
Future<void> main() async {
final baseUrl = Platform.environment['OCTOSPARK_API_URL'] ?? 'https://api.octospark.ai';
final token = Platform.environment['OCTOSPARK_TOKEN'];
final teamId = Platform.environment['OCTOSPARK_TEAM_ID'] ?? 'teamId';
final from = Platform.environment['OCTOSPARK_FROM'] ?? 'from';
final to = Platform.environment['OCTOSPARK_TO'] ?? 'to';
final url = '${baseUrl.replaceFirst(RegExp(r'/$'), '')}/v1/teams/$teamId/analytics/aggregates';
final uri = Uri.parse(url).replace(queryParameters: {
'from': from,
'to': to,
});
final headers = {
'Authorization': 'Bearer $token',
};
final response = await http.get(
uri,
headers: headers,
);
print(response.body);
}curl --request GET \
--url https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates \
--header 'Authorization: Bearer <token>'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates",
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://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates"
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://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")
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$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$response = Invoke-WebRequest -Uri 'https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates' -Method GET -Headers $headersimport Foundation
let url = URL(string: "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.timeoutInterval = 10
request.allHTTPHeaderFields = ["Authorization": "Bearer <token>"]
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);val client = OkHttpClient()
val request = Request.Builder()
.url("https://api-staging.octospark.ai/v1/teams/{teamId}/analytics/aggregates")
.get()
.addHeader("Authorization", "Bearer <token>")
.build()
val response = client.newCall(request).execute(){
"period": {
"from": "<string>",
"to": "<string>"
},
"totals": {
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"reachCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
},
"byPlatform": [
{
"platform": "x",
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"reachCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
}
],
"byWeek": [
{
"weekStart": "<string>",
"platform": "x",
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
}
],
"byDay": [
{
"date": "<string>",
"likeCount": 123,
"commentCount": 123,
"shareCount": 123,
"saveCount": 123,
"impressionCount": 123,
"postCount": 123,
"linkClickCount": 123,
"averageEngagementRate": 123
}
]
}{
"issues": [
{
"_tag": "Pointer",
"path": [
"<string>"
],
"message": "<string>"
}
],
"message": "<string>",
"_tag": "HttpApiDecodeError"
}{
"message": "<string>",
"_tag": "Unauthorized"
}{
"message": "<string>",
"_tag": "PaymentRequired"
}{
"message": "<string>",
"_tag": "Forbidden"
}{
"message": "<string>",
"_tag": "NotFound"
}{
"message": "<string>",
"_tag": "Conflict",
"code": "<string>",
"currentRevision": 123
}{
"message": "<string>",
"code": "<string>",
"_tag": "UnprocessableEntity"
}{
"message": "<string>",
"_tag": "TooManyRequests",
"code": "<string>",
"retryAfterSeconds": 123
}{
"message": "<string>",
"_tag": "InternalError"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Team (workspace) id (UUID). Discover ids via the list teams endpoint or the agent context.
Query Parameters
Start of the reporting window, ISO 8601 timestamp (inclusive).
"2026-05-01T00:00:00.000Z"
End of the reporting window, ISO 8601 timestamp (inclusive).
"2026-05-31T23:59:59.000Z"
Restrict aggregates to one provider; omit for all connected providers.
x, tiktok, instagram, facebook, youtube, linkedin, threads, pinterest "x"
Restrict aggregates to one content format; empty or omitted includes all formats.
text_post, text_image, text_video, carousel, thread, CSV of user-tag UUIDs; restricts aggregates to posts assigned ANY of these tags.
Alias of postType using the filter[...] convention.
text_post, text_image, text_video, carousel, thread, Alias of tagIds using the filter[...] convention; CSV of user-tag UUIDs.
Comma-separated AI tags; matches posts whose assets carry any of the listed tags (OR).
"launch,product"
Comma-separated AI content categories; matches posts in any of the listed categories (OR).
"education"
Comma-separated AI purposes; matches posts whose assets carry any of the listed purposes (OR).
"promotion"
Comma-separated AI emotions; matches posts tagged with any of the listed emotions (OR).
"joy"
Comma-separated media types; each value one of: image, video, audio, gif, document.
"image,video"
Comma-separated AI enrichment statuses; each value one of: pending, processing, completed, failed.
"completed"