DEV Community

Shan Yun
Shan Yun

Posted on

Shopify's Open Secret: Every Store Exposes /products.json

Shopify's Open Secret: Every Store Exposes /products.json

Build in public: how I turned a 10-line trick into a working Shopify scraper — no login, no CAPTCHA, no anti-bot.


If you've ever tried scraping an e-commerce site, you know the drill: Cloudflare walls, CAPTCHAs, session tokens, cat-and-mouse games with anti-bot teams.

Then I discovered that most Shopify stores hand you their entire product catalog on a silver platter.

The trick

Every Shopify store has a public JSON endpoint:

https://STORE.com/products.json?limit=250&page=1
Enter fullscreen mode Exit fullscreen mode

No auth. No CAPTCHA. Just clean JSON — title, price, variants, SKUs, inventory, tags. For the store, it's the API behind their own product pages. For us, it's a gift.

The whole scraper in 10 lines

import requests

def get_products(store_url, max_pages=4):
    base = store_url.rstrip("/") + "/products.json"
    products = []
    for page in range(1, max_pages + 1):
        data = requests.get(f"{base}?limit=250&page={page}", timeout=20).json()
        items = data.get("products", [])
        if not items:
            break
        products.extend(items)
    return products
Enter fullscreen mode Exit fullscreen mode

That's it. Paginate until empty, and you have a store's full catalog.

Real result: kith.com

I ran it against a real store while writing this. One page, 250 products, 215 variants in the response — including this:

{
  "title": "Nike WMNS Moon Shoe - Sail / Chlorophyll",
  "price": 105.0,
  "sku": "14318102",
  "inventory": null,
  "available": false,
  "tags": "sneaker, nike, footwear, ..."
}
Enter fullscreen mode Exit fullscreen mode

Every variant has its own SKU, price, and compare-at price. That's competitor intelligence data — prices, stock, product launches — sitting behind a single GET request.

Try it yourself (30 seconds)

Don't take my word for it — run this and see the live response:

curl -s "https://kith.com/products.json?limit=5&page=1" | head -c 2000
Enter fullscreen mode Exit fullscreen mode

If you get JSON back, the store is scrapeable the easy way. (Not all stores leave it open — test before you commit to a project.)

What's it good for?

  • Competitor monitoring — track when a rival changes prices or restocks
  • Dropshipping / product research — find what's trending across stores
  • Catalog snapshots — for analytics, dashboards, or AI training data

The honest limits

  • Only works on Shopify stores (non-Shopify sites return nothing — check https://store.com/products.json first)
  • Some big stores disable it or rate-limit aggressively (usually the ones with the most aggressive bot protection)
  • Inventory data is sometimes null — the store decides what to expose

The polished version

Full disclosure: I built this and I maintain it — it's the tool I use for my own competitor monitoring.

If you want this packaged and ready-to-run, I published it as a free-to-try Apify actor — handles pagination, normalization, and exports clean CSV/JSON/Excel. No Docker setup, no proxy management, runs on demand. Otherwise the 10 lines above are all you need.

If you're doing competitor research or building a price tracker, try the endpoint first — you might not need a battle against anti-bot at all.


Have you found other public endpoints like this? Drop them in the comments — the good ones deserve a thread.

Top comments (0)