# Shopify Store Products Export

> Shopify products scraper: export prices, sale prices, stock, variants, SKUs and images from any store. Only-new mode. No login or API key.

URL: https://cliqtomedia.com/actors/shopify-products-scraper/

Category: E-commerce & prices · Status: coming soon · Apify profile: https://apify.com/cliqtomedia?fpr=cliqto

Add a store URL and get its public products in one table. Each row has prices, stock status, variants, SKUs, images and tags. You need no login.

## How to use it: 3 steps

1. **Follow us on Apify.** The tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `https://www.allbirds.com` in Shopify store URLs. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Export public products from any Shopify store to JSON, CSV or Excel. You get one row per product with prices, sale prices, stock, variants, SKUs, images, tags and dates. Add one store URL, such as `https://www.allbirds.com`, and click **Start**. There is no login and no API key.



### Good for

- Watch a competitor's prices, sales and stock.
- Copy a supplier's catalog with SKUs and images into your own system.
- Get a daily list of only the new products in a store.

### Not a good fit

- Stores that are not on Shopify, or that switched the public feed off. You get a status row, not products.
- Inventory numbers. Shopify's public feed only says if a variant is in stock (`available`). It does not give quantities.
- Private data: orders, customers, costs, admin-only fields and unpublished products.
- More than 25,000 products from one feed. This is a Shopify limit. Use collections for bigger catalogs.

## Price

Prices will be shown after release.

## Questions

### Do I need a Shopify login or API key?

No. It reads the public product feed. Password-protected stores are skipped.

### Is the stock number exact?

No. The public feed only says if a variant is in stock. Quantities are not public.

### Why are there no products in an only-new run?

Nothing new was published since the last run with the same stateKey.

### What if the store is not on Shopify?

You get a status row, not products.

### How fresh is the data?

Each row is read live from the store at `fetchedAt`.

## Data fields

