curl --request GET \
--url https://api.syntalic.com/v1/analyst/retailer-indeximport requests
url = "https://api.syntalic.com/v1/analyst/retailer-index"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/analyst/retailer-index', 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/analyst/retailer-index",
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/analyst/retailer-index"
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/analyst/retailer-index")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/analyst/retailer-index")
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{
"retailer": "<string>",
"category": "<string>",
"department": "<string>",
"country": "<string>",
"currency": "<string>",
"window": {
"preset": "<string>",
"from": "2023-12-25",
"to": "2023-12-25",
"granularity": "<string>",
"comparison_from": "2023-12-25",
"comparison_to": "2023-12-25",
"timezone": "UTC"
},
"sample_threshold": 123,
"insufficient_sample_points": 123,
"insufficient_sample": true,
"stable_basket_size": 123,
"time_series": [
{
"date": "2023-12-25",
"period": "<string>",
"avg_price": 123,
"min_price": 123,
"max_price": 123,
"median_price": 123,
"product_count": 123,
"observation_count": 123,
"change_pct": 123,
"matched_basket_size": 123,
"method": "<string>",
"in_stock_count": 123,
"promo_count": 123,
"retailer_avg_price": 123,
"category_avg_price": 123,
"price_index": 123,
"stable_avg_price": 123,
"insufficient_sample": true,
"sample_threshold": 123
}
],
"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": {}
}
}Price index for a specific retailer over time
Compute a normalized price index (retailer avg / category avg) for a specific retailer day-by-day versus its category baseline. Points report insufficient_sample below sample_threshold products plus stable_avg_price over the products priced every day — read trends from the stable series.
curl --request GET \
--url https://api.syntalic.com/v1/analyst/retailer-indeximport requests
url = "https://api.syntalic.com/v1/analyst/retailer-index"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/analyst/retailer-index', 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/analyst/retailer-index",
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/analyst/retailer-index"
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/analyst/retailer-index")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/analyst/retailer-index")
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{
"retailer": "<string>",
"category": "<string>",
"department": "<string>",
"country": "<string>",
"currency": "<string>",
"window": {
"preset": "<string>",
"from": "2023-12-25",
"to": "2023-12-25",
"granularity": "<string>",
"comparison_from": "2023-12-25",
"comparison_to": "2023-12-25",
"timezone": "UTC"
},
"sample_threshold": 123,
"insufficient_sample_points": 123,
"insufficient_sample": true,
"stable_basket_size": 123,
"time_series": [
{
"date": "2023-12-25",
"period": "<string>",
"avg_price": 123,
"min_price": 123,
"max_price": 123,
"median_price": 123,
"product_count": 123,
"observation_count": 123,
"change_pct": 123,
"matched_basket_size": 123,
"method": "<string>",
"in_stock_count": 123,
"promo_count": 123,
"retailer_avg_price": 123,
"category_avg_price": 123,
"price_index": 123,
"stable_avg_price": 123,
"insufficient_sample": true,
"sample_threshold": 123
}
],
"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
Retailer platform key (e.g., amazon, walmart)
Country (us or ca)
us, ca Product category. Accepts a human-readable name (e.g. 'electronics', 'beauty') or a taxonomy slug path (e.g. 'electronics/headphones'); matched against the catalog's category tree (exact node, subtree, or path substring). Also accepts a GS1 GPC code (exactly 8 digits, e.g. '10001159') to filter by PRODUCT TYPE instead of by shelf placement — the same product type is shelved under different categories by different retailers, so a category filter answers from a fraction of the data while a GPC code spans them. Coarser codes (class/family/segment) match every brick beneath them. Resolve a phrase to a code with /v1/reference/classify?q=... ; when a code is used, resolved.match_source is 'gpc'. For analyst endpoints, supply either category or department; both may be supplied to narrow the scope.
1Top-level department (root category), e.g. 'Electronics', 'Beauty', 'Home & Kitchen'. Case-insensitive; matched against the category tree's root segment. For analyst endpoints, supply either category or department; both may be supplied to narrow the scope.
1Historical window preset. Explicit from/to takes precedence and is reported as custom; time_window=custom requires both from and to. Date-only ranges use UTC calendar boundaries with inclusive from and exclusive to.
last_30_days, last_60_days, last_90_days, month_to_date, previous_month, month_over_month, quarter_to_date, custom Start date (ISO 8601, defaults to 30 days ago)
End date (ISO 8601, defaults to now)
Response
Retailer index data
Show child attributes
Show child attributes
True when any series point has a basket below sample_threshold.
Products priced in every period of the series (the basis of stable_avg_price). Null for single-point series.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes

