Shopify Store Products and Prices from Store URLs avatar

Shopify Store Products and Prices from Store URLs

Pricing

$2.00 / 1,000 result rows

Go to Apify Store
Shopify Store Products and Prices from Store URLs

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

US Tech Automations

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

  1. Set Store addresses to one or more store URLs or bare domains, e.g. https://www.allbirds.com or allbirds.com.
  2. Optionally set Maximum products per store to cap how much of each store's catalogue this run reads. Default 250 (one page).
  3. Set Maximum rows to your spend cap. Every row bills, so this is also the most a single run can cost.
  4. Optionally paste Previous run's variant keys (the variant_id:price:available string from each row of an earlier run) to get an isNewOrChanged flag this run, so a daily schedule shows only price and stock moves.
  5. 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:

FieldWhat it holds
storeThe store address this row came from, normalised to https://host
store_nameStore's display name from /meta.json, or null if that feed was blocked
currencyStore's currency code from /meta.json, or null
product_id / variant_idShopify's own numeric ids
product_title / variant_titleAs published; variant_title is "Default Title" for a single-variant product
vendor / product_typeAs published
tagsList of tags as published
price / compare_at_priceAs published, as strings (e.g. "8.00"); compare_at_price is null when the store did not set one
on_saletrue when compare_at_price is set and higher than price
availableShopify's own in-stock flag for this variant
skuAs published, or null
image_urlThe 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_atThe variant's own timestamps
published_atThe product's publish timestamp
is_new_or_changedtrue 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_atWhen this run read the store, in UTC
errornull 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.