Shopify Products Scraper

A whole storefront,
variant by variant.

Give it a Shopify store link - the domain, or a single collection - and get the catalogue back as rows: the product id, title, handle, description, vendor, type, tags, price, sku, availability and the variant itself, plus timestamps and the store's own variant, image and option data. Twenty-two columns, read from the store's public products feed.

one-time 500 free rows$0.002 per row after22 columnsCSV · XLSX · JSON
How it works

A store link in,
its catalogue out.

The input is the shop, not the product - you name the storefronts or collections you want and the job reads what each one publishes.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the Shopify Products Scraper.
  3. STEP 3Paste links to Shopify websites, one per line - a store domain or a collection URL. Or upload a CSV, XLSX, TXT or Parquet file.
  4. STEP 4Set a limit per query, or set it to zero to take everything.
  5. STEP 5Choose your output format.
  6. STEP 6Click Get Data.

One row per variant, each tagged with the query it came from - so a run across several stores still reconciles back to your input list.

Why teams use it

One row is
one variant.

Every size and colour gets its own row

This is the thing to know before you count anything. A product with seventeen size and colour combinations produces seventeen rows: the id, title, handle and description repeat, while sku and variant change. Rows are variants - treat them as products and you will overcount a catalogue several times over.

The store's own product model, intact

Because the rows are read from the store's public products feed rather than scraped off a page, the export keeps Shopify's own shape: real timestamps, the handle, the vendor and product type, and the full variants, images and options structures carried through as JSON rather than flattened away.

Dates you can actually sort on

published_at, created_at and updated_at arrive as ISO 8601 timestamps with a UTC offset, which is unusual enough among catalogue exports to be worth saying - no parsing a display format, and a straight sort tells you what a shop added or touched most recently.

What you get back

Twenty-two columns,
one row per variant.

Each row is one buyable variant as the store publishes it: what the product is, what this particular size or colour costs, whether it is available, and the structured data Shopify keeps behind it.

The column list below is the header row of real run exports and the platform's own published list, which agree exactly. Read the note under it before you write a parser - three of these columns hold JSON rather than a plain value, and the row you are looking at is a variant rather than a product.

Data dictionary

Twenty-two columns,
in export order.

The export's header row, in order, confirmed against the platform's published column list. Where a value shape has actually been observed it is described; where it has not, the entry says what the field is for and stops.

query
The store or collection link you submitted, repeated on every row that came from it - so a run across several shops still reconciles against your input list.
id
The store’s product id. It is product-level, so it repeats across every variant of the same product - which makes it the column to group on when you want products rather than rows.
title
The product title. Product-level, and therefore repeated across that product’s variants.
handle
The product’s URL slug - the last part of its product page address, and a stable key that survives a title being reworded.
body_html
The product description as the store publishes it, markup and all.
published_at
When the product was published to the storefront, as an ISO 8601 timestamp with a UTC offset.
created_at
When the product record was created, in the same ISO 8601 form.
updated_at
When it was last changed, in the same ISO 8601 form. The column to sort on when you want to know what a shop has been touching.
vendor
The vendor the store files the product under - often the shop’s own brand rather than a third party.
product_type
The product type as the store classifies it.
tags
The product’s tags, as one comma-separated string rather than as a list.
variants
The full variant structure for the product, carried through as JSON in a single cell. Parse it if you need the other variants; the row you are on is already one of them.
images
The product’s image records, likewise carried through as JSON in one cell.
options
The option definitions - what the store calls its size, colour or material axes and the values each one allows - again as JSON.
price
The price of this variant, as text with two decimals and no currency symbol. Cast it before you compare or total.
compare_at_price
The was-price, where the store sets one. Its presence is what marks a variant as being on offer.
currency
The currency the price is quoted in.
sku
The store’s stock code for this exact variant. It is the closest thing the export has to a per-row key.
available
Whether this variant can be bought, as the lowercase word yes or no.
variant
The variant itself, as the store labels it - the option values joined together, like a colour and a size.
url
A link to the product page. Product-level, so it repeats across the product’s variants.
image
A link to the product image, and the last column in the file.

Two things to know before you write code against this. First, a row is a variant, not a product: id, title, handle, body_html, url and image repeat down the file while sku and variant change, so group on id when you want products and count rows only when you want variants. Second, variants, images and options each hold JSON inside a single cell - a spreadsheet will show them as a long string, and your parser needs to decode them rather than split on commas. Everything else is plain text, including the price, which carries no currency symbol.

Run controls

Set on the job,
not in the spreadsheet.

A list of store links and a limit. The only real constraint is that the site has to be built on Shopify - this reads the storefront's own public product feed.

Store domain Collection URL One per line Limit per query Zero for everything Must be a Shopify site CSV upload XLSX upload TXT upload Parquet upload
Common workflows

Three jobs this
runs more than any other.

A few examples of how teams use storefront catalogue data to answer a question they actually have.

Competitive

See what is actually in stock

Because every variant is its own row with its own availability, you can read which sizes or colours a shop has sold through rather than just which products it lists. That is a far better signal about what is selling than a product page ever gives you.

Merchandising
Pricing

Find everything on offer at once

Filter to rows where a was-price is set and you have the shop's entire discount picture in one pass - which lines, which variants, and how deep. Re-run it weekly and the promotional rhythm of a competitor becomes obvious.

Pricing
Research

Watch what a shop has been touching

