Shopify Store Scraper: Products, Collections & Store Info avatar

Shopify Store Scraper: Products, Collections & Store Info

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Shopify Store Scraper: Products, Collections & Store Info

Shopify Store Scraper: Products, Collections & Store Info

Collect products from any public Shopify store: title, vendor, type, tags, every variant with price, compare-at price, SKU and availability, images and dates. Add collections, store details and public stock counts. Stores that fail are reported and not charged.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

Philip Kirkbride

Philip Kirkbride

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Turn any Shopify store into a clean product spreadsheet. Paste a store's domain and get every product with its title, vendor, product type, tags, description and dates, every variant with its price, compare-at price, SKU and availability, and every image. Add the store's collections and a store profile (name, currency, location, shipping countries, product and collection counts) with one switch each, and public stock counts where the store shows them.

Give it whole stores, single collections or single product links, as many as you like. Paging is automatic and every run has a per-store and a total cap. Stores that are not on Shopify, are password-protected or do not publish their catalogue are listed in the run summary with a clear reason and are not charged.

Use cases

  • Competitor price monitoring: re-run a competitor's catalogue on a schedule and compare prices, discounts and availability over time.
  • Product research: see what a brand sells, how it prices variants and what goes on sale.
  • Catalogue export: copy a store's products, variants and images into a spreadsheet, a database or another shop.
  • Stock watching: follow sold-out variants and public stock counts for products you care about.
  • Market mapping: profile many Shopify brands at once by currency, location, shipping countries and catalogue size.

Quick Start

{
"stores": ["https://www.allbirds.com", "https://colourpop.com"],
"maxProductsPerStore": 100,
"includeStoreInfo": true,
"includeCollections": false
}

A store domain collects the whole catalogue (up to your cap). A collection link such as https://kith.com/collections/mens-footwear collects only that collection, and a product link such as https://colourpop.com/products/magical-skies-shadow-palette-and-brush-set collects one product.

Input

InputTypeDefaultMeaning
storesarrayrequiredShopify store domains or links, one per line: a store, a collection link (/collections/...) or a product link (/products/...). Repeated links are read once.
maxProductsPerStoreinteger100Cap on product rows from each store, across all of its links, up to 25,000. Use 0 to collect only store details or collections.
maxItemsinteger1000Total cap on rows (products, collections and stores) for the whole run, up to 200,000.
includeStoreInfobooleantrueAdd one row per store with its name, currency, location, shipping countries and product and collection counts.
includeCollectionsbooleanfalseAdd one row per collection with its title, description, image and product count.
maxCollectionsPerStoreinteger250Cap on collection rows from each store.
includeInventorybooleanfalseAdd per-variant stock quantities where the store shows them. This reads one extra page per product, so runs take longer.

Example queries

  • {"stores": ["kith.com"], "maxProductsPerStore": 2000}: a large catalogue.
  • {"stores": ["https://kith.com/collections/mens-footwear"], "maxProductsPerStore": 500}: one collection only.
  • {"stores": ["colourpop.com", "allbirds.com", "gymshark.com"], "maxProductsPerStore": 0, "includeCollections": true}: store profiles and collections, no products.
  • {"stores": ["https://colourpop.com/products/magical-skies-shadow-palette-and-brush-set"], "includeInventory": true}: one product with stock counts.

What it returns

Every row has a recordType: product, collection or store.

Product rows

FieldMeaning
id, handle, url, titleProduct identity and its link on the store.
vendor, productType, tagsBrand, product type and the store's tags.
description, descriptionHtmlDescription as plain text and as the store's original HTML.
price, priceMax, currencyLowest and highest variant price, in the store's currency.
compareAtPrice, onSaleThe original price when a variant is marked down, and whether any variant is.
availableTrue when at least one variant can be bought.
totalInventorySum of public variant stock counts, when includeInventory is on and the store shows them.
variants, variantCountEach variant's id, title, sku, price, compareAtPrice, available, inventoryQuantity, options, weightGrams, requiresShipping, taxable and imageUrl.
optionsOption names and values, such as Size or Color.
images, imageUrlEvery image with its size and alt text, plus the main image.
collectionHandleThe collection the product came from, for collection links.
createdAt, updatedAt, publishedAtDates as published by the store.

Collection rows carry id, handle, url, title, description, productsCount, imageUrl, publishedAt and updatedAt.

Store rows carry storeName, url, description, myshopifyDomain, currency, country, province, city, shipsToCountries, productsCount and collectionsCount.

