Shopify Store Scraper & API - Products, Prices, Variants
Pricing
$0.50 / 1,000 results
Shopify Store Scraper & API - Products, Prices, Variants
Shopify store scraper and products API: give it Shopify store, collection or product URLs. One row per product or variant: title, price, compare-at price, discount, stock flag, variants with SKU and options, vendor, type, tags, images, dates. No login; failed stores free. $0.50 per 1,000 results.
Pricing
$0.50 / 1,000 results
Rating
0.0
(0)
Developer
Giovanni Rich
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
Shopify store scraper for stores you do not own: give it store domains, collection URLs or product URLs and get every product as clean JSON, CSV or Excel: title, vendor, product type, tags, price, compare-at price, discount %, in-stock flag, every variant with its SKU, price, options and stock flag, all images, description and dates. Use it as a Shopify products scraper, a Shopify price monitoring tool, or an unofficial Shopify products API for competitor price tracking and catalog exports, on any store built on Shopify (own domain or *.myshopify.com), in bulk.
It reads the public product feed every Shopify storefront serves (/products.json) over plain HTTP, with no headless browser, no login and no API key, so a 10,000-product store takes about a minute and a half.
What you get
Product mode (outputMode: "product", default), one dataset item per product:
- Store:
storeDomain,storeName,storeCountry,currency(the store's own currency, read once from its/meta.json). - Identity:
productId,title,handle,url,vendor,productType,tags(array). - Price:
price(lowest variant price),priceMin,priceMax,compareAtPrice(strike-through price),discountPercent,onSale. All numbers. - Stock:
available(true when any variant can be bought),variantsCount. - Variants:
variants[]withvariantId,title,sku,price,compareAtPrice,discountPercent,available,option1/option2/option3,optionValues({"Size": "8"}),grams,requiresShipping,taxable,barcode(when the store exposes it),imageUrl,url(with?variant=),createdAt,updatedAt. Plusoptions[](name and all values). - Content:
imageUrl,images[],description(plain text, HTML stripped), optionaldescriptionHtml. - Dates:
createdAt,publishedAt,updatedAt,scrapedAt(ISO 8601, UTC).
Variant mode (outputMode: "variant"), one flat item per variant: variantId, title (product), variantTitle, sku, price, compareAtPrice, discountPercent, available, option1-3, optionValues, grams, barcode, imageUrl, url, productUrl, plus the product's productId, handle, vendor, productType, tags and the store fields. No nested arrays, so it opens cleanly in Excel or Google Sheets.
A RUN_SUMMARY record in the key-value store lists every store with its name, currency, published product count, products saved, pages read and stop reason, and every failed store with the reason (not a Shopify store, password-protected, feed disabled, access denied, domain does not resolve).
Sample output
Real rows from a run on www.allbirds.com, product mode (from sample-output.json):
| storeName | title | productType | price | compareAtPrice | currency | available | variantsCount |
|---|---|---|---|---|---|---|---|
| Allbirds | Women's Allbirds Flip Flop - Dusty Pink | Shoes | 25 | 50 | USD | true | 7 |
| Allbirds | Men's Canvas Runner NZ - Deep Navy Stripes (Blizzard Sole) | Shoes | 100 | null | USD | true | 13 |
| Allbirds | Women's Canvas Runner NZ - Deep Navy Stripes (Blizzard Sole) | Shoes | 100 | null | USD | true | 13 |
Use cases
- Competitor price monitoring: schedule variant mode daily and track
price,compareAtPriceandavailableper SKU. - Catalog export / migration: pull a whole store with
descriptionHtml, images, options and variants. - Product and dropshipping research: see what a store sells, at what price, what is new (
createdAt) and what is discounted. - Stock tracking:
onlyAvailableplus a schedule shows what sold out and what came back. - New arrivals feed:
updatedAfter: "1 day"on a schedule returns only new and changed products. - AI agents: one call returns a store's structured catalog an agent can search, compare and summarise.
Pricing
$0.50 per 1,000 results (pay per result; failed requests and failed stores are never charged). Half the $1.00 per 1,000 charged by the top Shopify product scrapers on the Store.
FAQ
Is it legal to scrape Shopify stores? It collects only public product data the store itself publishes for every visitor, no personal data and nothing behind a login. You're responsible for using it in line with each store's terms and applicable law. This is not legal advice.
Does it need a login, API key or store admin access?
No. Plain HTTPS requests to public URLs only. If a site is not on Shopify, or its feed is off, it is listed under failed in RUN_SUMMARY with the reason, and you pay nothing for it.
How fast is it and how many results can I get?
Every published product in the store (maxProductsPerStore: 0), 250 per request; a 10,000-product store takes about 90 seconds. Paste hundreds of stores for bulk runs. It does not return inventory quantities, sales or reviews (Shopify does not publish them), only an in-stock flag per variant.
Can I scrape one collection or one product, one row per variant?
Yes. Paste /collections/<name> or /products/<name> URLs and mix them with whole stores. Set outputMode: "variant" for one flat row per size / colour (each variant row is one billed result).
Can I schedule it or use it via API, and what about proxies? Yes: Apify schedules, the REST API, Make, Zapier, n8n and MCP. The default datacenter proxy works for most stores; rate limits (HTTP 429 / 430) are retried on a fresh IP, and a store that answers 403 is retried once over a direct connection. If it still fails with "access denied", switch to the RESIDENTIAL group.
How to use
- Paste one or more Shopify stores, collections or products, one per line:
allbirds.com(whole store),https://www.allbirds.com/collections/mens(one collection) orhttps://www.allbirds.com/products/mens-tree-runners(one product). - Pick the Output: one row per product (variants nested) or one row per variant (flat, best for price and stock monitoring). Set Max products per store (default 250; 0 = the whole store) and any filters: in stock only, on sale only, title keywords, vendors, product types, updated after a date.
- Click Start. Download the results as JSON, CSV, Excel or HTML from the Output tab, or pull them through the Apify API, Make, Zapier, n8n or an MCP client.
Input example
{"storeUrls": ["allbirds.com", "www.deathwishcoffee.com", "https://www.taylorstitch.com/collections/mens-shirts"],"outputMode": "product","maxProductsPerStore": 0}
Price monitoring, one row per variant, discounted and in-stock items only:
{"storeUrls": ["gymshark.com", "ugmonk.com"],"outputMode": "variant","maxProductsPerStore": 500,"onlyAvailable": true,"onSaleOnly": true}
Output example
Real item from a cloud run (www.allbirds.com, product mode). The product has 7 variants and 5 images; 2 of each are shown here:
{"storeDomain": "www.allbirds.com","storeName": "Allbirds","storeCountry": "US","productId": "7340901859408","title": "Women's Allbirds Flip Flop - Dusty Pink","handle": "womens-allbirds-flip-flop-dusty-pink","url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink","vendor": "Allbirds","productType": "Shoes","tags": ["allbirds::carbon-score => undefined", "allbirds::cfId => color-a4d5d0f6620dc304306f503bf67bc5f9", "allbirds::complete => true", "allbirds::edition => limited", "allbirds::gender => womens", "allbirds::hue => pink", "allbirds::master => womens-allbirds-flip-flop", "allbirds::material => sugar", "allbirds::price-tier => tier-3", "allbirds::silhouette => zeffer", "loop::returnable => true", "OOS DNS", "shoprunner", "WC WAVE 1 TRUCK #1-#16 7.30.2026", "YBlocklist", "YGroup_ygroup_womens-allbirds-flip-flop"],"price": 25,"priceMin": 25,"priceMax": 25,"compareAtPrice": 50,"currency": "USD","discountPercent": 50,"onSale": true,"available": true,"variantsCount": 7,"variants": [{"variantId": "42146889039952","title": "5","sku": "A12513W050","price": 25,"compareAtPrice": 50,"discountPercent": 50,"available": false,"option1": "5","option2": null,"option3": null,"optionValues": { "Size": "5" },"grams": 455,"requiresShipping": true,"taxable": true,"barcode": null,"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345","url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink?variant=42146889039952","createdAt": "2026-03-27T21:03:50.000Z","updatedAt": "2026-10-10T17:37:35.000Z"},{"variantId": "42146889072720","title": "6","sku": "A12513W060","price": 25,"compareAtPrice": 50,"discountPercent": 50,"available": false,"option1": "6","option2": null,"option3": null,"optionValues": { "Size": "6" },"grams": 492,"requiresShipping": true,"taxable": true,"barcode": null,"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345","url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink?variant=42146889072720","createdAt": "2026-03-27T21:03:50.000Z","updatedAt": "2026-10-10T17:37:35.000Z"}],"options": [{"name": "Size","position": 1,"values": ["5", "6", "7", "8", "9", "10", "11"]}],"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345","images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345","https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_BACK.png?v=1774646345"],"description": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather, these flip flops bring everyday comfort to sunny days, beach walks, and everything in between. Just slip them on and go.","createdAt": "2026-03-27T21:03:50.000Z","publishedAt": "2026-09-25T23:58:13.000Z","updatedAt": "2026-10-10T17:37:35.000Z","scrapedAt": "2026-10-10T17:37:35.646Z"}
Integrations
- API: start runs and read datasets over the Apify REST API or the JavaScript / Python clients.
- MCP / AI agents: call it from Claude, ChatGPT or any MCP client through the Apify MCP server; inputs and outputs are documented field by field.
- No-code: Make, Zapier, n8n, Google Sheets, Airtable, Slack, webhooks.
- Scheduling: run hourly, daily or weekly in Apify Schedules to track prices and stock.
Limits (read before large runs)
- It reads what the store publishes in its feed: published products only, no inventory quantities, no sales numbers, no reviews, no metafields.
- Prices are in the store's default currency (
currency). Stores that sell in several markets show converted prices on the site; the feed has the base price. - A few stores turn the feed off (headless storefronts) or sit behind strict bot protection. They come back as failed with the reason and are not charged. For "access denied (HTTP 403)" switch the proxy to the RESIDENTIAL group.
barcodeandweightare only in the single-product feed, so they are filled for product URLs and empty for whole-store runs.gramsis always filled.- Filters are applied after reading, so a filtered run still reads the whole store or collection (fast, and you only pay for what passes).
How it works (for developers)
Every Shopify storefront serves /products.json?limit=250&page=N (and /collections/<handle>/products.json), 250 products per page, until a page comes back short or empty. The actor reads /meta.json once per store for the store name, currency, country and published product count (falling back to the homepage when a store does not serve it), then pages through the feed and maps each product: prices and compare-at prices become numbers, the cheapest variant sets price, HTML is stripped from the description, dates are converted to UTC. Product URLs use /products/<handle>.js (stock flags, barcodes) merged with /products/<handle>.json (update date, weights). A 404, a non-JSON answer, a redirect to /password or a 403 marks the store as failed with a plain reason.
Run it locally:
npm installnpm test # parser tests on saved real fixtures (store feed, collection, product .js/.json, meta, 404, 403)node src/main.js # input in storage/key_value_stores/default/INPUT.json