- `recordType` (string): Row type: product, or store-status for a store that was not found, failed or stopped early.
- `status` (string): complete for product rows; not_found (no Shopify feed, collection missing, password-protected, empty) or error (blocked, rate limited, unavailable, stopped) for store-status rows.
- `store` (string): Store domain the data came from, e.g. www.allbirds.com.
- `storeName` (string): Store name from the store's public meta.json, when available.
- `storeUrl` (string): Store homepage URL.
- `collection` (string): Collection handle when the export was limited to a collection; null for the whole catalog.
- `productId` (integer): Shopify product ID.
- `handle` (string): Product handle (URL slug).
- `title` (string): Product title.
- `vendor` (string): Brand or vendor.
- `productType` (string): Product type set by the store.
- `tags` (array): Product tags.
- `description` (string): Product description as plain text (HTML removed, up to 5,000 characters).
- `price` (number): Lowest variant price in the store currency. null if the store hides it; never 0 for a missing price.
- `priceMax` (number): Highest variant price.
- `compareAtPrice` (number): Compare-at (original) price of the cheapest variant; null when there is none.
- `onSale` (boolean): true when compareAtPrice is above price.
- `currency` (string): Store currency code from meta.json, e.g. USD; null when the store does not publish it.
- `available` (boolean): true if at least one variant is in stock.
- `variantsCount` (integer): Number of variants.
- `availableVariantsCount` (integer): Number of variants in stock.
- `options` (array): Product options with their values, e.g. Size: 8, 9, 10.
- `variants` (array): Variants with variantId, title, sku, price, compareAtPrice, available, option1-3, grams, requiresShipping, imageUrl and position; null when Include variants is off.
- `imageUrl` (string): Main product image URL.
- `images` (array): All product image URLs.
- `createdAt` (string): When the product was created (UTC ISO 8601).
- `updatedAt` (string): When the product was last updated (UTC ISO 8601).
- `publishedAt` (string): When the product was published (UTC ISO 8601).
- `url` (string): Product page URL.
- `isNew` (boolean): Only new products mode: true for a product not seen in earlier runs; null on the first run and when the mode is off.
- `statusCode` (string): Store-status rows: NOT_SHOPIFY, COLLECTION_NOT_FOUND, PASSWORD_PROTECTED, NO_PRODUCTS, BLOCKED, RATE_LIMITED, SOURCE_UNAVAILABLE, CHARGE_LIMIT, INVALID_URL and others.
- `statusMessage` (string): Store-status rows: plain-English reason.
- `input` (string): Store-status rows: your input value as given.
- `productsFound` (integer): Store-status rows: product rows saved for this store before the stop.
- `source` (string): Data source: shopify-products-json (the store's public storefront feed).
- `sourceUrl` (string): Feed page URL the row came from.
- `fetchedAt` (string): When the row was fetched (UTC ISO 8601).

## Input settings

- `storeUrls` (array, required): Up to 100 Shopify stores as URLs or domains, e.g. https://www.allbirds.com or kith.com. A collection URL such as https://kith.com/collections/mens exports only that collection. Headless stores are tried on their *.myshopify.com domain. Each store you check is billed once. Password-protected stores are skipped, never unlocked.
- `collection` (string): Collection handle applied to every store without a collection in its URL, e.g. mens or sale. Leave empty to export the whole catalog.
- `maxProducts` (integer): Stop each store after this many product rows. Shopify serves at most 25,000 products per feed (use collections for bigger catalogs). Each product row is billed.
- `onlyNew` (boolean): Return only products not delivered in earlier runs with the same state key. The first run returns the newest products (up to the max) and treats all older ones as already seen; later runs return only products published since. State lives in your account's key-value store shopify-products-scraper-state.
- `includeVariants` (boolean): Add the variants list to each product row: variant ID, title, SKU, price, compare-at price, availability, options and weight. Turn off for smaller rows; price ranges and stock counts stay.
- `stateKey` (string): Name of the onlyNew memory, so different schedules or task setups do not share it. Letters, digits, - and _ (up to 40). Default: default.

## Step by step on Apify

1. Open the Input tab.
2. In Store URLs (`storeUrls`), add a store, for example `https://www.allbirds.com`.
3. Keep the prefilled Max products per store (`maxProducts`) of 20 for a first test. The default for runs without this field is 1,000.
4. Click Start.
5. Open the Products view in the Output tab. Check `title`, `price` and `available`. Rows with `recordType: product` are products.

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Competitor price and sale watch | `storeUrls`, schedule | Product row | `price`, `compareAtPrice`, `onSale`, `available` | Dataset export or API to a sheet |
| Supplier catalog import | `storeUrls`, `includeVariants: true` | Product row with variants | `variants[].sku`, `variants[].price`, `images`, `description` | JSON/CSV import into your store or PIM |
| New product alerts | `storeUrls`, `onlyNew: true`, schedule | New product rows | `title`, `url`, `publishedAt`, `isNew` | Webhook or integration on run finish |
| Collection research | Collection URL or `collection` | Product row | `productType`, `vendor`, `tags`, `price` | Dataset export |

## Tips

- Use only-new mode on a daily schedule to get new products only.
- Pick one collection when you need only part of a big store.
- Use collections for stores with more than 25,000 products.

## Limits



- 25,000 products per feed. Shopify does not serve more from one feed. For bigger stores, run collections one by one.
- Time. A big store gives about 120 products per second: 1,000 products took about 5 seconds, 18,847 products took 154 seconds. One store up to the 25,000 limit fits in the default 300-second timeout. For several big stores in one run, raise the timeout in Run options or split the stores.
- Currency. Prices are in the store's base currency (`currency`), whatever country the run comes from. If the store answers in another market's prices, `currency` is `null` and the run summary has a warning.
- No proxy needed. The feed is public. The Actor waits when a store asks it to slow down (HTTP 429 or 503).
- Order. Rows come newest first by publish date, as the store's feed gives them.
- Partial results. If a store fails after some pages, the rows already saved stay in the Dataset. The store also gets a status row with `status: error` and `productsFound`. The run summary lists every store with its result.

## Sample result

```json
{
  "recordType": "product",
  "status": "complete",
  "store": "www.allbirds.com",
  "storeName": "Allbirds",
  "collection": null,
  "productId": 7340901859408,
  "handle": "womens-allbirds-flip-flop-dusty-pink",
  "title": "Women's Allbirds Flip Flop - Dusty Pink",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "price": 25,
  "priceMax": 25,
  "compareAtPrice": 50,
  "onSale": true,
  "currency": "USD",
  "available": true,
  "variantsCount": 7,
  "availableVariantsCount": 1,
  "options": [{ "name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"] }],
  "variants": [
    {
      "variantId": 42146889039952,
      "title": "5",
      "sku": "A12513W050",
      "price": 25,
      "compareAtPrice": 50,
      "available": false,
      "option1": "5",
      "option2": null,
      "option3": null,
      "grams": 455,
      "requiresShipping": true,
      "imageUrl": null,
      "position": 1
    }
  ],
  "url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
  "createdAt": "2026-03-27T21:03:50.000Z",
  "updatedAt": "2026-10-17T08:09:02.000Z",
  "publishedAt": "2026-09-25T23:58:13.000Z",
  "isNew": null,
  "source": "shopify-products-json",
  "fetchedAt": "2026-10-17T08:12:27.141Z"
}
```

## Similar tools

- [AliExpress Scraper: Products, Prices & Reviews, No Login](https://cliqtomedia.com/actors/aliexpress-scraper/)
- [Coles, Woolworths & Aldi Price Scraper - No Login](https://cliqtomedia.com/actors/au-supermarket-prices/)
- [Idealo Price Scraper: All Shop Offers, 6 Countries, No Login](https://cliqtomedia.com/actors/idealo-price-scraper/)
- [Naver Shopping Scraper: Korea Products & Prices](https://cliqtomedia.com/actors/naver-shopping-scraper/)
- [Trendyol Scraper: Products, Prices & Reviews (No login)](https://cliqtomedia.com/actors/trendyol-scraper/)
- [eBay Sold Listings Scraper - Sold Prices & Dates](https://cliqtomedia.com/actors/ebay-sold-listings/)
