Shopify Scraper — Products API, Prices & Stock | $0.90/1k avatar

Shopify Scraper — Products API, Prices & Stock | $0.90/1k

Pricing

from $0.90 / 1,000 product results

Go to Apify Store
Shopify Scraper — Products API, Prices & Stock | $0.90/1k

Shopify Scraper — Products API, Prices & Stock | $0.90/1k

Scrape any Shopify store by domain: products, variants, prices, compare-at prices, stock, SKUs, images, vendor, type, tags, dates and store currency. Many stores per run, collections, product URLs, filters, product or variant rows. No API key.

Pricing

from $0.90 / 1,000 product results

Rating

0.0

(0)

Developer

Raffy

Raffy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

What does Shopify Products Scraper do?

Shopify Products Scraper reads the product catalog of any Shopify store and gives it back as clean JSON, CSV or Excel: titles, every variant with its price, compare-at (was) price, stock status and SKU, images, vendor, product type, tags, created / updated / published dates and the store's currency. Enter store domains such as colourpop.com or allbirds.com (one or thousands), and get their products in seconds. No Shopify account, no API key, no app install and no browser.

It works as a Shopify products API for stores you do not own. Every Shopify store publishes its catalog as public JSON (/products.json), and this Actor reads that feed page by page, handles pagination, redirects, headless storefronts and currency, and turns it into one tidy row per product (or per variant).

Typical use cases:

  • Competitor price monitoring: track prices, discounts (compare-at prices) and stock of rival Shopify stores every day with a schedule.
  • Product research and dropshipping: pull full catalogs of trending DTC brands, their best sellers and new arrivals, with images and descriptions.
  • Catalog and market analysis: compare assortments, vendors, product types and price ranges across hundreds of stores.
  • Feeds for AI agents and apps: a structured Shopify product scraper an agent can call with just a domain.

