Point it at any store.
Get the whole catalog.
There is no single target site here: you supply the domain. One key reads any Shopify storefront on the web — the store profile, every product with every variant's price, sale price, SKU and stock, and the collections they sit in — as structured JSON. No Partner account, no app installed on the merchant's store, no per-store access token.
Trusted by developers shipping real products.
493,455 served today
Request
$ curl -X POST \ https://api.fetchlayer.dev/shopify-stores/products \ -H "Authorization: Bearer ss-your-key" \ -H "Content-Type: application/json" \ -d '{"store":"allbirds.com","limit":250}'
Response
{
"products": [{
"handle": "mens-tree-runners",
"title": "Men's Tree Runners",
"vendor": "Allbirds",
"priceMin": "98.00",
"onSale": false,
"variants": [{ "sku": "TR-M-10-NAT",
"price": "98.00", "available": true }]
}],
"nextCursor": "cGFnZT0y",
"notes": []
} Built for feedback workflows
Fetch the public signal. Use it wherever your team works.
Detection before you spend
Point /detect-store at a domain and it tells you whether it is Shopify, how confident that verdict is, which signals fired, and which of products, collections and metadata this store leaves published — before you spend a single request walking a catalogue that is switched off.
Themed and headless stores alike
Every classic storefront answers the same endpoints no matter how heavily it is themed or which custom domain it sits on. A headless store is read at the myshopify domain its own markup gives away, so a custom front end is no obstacle.
Variant-level catalogue
Not just titles and prices: every variant with its price, compare-at price, SKU, barcode, option values, weight, taxability and availability, plus the full description, the option matrix and every image with its dimensions.
Stock where the store publishes it
Stores that track inventory return inventoryQuantity per variant on /product-detail — the field that turns a catalogue snapshot into a restock and stock-out signal you can watch over time.
The store’s own merchandising
Collections show you how a merchant groups their catalogue, with titles, descriptions, images and product counts. Ask for one and it returns that collection’s products in full, in the same shape as a catalogue walk.
Partial answers announce themselves
Every response carries a notes array reporting truncated walks, upstream limits and fields this particular store does not publish. An empty notes means complete; entries in it tell you exactly what is missing and why.
AI-ready JSON
Hand product titles, descriptions, tags, prices and variants to an LLM or an MCP agent to cluster a catalogue, diff two stores, or write the sourcing brief — no HTML parsing, no per-store wrapper code.
Price a competitor’s whole catalogue with AI—then export it to CSV.
Prefer not to write code? Give FetchLayer Research Chat a store domain, ask what it sells and what it charges, and turn the entire catalogue into a structured file for your pricing model, sourcing shortlist, or category review.
- ✓Ask questions in plain English
- ✓Analyze themes, sentiment, and pain points
- ✓Download the structured results as CSV or JSON
No code or setup required · Uses your FetchLayer credits
Pull this store’s full catalogue, break it down by product type and price band, flag everything currently discounted, then export it as CSV.
I walked all 412 products, grouped them into nine product types, and marked the 38 items currently sitting below their compare-at price. The variant-level breakdown with SKUs and availability is ready to download.
shopify-store-catalog.csv
1,284 variants · 14 columns · ready to download
Solutions
Build the workflow around the feedback.
See what they advertise
Pair a competitor’s catalogue with the ads they are running to see which products they are actually pushing.
Explore →Read the reception
Shopify publishes no reviews — Trustpilot does. Pull a merchant’s public reviews in the same JSON shape.
Explore →Find the demand
Search public discussions for the products, price objections, and gaps a catalogue should answer.
Explore →From raw feedback to action
One request is the start of the workflow.
Store the structured response, run it on a schedule, pass it to an LLM, or feed it into the system your team already uses. FetchLayer handles retrieval so you can focus on the outcome.
- 01
Qualify the domain
Run /detect-store over the domains you care about. Keep the confirmed hits, note the permanent myshopify domain, and see which data each store publishes.
- 02
Walk the catalogue
Pull products page by page with a cursor, drop into /product-detail for stock, and read collections to see how the merchant groups what they sell.
- 03
Turn stores into intelligence
Diff prices week over week, build a sourcing shortlist, watch for new SKUs and restocks, or hand the JSON to an agent to write the category review.
MCP & agents
Your AI already knows
how to use this.
Use the Shopify endpoint directly from your MCP-compatible agent. Ask it to retrieve public feedback, identify patterns, and turn the result into a useful brief without writing integration glue.
Pick your editor and we hand you the config with your key already in it — no JSON to hand-edit, no wrapper code.
Get your free API keyFree tier · no credit card · any MCP host
Check whether these twelve domains are Shopify stores, then pull the full catalogue and current prices for every one that is.
Confirmed nine of twelve are Shopify — two are headless and read at their myshopify domains. Walked all nine catalogues: 3,180 products, 11,942 variants with prices and SKUs, and 214 items currently discounted.
Works with every MCP-compatible tool
Use cases
What teams build with Shopify store data.
Same API, endless applications. Here is what teams ship with public storefront data.
Competitor catalogue intelligence
Read any Shopify storefront’s catalogue — every product, variant, price, SKU and collection — from just its domain.
AI agent context
Give Claude, Codex, or your MCP agent structured products, variants and prices instead of a per-store scraper.
Price & stock monitoring
Poll a store on a schedule to catch price changes, sale cycles, restocks and stock-outs as they happen.
Assortment research
Compare how rival merchants group, describe and tag their catalogues to find the gaps in your own range.
Catalogue exports
Turn a whole storefront into a clean CSV of products, variants, prices and images for sourcing or resale.
Market research
Detect which domains in a category run Shopify, then read a hundred of them to size the market properly.
Compare approaches
Spend time on the insight, not the collection layer.
| What you need | FetchLayer | Official API | Build it yourself |
|---|---|---|---|
| Read a store you do not own | ✓ | Merchant must install your app | You build it |
| Works on themed & headless stores | ✓ | n/a | You detect it |
| Variant prices, SKUs & stock | ✓ | With granted scopes | You parse it |
| One key for every storefront | ✓ | Token per store | You manage it |
| Ready for AI and MCP workflows | ✓ | Your integration | Your integration |
FetchLayer provides access to publicly available data. It is not affiliated with, endorsed by, or sponsored by the platform.
Pricing
Start free. Scale when ready.
Pay per request with no commitment, or lock in a flat monthly rate with built-in savings.
Free plan — 30 requests
Verify responses, inspect the API, no credit card required.
Pay as you go
$1.99
per 1,000 requests
$0.00199 per request · credits never expire
How credits work — no multipliers
One credit = one API call, on every endpoint and platform. No matter how many results come back, you pay for the call, not the output size. Most scraping APIs charge multipliers of 5x, 25x, even 75x per call depending on the target — here it's always 1.
- No multipliers — 1 request = 1 credit
- No monthly commitment
- Credits never expire
- Same API & MCP access as subscribers
- ∞ req/min, ∞ API keys
∞
Expiry
Credits stay until you use them. No monthly reset, no pressure to hit a quota.
0
Commitments
No subscription, no contract, no minimums. Start, pause, or scale whenever.
100%
Access
Every endpoint and MCP included. Not a limited tier — same data as any subscriber.
API reference
Every parameter, documented.
All requests are POST with a JSON body and Bearer auth header.
POST /shopify-stores/detect-store Confirm a domain is a Shopify store and find the real store behind it — with the signals behind the verdict, the permanent myshopify domain, and which data surfaces that store leaves published. A non-Shopify domain is a normal 200, so this is safe to run down a list.
store* string Store domain, or any URL on the store — e.g. example.com format string 'json' | 'markdown'. Defaults to json. timeoutMs number Per-request time limit in milliseconds (max 120000). POST /shopify-stores/store-profile What a store publishes about itself: name, description, currency and money format, locale, country, city and province, the countries it ships to, the card brands it accepts, product and collection totals, the theme in use, the logo, and every social profile it links to.
store* string Store domain, or any URL on the store format string 'json' | 'markdown'. Defaults to json. POST /shopify-stores/products The full product catalogue: every product with its description, tags, images, and option matrix, and every variant with price, compare-at price, SKU, barcode, options, weight, and availability. Walk several pages in one request, or resume from a cursor.
store* string Store domain, or any URL on the store limit number Maximum products returned (max 2000), or -1 for everything available. Defaults to 30. pages number Pages of results to collect in one request (max 40), or -1 for the maximum allowed. cursor string Resume from a previous response's nextCursor. POST /shopify-stores/product-detail One product in full, from its URL or its handle: the complete description, every image with dimensions and alt text, and every variant with price, SKU, barcode, and stock. The only endpoint that returns per-variant inventory.
product* string Product URL, or the product's handle as it appears in the URL store string Required only when product is a handle rather than a full URL POST /shopify-stores/collections How the store organises its catalogue, or one of those groups read in full. Without a collection, returns every collection with its title, description, image, and product count; with one, returns that collection's products in the same shape as /products.
store* string Store domain, or any URL on the store collection string Collection URL or handle. Omit to list the store's collections. limit number Maximum items returned (max 2000), or -1 for everything available. pages number Pages of results to collect in one request (max 40). cursor string Resume from a previous response's nextCursor. POST /shopify-stores/media Stream a product image file through the API, using a url taken from any image on a product. Only store image hosts are accepted, and HTTP Range requests are supported. A GET with query parameters rather than a JSON body.
url* string Product image URL, as returned on a product image filename string Content-Disposition filename to serve the file as (max 200 characters) POST /shopify-stores/resolve-url Parse any store URL into the fields the other endpoints take — product, collection, or store, plus the domain, the canonical store URL, the handle, the selected variant, and the permanent myshopify domain. Touches no store, and never consumes a credit.
url* string Any store URL, to be parsed into structured fields Fields marked * are required. Full API reference →
FAQ
Common questions.
Which stores can I read — only my own?
Any of them. That is the whole point of this API: you supply the domain, and every endpoint takes it as an argument. There is no OAuth handshake with the merchant, no app to install on their store, and no per-store access token. One FetchLayer key reads your competitor’s catalogue, a supplier’s, and a thousand domains you are qualifying in bulk. FetchLayer is not affiliated with, endorsed by, or sponsored by Shopify.
How do I know a domain is even a Shopify store?
Send it to /detect-store. It returns isShopify with a confidence of confirmed, likely, or no, the individual signals behind that verdict, the store name and currency, the permanent myshopify domain, and which of products, collections, and store metadata that particular store leaves published. A domain that is not Shopify comes back as a normal 200 with isShopify false — not an error — so you can run it down a list of a thousand domains and keep the hits.
Does it work on stores that do not look like Shopify?
Usually, yes. Every classic storefront answers the same set of endpoints no matter how heavily it has been themed or which custom domain it sits on, and a headless store — a custom front end with Shopify behind it — is read at the myshopify domain its own markup gives away. /detect-store returns that permanent domain, and you pass it back as the store.
What do I actually get for each product?
Title, handle, vendor, product type, tags, the description in plain text and as HTML, publish and update timestamps, every image with its dimensions and alt text, the full option matrix, and every variant with price, compare-at price, SKU, barcode, option values, weight, taxability, and availability — plus the product’s price range, currency, and whether anything on it is discounted. A product with more than 250 variants comes back flagged rather than silently shortened.
Can I see stock levels?
For stores that track inventory and publish it, yes — inventoryQuantity comes back per variant on /product-detail. A catalogue walk returns availability but not units on hand, which is deliberate: stock is the one field worth a request of its own, and pulling it product by product is what makes a stock-out or restock detectable over time.
Are product reviews included?
No, and that is a decision rather than an oversight. Shopify has no native review source — reviews come from a third-party app, and they fragment across Yotpo, Bazaarvoice, Judge.me, Okendo, and Stamped, none of which is common enough to justify plugin-specific work that would break the moment a merchant switched apps. If you need review data, the review platforms FetchLayer does cover (Trustpilot, the App Store, Google Play, Google Maps) return it properly.
Why does every response carry a notes array?
Because a partial answer should say so. notes is where a walk that stopped early, an upstream limit, or a field this particular store does not publish gets reported. An empty notes means the result is as complete as the store publishes; entries in it tell you exactly what is missing and why. Read it before treating a catalogue as final.
Can I download the product images?
Yes. Every image on a product carries a downloadUrl, and GET /shopify-stores/media streams the actual bytes through FetchLayer with HTTP Range support. Only store image hosts are accepted, and the request carries your Bearer key in a header — so an image URL cannot be shared without also sharing the key.
How does billing work?
One API request equals one credit, the same as every other FetchLayer platform. Each page walked counts as one request, so pages: 10 bills as ten. Parsing a URL with /resolve-url touches no store and is free. Streaming an image bills as a normal request. Shopify is in Beta while coverage expands, at standard pricing.
Start pulling Shopify store data today.
Get a free API key, make your first request, and put public feedback to work in your own product or research workflow.
Used by developers at
Individual developers or teams — not official partnerships