Any WooCommerce store.
Every price, as JSON.
You choose the storefront. Pass a domain and get its products, prices, sale prices, stock, SKUs, variations, images and category tree as structured JSON — from any of the millions of independent shops running WooCommerce. No consumer key, no plugin, no cooperation from the store required.
Trusted by developers shipping real products.
493,455 served today
Request
$ curl -X POST \ https://api.fetchlayer.dev/woocommerce-stores/products \ -H "Authorization: Bearer ss-your-key" \ -H "Content-Type: application/json" \ -d '{"store":"example-shop.com","onSale":true}'
Response
{
"dataSource": "catalog-api",
"products": [{
"name": "Coastal Rain Shell",
"sku": "CRS-BLK-M",
"price": "129.00",
"regularPrice": "179.00",
"stockStatus": "in-stock",
"source": "catalog-api"
}],
"totalProducts": 118,
"notes": []
} Built for feedback workflows
Fetch the public signal. Use it wherever your team works.
Any store, named by you
There is no fixed target site. Pass a domain — or any URL on it — and the same routes answer for any of the millions of independent shops running WooCommerce. Point it at one competitor or a list of a hundred.
Detect before you spend
One call confirms a domain really is WooCommerce, finds the real storefront, and reports which published sources answer. You know whether reading a store is cheap, expensive, or pointless before the second request.
Products, prices and stock
Every SKU with price, regular price, sale price, stock status and quantity, categories, tags, brands, attributes and image URLs. Amounts are exact decimal strings in the store’s own currency, never floats.
Every variation, priced
One product-detail call returns each variation with its own id, SKU, option values, price and stock — so a size-and-colour matrix comes back priced, not as a single range you have to guess at.
The source is on the record
Cost varies by store, not by route. Every response names the path it took — catalog-api, content-api or product-pages — so you know which fields to trust and what the read cost before you scale the job.
Nothing fails quietly
A notes[] array on every response reports truncated walks, upstream limits and fields a store does not publish. A short result set is explained, not silently returned as if it were complete.
Paste a URL, get input
Hand any store, product or category URL to resolve-url and it comes back as the domain, store URL, product slug or id, and category slug the other routes take. Parsing a URL is free.
AI-ready JSON
Pass catalogues, prices and stock to an LLM or an MCP agent to compare a market, spot a discount cycle, or write the pricing memo — no HTML parsing, no wrapper code, no per-store scraper.
Price a whole category across a dozen stores—then export it.
Prefer not to write code? Give FetchLayer Research Chat a list of storefronts, ask what they charge and what they keep in stock, and turn the whole comparison into a structured file for your pricing review, board deck, or market map.
- ✓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
Check these twelve stores, pull every product in their outerwear category with price and stock, and tell me who is discounting hardest. Then export it as CSV.
All twelve domains confirmed as WooCommerce. I read 1,180 products, found four stores discounting more than 30% on outerwear right now, and flagged the two that are out of stock on their best sellers. The full product-level table is ready to download.
woocommerce-category-pricing.csv
1,180 products · 14 columns · ready to download
Solutions
Build the workflow around the feedback.
Do the same for Shopify
The same store-you-name shape, for any Shopify storefront — profile, products, variants and collections.
Explore →See what they advertise
Pair a competitor’s catalogue with the ads and creative they are running behind it.
Explore →Read the reputation
WooCommerce review text is not offered yet — Trustpilot is. Pull public reviews of the stores you price against.
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
Detect the store
Send the domain to /detect-store. It confirms WooCommerce, finds the real storefront, and tells you which data sources it publishes — and therefore what reading it will cost.
- 02
Map it, then pull it
Read the category tree cheaply to see what the store sells, then request the products that matter with price, stock and search filters, paging with a cursor.
- 03
Diff it on a schedule
Key on dateModified and re-read weekly: price moves, new SKUs, stockouts and discount depth across a whole set of competitors, as a table instead of a browsing session.
MCP & agents
Your AI already knows
how to use this.
Use the WooCommerce 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
Is this domain a WooCommerce store? If it is, pull its outerwear category with prices and tell me what it is discounting.
Confirmed WooCommerce with high confidence, reading from the store’s published catalog. Pulled 118 products in outerwear: 31 are on sale, the deepest cut is 42% off, and four best sellers are out of stock.
Works with every MCP-compatible tool
Use cases
What teams build with WooCommerce store data.
Same API, endless applications. Here is what teams ship with public storefront data.
Competitor pricing intelligence
Point one key at any WooCommerce store and read its products, prices, sale prices, stock and every variation.
AI agent context
Hand Claude, Codex, or your MCP agent structured catalogues and exact decimal prices instead of a per-store scraper.
Discount-cycle monitoring
Poll a storefront on a schedule to see when sale prices drop, how deep they go, and what quietly restocks.
Assortment research
Compare categories, brands and attributes across rival shops to find the products a market is still missing.
Catalogue exports
Export a whole store — SKUs, variations, prices, stock and images — as one clean dataset per domain.
Market sizing
Detect WooCommerce across a list of a hundred domains, then read them all to size an independent market.
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 | ✓ | Consumer key required | You build it |
| Works on any WooCommerce domain | ✓ | One store per key | One scraper per store |
| Detects the store before reading it | ✓ | N/A | You build it |
| Falls back when no catalog is published | ✓ | No data | You build it |
| Reports what the read actually cost | ✓ | N/A | You instrument 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 /woocommerce-stores/detect-store Confirm a domain runs WooCommerce and find the real storefront behind it, before you spend requests on it. Returns a confidence verdict, the signals that matched, and every published data source that answered.
store* string Store domain, e.g. example-shop.com, or any URL on the store timeoutMs number Per-request time limit in milliseconds (max 600000). POST /woocommerce-stores/store-profile The store's own details: name, description, the currency and symbol it prices in, locale, logo, the social profiles it advertises, and the product and category counts it reports.
store* string Store domain, or any URL on the store dataSource string 'catalog-api' | 'content-api' | 'product-pages'. Defaults to the most complete one the store offers. POST /woocommerce-stores/products Products with prices, sale prices, stock, SKUs, categories, tags, brands, attributes, variations and image URLs. The response's dataSource tells you which path the read took — and therefore what it cost.
store* string Store domain, or any URL on the store limit number Maximum products returned (max 250), or -1 for everything available. Defaults to 30. search string Only products matching this text category string Only products in this category, by slug or id tag string Only products with this tag, by slug or id minPrice string Only products at or above this price, in the store's currency maxPrice string Only products at or below this price, in the store's currency onSale boolean Only products the store has discounted inStock boolean Only products the store reports as in stock orderBy string 'date' | 'price' | 'popularity' | 'rating' | 'title' | 'menu_order'. orderDirection string 'asc' | 'desc'. pages number Pages of results to collect in one request (max 100). cursor string Resume from a previous response's nextCursor. dataSource string Pin the read to one published source instead of the most complete available. POST /woocommerce-stores/product-detail One product in full: description, prices, SKU, stock status and quantity, rating and review count, categories, tags, brands, every attribute, every variation with its own price and stock, all images, weight and dimensions, and related product ids.
store* string Store domain, or any URL on the store product* string Product id, slug, or the product's URL on the store includeVariations boolean Also resolve each variation's own price, SKU and stock. Defaults to true. POST /woocommerce-stores/categories The store's category tree: name, slug, URL, description, parent and the number of products reported in each. Cheap on every source, so it is the usual way to map a catalog before deciding what is worth pulling.
store* string Store domain, or any URL on the store limit number Maximum categories returned (max 500), or -1 for everything available. slug string Only the category with this slug parent string Only categories directly under this one, by slug or id includeEmpty boolean Include categories holding no products. Defaults to false. POST /woocommerce-stores/media A GET that streams a product image’s bytes, with HTTP Range support. Use the downloadUrl returned on any product image verbatim — it already carries both parameters, and a URL that does not belong to that store is rejected.
store* string The store the image belongs to (query parameter) url* string Image URL, exactly as returned on a product (query parameter) filename string Content-Disposition filename to serve the file as POST /woocommerce-stores/resolve-url Parse any store, product or category URL into the structured input the other endpoints take — domain, store base URL, product slug or id, category slug. Free: it never consumes a credit.
url* string Any store, product or category URL Fields marked * are required. Full API reference →
FAQ
Common questions.
Which store does this read?
Whichever one you name. Unlike a single-source API there is no fixed target site here: every endpoint takes a store — a domain such as example-shop.com, or any URL on it — so the same seven routes answer for any of the millions of independent shops running WooCommerce. Point it at a competitor, at a list of stores in a category, or at a market you are sizing. FetchLayer is not affiliated with, endorsed by, or sponsored by WooCommerce or Automattic.
Do I need the store’s consumer key or a plugin installed?
No. You authenticate with your FetchLayer API key — the same Bearer token you use for every other platform. Nothing is required from the store itself: no WooCommerce consumer key or consumer secret, no WordPress login, no plugin, no cooperation from the shop owner. Only what the storefront already publishes is read.
What does /detect-store do, and why call it first?
It answers a question no other platform on FetchLayer has to ask: is this domain actually a WooCommerce store, and where is the real storefront? It returns a verdict with a confidence level, the individual signals that were checked and which matched, and every published data source that answered — most complete first. Run it once on a new domain and you know, before spending a single further request, whether reading that store is cheap, expensive, or pointless.
Why does one store cost more to read than another?
Because cost here depends on the target, not the route. A store that publishes a catalog answers a products call in roughly 102 KB. A store that publishes none has to be read from its rendered product pages — measured at up to 5 MB for nine products. Every response carries a source on each product and a dataSource on the response naming which path was taken: catalog-api, content-api, or product-pages. Check it before you scale a job across a list of stores.
So what does limit actually mean?
On a store read from its catalog, limit is a target: ask for 250 products and you get 250 in about three cheap pages. On a store read from rendered pages, limit is a hard request budget — every product is a page fetch, so asking a catalog-less store for 500 products is asking for something very expensive. Start small, read dataSource on the response, and walk a large catalog with cursor across billed requests rather than hiding it inside one.
Why should I read notes[] on every response?
Because it is where a short answer gets explained. notes[] reports truncated walks, upstream limits, and fields a particular store does not publish. A result set smaller than you expected is usually described there rather than returned as an error, so an integration that ignores notes will quietly mistake a capped walk for a small catalog.
Can I get product reviews?
Not yet, and that is deliberate rather than an oversight. The groundwork exists, but there is a documented trap: the generic WordPress comments route that answers on many stores excludes the review comment type, so a store with 1,201 reviews reports a total of zero and looks like it worked perfectly. Shipping a route that silently returns nothing is worse than shipping none, so reviews wait for a source that reports them honestly. Product ratings and review counts are returned today.
What can I actually build with this?
Competitor catalog and pricing intelligence — every SKU, price, sale price and stock status a rival publishes, diffed on a schedule. Market research across many independent stores at once: what a whole category charges, how deeply it discounts, what it stocks. And catalog monitoring on your own or a partner’s store, keyed on dateModified, so a price change, a stockout or a new product is something you find out about rather than something you notice.
Can I use this with an AI model or MCP agent?
Yes. Every response is structured JSON you can store, embed, or hand to an LLM, and the six JSON routes are exposed through FetchLayer’s MCP server — so an agent can check a domain, read its catalog, compare prices across stores and write the summary without any wrapper code. Prices come back as exact decimal strings in the store’s own currency, never floats, so the arithmetic stays correct.
How does billing work?
One API request equals one credit, the same as every other FetchLayer platform — no multipliers. Each page walked counts as one request, so pages: 10 bills as ten. Parsing a URL with /resolve-url is free and consumes nothing; streaming an image through /media bills as a normal request. WooCommerce is in Beta while coverage expands, at standard pricing.
Start pulling WooCommerce 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