It reads only data the stores publish for every visitor. It does not log in and does not collect customer data (Shopify's public feeds contain none).

Why use Shopify Products Scraper?

  • The whole catalog, fast. 250 products per request; 1,445 products from 30 stores took 7 seconds on Apify in our test.
  • Works where other Shopify scrapers stop. Headless stores (a custom front end on www) and stores that redirect to regional domains are read through the store's own Shopify address, so they still return data.
  • Correct currency. The price currency comes from the store's shop record and every request pins it, so prices never switch to a visitor's local currency, and the currency is never guessed.
  • Filters that save money. In stock only, price range, product type, vendor, tags, title keywords and "updated since" are applied before rows are written; you pay only for rows you keep.
  • Honest results. Every row has a status. A site that is not a Shopify store, an empty collection or a deleted product gives one free not_found row that says why; you are billed only for ok rows.
  • Cheap. $0.90 per 1,000 products, Apify platform usage included.

What data can Shopify Products Scraper extract?

One row per product (default) with these fields:

FieldTypeDescription
titlestringProduct title
storeDomainstringStore domain as you entered it, e.g. allbirds.com
storeNamestringShop name from the store's public shop record
productIdintegerShopify product ID
handlestringProduct handle (URL slug)
urlstringProduct page on the store
vendorstringVendor / brand
productTypestringProduct type as the store names it
tagsarrayProduct tags
minPrice, maxPricenumberLowest and highest variant price
compareAtMinPrice, compareAtMaxPricenumberCompare-at ("was") prices, when the store sets them
currencystringISO currency of the prices, e.g. USD, AUD; empty if the store does not publish it
availablebooleanAt least one variant can be bought
onSalebooleanA variant's compare-at price is above its price
variantCountintegerNumber of variants
variantsarrayid, title, sku, price, compareAtPrice, available, option1-option3, grams per variant
images, imageCountarray, integerImage URLs (up to 50) and the total count
bodyTextstringDescription as plain text (HTML removed)
optionsarrayOption names and values, e.g. Size: S, M, L
createdAt, updatedAt, publishedAtstringDates with the store's time-zone offset
collectionstringCollection handle, when the row came from a collection
sourcestringproducts_feed, collection_feed or product_page
status, error, scrapedAtstringRow status, reason for non-ok rows, time of extraction

With One row per = Variant, each size/colour is its own row with variantId, variantTitle, sku, price, compareAtPrice, available, option1-option3, grams and image, plus the product columns. Rows from Product URLs also carry per-variant inventoryQuantity and barcode when the store publishes them.

Result status (tri-state output)

statusMeaningBilled?
okA product (or variant) row.Yes
not_foundNot a Shopify store, feed turned off, password-protected store, empty or unknown collection, deleted product, or nothing matched your filters. error says which.No
errorThe store could not be read after several retries (network error, rate limit). error says why.No

How to scrape Shopify stores

  1. Open the Actor in Apify Console and click Try for free.
  2. Enter one or more store domains in Store URLs or domains (colourpop.com, https://www.allbirds.com), collection URLs, or product URLs.
  3. Optionally pick Collection handles, One row per (product or variant) and Filters.
  4. Set Maximum results: the default 20 is a quick test; raise it to 10,000 or more to read whole catalogs.
  5. Click Start. The default run finishes in about 5-10 seconds. Download the results as JSON, CSV, Excel or HTML.

To automate it, call the Actor from the API tab (Node.js, Python, curl) or add a Schedule for daily price tracking.

How much does it cost to scrape Shopify?

This Actor uses pay-per-event pricing. Apify platform usage is included in these prices.

EventPrice
Actor start$0.005 per run
Result (status: ok row)$0.0009 per product (or per variant row)

Examples: the default run (20 products) costs $0.023. 1,000 products cost $0.905, 10,000 products $9.005. Rows with status not_found or error are never billed, and products your filters drop are never written or billed. You can cap spending with Maximum results, Maximum results per store and the run's Max total charge option.

Input

FieldTypeDefaultDescription
startUrlsarray of stringscolourpop.com, allbirds.comStore domains or URLs, collection URLs or product URLs
productUrlsarray of strings-Product pages to read individually
collectionsarray of strings-Collection handles to read in every store
outputModeproduct or variantproductOne row per product or per variant
maxItemsinteger20Stop after this many rows in total
maxItemsPerStoreinteger-Stop reading a store after this many rows
inStockOnlybooleanfalseOnly products (variants) that can be bought
minPrice, maxPriceinteger-Price range, in the store's currency
productTypes, vendors, tags, keywordsarray of strings-Keep matching products only
updatedSincestring-YYYY-MM-DD or relative such as 7 days
proxyConfigurationobjectoffOptional Apify Proxy (datacenter is enough)

Example: the in-stock hoodies under $80 of two stores, one row per variant:

{
"startUrls": ["gymshark.com", "https://www.allbirds.com"],
"keywords": ["hoodie"],
"inStockOnly": true,
"maxPrice": 80,
"outputMode": "variant",
"maxItems": 500
}

Output

Real rows from a run on Apify (arrays shortened):

[
{
"url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"status": "ok",
"scrapedAt": "2026-09-27T22:24:39.779Z",
"storeDomain": "allbirds.com",
"storeName": "Allbirds",
"productId": 7340901859408,
"handle": "womens-allbirds-flip-flop-dusty-pink",
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": ["allbirds::complete => true", "allbirds::edition => limited", "allbirds::gender => womens"],
"createdAt": "2026-03-27T14:03:50-07:00",
"updatedAt": "2026-09-27T15:24:39-07:00",
"publishedAt": "2026-09-25T16:58:13-07:00",
"currency": "USD",
"minPrice": 25,
"maxPrice": 25,
"compareAtMinPrice": 50,
"compareAtMaxPrice": 50,
"available": true,
"onSale": true,
"variantCount": 7,
"variants": [
{ "id": 42146889039952, "title": "5", "sku": "A12513W050", "price": 25, "compareAtPrice": 50, "available": false, "option1": "5", "option2": null, "option3": null, "grams": 455 }
],
"images": ["https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345"],
"imageCount": 5,
"bodyText": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather, these flip flops bring everyday comfort to sunny days...",
"options": [{ "name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"] }],
"collection": null,
"source": "products_feed"
},
{
"url": "https://princesspolly.com/",
"status": "not_found",
"error": "princesspolly.com is not a Shopify store: us.princesspolly.com/meta.json answered HTTP 404 (every Shopify store answers it). If the shop runs on another domain, enter that domain or its .myshopify.com address.",
"scrapedAt": "2026-09-27T22:24:38.641Z",
"storeDomain": "princesspolly.com"
}
]

Tips

  • Put many stores in one run: you pay the start fee once, and stores are read in parallel.
  • Use Maximum results per store so one huge catalog cannot use up the run.
  • For daily price tracking, schedule the run and use Updated since 1 day: the feed is newest-first, so the scan stops early.
  • If a store answers with rate-limit errors, run it again later or enable Apify Proxy (datacenter).

Limitations

  • Only public Shopify storefronts. Password-protected stores and stores that turned their public product feed off return a not_found row.
  • Stock counts (inventoryQuantity) are published by some stores only, and only on product-URL rows; feed rows carry available per variant, not quantities.
  • Prices are in the store's own currency (its main market). Regional price lists of other markets are not collected.
  • productType, vendor and tags are whatever the store enters; they differ between stores.
  • For product URLs on stores with a headless front end, available comes from the published stock data and can be empty; availabilityError then says why. Scanning the store or a collection always gives available.

FAQ

Do I need a Shopify account, app or API key?

No. The Actor reads the public JSON that every Shopify store serves to every visitor. It works for any store, not only your own.

How do I know if a site is a Shopify store?

Just enter it. A Shopify store returns products; any other site returns one free not_found row explaining that it is not a Shopify store (or that its feed is off). You can use this to check lists of domains.

Can I get the products of one collection only?

Yes. Enter the collection URL (https://colourpop.com/collections/best-sellers) or put the handle best-sellers in Collection handles.

How do I track the price of specific products?

Put their URLs in Product URLs and schedule the run. Use One row per = Variant to get one row per size or colour with its own price and stock.

Can I use this Actor from an AI agent or MCP client?

Yes. It runs with no input at all (it then reads two example stores), accepts plain domains, and every row explains itself with status and error.

Why did I get fewer rows than maxItems?

The stores have fewer matching products, a per-store limit stopped them, or your run hit its Max total charge. not_found rows say when a filter matched nothing.

This Actor extracts only product and store information that Shopify stores publish publicly for every visitor; it does not extract customer data, e-mail addresses, phone numbers or other personal data, and it does not log in or get around access controls. Personal data is protected by the GDPR in the European Union and by other regulations around the world; do not use the output to process personal data without a legitimate reason. You are responsible for complying with each store's terms of service and applicable law when using the extracted data.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Shopify Inc. or any store it reads. Shopify is a trademark of Shopify Inc. All trademarks belong to their respective owners.