curl --request GET \
--url https://api.syntalic.com/v1/marketing/price-positioningimport requests
url = "https://api.syntalic.com/v1/marketing/price-positioning"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/marketing/price-positioning', 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/marketing/price-positioning",
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/marketing/price-positioning"
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/marketing/price-positioning")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/marketing/price-positioning")
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{
"brand": "<string>",
"category": "<string>",
"country": "<string>",
"currency": "<string>",
"brand_avg_price": 123,
"category_avg_price": 123,
"category_median_price": 123,
"price_index": 123,
"positioning": "premium",
"brand_median_price": 123,
"tier": "entry",
"tier_node": "<string>",
"tier_edges": [
123
],
"banded_from": "<string>",
"product_count": 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": {}
}
}Analyze a brand's price positioning vs competitors
Place a brand on a category’s price ladder. PREFER tier: the brand’s median current price placed on the shelf’s equal-population ladder (entry | value | mid | premium | luxury, so premium always means the shelf’s fourth fifth), read from the category’s published price band or its nearest banded ancestor (tier_node). It is the same reading the Syntalic dashboards report, and it is null without a category or when no band is published. positioning is DEPRECATED and kept for compatibility: a ratio of averages (brand avg / category avg, above 1.15 premium, below 0.85 value), which uses the words premium and value with a different meaning from tier. Prices the pipeline flagged as incoherent are excluded.
curl --request GET \
--url https://api.syntalic.com/v1/marketing/price-positioningimport requests
url = "https://api.syntalic.com/v1/marketing/price-positioning"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/marketing/price-positioning', 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/marketing/price-positioning",
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/marketing/price-positioning"
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/marketing/price-positioning")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/marketing/price-positioning")
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{
"brand": "<string>",
"category": "<string>",
"country": "<string>",
"currency": "<string>",
"brand_avg_price": 123,
"category_avg_price": 123,
"category_median_price": 123,
"price_index": 123,
"positioning": "premium",
"brand_median_price": 123,
"tier": "entry",
"tier_node": "<string>",
"tier_edges": [
123
],
"banded_from": "<string>",
"product_count": 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
Brand name (e.g., Sony, Samsung, Nike)
1Country (us or ca)
us, ca Product category in the Shopify product taxonomy. Accepts a display path (e.g. 'Electronics > Computers > Laptops'), its slug form (e.g. 'electronics/computers/laptops'), a single path segment (e.g. 'laptops', 'headphones'), or an everyday shelf name (e.g. 'apparel', 'beauty', 'grocery'); matched against the catalog's category tree (exact node, subtree, or whole path segment). 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'.
1Filter to a specific retailer platform (long-tail specialty stores are also present; any platform key is accepted)
amazon, walmart, target, bestbuy, homedepot, costco, ikea, samsclub, cvs, dillards Response
Price positioning data
Ratio of averages. Prefer tier.
premium, mid-range, value, unknown The brand's median on the shelf's equal-population ladder.
entry, value, mid, premium, luxury The category node whose price band the tier was read from.
The ladder's ascending tier upper bounds. Empty when there is no band.
Set when the ladder's shape was inherited from an ancestor shelf.
Show child attributes
Show child attributes
Show child attributes
Show child attributes

