Shopify Scraper: Products, Prices, Stock | $0.50 per 1,000 avatar

Shopify Scraper: Products, Prices, Stock | $0.50 per 1,000

Pricing

from $0.35 / 1,000 shopify product extracteds

Go to Apify Store
Shopify Scraper: Products, Prices, Stock | $0.50 per 1,000

Shopify Scraper: Products, Prices, Stock | $0.50 per 1,000

Scrape products from any Shopify store: prices, compare-at price and discount, stock per variant, SKU, barcode, options, images, tags and the store's currency. Give store, collection or product links; one row per product or per variant, with keyword, stock and sale filters.

Pricing

from $0.35 / 1,000 shopify product extracteds

Rating

0.0

(0)

Developer

vøiddo

vøiddo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Share

Shopify Store Products Scraper: Variants, SKU, Prices

Pull the public product catalog of any Shopify store: every product or one collection, with prices, compare-at prices and the discount in percent, stock per variant, SKUs, barcodes, options, images, tags, vendor and product type, in the store's own currency. Give store domains, collection links or product links. No login, no API key, no browser: the actor reads the product feeds every Shopify store publishes.

What you get

One row per product (default), or one row per variant (SKU):

{
"storeDomain": "www.tentree.com",
"storeName": "Tentree",
"currency": "USD",
"title": "Retro Juniper T-Shirt",
"url": "https://www.tentree.com/products/retro-juniper-classic-t-shirt-1",
"vendor": "tentree",
"productType": "Mens",
"minPrice": 18.0,
"maxPrice": 18.0,
"compareAtPriceMax": 45.0,
"discountPercent": 60,
"anyOnSale": true,
"available": true,
"variantsInStock": 2,
"variantsTotal": 5,
"skus": ["TCM2508-0451-S", "TCM2508-0451-M", "..."],
"options": [{"name": "Color", "values": ["METEORITE BLACK HEATHER"]},
{"name": "Size", "values": ["S", "M", "L", "XL", "XXL"]}],
"variants": [{"variantId": 41607156007098, "title": "METEORITE BLACK HEATHER / S",
"sku": "TCM2508-0451-S", "price": "18.00", "compareAtPrice": "45.00",
"discountPercent": 60, "available": true, "grams": 400, "...": "..."}],
"images": ["https://cdn.shopify.com/s/files/1/2341/3995/files/TCM2508-0451-meteorite-black-heather-regular-fit-crew-neck-t-shirt_2.jpg?v=1753496074"],
"description": "Our classic Juniper treeline graphic gets a retro update. This tee is made from a thoughtful blend of organic cotton, recycled polyester, and TENCEL™.",
"collection": "mens",
"tags": ["25-birthday-20off", "25-birthday-sale", "..."],
"publishedAt": "2023-06-30T22:03:52-07:00",
"updatedAt": "2026-10-23T10:08:52-07:00"
}

Every product row also carries productId, handle, storeCountry, createdAt, imageCount, firstImageUrl and variantCount. A variant row (rowMode: per_variant) has the variant's own price, compareAtPrice, discountPercent, onSale, available, sku, barcode, grams, imageUrl and variantUrl (the product page with that variant selected), next to the product's title, vendor, type, tags and link.

The run's OUTPUT record holds one summary per store: products read and kept, the top 10 vendors, how many products are in stock and on sale, the collection list, and with detectStack the apps the store runs.

How to use

