Aurelix

Tools › E-commerce

Shopify Product Export Scraper

Export a Shopify store's products with variants, SKUs, prices, barcodes and stock counts for $0.90 per 1,000 products, no login, with price changes flagged.

For retailers, brands and resellers tracking competitors. Barcodes (GTIN/UPC/EAN) and public stock counts cost nothing extra, and a change mode returns only new, repriced or updated products.

$0.90 per 1,000 products ($0.63 on paid Apify plans)

At a glance

What the Shopify Product Export Scraper does

Search by
Shopify store domains or any URL on the store
Options
Max products per store, barcodes and stock counts, collection tags, descriptions, new-or-changed only
Output
34 fields per product, variants nested; JSON, CSV, Excel, API
Automate
Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents

Who it is for

  • E-commerce brands monitoring competitors' prices and discounts
  • Dropshippers and resellers exporting a supplier's full catalogue
  • Price-comparison sites refreshing product data daily
  • Market researchers comparing product ranges, vendors and price points across stores

Output

What you get

  • Product id, title, handle, vendor, product type, tags, options
  • Variants: variant id, title, SKU, price, compare-at price, available, options, weight (grams), barcode, stock count where published, variant URL, previous price
  • Price min/max, highest compare-at price, on-sale and in-stock flags
  • inventory_total: units in stock across variants, where the store publishes stock counts
  • Images (URL, alt text, size), main image, product URL
  • Collection names per product
  • Created, updated and published dates in ISO 8601 UTC
  • Store name, domain and currency
  • change_type (new/changed/unchanged, based on prices, stock, SKUs, variants, title and tags), price_changed and previous lowest price versus the last run

Example

Input and output

Input

{
  "storeUrls": [
    "kith.com",
    "https://www.allbirds.com"
  ],
  "maxProductsPerStore": 500,
  "incremental": true
}

One output record

{
  "product_key": "allbirds.com:7366895894608",
  "product_id": 7366895894608,
  "store_domain": "allbirds.com",
  "store_name": "Allbirds",
  "store_url": "https://allbirds.com",
  "title": "Women's Wool Runner - Natural Grey (Light Grey Sole)",
  "handle": "womens-wool-runners-natural-grey",
  "vendor": "Allbirds",
  "product_type": "Shoes",
  "tags": [
    "allbirds::carbon-score => 7.07",
    "allbirds::cfId => color-womens-wool-runners",
    "allbirds::complete => true",
    "… 17 more"
  ],
  "options": [
    {
      "name": "Size",
      "values": [
        "5",
        "6",
        "7",
        "… 4 more"
      ]
    }
  ],
  "currency": "USD",
  "price_min": 49,
  "price_max": 49,
  "compare_at_price_max": 110,
  "on_sale": true,
  "available": true,
  "variants_count": 7,
  "variants": [
    {
      "variant_id": 42424464900176,
      "title": "5",
      "sku": "WR3WNCW050",
      "price": 49,
      "compare_at_price": 110,
      "available": true,
      "options": [
        "5"
      ],
      "grams": 698,
      "requires_shipping": true,
      "taxable": true,
      "url": "https://allbirds.com/products/womens-wool-runners-natural-grey?variant=42424464900176",
      "created_at": "2026-05-26T18:10:22Z",
      "updated_at": "2026-11-04T06:12:06Z",
      "previous_price": null,
      "barcode": null,
      "inventory_quantity": null
    },
    {
      "variant_id": 42424464932944,
      "title": "6",
      "sku": "WR3WNCW060",
      "price": 49,
      "compare_at_price": 110,
      "available": false,
      "options": [
        "6"
      ],
      "grams": 714,
      "requires_shipping": true,
      "taxable": true,
      "url": "https://allbirds.com/products/womens-wool-runners-natural-grey?variant=42424464932944",
      "created_at": "2026-05-26T18:10:22Z",
      "updated_at": "2026-11-04T06:12:06Z",
      "previous_price": null,
      "barcode": null,
      "inventory_quantity": null
    },
    {
      "variant_id": 42424464965712,
      "title": "7",
      "sku": "WR3WNCW070",
      "price": 49,
      "compare_at_price": 110,
      "available": false,
      "options": [
        "7"
      ],
      "grams": 737,
      "requires_shipping": true,
      "taxable": true,
      "url": "https://allbirds.com/products/womens-wool-runners-natural-grey?variant=42424464965712",
      "created_at": "2026-05-26T18:10:22Z",
      "updated_at": "2026-11-04T06:12:06Z",
      "previous_price": null,
      "barcode": null,
      "inventory_quantity": null
    },
    "… 4 more"
  ],
  "inventory_total": null,
  "image_url": "https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_LEFT_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_bc7cc3a6-43a0-4dde-8f9e-48a8d80499df.png?v=1779…",
  "images": [
    {
      "url": "https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_LEFT_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_bc7cc3a6-43a0-4dde-8f9e-48a8d80499df.png?v=1779…",
      "alt": null,
      "width": 1600,
      "height": 1600,
      "variant_ids": []
    },
    {
      "url": "https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_BACK_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_0e004c82-37f9-43cb-aea0-2adb950bf655.png?v=1779…",
      "alt": null,
      "width": 1600,
      "height": 1600,
      "variant_ids": []
    },
    {
      "url": "https://cdn.shopify.com/s/files/1/1104/4168/files/WR3WNCW_SHOE_TOP_GLOBAL_WOMENS_WOOL_RUNNER_GREY_LIGHT_GREY_76623920-15eb-4ed9-bf55-67d5b11066d4.png?v=17798…",
      "alt": null,
      "width": 1600,
      "height": 1600,
      "variant_ids": []
    },
    "… 1 more"
  ],
  "product_url": "https://allbirds.com/products/womens-wool-runners-natural-grey",
  "collections": [
    "All",
    "All Products",
    "All Shoes - Men's and Women's",
    "… 1 more"
  ],
  "description_text": "The Allbirds Wool Runner is the original wool sneaker that started it all. Called the world's most comfortable shoe, it's flexible, supportive,…",
  "created_at": "2026-05-26T18:10:21Z",
  "updated_at": "2026-11-04T06:12:06Z",
  "published_at": "2026-09-25T23:24:03Z",
  "change_type": "unchanged",
  "price_changed": false,
  "previous_price_min": null,
  "source_url": "https://allbirds.com/products.json",
  "scraped_at": "2026-11-04T06:24:01Z"
}

