Data API changelog
Every customer-visible change to the ShopSavvy Data API, newest first: new endpoints and fields, pricing and limit changes, fixes and deprecations.
Last updated · RSS feed · Versioning and deprecation policy · Documentation
- AddedMCP price answers name their source. The MCP tools
product_lookup,product_offers,product_offers_retailerandproduct_price_historyend with a source line naming ShopSavvy, linking the product page on shopsavvy.com and giving the time the latest price was checked. Each current offer also shows when it was last checked. - ChangedMCP tool descriptions say when to use each tool and what it costs. Every MCP tool description now states what it returns, when to use it instead of its siblings, which identifiers match best, its credit cost with a key (free without one), and to report "no data" rather than guess.
product_lookup_batchresults now include the ShopSavvy ID. - ChangedMCP scheduling tools need an API key.
product_schedule,product_unscheduleandscheduled_products_listnow returnERR_AUTH_MISSINGwithout an API key, because a schedule belongs to an account. Lookups, offers, price history and the content tools still work without a key.
- AddedEvery product says how it matched. Products returned by any endpoint that takes identifiers now carry a
matchobject: theidentifieryou sent, the field it matchedby(barcode,shopsavvy_id,asin,url,model,mpnorname), and how manycandidatesshared that identifier. Line results up with your request and tell an exact match from a name-search best guess. - AddedMarketplace and condition on every offer. Offers now include
is_marketplace(truefor a third-party marketplace seller,falsewhen the retailer sells it,nullwhen unknown) andcondition_grade(for exampleopen-boxorrefurbished-excellent), in JSON and as CSV columns. - ChangedIdentifier matching gives the same answer every time. A full-length barcode with a valid check digit is looked up only as a barcode, so a UPC can no longer come back as an unrelated product whose model number happens to be the same digits. ShopSavvy product IDs are matched right after barcodes. When several products share a barcode or model number, the one with the most evidence behind it is returned, consistently.
- Changed"Product not found" tells you what to try next.
ERR_PRODUCT_NOT_FOUNDnow says whether the barcode check digit failed (usually a missing or extra digit), whether the barcode simply is not in the catalog yet, or which other identifiers to try. - ChangedHourly request limit reported the same way everywhere. Every authenticated response carries
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset, andmeta.rate_limit_remainingshows the same number on every endpoint, including errors andGET /v1/usage. More than 1,000 requests in a rolling hour returns429 ERR_RATE_LIMITwith aRetry-Afterheader; rejected requests do not count against the limit. - ChangedScheduled monitoring refreshes on the cadence you chose. Products scheduled with
PUT /v1/products/scheduledare re-checked hourly, daily or weekly at the retailers we can re-check through an official retailer API (Amazon and Best Buy). Offers at other retailers keep updating as ShopSavvy sees them, each with its own timestamp. Refreshes are not charged; scheduling still costs 1 credit per product. - ChangedRescheduling updates instead of duplicating. A newly scheduled product shows up in
GET /v1/products/scheduledright away, and scheduling it again updates the existing schedule instead of adding a second one. - ChangedNo credit for a review that does not exist.
GET /v1/products/reviews, andPOST /v1/products/batchwithinclude: ["reviews"], no longer charge a credit when the product has no TLDR review. - ChangedPlayground shows exactly what your code receives. Live Mode in the API Playground shows the real response, including error bodies with their
actionhint, the HTTP status and the request id. Every response is labelled Demo, Live Sandbox or Live, and the copied curl command matches the request that ran. - FixedUnknown availability is always omitted. Offers with unknown availability now always omit
availability, as documented, instead of sometimes returningnull.
- FixedPlayground Live Mode calls the API as your key. Live Mode was returning the sample demo response (
isDemo: true, 0 credits). It now sends real requests with the API key you select, so results, credit usage and errors match what your own code sees, on every playground endpoint including deals, reviews and batch lookup. - FixedNew subscriptions always get dashboard access and a key. A subscription started before your ShopSavvy account had finished setting up could leave you without dashboard access or an API key. The account is now completed when the subscription starts, so your plan, credits and first key are ready right away.
- AddedStandard MCP transports with anonymous access. The MCP server at
https://api.shopsavvy.com/mcpnow speaks the standard Streamable HTTP transport (plus legacy HTTP+SSE at/mcp/sse), so Claude Code, Cursor, VS Code, Codex and other clients connect by URL:claude mcp add --transport http shopsavvy https://api.shopsavvy.com/mcp. It works without a key at a lower rate limit; add your API key as a Bearer token to raise it. - FixedSchedule and unschedule accept the SDK request body. The JSON body the published SDKs send to schedule and unschedule products is now accepted, alongside query parameters.
- FixedBare retailer domains work on price history and scheduling. Passing a retailer as a bare domain (
retailer=bestbuy.com, the documented format) no longer returns a 500 onGET /v1/products/offers/historyand scheduling. - Fixed
GET /v1/products/scheduledwith a removed product. Listing scheduled products no longer returns a 500 when one of them has since been removed from the catalog.
- Changed
product_price_historyacceptsstartandend. The MCP tool now also acceptsstartandend, the names the REST endpoint uses.start_dateandend_datekeep working.
- Fixed
GET /v1/usageworks again. The usage endpoint returned a 500 on every call. It now returns your credits used, credits remaining and request counts for the current billing period.
- AddedWebhook event ids and attempt numbers for safe retries. Every delivery carries a stable event id (
idin the body,X-ShopSavvy-Event-Idheader) that is the same on the first attempt and every retry, and anattemptnumber (X-ShopSavvy-Delivery-Attempt,1to5). Record the ids you have processed and ignore repeats;timestampand the signature change on every attempt. - ChangedPrice history matches the ShopSavvy price chart.
GET /v1/products/offers/historyand theproduct_price_historytool now apply the same filters as the chart on shopsavvy.com: a point must come from a verified retailer or a listing confirmed to be this exact product, must carry a real price in the listing's own currency, and must pass the same per-retailer outlier check. Expect fewer, cleaner points on noisy products. - ChangedPrice history points carry price, date and currency. Each history point now returns
price,timestamp,currencyandavailability(onlyavailabilitywas coming through), and the CSVcurrencycolumn reflects the archived value. All 10 SDKs describe the real shape,offer.history[].timestamp. - ChangedOffers exclude listings our validation judged wrong. Every offer endpoint and MCP offer tool now drops listings flagged as a wrong-product or wrong-price match, listings from an unresolved retailer, and archive rows with no real price.
POST /v1/products/batchwithinclude: ["offers"]returns the same filtered set asGET /v1/products/offers. - ChangedCharged only for offers we found. Batch lookups no longer add 3 credits for a product whose offer list is empty, and the per-day part of price-history pricing is not charged when the request finds no offers.
- ChangedUp to 100 identifiers per request. Every endpoint that takes a comma-separated
idslist accepts at most 100 identifiers, matchingPOST /v1/products/batch. Larger requests are rejected withERR_INVALID_PARAMSbefore any credits are charged. An emptyidsvalue now returnsERR_IDENTIFIER_REQUIRED. - ChangedPrice history windows of up to 366 days. Price history is charged per day of the requested window, so one request now spans at most 366 days. Request longer histories in successive windows.
- ChangedPrice history no longer includes eBay. A fresh eBay listing can still appear in
offers, but itshistoryarray is always empty, matching the ShopSavvy price chart. - ChangedWebhooks deduplicated per retailer. Two retailers changing price on the same product in the same pass now produce one delivery each, instead of collapsing into one delivery for the hour.
- ChangedDocumentation: USD offers and per-request history pricing. The docs and OpenAPI spec now state that offer endpoints return USD-denominated offers only, and that the per-day part of price-history pricing is charged once per request, not per product. Nothing about responses or charges changed.
- FixedReversed credits come back to your balance immediately. When a failed request is reversed, your remaining monthly allowance and any referral bonus it drew on are restored at once, so
credits_used: 0on an error matches your balance. - FixedA failed request counts once against the hourly limit. A request that errored after being recorded could count twice toward the rate limit. Requests are now counted, not log rows.
- FixedMCP tool errors report credits and reverse charges. A failed MCP tool call now includes
credits_used,credits_remainingandrate_limit_remainingin the JSON-RPC errordata, and any credits recorded for it are reversed, as the REST endpoints already did. - FixedReferral bonus credits fully usable. Bonus credits are spent after your plan allowance is used up, and the whole bonus balance is available in a single month.
- FixedStart a trial right after creating an account. Going straight from a new account to "Start Free Trial" could fail with "User not found". Checkout now works from the moment your account exists.
- AddedPer-aspect review scores. Product
scoreobjects and TLDR reviewscoresnow include anaspectsmap of per-aspect scores (e.g.value,features,reliability,quality) aggregated from the product's professional reviews. Aspect names are free-form and vary per product. - FixedDocumentation correction: scores are 0-1 scale. All quality scores (
overall,customer,professional, and aspect scores) are on a 0-1 scale, and always have been. The docs previously described a 0-100 scale and three fixed aspect fields (value,features,reliability) that were never actually returned. The API's numeric output is unchanged; multiply by 10 or 100 if you want a /10 or /100 display score.
- ChangedFaster price-history lookups.
GET /v1/products/offers/historyreturns quickly even for products with long, deep histories, and no longer times out on wide date ranges.
- AddedPayment-failure emails and a grace window. If a subscription charge fails you get an email right away with a link to update your card and retry, and API access keeps working for a week after the first failed attempt.
- ChangedCustom-plan dashboards. Customers on a custom plan no longer see the public plan upgrade prompts in the dashboard, keys, webhooks, playground or billing pages.
- AddedLive Sandbox in the playground. The API Playground has a Live Sandbox mode that sends real calls for a set of sample products, with no account and no credits.
- AddedReferral program. Share your referral link (
shopsavvy.com/data?ref=YOUR_CODE) and earn bonus API credits when a developer you refer becomes a paying subscriber. Your link and referrals are on the Referrals page of the dashboard.
- ChangedMore identifiers resolve. Catalog data from additional retail-network partners fills in barcodes, brands and model numbers, so more products resolve on identifier lookups.
- AddedUpdate webhooks in place.
PUT /v1/webhooks/:idchanges a webhook's URL, events oris_activeflag without deleting it and losing its signing secret. Omitted fields are left alone, and re-enabling a webhook resets its failure counter. Available in all 10 SDKs asupdateWebhook.
- AddedWebhooks fire for real events. Registered webhooks for
price_drop,availability_changeandschedule_completionnow receive signed POSTs when a scheduled product changes, not only from the dashboard test button. Deliveries are deduplicated per webhook, event and product for 60 minutes, retried with backoff (1m, 5m, 30m, 2h, 12h), and a webhook is disabled after 50 consecutive failures.
- AddedWebhooks dashboard. Register, test, enable or disable, and delete webhooks from
/data/webhooks. - AddedAPI Playground page. The playground is now a dedicated page at
/data/playground. - AddedAutomatic first API key. Starting a subscription creates a default API key, so you can make calls right away.
- ChangedInstant subscription activation. Your subscription, dashboard and API key are ready the moment you return from checkout.
- ChangedPer-key usage breakdown. The Usage page shows live credit and request counts for each of your API keys.
- ChangedSmarter auth redirects. Signing in from any Data API page takes you straight to your dashboard.
- AddedWebhook system. Register URLs to receive notifications on price drops, availability changes and schedule completions, with HMAC-SHA256 signature verification, exponential backoff retry, and auto-disable after repeated failures.
- AddedOpenAPI 3.0 spec. The API specification is available at
https://api.shopsavvy.com/v1/openapi.jsonfor Postman import, SDK generation and tooling. - AddedCredit usage alerts.
X-Credits-Warningresponse header when usage passes 75%, and a dashboard banner at 75%, 90% and 100%. - AddedPersistent sidebar navigation. Every dashboard page has a sidebar with all sections and a credit usage indicator.
- AddedUsage charts. Daily usage line chart and endpoint breakdown on the dashboard.
- AddedCode snippets in 11 languages. Examples cover cURL, TypeScript, Python, Go, Ruby, Java, PHP, C#, Rust, Swift and Kotlin.
- AddedCollapsible JSON tree viewer. The playground response viewer expands and collapses, color-codes values, and has a Raw JSON toggle.
- AddedTable view for arrays. Offers, deals and search results can be viewed as sortable tables in the playground.
- AddedResponse metrics. Response time (ms) and payload size (KB) shown after each playground request.
- ChangedExpanded product fields. Product responses include
title_short,slug,description,categories,attributes,rating,score,keywordsandidentifiers. - ChangedImproved error responses. All errors include
error_detailwithcode,message,actionanddocs_url, and every response includesrequest_idinmeta. - ChangedRetry-After header. 429 rate limit responses include the standard
Retry-AfterHTTP header.
- AddedDeals endpoint.
GET /v1/dealsreturns a deals feed with expert grades (A+ through F), community votes, hot/new/top sorting, filtering by category, retailer, price and grade, and CSV export. - AddedTLDR Reviews endpoint.
GET /v1/products/reviewsreturns expert review summaries with pros, cons, a bottom-line verdict and quality scores. - AddedBatch product lookup.
POST /v1/products/batchlooks up many products at once: synchronous for 20 identifiers or fewer, asynchronous with polling above that. It can include offers and reviews. - AddedCSV format support.
?format=csvworks on all endpoints, including search and price history. - AddedStandardized error codes. Error codes from
ERR_AUTH_MISSINGtoERR_INTERNAL, each with an actionable message and a documentation link.
- AddedProduct Search endpoint.
GET /v1/products/searchfor keyword product discovery with pagination. - AddedScheduled Monitoring.
PUT /v1/products/scheduledsets hourly, daily or weekly refresh cadences for tracked products. - AddedAPI Playground demo mode. Try every endpoint with sample data, no credits consumed.
- AddedLive mode playground. Test with your own API key and see real product data and credit use.
- ChangedImproved product matching. Better handling of model numbers and URLs as identifiers, and faster ASIN lookups.
- AddedCSV export.
?format=csvon/productsand/products/offersfor spreadsheets. - AddedSingle retailer filtering.
?retailer=amazon.comon the offers endpoint returns prices from one retailer only. - AddedUsage endpoint.
GET /v1/usagereturns credits used, credits remaining and request count for the current billing period. - FixedPrice history date validation. Clearer error messages when a date is in the wrong format.
- FixedOffer deduplication. Duplicate offers from the same retailer are removed from responses.
- AddedDeveloper Dashboard. Usage analytics, API key management, subscription billing and an onboarding checklist.
- AddedSubscriptions. Starter ($49/mo), Professional ($199/mo) and Enterprise ($499/mo) plans, with a 14-day trial on Starter.
- AddedAPI key management. Create up to 5 API keys per account, revoke keys, and see when each was last used.
- AddedGrandfathered legacy allowance. Accounts that used the API before plans existed keep 50 credits a month.
- AddedInitial API launch. Product lookup, all-retailer prices and price history endpoints.
- AddedAPI key authentication. Bearer token auth with
ss_live_prefixed keys, stored as SHA-256 hashes. - AddedCredit-based billing. 1 credit per product lookup, 3 per all-retailer offers, 2 per single-retailer offers, 1 per day of history.
- AddedRate limiting. 100 requests a minute for authenticated users and 10 a minute for anonymous MCP access.
- Added10 official SDKs. TypeScript, Python, Go, Ruby, Java, PHP, C#, Rust, Swift and Kotlin.
- AddedMCP server. A Model Context Protocol server for AI assistants (Claude, Cursor and others), with anonymous rate-limited access.