FieldDefaultWhat it does
storesnoneStore domains (gymshark.com), store links, collection links (https://kith.com/collections/footwear) or product links (https://kith.com/products/handle).
maxProductsPerStore5000Products kept from each store, collection or product link, after the filters (up to 37,500).
rowModeper_productper_product (variants nested) or per_variant (one row per SKU).
keywordsnoneKeep products whose title, type, vendor or tags contain one of these words.
onlyAvailablefalseKeep what can be bought now.
onlyOnSalefalseKeep what is priced under its compare-at price.
includeDescriptiontrueThe description as plain text, up to 5,000 characters.
includeCollectionstrueThe store's collections in the store summary.
includeBodyHtmlfalseThe description HTML exactly as published (bodyHtml).
detectStackfalseInstalled apps and tech stack in the store summary, no extra charge.

Example: the sale items of one collection, one row per size and colour:

{"stores": ["https://www.tentree.com/collections/mens"], "onlyOnSale": true, "rowMode": "per_variant"}

Schedule it daily to follow a competitor's prices, new arrivals and sales: each run is a dated snapshot.

Pricing

Pay per event. Price per 1,000 events:

EventBase priceBronzeSilverGold
Shopify product extracted$0.50$0.45$0.40$0.35

Bronze, Silver and Gold are the discounts Apify gives users of its paid plans. The Pricing tab always shows the current prices.

Buyer

  • Ecommerce and DTC brands tracking competitors' prices, discounts, new products and stock every day.
  • Dropshipping and product research teams surveying niches, vendors and price points across many stores.
  • Price comparison and affiliate sites refreshing catalogs with prices, images, barcodes and stock.
  • Agencies and analysts sizing a store: catalog size, vendor mix, sale depth and installed apps.
  • Developers moving a catalog to another platform, with options, variants, images and descriptions.

Notes and limits

  • Shopify stores only. A domain without a Shopify product feed is skipped with the reason in OUTPUT and in the run's status message, at no charge.
  • You pay per product kept, also in per_variant mode, and never past the spending limit you set for the run: the actor stops there.
  • Prices are in the store's currency (currency), as the store shows them to a visitor from its home country. discountPercent is the saving against the compare-at price; on a product row it is the largest of its variants.
  • Stock is in stock or not (available); Shopify does not publish counts.
  • Barcodes (GTIN, UPC, EAN) come with product links; store and collection feeds do not carry them.
  • Respectful by design. The actor reads each store's robots.txt first, skips what it closes (and stores that close their content to machine learning agents), sends its own client name, and makes one request at a time, half a second apart, waiting out a "slow down" answer.
  • No personal data. Catalog data only; e-mail addresses and phone numbers in descriptions are removed.
  • Not affiliated with Shopify.

Run it through the API

Python, with the apify-client package:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("v0iddo/shopify-store-intelligence").call(run_input={"stores": ["gymshark.com", "allbirds.com", "kith.com"], "maxProductsPerStore": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript, with the apify-client package:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('v0iddo/shopify-store-intelligence').call({"stores": ["gymshark.com", "allbirds.com", "kith.com"], "maxProductsPerStore": 20});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

One HTTP call that waits for the run and returns the rows (for runs that finish within 5 minutes):

curl -X POST "https://api.apify.com/v2/acts/v0iddo~shopify-store-intelligence/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"stores": ["gymshark.com", "allbirds.com", "kith.com"], "maxProductsPerStore": 20}'

Use it from an agent (MCP)

Claude, Cursor, VS Code and other MCP clients can call this actor as a tool through the Apify MCP server. Add it to the client's MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=v0iddo/shopify-store-intelligence",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}

FAQ

Do I need an account, cookies or an API key?

No. The actor reads public data without logging in. You only need an Apify account to start it.

How many results can one run return?

Set Max products per store (up to 37,500) to the number you need. Large jobs can also be split into several runs or scheduled.

How am I charged?

Pay per event, at the prices on the Pricing tab for your Apify plan (the Pricing section of this page lists them). The platform usage of the run is included in those prices, and your spending limit for a run is always respected.

Why did my run return no results?

The status message and the log of the run say why: usually nothing matched the input, or the source did not answer for a moment. Check the input against the example above and run it again.

Can I run it on a schedule?

Yes. Save your input as a task and add a schedule in the Apify Console (daily, hourly or with a cron expression). Each run gets its own dataset, so you keep a history.

Which formats can I export?

JSON, CSV, Excel, XML, HTML table and RSS from the Output tab or the API. Integrations send the rows to Google Sheets, Slack, Make, Zapier, n8n or a webhook.

Is collecting this data allowed?

The actor collects data that the source publishes openly, without a login. Public data can still be personal data under laws such as the GDPR, and sources have their own terms: make sure your use of the data follows the rules that apply to you.

What happens when the source changes?

An automated test runs the actor every day on the example input and checks the rows, not only that the run finished. When a check fails, the actor is repaired and rebuilt; the build history on this page shows each update.

Something is missing or wrong. Where do I report it?

Open an issue on the Issues tab of this actor with the run link. Requests for a new field are welcome too.

Source

The public storefront feeds of each Shopify store:

  • GET /products.json?limit=250&page=N: the store's products.
  • GET /collections/<handle>/products.json: the products of one collection.
  • GET /products/<handle>.js: one product, with barcodes.
  • GET /meta.json: the store's name, country and currency.
  • GET /collections.json: the collection list.