Sort by the updated timestamp and the recent activity surfaces itself: new launches, reworked descriptions, quiet price changes. The created and published dates alongside it separate genuinely new products from old ones being refreshed.

Strategy
Pricing

Pay only for the rows
you actually pull.

No subscription, no minimum, no recurring bill. Your first 500 rows are on us - after that, pay-as-you-go at the same flat rate as every other scraper here.

Free tier

500 free rows - $0

Every new account, one-time. No credit card required. Per-query limits, file upload and every export format included.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

Roughly $2 per 1,000 variants. Worth remembering that a single product can be a dozen rows - the pre-flight estimator shows the row count and credit cost before a run starts.

Most popular
Volume

Custom · high volume

Volume pricing, dedicated workers and an SLA for continuous monitoring or very large catalogue pulls. Tell us your numbers and we will quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

The storefront,
and what runs on it.

The legal bit

Is it legal to scrape
a Shopify store?

Short answer: yes for the public catalogue - and this export contains no customer, no order and no inventory data.

Every field here comes from the product feed a Shopify storefront publishes for anyone to read - the same data that populates the shop's own pages and its listings elsewhere. Titles, descriptions, prices, variants and images are public by design. Collecting publicly published catalogue data is long-established practice, and nothing here touches a login, a cart, a checkout or a merchant admin.

There is no personal data in this output at all - it is a product table. No customer names, no orders, no stock quantities, because none of that is in the public feed. The availability column says whether a variant can be bought, which is not the same as how many are left, and this export has no way of knowing the latter.

Shopify's terms and each merchant's own terms may restrict automated access, so this is a terms question as well as a legal one - if you have a relationship with the shop, check it. We run no third-party trackers on the data layer, and your exports auto-delete after 30 days.

livescraper.app · principles
Public product feed only
No logins, no merchant admin
No orders or customer data
No stock quantities
Exports auto-delete (30 days)
Check the merchant's own terms before scaling.
Common questions

Things people
ask before signing up.

The questions we hear most. Anything else? Talk to us - humans, not bots, write the answers.

How do I scrape a Shopify store?+
Using the Shopify Products Scraper:
  1. Sign in to the platform.
  2. Open the Shopify Products Scraper.
  3. Paste links to Shopify websites, one per line - a store domain or a collection URL. Or upload a CSV, XLSX, TXT or Parquet file.
  4. Set a limit per query, or set it to zero to take everything.
  5. Choose your output format.
  6. Click Get Data.
Is a row a product or a variant?+
A variant. A product with seventeen size and colour combinations produces seventeen rows, with the id, title, handle and description repeating while the sku and variant change. Group on the id when you want products, and count rows only when you actually want variants.
Does it work on any online shop?+
Only on shops built on Shopify. This reads the storefront's own public product feed, so a site running on something else has nothing for it to read - that is the one real constraint on this scraper, and it is worth checking before you queue a long list.
Can I give it one collection instead of a whole shop?+
Yes. A store domain takes the catalogue and a collection URL takes just that section, one link per line either way. The query column repeats whichever you submitted, so a run mixing whole shops and single collections still reconciles against your input.
What are the variants, images and options columns?+
They carry the store's own structured data through as JSON inside a single cell, rather than flattening it away. A spreadsheet will show them as a long string - decode them in your parser if you need what is inside, and remember the row you are on is already one of the variants.
What format are the dates in?+
ISO 8601 timestamps with a UTC offset, for the published, created and updated columns alike. That means no display format to unpick, and sorting on the updated column tells you what the shop has been working on most recently.
Do I get stock levels?+
No. The available column says whether a variant can be bought, as the lowercase word yes or no, which is not the same as how many are left. Quantities are not in the public feed, so no export can give them to you.
How much does it cost?+
The first 500 rows are free and one-time, with no credit card. After that it is $0.002 per row - about $2 per 1,000 variants - which is the same flat rate as every other scraper on the platform. Because a single product can be many rows, the estimator showing the count before a run starts is worth reading here.

Your first 500 rows,
on the house.

500 one-time free rows on every new account - no expiry. After that it is $0.002 per row, pay-as-you-go - no card on file until you say so.

Activates instantly · no card required

Scrape Shopify store catalogues at scale

Livescraper's Shopify Products Scraper turns a store link into a catalogue table. You paste links to Shopify websites one per line - a store domain for the whole shop, or a collection URL for one section - or upload them as a CSV, XLSX, TXT or Parquet file, cap the rows per query, and download the result as a clean CSV, Excel or JSON file.

Each row is one buyable variant: the product id, title, handle and description, the vendor and product type, the tags, the price and any was-price, the sku, whether it is available, and the variant label itself, alongside published, created and updated timestamps and the store's own variants, images and options data. Because the rows come from the storefront's public product feed rather than from a rendered page, the export keeps Shopify's own structure instead of a flattened approximation of it.

Merchandising teams read availability at the variant level to see which sizes and colours a shop has actually sold through. Pricing teams filter to rows carrying a was-price to get a competitor's entire discount picture in one pass. Strategy teams sort on the updated timestamp to see what a shop has been touching, with the created and published dates separating new launches from refreshed listings.

Two practical notes before you plan a job. A row is a variant rather than a product, so a catalogue of a few hundred products can be several thousand rows - group on the product id when you want products. And the variants, images and options columns each hold JSON in a single cell, so decode them rather than splitting on commas. Start free: your first 500 rows cost nothing and need no credit card, and after that it is $0.002 per row, flat.