From a real run of this tool; long text and lists shortened here.

How to use it

Three steps

  1. Paste one or more Shopify store URLs into 'Shopify store URLs' (e.g. kith.com or https://www.allbirds.com).
  2. Optionally set 'Max products per store', turn on 'Barcodes and stock counts', turn on 'Only new or changed products' for a change feed, or switch collection tags or descriptions off.
  3. Click Start, then download JSON, CSV or Excel, or schedule it daily and send results to Google Sheets, Zapier, Make or n8n.

API

Call it from Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("aurelix/shopify-products-scraper").call(run_input={'storeUrls': ['kith.com', 'https://www.allbirds.com'],
 'maxProductsPerStore': 500,
 'incremental': True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

pip install apify-client. The same input works from the Apify console, a schedule, Make, n8n, Zapier or an AI agent through the Apify MCP server.

Pricing

Pay per result

Per 1,000 products, free plan$0.90
Per 1,000 products, paid plans$0.63
Start fee per run$0.001

Live prices from the Apify Store; no subscription and no platform usage billed on top. See the Store page.

Honest limits

What it does not do

  • Only Shopify stores that leave the public products.json feed on. Stores that disable it, password-protect it or block automated visitors are skipped.
  • At most 25,000 products per store per run: Shopify's public feed ends at page 100 of 250 products. A larger store returns its first 25,000 products, and the run status does not flag the cut.
  • Some stores' feeds include products the shop does not show, such as bundles or test items: in our checks one store returned 508 products where its sitemap listed 274.
  • Respects each store's robots.txt: a store that disallows products.json is skipped, and collections it disallows are left out of the collection tags.
  • Stock counts only where the store publishes them (many do not); otherwise an in-stock flag per variant.
  • Currency comes from the store's public metadata; stores that hide it return currency = null. Prices are the ones the store serves to the Actor's server. Stores that price by visitor country can show other visitors converted prices: in our checks, two stores showed a Canadian address prices converted at a fixed rate.
  • Collection tags cover the first 20 collections by default ('Max collections per store'); large stores can have over 1,000.
  • Some stores rate-limit busy addresses (HTTP 429). The Actor waits and retries; if a store keeps refusing, the products already read are kept and the run ends with a 'Partial' status naming the store.
  • Price-change flags compare with the last run on the same store only; the first run has nothing to compare with.
  • No SEO title or metafields: they are not in Shopify's public product JSON.

FAQ

Questions buyers ask

How much does the Shopify Product Export Scraper cost?

$0.90 per 1,000 products ($0.63 on paid Apify plans), billed through your Apify account; you pay only for results. Apify's free plan includes $5 of credit a month, enough for about 5,555 products.

How do I know if a store runs on Shopify?

Open https://<store>/products.json in a browser. If you see product data, this Actor can read it. Most Shopify stores leave it on; some large brands turn it off.

What happens with stores that block the feed?

They are skipped with a clear reason in the run status (not found, blocked, password-protected or rate-limited) and you pay nothing per product for them (only the small run start fee). Other stores in the same run are still read.

How does the price-change flag work?

The Actor remembers each product's variant prices per store. On the next run, any variant whose price moved gets previous_price set and the product gets price_changed = true. The memory is shared across your runs on that store unless you set a change-tracking name.

What does 'Only new or changed products' return on the first run?

Everything, because nothing has been seen yet. From the second run on, only products that are new, repriced, went in or out of stock, or had variants, title or tags changed. Routine inventory syncs that only bump the update time do not count.

Does it show stock quantities?

Yes, where the store publishes them: turn on 'Barcodes and stock counts' and each variant gets inventory_quantity (and the product inventory_total). Many stores hide quantities; then those fields stay empty and you still get the in-stock flag (available). We never guess quantities.

Does it return barcodes (GTIN/UPC/EAN)?

Yes, with 'Barcodes and stock counts' on: every variant's barcode as the store entered it. It costs nothing extra per product.

Is this legal?

It reads only public data any logged-out visitor can see: the product feed each Shopify store serves to every visitor. It goes at a polite pace, respects robots.txt, never logs in and never solves CAPTCHAs. It returns product fields (title, price, variants, images, collections, links); no customer or order data. Data is returned as shown publicly on the source; people can ask for removal by opening an issue on this Actor's Issues tab; if a store formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

Can I use it from an AI assistant?

Yes. The input is described for agents: give 'storeUrls' and optional limits. It works through Apify's MCP server and API.

Is there a limit on products or stores per run?

Shopify's public feed serves at most 100 pages of 250 products, so a run reads up to 25,000 products per store; a larger store returns its first 25,000. 'Max products per store' sets a lower cap. There is no fixed limit on the number of stores; the Actor reads 3 stores at a time.

What am I charged when a store returns nothing or only part of its catalogue?

You pay per product returned, plus the start fee once per run. A store that is blocked, not on Shopify or not reachable returns nothing and costs nothing per product. If a store stops answering midway, the products already read are kept and charged, and the run status starts with 'Partial' and names the store. With 'Only new or changed products' on, unchanged products are not returned and not charged.

How are duplicates handled?

Store URLs are reduced to their domain, so kith.com and https://kith.com/collections/sale in the same run read the store once. A product in several collections is one row with all its collection names. Use product_key (store domain plus product id) as the key when you merge runs.

How long does a run take?

Each request returns 250 products, with a short pause between pages. In our test runs a 352-product catalogue took 3.8 s and 852 products from two stores with collection names took 48.6 s. Collection names add requests per collection, and 'Barcodes and stock counts' adds one request per product (4 at a time).

How long does the change memory last?

It is kept per store and per change-tracking name. A product not seen for 90 days is forgotten and counts as new when it comes back. If the run's Max total charge stops output, products that were not returned are not remembered, so they come back on the next run.

Do I need a proxy?

Usually not: the feed is public and the Actor runs without one by default. Each request is retried up to 5 times with growing waits (it follows the store's Retry-After header, up to 30 s). If a store keeps answering HTTP 429, turn on Apify Proxy in the Proxy field.

What do price_min, on_sale, available and inventory_total mean?

price_min and price_max are the lowest and highest variant prices; compare_at_price_max is the highest compare-at (was) price. on_sale is true when any variant's compare-at price is above its price. available is true when any variant is in stock. inventory_total adds up the published stock counts, counting negative stock as 0.

Why is the currency empty?

The currency comes from the store's public meta.json, or from its cart file when meta.json has none. A store that hides both returns currency = null; prices are still filled in.

How do I export products to Google Sheets?

Download the run's results as CSV or Excel and open them in Google Sheets, or add Apify's Google Sheets integration to the run or a schedule so every run's results land in a sheet.

Related

Related tools

Try the Shopify Product Export Scraper

Open it on the Apify Store, paste the example input above and click Start. Results download as CSV, Excel or JSON.