curl --request GET \
--url https://api.syntalic.com/v1/social/brand-momentumimport requests
url = "https://api.syntalic.com/v1/social/brand-momentum"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/social/brand-momentum', 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-momentum",
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-momentum"
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-momentum")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/social/brand-momentum")
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>",
"window_days": 123,
"platform": "<string>",
"organic_only": true,
"status": "<string>",
"thin_base_rows": 123,
"brands": [
{}
],
"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": {}
}
}Rank brands by conversation momentum in a category
Brands ranked by MOVEMENT in a category’s conversation — new entrants first, then the biggest risers and fallers by mention growth. This is the trend view over the same rows brand-share ranks by volume: one dataset, two questions, deliberately not two copies. Each row carries its prior-window base and a thin_base flag; thin_base_rows on the response counts them, because a 900% rise from two mentions is arithmetic, not a trend. Pass status=new for emerging-brand detection (brands appearing in the conversation with no prior-window presence), rising or falling to filter direction.
curl --request GET \
--url https://api.syntalic.com/v1/social/brand-momentumimport requests
url = "https://api.syntalic.com/v1/social/brand-momentum"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/social/brand-momentum', 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-momentum",
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-momentum"
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-momentum")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/social/brand-momentum")
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>",
"window_days": 123,
"platform": "<string>",
"organic_only": true,
"status": "<string>",
"thin_base_rows": 123,
"brands": [
{}
],
"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.
Restrict to one movement class. new = emerging-brand detection.
new, rising, falling, all Max results to return (default 25, min 1, max 100)
1 <= x <= 100Response
Brand momentum
Always null. The rollup publishes category-level rows only.
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

