Shopify Products Scraper | Prices & Variants avatar

Shopify Products Scraper | Prices & Variants

Pricing

from $0.75 / 1,000 product extracteds

Go to Apify Store
Shopify Products Scraper | Prices & Variants

Shopify Products Scraper | Prices & Variants

Extract complete public Shopify product catalogs through products.json. Get titles, prices, compare-at prices, variants, SKUs, availability, images, tags, and vendors. Process one or many stores with no Shopify API key. Pay only $1 per 1,000 saved products—no start or per-store fees.

Pricing

from $0.75 / 1,000 product extracteds

Rating

0.0

(0)

Developer

DataScraperES

DataScraperES

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Share

Extract public Shopify product catalogs from one or many storefronts. Add the store URLs and receive one structured Dataset item per unique product, including prices, variants, SKUs, availability, options, images, timestamps, and merchant metadata when publicly available.

What this Actor does

Shopify Products Scraper reads the public catalog exposed by compatible Shopify storefronts and converts every product into a consistent, export-ready record. It handles pagination, duplicate products, multiple stores, retries, rate limits, currency detection, and partial store failures automatically.

The normalized output keeps product identity, content, pricing, availability, variants, images, source information, and warnings together in one row. An optional output mode also preserves the original public product object.

Use cases

  • Monitor public product catalogs, prices, compare-at prices, and availability.
  • Build ecommerce research, competitor, assortment, or market datasets.
  • Enrich product feeds with variants, SKUs, barcodes, images, and merchant tags.
  • Compare catalogs across multiple Shopify stores.
  • Create recurring snapshots for pricing and assortment analysis.

How to use

  1. Open the Actor in Apify Console.
  2. Add one or more public Shopify storefront URLs.
  3. Choose the per-store and run-wide product limits.
  4. Keep the default output options or disable data you do not need.
  5. Click Start and open the default Dataset when the run finishes.

Input

startUrls is required and accepts 1–100 public Shopify storefront homepages or localized storefront URLs. Equivalent URLs are normalized and deduplicated.

maxProductsPerStore defaults to 1,000 and limits each storefront. maxTotalProducts defaults to 10,000 and is a hard limit across the entire run. Both accept values from 1 to 100,000.

respectRobotsTxt, fetchStorefrontContext, includeVariants, includeImages, and includeDescriptionHtml default to true. outputMode defaults to normalized; use normalizedAndRaw only when the original public product object is also needed.

This is the exact input used for the output example below:

{
"startUrls": [
{
"url": "https://partakefoods.com"
}
],
"maxProductsPerStore": 1,
"maxTotalProducts": 1,
"respectRobotsTxt": true,
"fetchStorefrontContext": true,
"includeVariants": true,
"includeImages": true,
"includeDescriptionHtml": true,
"outputMode": "normalized"
}

Output

Each default Dataset item represents one unique product. productKey combines the normalized store domain and Shopify product ID. Prices are strings to preserve source precision, while unavailable fields remain null or empty. Variant and image fields are omitted only when their corresponding input options are disabled. rawProduct appears only in normalizedAndRaw mode.

This is the complete Dataset item from a real successful run:

{
"productKey": "partakefoods.com:7424044826722",
"shopifyProductId": "7424044826722",
"storeUrl": "https://partakefoods.com",
"storeDomain": "partakefoods.com",
"productUrl": "https://partakefoods.com/products/teeny-tiny-crunchy-chocolate-chip",
"title": "Teeny Tiny Crunchy Chocolate Chip",
"handle": "teeny-tiny-crunchy-chocolate-chip",
"vendor": "Partake Foods",
"productType": null,
"descriptionText": "Say hello to snack time’s new MVP. Partake Teeny Tiny Chocolate Chip Cookies deliver the same crunchy, chocolatey goodness you know and love — now in a Teeny Tiny bite ! Free of the Top 9 Allergens, gluten-free, non-GMO, and kosher, these cookies are safe for schools, playdates, and parties. Whether you’re filling lunchboxes, hosting movie night, or grabbing a handful just because, these crunchy little classics make every moment sweeter! Like all Partake treats, they’re gluten-free, non-GMO, and free of the top 9 allergens—so everyone can enjoy the moment, worry-free.",
"tags": [],
"available": false,
"currency": "USD",
"priceMin": "0.00",
"priceMax": "0.00",
"compareAtPriceMin": null,
"compareAtPriceMax": null,
"variantCountObserved": 1,
"variantsMayBeTruncated": false,
"createdAt": "2025-10-06T23:32:50+02:00",
"publishedAt": "2025-10-14T16:03:34+02:00",
"updatedAt": "2026-08-24T17:09:01+02:00",
"scrapedAt": "2026-08-24T17:09:02.512198+02:00",
"source": {
"endpoint": "https://partakefoods.com/products.json?limit=1&page=1",
"page": 1,
"contract": "public_products_json_observed"
},
"warnings": [],
"descriptionHtml": "<p><meta charset=\"utf-8\"><meta charset=\"utf-8\">Say hello to snack time’s new MVP. Partake Teeny Tiny Chocolate Chip Cookies deliver the same crunchy, chocolatey goodness you know and love — now <em data-end=\"366\" data-start=\"327\">in a Teeny Tiny bite</em>! Free of the Top 9 Allergens, gluten-free, non-GMO, and kosher, these cookies are safe for schools, playdates, and parties. Whether you’re filling lunchboxes, hosting movie night, or grabbing a handful just because, these crunchy little classics make every moment sweeter!</p>\n<p>Like all Partake treats, they’re gluten-free, non-GMO, and free of the top 9 allergens—so everyone can enjoy the moment, worry-free.</p>",
"variants": [
{
"id": "42220701089890",
"title": "Default Title",
"sku": null,
"barcode": null,
"available": false,
"price": "0.00",
"compareAtPrice": null,
"option1": "Default Title",
"option2": null,
"option3": null,
"grams": 0,
"weight": null,
"weightUnit": null,
"requiresShipping": true,
"taxable": true,
"inventoryManagement": null,
"featuredImage": null
}
],
"options": [
{
"name": "Title",
"position": 1,
"values": [
"Default Title"
]
}
],
"images": [
{
"id": "33333703114850",
"src": "https://cdn.shopify.com/s/files/1/0012/2296/7353/files/TTCC-PDP-FOP.png?v=1759786436",
"altText": null,
"width": 3000,
"height": 3000,
"position": 1,
"variantIds": []
},
{
"id": "33439384567906",
"src": "https://cdn.shopify.com/s/files/1/0012/2296/7353/files/teeny_tiny_6.png?v=1760556603",
"altText": null,
"width": 6912,
"height": 3456,
"position": 2,
"variantIds": []
},
{
"id": "33333703049314",
"src": "https://cdn.shopify.com/s/files/1/0012/2296/7353/files/TTCC-PDP-Square3.png?v=1760556603",
"altText": null,
"width": 2000,
"height": 2000,
"position": 3,
"variantIds": []
},
{
"id": "33439395283042",
"src": "https://cdn.shopify.com/s/files/1/0012/2296/7353/files/teeny_tiny_7.png?v=1760556084",
"altText": null,
"width": 2500,
"height": 2500,
"position": 4,
"variantIds": []
}
]
}

