Shopify Store Products and Prices from Store URLs
Pricing
$2.00 / 1,000 result rows
Shopify Store Products and Prices from Store URLs
For e-commerce competitive-pricing analysts and agency prospectors: paste one or more Shopify store addresses and get every published product variant as one row, with price, compare-at price, sale flag, stock, tags, images and a changed-since-last-run flag.
Pricing
$2.00 / 1,000 result rows
Rating
0.0
(0)
Developer
US Tech Automations
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Shopify store scraper, Shopify products scraper, Shopify price monitor: paste one or more Shopify store addresses and get every published product variant as one row — price, compare-at price, stock, sale flag, tags, image, and a changed-since-last-run flag — read live from the store's own public catalogue feed.
Introduction
Every Shopify store publishes its full product catalogue at two public JSON
addresses any signed-out visitor's browser can read: /meta.json (store
name, currency, country) and /products.json (every product and variant).
This Actor reads those feeds live on every run, paging through
/products.json at 250 products per request, one request per second.
Nothing is stored between runs and nothing is invented if a store blocks
the request or turns out not to be running Shopify.
Tutorial
- Set Store addresses to one or more store URLs or bare domains, e.g.
https://www.allbirds.comorallbirds.com. - Optionally set Maximum products per store to cap how much of each store's catalogue this run reads. Default 250 (one page).
- Set Maximum rows to your spend cap. Every row bills, so this is also the most a single run can cost.
- Optionally paste Previous run's variant keys (the
variant_id:price:availablestring from each row of an earlier run) to get anisNewOrChangedflag this run, so a daily schedule shows only price and stock moves. - Click Start. Results land in the dataset.
Pricing
$0.002 per row. No start fee.
A run across two stores that returns 400 product-variant rows costs $0.80. A store that is blocked or turns out not to be Shopify still returns one row (an error row, so the run can be diagnosed), billed the same $0.002.
Maximum rows is the spend cap: the run cannot cost more than that number multiplied by $0.002, whatever the stores hold.
Input and output examples
Input:
{"storeUrls": ["https://www.allbirds.com", "https://www.deathwishcoffee.com"],"maxProductsPerStore": 3,"maxItems": 1000}
Output (one row, from a live run on 2026-09-21):
{"store": "https://www.deathwishcoffee.com","store_name": "Death Wish Coffee","currency": "USD","product_id": 7237656248375,"variant_id": 41524646871095,"product_title": "Death Grip Bottle Opener","variant_title": "Default Title","vendor": "BAMKO","product_type": "Accessories","tags": ["Accessories", "Gifting", "Merch"],"price": "8.00","compare_at_price": null,"on_sale": false,"available": true,"sku": "UWMDWC25","image_url": "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_March2025_Product_BottleOpener_Front2_Web.jpg?v=1741809353","product_url": "https://www.deathwishcoffee.com/products/death-grip-bottle-opener","created_at": "2025-03-06T09:27:55-05:00","updated_at": "2026-09-21T13:22:04-04:00","published_at": "2026-09-16T15:20:29-04:00","is_new_or_changed": null,"fetched_at": "2026-09-21T17:22:13Z","error": null}
Every field in a row:
| Field | What it holds |
|---|---|
store | The store address this row came from, normalised to https://host |
store_name | Store's display name from /meta.json, or null if that feed was blocked |
currency | Store's currency code from /meta.json, or null |
product_id / variant_id | Shopify's own numeric ids |
product_title / variant_title | As published; variant_title is "Default Title" for a single-variant product |
vendor / product_type | As published |
tags | List of tags as published |
price / compare_at_price | As published, as strings (e.g. "8.00"); compare_at_price is null when the store did not set one |
on_sale | true when compare_at_price is set and higher than price |
available | Shopify's own in-stock flag for this variant |
sku | As published, or null |
image_url | The variant's own image if the store set one, else the product image tagged for this variant, else the product's first image, else null |
product_url | {store}/products/{handle} |
created_at / updated_at | The variant's own timestamps |
published_at | The product's publish timestamp |
is_new_or_changed | true when this row's variant_id:price:available was not in Previous run's variant keys, false when it was, null when that input was left empty |
fetched_at | When this run read the store, in UTC |
error | null on a real product row; on a blocked or non-Shopify store, this holds the reason and every other field above is null |
Recommendations
Run daily with Previous run's variant keys set to last run's
variant_id:price:available values (export them from the dataset), then
filter this run's rows to isNewOrChanged: true to see only what actually
moved.
Limitations
One error row per blocked or non-Shopify store, never guessed rows. A
store that answers 401/403/404/429 on /products.json, that is not
running Shopify, or whose own robots.txt disallows the feed, produces
exactly one row with the reason in error and every catalogue field null.
/meta.json is optional. Some stores block or omit it while still
serving /products.json; when that happens store_name, currency, and
country are null on every row from that store, and the run still
proceeds.
Robots.txt is honoured per store, live, every run. If a store's own
robots.txt disallows /meta.json or /products.json for
User-agent: *, this tool does not request either path from that store.
Row grain is the product variant. A product with five size options
produces five rows that repeat the product-level fields with a different
variant_id, price, and available on each.
No customer or personal data. This tool never reads /admin, /cart,
/checkout, /account, or any customer page, and never outputs an email,
phone number, or home address.
FAQ
Where does the data come from?
Each store's own public /meta.json and /products.json, the same feeds
Shopify serves to a signed-out browser. Read live on every run, never from
a stored copy.
Does it need a login or an API key? No.
Why did I get fewer rows than Maximum rows? Either the stores held that many products and no more, or the run hit Maximum rows or Maximum products per store first.
What happens if a store blocks the request? That store produces one error row naming the reason, and the run moves on to the next store. Nothing is invented to fill the gap.
Is there support? Yes. Raise it through the Apify Store issues tab for this actor, or email operations@ustechautomations.com. Replies within 2 business days.
Refunds and support
Refunds: if a run returns only error rows for a valid input (every store you listed was blocked or is not Shopify), email operations@ustechautomations.com within 7 days and we refund that run. Support: same address, replies within 2 business days.