The short answer
| Store | Products | New | Removed | Price changes | Stock changes |
|---|---|---|---|---|---|
| allbirds.com | 692 | 0 | 0 | 0 | 10 |
| gymshark.com | 10,027 read | 6 | not counted | 0 | 266 |
| kyliecosmetics.com | 247 | tracked since 2026-10-08 | |||
Changes count from the snapshot of 2026-10-07 to the one of 2026-10-08. A stock change is one variant, such as a shoe size, going in or out of stock.
How to tell if a website is Shopify
Add /cart.json to the store's address. A store on a Shopify-hosted theme answers with a JSON cart, even an empty one, because Shopify serves the cart endpoints on every theme it hosts.
On 2026-10-08, www.allbirds.com and kyliecosmetics.com answered 200 with a JSON cart. Our own tools.openkrill.app answered 404.
The test misses one kind of store. Shopify's docs say the cart endpoints do not exist on a custom storefront, and www.gymshark.com answered 404, yet our tracker reads its product feed every day. So a 404 means "not a Shopify-hosted theme", not "not Shopify".
What products.json gives you, and what it does not
The feed lists each product with its title, type, vendor, variants, price and availability per variant. It returns up to 250 products a page with ?limit=250.
It has no stock counts, no sales and no past prices. One read shows what a store sells today; a price tracker has to read the feed every day and keep the snapshots itself.
That is what Store Price Tracker does. A store you ask about joins a daily snapshot list, and each answer reports new and removed products and price and stock changes since the day before.
Big catalogs, and why "removed" can read zero
gymshark.com is large: the tracker read 10,027 products and stopped at its page limit, so the store has at least that many.
On a partial read the tracker does not count removed products, because a missing product may sit on a page it did not fetch. That is why the removed cell reads "not counted". Price and stock changes still count for every product it read.
Reading feeds politely
The tracker checks robots.txt before it reads a store, names itself StorePriceTracker in every request, and backs off when a store answers 429. It reads public product data only: no cart, no checkout, no customer data.
Set it up from the Store Price Tracker install guide for Claude. More store tasks are on the page of tools for Shopify operators.
Try it: run the same check yourself with Store Price Tracker, with no key, or read every post on the Agent Tools blog.
Sources
- @alexpagepilot on X: shows the URL tricks: add /cart.json to tell a Shopify store, then read /meta.json and /products.json?limit=250&page=1.
- Shopify, Ajax API: the storefront endpoints exist on every theme hosted by Shopify, and not on a custom storefront.
- Shopify, Cart API reference: GET /cart.js returns the visitor's cart as JSON.
- Shopify, Product API reference: GET /products/{handle}.js returns one product with its variants as JSON.
- RFC 9309, Robots Exclusion Protocol: the robots.txt rules our tracker honors before it reads a feed.
- RFC 6585, Additional HTTP Status Codes: 429 Too Many Requests, the answer that makes our tracker back off.
- allbirds.com/products.json: a live example of the feed: products, variants, prices and availability.
- Our own runs: Store Price Tracker and the other tools named above, on 2026-10-08. A timer runs the same calls again every 7 to 30 days.
Change log
We measure the numbers in this post again every 7 to 30 days and check that every source still loads. A new line appears here only when something in the post really changed.
- 2026-10-08. Published. Why: First version, with the numbers we measured with our own tools on 2026-10-08.