Why scrape Shopify stores?
Shopify store data drives e-commerce intelligence across industries:
Product catalogs
Extract complete product listings with variants, pricing, and inventory status from competitor stores.
Pricing intelligence
Monitor competitor pricing across thousands of products. Track price changes and discount patterns.
Competitor research
Analyze competitor product lines, new launches, bestsellers, and collection strategies.
Method 1: DIY with /products.json
Most Shopify stores expose a /products.json endpoint that returns structured product data without any scraping. This is the easiest starting point:
#E8A0BF">import requests
# Most Shopify stores expose /products.#87CEEB">json
url = #A8D4A0">"https://example-store.myshopify.com/products.#87CEEB">json?limit=250"
headers = {
#A8D4A0">"User-Agent": #A8D4A0">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
#A8D4A0">"AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36"
}
resp = requests.#87CEEB">get(url, headers=headers)
products = resp.#87CEEB">json()[#A8D4A0">"products"]
#E8A0BF">for product in products[:10]:
#E8A0BF">print(f#A8D4A0">"Title: {product[#A8D4A0">'title']}")
#E8A0BF">print(f#A8D4A0">"Vendor: {product[#A8D4A0">'vendor']}")
#E8A0BF">print(f#A8D4A0">"Price: {product[#A8D4A0">'variants'][0][#A8D4A0">'price']}")
#E8A0BF">print(f#A8D4A0">"Available: {product[#A8D4A0">'variants'][0][#A8D4A0">'available']}")
#E8A0BF">print(#A8D4A0">"---")
# Paginate #E8A0BF">with ?page=2, ?page=3, etc.Pain points
- !Store owners can disable /products.json — about 20% of stores block this endpoint
- !Limited to 250 products per page — large catalogs need pagination handling
- !Does not include review data, custom content, or SEO-specific fields
- !Some stores use Cloudflare or Shopify's built-in bot protection
- !Product descriptions in JSON may differ from rendered storefront content
- !No access to collection-level data, navigation structure, or blog content
Method 2: SnapRender API
When /products.json is disabled or you need rendered content (reviews, custom sections), SnapRender scrapes the live storefront. Use /render for markdown or /extract for structured JSON.
Render as markdown
Get the full collection page as clean markdown including rendered descriptions.
#E8A0BF">import requests
# Render a Shopify collection page #E8A0BF">as markdown
render = requests.#87CEEB">post(
#A8D4A0">"https://api.snaprender.dev/v1/render",
headers={#A8D4A0">"x-api-key": #A8D4A0">"sr_live_YOUR_KEY"},
json={
#A8D4A0">"url": #A8D4A0">"https://example-store.myshopify.com/collections/all",
#A8D4A0">"format": #A8D4A0">"markdown"
}
)
#E8A0BF">print(render.#87CEEB">json()[#A8D4A0">"data"][#A8D4A0">"markdown"])Extract structured data
Pull product cards with CSS selectors. Returns clean JSON.
#E8A0BF">import requests
# Extract structured product data #E8A0BF">from a Shopify storefront
extract = requests.#87CEEB">post(
#A8D4A0">"https://api.snaprender.dev/v1/extract",
headers={#A8D4A0">"x-api-key": #A8D4A0">"sr_live_YOUR_KEY"},
json={
#A8D4A0">"url": #A8D4A0">"https://example-store.myshopify.com/collections/all",
#A8D4A0">"selectors": {
#A8D4A0">"titles": #A8D4A0">".product-card__title",
#A8D4A0">"prices": #A8D4A0">".price-item--regular",
#A8D4A0">"images": #A8D4A0">".product-card__image img[src]",
#A8D4A0">"links": #A8D4A0">".product-card a[href]"
}
}
)
#E8A0BF">print(extract.#87CEEB">json())Example response
{
#A8D4A0">"status": #A8D4A0">"success",
#A8D4A0">"data": {
#A8D4A0">"titles": [#A8D4A0">"Organic Cotton T-Shirt", #A8D4A0">"Recycled Canvas Tote", #A8D4A0">"..."],
#A8D4A0">"prices": [#A8D4A0">"$34.99", #A8D4A0">"$28.00", #A8D4A0">"..."],
#A8D4A0">"images": [#A8D4A0">"//cdn.shopify.com/s/files/...", #A8D4A0">"..."],
#A8D4A0">"links": [#A8D4A0">"/products/organic-cotton-tee", #A8D4A0">"/products/recycled-tote", #A8D4A0">"..."]
},
#A8D4A0">"url": #A8D4A0">"https://example-store.myshopify.com/collections/all",
#A8D4A0">"elapsed_ms": 1840
}Legal considerations
Key legal points for scraping Shopify stores:
- 1.Each Shopify store is independently owned — Terms of Service vary by store. Check each store's ToS before scraping.
- 2.The /products.json endpoint is a publicly accessible API, but accessing it after being told not to could raise legal issues.
- 3.Product images and descriptions may be copyrighted — scraping for analysis is different from republishing.
- 4.Never scrape customer data, order information, or private store analytics.
- 5.Rate-limit your requests. Even though individual stores may not notice, Shopify's platform-level protections will flag aggressive patterns.
Start free — 100 requests/month
Get your API key in 30 seconds. Scrape Shopify product data with five lines of code. No credit card, no browser fleet, no proxy bills.
Get Your API KeyFrequently asked questions
Shopify stores are independently owned — each store has its own Terms of Service. Scraping publicly visible product catalogs is generally permissible under the hiQ v. LinkedIn ruling, but individual store owners may object. Never scrape customer data, and always respect robots.txt. Consult a lawyer for commercial use.
Yes — most Shopify stores expose a /products.json endpoint that returns product data in JSON format. This is the easiest method for basic product info. However, it only returns 250 products per page, may be disabled by store owners, and does not include all data visible on the storefront.
Product titles, descriptions, prices, variants, images, inventory status, collections, tags, vendor names, and SKUs. The /products.json endpoint gives structured data; scraping the storefront gives rendered content including reviews and custom sections.
SnapRender starts free with 100 requests/month. Paid plans begin at $9/month for 1,500 requests. Each Shopify page is one request — no credit multipliers.