Every row also has storeDomain, storeName and scrapedAt (collection time, UTC). The run summary (OUTPUT) reports products, collections, stores, storesRequested, storesSucceeded, errors and the list at storeErrors, each with the link and a reason code such as NOT_SHOPIFY, STORE_LOCKED, CATALOGUE_NOT_PUBLIC, PRODUCT_NOT_FOUND or COLLECTION_NOT_FOUND.

Output example

{
"recordType": "product",
"storeDomain": "www.allbirds.com",
"storeName": "Allbirds",
"id": 7340901859408,
"handle": "womens-allbirds-flip-flop-dusty-pink",
"url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
"title": "Women's Allbirds Flip Flop - Dusty Pink",
"vendor": "Allbirds",
"productType": "Shoes",
"tags": [
"allbirds::gender => womens",
"allbirds::material => sugar",
"OOS DNS",
"shoprunner"
],
"description": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather, these flip flops bring everyday comfort to sunny days, beach walks, and everything in between. Just slip them on and go.",
"descriptionHtml": null,
"currency": "USD",
"price": 25.0,
"priceMax": 25.0,
"compareAtPrice": 50.0,
"onSale": true,
"available": true,
"totalInventory": null,
"variantCount": 7,
"variants": [
{
"id": 42146889105488,
"title": "7",
"sku": "A12513W070",
"price": 25.0,
"compareAtPrice": 50.0,
"available": false,
"inventoryQuantity": null,
"options": [
"7"
],
"weightGrams": 503,
"requiresShipping": true,
"taxable": true,
"imageUrl": null
},
{
"id": 42146889138256,
"title": "8",
"sku": "A12513W080",
"price": 25.0,
"compareAtPrice": 50.0,
"available": false,
"inventoryQuantity": null,
"options": [
"8"
],
"weightGrams": 516,
"requiresShipping": true,
"taxable": true,
"imageUrl": null
}
],
"options": [
{
"name": "Size",
"values": [
"5",
"6",
"7",
"8",
"9"
]
}
],
"images": [
{
"url": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345",
"alt": null,
"width": 4000,
"height": 4000
}
],
"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345",
"collectionHandle": null,
"createdAt": "2026-03-27T14:03:50-07:00",
"updatedAt": "2026-10-19T17:49:09-07:00",
"publishedAt": "2026-09-25T16:58:13-07:00",
"scrapedAt": "2026-10-20T00:55:12Z"
}
{
"recordType": "collection",
"storeDomain": "www.allbirds.com",
"storeName": "Allbirds",
"id": 270995030096,
"handle": "30-off-tree-runner-go-tree-gliders",
"url": "https://www.allbirds.com/collections/30-off-tree-runner-go-tree-gliders",
"title": "30% Off Tree Runner Go & Tree Gliders",
"description": null,
"productsCount": 107,
"imageUrl": null,
"publishedAt": "2024-09-07T20:37:09-07:00",
"updatedAt": "2026-10-19T04:02:25-07:00",
"scrapedAt": "2026-10-20T00:55:12Z"
}
{
"recordType": "store",
"storeDomain": "www.allbirds.com",
"storeName": "Allbirds",
"url": "https://www.allbirds.com",
"description": "The world’s most comfortable shoes, made with natural materials like merino wool, eucalyptus tree fiber, and sugar cane, Allbirds has created the comfiest shoes on the planet.",
"myshopifyDomain": "weareallbirds.myshopify.com",
"currency": "USD",
"country": "US",
"province": "California",
"city": "Beverly Hills",
"shipsToCountries": [
"US"
],
"productsCount": 692,
"collectionsCount": 1346,
"scrapedAt": "2026-10-20T00:55:12Z"
}

Price

$0.0005 per result delivered (one product, collection or store row), plus $0.005 per run start. The run-start event is charged per GB of memory; the default 512 MB run is one start event. The start is charged even if the run saves no results. Stores and links that fail are not charged. Platform usage is included in these prices.

Good to know

  • Works with stores built on Shopify's standard online store, which is most Shopify shops. Some large brands run their own custom storefront on top of Shopify and do not publish their catalogue; those are reported as CATALOGUE_NOT_PUBLIC and are not charged.
  • A store returns at most 25,000 products per run, across all of its links; products found twice are delivered once.
  • Prices are the store's own prices in its main currency, as a signed-out visitor sees them. Stores that sell in several countries may show other prices to local visitors.
  • Stock counts are shown only by stores that publish them; elsewhere inventoryQuantity stays empty and available still tells you whether a variant can be bought.
  • Password-protected stores (STORE_LOCKED) and sites that are not Shopify stores (NOT_SHOPIFY) are listed in the run summary. If no store at all returns data, the run fails with a clear message.
  • The scraper reads one store at a time at a gentle pace. A 1,000-product store usually takes well under a minute; with stock counts on, allow about half a second per product.