curl --request GET \
--url https://api.syntalic.com/v1/social/brand-shareimport requests
url = "https://api.syntalic.com/v1/social/brand-share"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/social/brand-share', 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://api.syntalic.com/v1/social/brand-share",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.syntalic.com/v1/social/brand-share"
req, _ := http.NewRequest("GET", url, nil)
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.syntalic.com/v1/social/brand-share")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/social/brand-share")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"category": "<string>",
"subcategory": "<string>",
"axis": "category",
"brand": "<string>",
"window_days": 123,
"platform": "<string>",
"organic_only": true,
"brands": [
{}
],
"siblings": [
{}
],
"noise_pct": 123,
"coverage": {
"products": 42,
"sufficient": true,
"note": "<string>",
"unpublished_note": "<string>",
"sku_note": "<string>",
"rank_note": "<string>"
},
"freshness": {
"observedThrough": "2023-11-07T05:31:56Z",
"staleHours": 6.5
},
"snapshot": {},
"resolved": {
"input": "<string>",
"category_path": "<string>",
"department": "<string>",
"match_source": "<string>",
"match_confidence": 123,
"alternates": [
{}
]
},
"meta": {
"served_from": "<string>",
"freshness_seconds": 123,
"schema_version": "<string>",
"computed_at": "2023-11-07T05:31:56Z",
"price_observed_at_min": "2023-11-07T05:31:56Z",
"price_observed_at_max": "2023-11-07T05:31:56Z"
}
}{
"type": "<string>",
"title": "Bad Request",
"status": 400,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Payment Required",
"status": 402,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Not Found",
"status": 404,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Too Many Requests",
"status": 429,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Internal Server Error",
"status": 500,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}Share of social conversation by brand
Share of social conversation by brand inside a category, with movement. mentions is the event count and is the comparison currency; views is view-weighted reach and is reported SEPARATELY. share_pct is computed on mentions, never on views - Instagram stills report no plays, so view-weighting renders active subcategories as 0%. category is required: there is no default aisle, because inheriting one would sell a department-wide number under an aisle-shaped label. Each row carries rank, its position in the category by mentions - emitted ONLY on an unfiltered request, because with brand set the page is one row and any ordinal on it would be meaningless. A row may also carry tied_with, the 1-based positions of other rows within 5% of its mention count: that is PAIRWISE proximity, not an equivalence class, so A near B and B near C does not make A near C. organic_only filters to posts the provider did not mark as an ad (isAd on TikTok, paidPartnership on Instagram); each slice is its own denominator, so shares within it sum to 100 rather than to the organic share of the whole, and a post whose ad status is unknown is counted in neither slice. The rollup publishes category-level rows only.
curl --request GET \
--url https://api.syntalic.com/v1/social/brand-shareimport requests
url = "https://api.syntalic.com/v1/social/brand-share"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/social/brand-share', 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://api.syntalic.com/v1/social/brand-share",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.syntalic.com/v1/social/brand-share"
req, _ := http.NewRequest("GET", url, nil)
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.syntalic.com/v1/social/brand-share")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/social/brand-share")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"category": "<string>",
"subcategory": "<string>",
"axis": "category",
"brand": "<string>",
"window_days": 123,
"platform": "<string>",
"organic_only": true,
"brands": [
{}
],
"siblings": [
{}
],
"noise_pct": 123,
"coverage": {
"products": 42,
"sufficient": true,
"note": "<string>",
"unpublished_note": "<string>",
"sku_note": "<string>",
"rank_note": "<string>"
},
"freshness": {
"observedThrough": "2023-11-07T05:31:56Z",
"staleHours": 6.5
},
"snapshot": {},
"resolved": {
"input": "<string>",
"category_path": "<string>",
"department": "<string>",
"match_source": "<string>",
"match_confidence": 123,
"alternates": [
{}
]
},
"meta": {
"served_from": "<string>",
"freshness_seconds": 123,
"schema_version": "<string>",
"computed_at": "2023-11-07T05:31:56Z",
"price_observed_at_min": "2023-11-07T05:31:56Z",
"price_observed_at_max": "2023-11-07T05:31:56Z"
}
}{
"type": "<string>",
"title": "Bad Request",
"status": 400,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Payment Required",
"status": 402,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Not Found",
"status": 404,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Too Many Requests",
"status": 429,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}{
"type": "<string>",
"title": "Internal Server Error",
"status": 500,
"detail": "<string>",
"instance": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
}
}Query Parameters
Category root slug (department, not aisle).
Rollup window. Only published windows are accepted.
7d, 30d, 90d TikTok and Instagram are the only platforms in the corpus.
all, tiktok, instagram Exclude posts marked as ads.
Brand name (e.g., Sony, Samsung, Nike)
1Max results to return (default 25, min 1, max 100)
1 <= x <= 100Response
Brand share of conversation
Always null. The rollup publishes category-level rows only.
Always category. The subcategory axis is unpublished.
category How much data backed this answer. sufficient is false when the slice is too thin to read as a market statement; the count is always reported so you can judge for yourself, and note explains an empty or thin result rather than leaving you to infer it.
Show child attributes
Show child attributes
How current the underlying observations are. observedThrough is the newest observation behind this answer; staleHours is its age. Both null when nothing was observed.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes

