Shopify Store API — Any Storefront as JSON | FetchLayer
Unofficial Third-party API
7 endpoints live

Point it at any store.
Get the whole catalog.

Any storefront you name Variants, prices & stock Collections & images AI-ready JSON

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.

Free tier included No credit card No scraper maintenance

Trusted by developers shipping real products.

493,455 served today

POST /shopify-stores/products
200 OK

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": []
}

Used by developers at

Individual developers or teams — not official partnerships

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.

FetchLayer Research Chat

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
Research stores in Chat

No code or setup required · Uses your FetchLayer credits

Shopify research

Pull this store’s full catalogue, break it down by product type and price band, flag everything currently discounted, then export it as CSV.

Y

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

CSV

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.

  1. 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.

  2. 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.

  3. 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

Live

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.

1
Pick your editor
2
Agent discovers 7+ tools
3
Query any platform instantly
connect your agent ~30s

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 key

Free tier · no credit card · any MCP host

New chat fetchlayer connected

Check whether these twelve domains are Shopify stores, then pull the full catalogue and current prices for every one that is.

Used fetchlayer.shopify_detect_store

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.

Ask a follow-up…

Works with every MCP-compatible tool

Cursor
Claude
VS Code
Windsurf
Cline
Hermes
OpenClaw
Kiro
No wrapper code
All 7 endpoints exposed as tools
Official & maintained
Free to install

Use cases

What teams build with Shopify store data.

Same API, endless applications. Here is what teams ship with public storefront data.

01

Competitor catalogue intelligence

Read any Shopify storefront’s catalogue — every product, variant, price, SKU and collection — from just its domain.

competitorscatalogueresearch
02

AI agent context

Give Claude, Codex, or your MCP agent structured products, variants and prices instead of a per-store scraper.

llmagentsmcp
03

Price & stock monitoring

Poll a store on a schedule to catch price changes, sale cycles, restocks and stock-outs as they happen.

alertsmonitoringcron
04

Assortment research

Compare how rival merchants group, describe and tag their catalogues to find the gaps in your own range.

merchandisinggapsinsight
05

Catalogue exports

Turn a whole storefront into a clean CSV of products, variants, prices and images for sourcing or resale.

cataloguecsvexport
06

Market research

Detect which domains in a category run Shopify, then read a hundred of them to size the market properly.

marketsdetectionresearch

Compare approaches

Spend time on the insight, not the collection layer.

What you needFetchLayerOfficial APIBuild it yourself
Read a store you do not ownMerchant must install your appYou build it
Works on themed & headless storesn/aYou detect it
Variant prices, SKUs & stockWith granted scopesYou parse it
One key for every storefrontToken per storeYou manage it
Ready for AI and MCP workflowsYour integrationYour 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.

Try free

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
Get API key

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.