Shopify Products Scraper - $1.00/1k, Full Catalog
Pricing
$1.00 / 1,000 product returneds
Shopify Products Scraper - $1.00/1k, Full Catalog
Scrape the full catalog of any Shopify store. Shopify gives 250 products per page to anyone, with no key. This walks every page. Rows have the title, URL, vendor, type, tags, lowest and highest price and stock status. Each variant has its SKU, price and image URLs. $1.00 per 1,000 products.
Pricing
$1.00 / 1,000 product returneds
Rating
5.0
(2)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Shopify Products Scraper
Shopify's own ceiling on /products.json is 250 products a page, and it hands those 250 to anyone who asks. That endpoint, and that ceiling, are the whole trick here.
This pages through it, 250 products at a time, and flattens the result into rows you can drop straight into a sheet: one row per product, with every variant and image. The endpoint is open, so there's no key to request and no anti-bot standing in front of it.
What you get per product
| Field | Notes |
|---|---|
store | The origin the row came from. |
productId, handle, url | Shopify's id, the slug, and the canonical /products/<handle> link. |
title, vendor, productType | As the store set them. |
tags | Array. Many stores use these for internal metadata, so expect entries like allbirds::gender => mens alongside real tags. |
description | body_html stripped to plain text. |
createdAt, publishedAt | ISO timestamps. |
priceMin, priceMax | Across the product's variants. |
available | true if any variant is in stock. |
variantCount, variants | Each variant carries title, sku, price, compareAtPrice and available. |
images | Array of image URLs. |
A real variant, from an Allbirds row:
{ "title": "8", "sku": "A11718M080", "price": 91, "compareAtPrice": 130, "available": false }
Input
{"storeUrls": ["https://www.gymshark.com", "allbirds.com"],"maxItems": 500}
| Field | Default | Notes |
|---|---|---|
storeUrls | — | A bare domain, a full URL, or any page on the store — all get normalised to the origin. |
maxItems | 1000 | Products per store. |
proxyConfiguration | off | Optional. The endpoint is public with no anti-bot, so leave it off unless a huge sweep starts hitting IP rate limits. |
notionConnector / notionParentId | — | Optional delivery into Notion via an Apify MCP connector. |
If a store blocks the www host but serves on the apex (or the reverse), both are tried before giving up.
Limits worth knowing
- Published products only. Drafts and unpublished products aren't in
/products.jsonat all, so nothing here can reach them. - No stock numbers. Shopify keeps
inventory_quantityout of the public feed. You get the booleanavailableper variant, and that's the most anyone gets from this endpoint. - Some stores disable or password-protect the endpoint. Those come back as a
NOT_SHOPIFYdiagnostic row rather than failing the run. - 250 per page is Shopify's limit, handled for you.
- Fields mirror the store's own data, so
title,handle,vendor,productTypeand the price fields can benullwhen the store left them empty.tags,variantsandimagesare always arrays, sometimes empty.
Billing
$1.00 per 1,000 products ($0.001 each). Flat on every plan.
One charge per product row with ok: true. Diagnostic rows — NOT_SHOPIFY, NO_RESULTS, BAD_INPUT, network errors — are ok: false and cost nothing. So if you feed it a list of domains and half turn out not to be Shopify, you pay for the half that are.