curl --request GET \
--url https://api.syntalic.com/v1/shopper/price-historyimport requests
url = "https://api.syntalic.com/v1/shopper/price-history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/shopper/price-history', 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/shopper/price-history",
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/shopper/price-history"
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/shopper/price-history")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/shopper/price-history")
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{
"query": "<string>",
"country": "<string>",
"currency": "<string>",
"product_uid": "<string>",
"entity_uid": "<string>",
"product_name": "<string>",
"retailer": "<string>",
"condition": "<string>",
"current_price": 123,
"period_low": 123,
"period_high": 123,
"period_avg": 123,
"is_good_deal": true,
"trend": "<string>",
"insufficient_history": true,
"observation_count": 123,
"scope": "entity",
"member_count": 123,
"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"
},
"observations": [
{
"date": "2023-12-25",
"price": 123
}
],
"series": [
{
"date": "2023-12-25",
"price": 123
}
],
"series_summary": {
"current": 123,
"min": 123,
"min_date": "2023-12-25",
"max": 123,
"max_date": "2023-12-25",
"change_pct": 123,
"change_window_days": 7,
"drops": [
{
"date": "2023-12-25",
"from_price": 123,
"to_price": 123,
"pct": 123
}
]
},
"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": {}
}
}Get price history for a product over time
Get historical price observations for a product within a date range. Returns current price, period low/high/avg, trend (rising/falling/stable), good-deal flag, and an observation time-series for charting. Also returns series, one row per day at that day’s lowest price across the product’s entity-matched listings, and series_summary, which reads that series: the dated low and high (min_date, max_date), every day-over-day drop of 5% or more (drops), and change_pct, the banded like-for-like change over win days (best price in the last few days vs best price around win days ago; null when the queried range does not reach back that far). These are the numbers the Syntalic dashboards report. Includes a nullable gpc block for the resolved product (fail-soft).
curl --request GET \
--url https://api.syntalic.com/v1/shopper/price-historyimport requests
url = "https://api.syntalic.com/v1/shopper/price-history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.syntalic.com/v1/shopper/price-history', 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/shopper/price-history",
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/shopper/price-history"
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/shopper/price-history")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.syntalic.com/v1/shopper/price-history")
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{
"query": "<string>",
"country": "<string>",
"currency": "<string>",
"product_uid": "<string>",
"entity_uid": "<string>",
"product_name": "<string>",
"retailer": "<string>",
"condition": "<string>",
"current_price": 123,
"period_low": 123,
"period_high": 123,
"period_avg": 123,
"is_good_deal": true,
"trend": "<string>",
"insufficient_history": true,
"observation_count": 123,
"scope": "entity",
"member_count": 123,
"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"
},
"observations": [
{
"date": "2023-12-25",
"price": 123
}
],
"series": [
{
"date": "2023-12-25",
"price": 123
}
],
"series_summary": {
"current": 123,
"min": 123,
"min_date": "2023-12-25",
"max": 123,
"max_date": "2023-12-25",
"change_pct": 123,
"change_window_days": 7,
"drops": [
{
"date": "2023-12-25",
"from_price": 123,
"to_price": 123,
"pct": 123
}
]
},
"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
Search query (product name, keyword, or brand + model). Required unless product_uid or entity_uid is supplied.
1Stable product identifier returned by a prior Syntalic shopper response. When supplied, the endpoint should pin to this listing instead of re-resolving free text.
1Stable cross-retailer entity identifier returned by a prior Syntalic shopper response. When supplied, the endpoint should resolve within the same physical-product entity.
1Country (us or ca)
us, ca Filter 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 Historical 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)
Window in days for series_summary.change_pct. Independent of the chart range: set lookback_days (or from) far enough back to cover it.
7, 30, 90 Response
Price history
entity, listing Show child attributes
Show child attributes
Show child attributes
Show child attributes
One row per day at that day's lowest price, oldest first.
Show child attributes
Show child attributes
What the daily-low series says. Null when there is no series.
Show child attributes
Show child attributes
Show child attributes
Show child attributes

