Tony Wang4 min readHow to Scrape Shop App (shop.app) in 2026 (API & Python)
Scrape Shop.app in 2026 — cross-store product search, details, and reviews across Shopify merchants — DIY, no-code, or a structured API, with the legal basics.
The fastest way to scrape Shop.app in 2026 is to call a structured API that returns normalized JSON — cross-store product search, product detail, reviews, and shop profiles — instead of reverse-engineering Shop.app's internal GraphQL app. Shop.app is Shopify's consumer marketplace, so it aggregates products across thousands of Shopify merchants in one place. This guide covers all three approaches, what each returns, where each breaks, and the legal basics.
Why scrape Shop.app?
Because it aggregates many merchants, Shop.app is useful for:
- Cross-store product & competitor discovery — find products and shops across the Shopify ecosystem, not just one store.
- Merchandising & pricing research — compare prices and assortments across merchants.
- Review & sentiment analysis — read product and shop reviews at scale.
- Trend spotting — surface categories and deals that are gaining traction.
Is it legal to scrape Shop.app?
Option 1: DIY in Python (and why it breaks)
Shop.app is a JavaScript app backed by an internal GraphQL API, so a DIY scraper reverse-engineers it:
import requests
# shop.app renders client-side from an internal GraphQL API behind request tokens
resp = requests.post("https://shop.app/api/graphql", json={"query": "...", "variables": {...}})
It demos and then breaks:
- No official public API. Shop.app doesn't publish a developer API, so there's no documented endpoint or key — you're replicating the consumer app's private calls.
- Single-store vs cross-store. A single Shopify store exposes a public
/products.json(that's the route in how to scrape Shopify stores), but Shop.app's value is cross-store aggregation, and it has no equivalent open endpoint. - Tokens and anti-bot. The internal GraphQL calls require request tokens and trip anti-bot defenses, so you need realistic headers, proxies, and constant upkeep.
- Drifting internal schema. The private GraphQL schema changes without notice and breaks replicated queries.
Option 2: No-code tools
Marketplace "Shop.app scraper" actors export CSV/JSON and suit one-off pulls, but they're awkward in an in-product pipeline and inherit the same internal-API fragility.
Option 3: A structured Shop.app API
For repeatable workflows, a Shop.app scraping API returns normalized JSON with no GraphQL to maintain. Search across stores:
curl "https://api.crawlora.net/api/v1/shop-app/search?query=sneakers" \
-H "x-api-key: $CRAWLORA_API_KEY"
Then resolve a product id and pull detail and reviews in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/shop-app"
products = requests.get(f"{base}/search", headers=h, params={"query": "sneakers", "limit": 20}).json()["data"]["products"]
pid = products[0]["id"]
detail = requests.get(f"{base}/products/{pid}", headers=h).json()["data"]["product"]
reviews = requests.get(f"{base}/products/{pid}/reviews", headers=h).json()["data"]["reviews"]
A search response is normalized JSON you can store directly (real fields):
{
"code": 200,
"msg": "OK",
"data": {
"query": "sneakers",
"limit": 20,
"products": [
{ "id": "8075903107261", "variant_id": "46242960965821", "title": "BILLY Sport Inclusion", "url": "https://billyfootwear.com/products/...?utm_source=shop_app", "shop_id": "62696", "shop_name": "BILLY Footwear", "price": 100, "currency": "USD", "position": 1, "group_title": "kids' athletic sneakers" }
]
}
}
Search accepts query plus in_stock, on_sale, and deep_search filters. Beyond products, the same key reaches product variants and related items, and shop profiles by handle — /shop-app/shops/{handle}, its /products, /reviews, and /locations — plus /shop-app/categories and /shop-app/suggestions. Store one row per product and re-pull on a schedule.
What you can collect
Public catalog data: cross-store product search (id, variant_id, title, url, shop_id, shop_name, price, currency, group); product detail, variants, and related items; product reviews (rating, body, author, date); shop profiles with products, reviews, and locations; categories; and search suggestions. Public, factual fields only.
Limitations and common challenges
- No official API. Shop.app has no public developer API, so collecting its data means scraping — which a structured API handles behind one key.
- Cross-store, not a full single-store catalog. Shop.app aggregates across merchants; to pull one store's complete catalog, use its
/products.jsonper the Shopify stores guide. - Reviews are personal data. Reviewer names and review text are personal under GDPR/CCPA — collect public, factual fields with a lawful basis.
- Prices and stock change. Use the
in_stock/on_salefilters and re-pull on a schedule rather than trusting a one-time snapshot.
Where this gets used
- E-commerce product intelligence — research catalogs, prices, and shops across the Shopify ecosystem. See the e-commerce product intelligence use case.
- Competitor & merchandising research — compare assortments and pricing across merchants.
- Review & reputation monitoring — track product and shop sentiment at scale.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the search endpoint in the Playground, check the schema in the API docs, and review pricing. See also how to scrape Shopify stores for single-store catalogs, how to scrape eBay for the marketplace side, how to choose a web scraping API, and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Is Shop.app the same as scraping a Shopify store?
No. A single Shopify store exposes a public /products.json you can read directly (see the Shopify stores guide). Shop.app is Shopify's consumer marketplace that aggregates products across many merchants, so it's cross-store discovery — and it has no equivalent open per-store endpoint.
Does Shop.app have an official API?
No public developer API. Shop.app renders client-side from an internal GraphQL API behind request tokens, so collecting its data means scraping — which a structured API handles behind one key, returning search, product, review, and shop data as normalized JSON.
How do I get a product's reviews?
Search to get a product id, then call /shop-app/products/{id} for detail and /shop-app/products/{id}/reviews for reviews (rating, body, author, date). Shops are addressed by handle via /shop-app/shops/{handle} and its /products and /reviews.
What Shop.app data can I collect?
Public catalog data: cross-store product search (id, variant_id, title, url, shop_id, shop_name, price, currency, group), product detail, variants, and related items; product reviews; shop profiles with products, reviews, and locations; categories; and suggestions.
Can I filter by stock or sale?
Yes. /shop-app/search accepts query plus in_stock, on_sale, and deep_search filters, so you can narrow to available or discounted products and re-pull on a schedule as prices and stock change.
Are Shop.app reviews personal data?
Yes. Reviewer names and review text are personal data under GDPR/CCPA — collect only public, factual fields with a lawful basis, and don't republish reviewers' identities.