The Output tab also links to a SUMMARY record with run and per-store counts, plus a bounded ERRORS record for storefront failures. A run can be partial when it preserves products but reaches a selected limit or cannot complete every store.

Pricing

Each unique product successfully saved to the default Dataset is charged according to your Apify account tier.

Apify plan tierPrice per productPrice per 1,000 products
Free$0.001$1.00
Bronze$0.0009$0.90
Silver$0.0008$0.80
Gold$0.00075$0.75
Platinum$0.00075$0.75
Diamond$0.00075$0.75

There is no Actor start fee and no per-store fee; platform usage is included. Duplicate, invalid, unavailable, failed, or charge-limit-skipped products are free.

API and integrations

Run the Actor through Apify Console, API, CLI, tasks, schedules, or webhooks. Use the Dataset API for product records and the default Key-Value Store for SUMMARY and ERRORS. Dataset exports are available in JSON, CSV, Excel, XML, JSONL, and other Apify-supported formats.

For recurring monitoring, save the input as a Task and attach a Schedule. Use productKey, storeDomain, and shopifyProductId as stable identifiers when comparing snapshots or loading results into a database.

ActorBest for
Website Technology Lookup – CMS, Hosting & Tech Stack DataConfirming ecommerce technology and enriching storefront domains with their wider tech stack.
Similarweb Website Traffic & SEO Analytics ScraperAdding estimated traffic, rankings, audience geography, and competitor intelligence to store domains.
Favicon ExtractorAdding lightweight store icons to catalog directories, dashboards, and product research tools.

Limits and data quality

  • A run accepts up to 100 storefront URLs and up to 100,000 products per store or run.
  • Only products exposed through a compatible public Shopify catalog can be returned. Draft, private, hidden, password-protected, wholesale-only, unlisted, or market-restricted products may be absent.
  • Exact inventory quantities, costs, private metafields, customers, orders, reviews, ratings, analytics, and sales estimates are not public catalog fields and are not returned.
  • Availability means at least one observed variant is publicly purchasable; it is not an inventory count.
  • Public product records can expose at most 250 variants. Items at that boundary set variantsMayBeTruncated to true.
  • Headless or heavily customized stores may not expose a compatible catalog. Non-Shopify platforms are not supported.
  • Currency can depend on storefront market and visitor context. The Actor returns null rather than guessing when it cannot confirm a value.
  • Catalogs can change while a run is active, so a multi-page result is not a transactional snapshot.
  • When respectRobotsTxt is enabled, stores that disallow the catalog path are skipped.

Frequently asked questions

Does one Dataset item represent a product or a variant?

One item represents one product. When variants are enabled, all observed variants are nested in the variants array.

Why did the Actor return fewer products than my limit?

Limits are maximums, not guaranteed counts. The public catalog may be smaller, restricted, incompatible, contain duplicate or invalid records, or be interrupted by a spending limit. Review SUMMARY and ERRORS for the store outcome.

Why is currency null?

Currency detection is separate from product extraction. If the storefront does not expose a verifiable currency context, the Actor keeps the product and returns null.

Which output mode should I use?

Use normalized for smaller, consistent records. Choose normalizedAndRaw only when you also need the complete original public product object.

What happens when one store fails?

Stores run independently. Products already saved from other stores remain in the Dataset, and the failure is recorded in ERRORS and the run summary.

Responsible use

Use public catalog data only for purposes you are authorized to perform. Respect storefront terms, robots preferences, intellectual-property rights, privacy requirements, and applicable laws. Product images, descriptions, names, and trademarks remain subject to their owners' rights.

Support

Open the Actor's Issues tab and include the run ID, affected storefront URL, exact non-sensitive input, and expected versus actual behavior. Do not include credentials, private data, or confidential storefront information.