Shopify Products Scraper - $1.00/1k, Full Catalog
Pricing
$1.00 / 1,000 product returneds
Shopify Products Scraper - $1.00/1k, Full Catalog
Shopify's own ceiling on /products.json is 250 products a page, and it hands those to anyone, no key. This walks the pages: title, URL, vendor, product type, tags, min and max price, availability, every variant with SKU and price, all image URLs. $1.00 per 1,000 products, no run-start fee.
Pricing
$1.00 / 1,000 product returneds
Rating
5.0
(2)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
3 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), with no run-start fee. 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.