Shopify Product Feed
Your Shopify Product Feed URL: How to Find, Test, and Fix It
Every Shopify store ships with a built-in product feed that AI shopping agents, comparison tools, and price trackers use to discover your catalog — here's how to test whether yours is actually working.
https://yourdomain.com/products.json. It returns your entire published catalog as machine-readable JSON. AI shopping agents like ChatGPT Shopping and Perplexity Commerce poll this URL to index your products. If it returns a 403, a Cloudflare challenge page, or an empty products array, you are invisible to those agents.
What is the Shopify product feed URL?
Shopify exposes every store's product catalog at a fixed URL: /products.json. No app, plugin, or configuration is required — it is part of the core Shopify storefront and has been there since 2012.
The feed returns a JSON object with a top-level products array. Each product includes its title, handle, vendor, product type, tags, variants (with prices and SKUs), and images. Here is a minimal example of what a single product looks like in the feed:
{
"products": [
{
"id": 7892345678,
"title": "Merino Wool Crew Neck",
"handle": "merino-wool-crew-neck",
"vendor": "Allbirds",
"product_type": "Sweaters",
"tags": ["sustainable", "merino", "natural"],
"variants": [
{
"id": 44123456789,
"title": "Small / Charcoal",
"price": "98.00",
"sku": "MW-CREW-S-CH",
"available": true
}
],
"images": [{ "src": "https://cdn.shopify.com/..." }]
}
]
}
By default, Shopify paginates the feed at 250 products per page. To retrieve more, append ?page=2, ?page=3, and so on. Many AI agents only fetch the first page, so stores with large catalogs may have only their first 250 products indexed by AI shopping tools.
Why AI shopping agents depend on this URL
When an AI shopping agent (ChatGPT with shopping enabled, Perplexity Commerce, Google AI Mode, or a custom agentic workflow) needs to compare products across Shopify stores, it checks /products.json first. This is the fastest way to bulk-ingest a store's catalog — one HTTP request versus crawling hundreds of individual product pages.
The feed is also how price-comparison tools, affiliate networks, and third-party apps (Google & YouTube channel, Meta Catalog) stay up to date on your prices and availability. A broken feed means outdated pricing, missing products, and lost referral traffic.
In our scan of the top 100 DTC Shopify brands, 60 had a working /products.json feed. The remaining 40 had broken or blocked feeds — mostly stores that migrated to headless storefronts (Hydrogen, Next.js, Vercel) without realizing the feed URL was no longer routing correctly.
How to test your Shopify product feed URL
Step 1 — Open it in a browser
Navigate to https://yourdomain.com/products.json in an incognito window. You should see raw JSON with a products array. If you see a Shopify password page, a Cloudflare interstitial, or a 403/404 error, your feed is blocked.
Step 2 — Test with a bot user-agent
Browsers and bots often receive different responses, especially when Cloudflare Bot Fight Mode is active. Test with a real bot user-agent:
curl -sI -A "GPTBot/1.0" https://yourdomain.com/products.json | head -5 # Expected: HTTP/2 200 # Problem: HTTP/2 403, 401, or a redirect to a login page
If the browser returns 200 but curl returns 403 or an HTML challenge page, Cloudflare (or another WAF) is blocking bot traffic. See our guide on Cloudflare settings that silently block AI shopping agents for the fix.
Step 3 — Check the products count
Even if the feed loads, verify it is returning your full catalog:
curl -s "https://yourdomain.com/products.json?limit=250" | \ python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d['products']), 'products')"
If you see 0 products but your store has inventory, the feed is empty — usually because you are on a headless storefront that does not proxy /products.json back to Shopify's servers.
Common reasons the feed is broken
When you move to a headless front-end (Hydrogen, Next.js on Vercel, custom React), the new server often does not proxy unknown routes to Shopify. Requests to /products.json return a 404 from Vercel instead of Shopify's feed. The fix: add an explicit route in your Next.js or Remix config that proxies /products.json to your Shopify Storefront API.
Cloudflare's Bot Fight Mode challenges requests from known bots with a JavaScript interstitial. GPTBot, ClaudeBot, PerplexityBot, and Google-Extended are all classified as bots and get challenged. The fix: add a WAF Skip rule for AI bot user-agents, or disable Bot Fight Mode entirely and use Cloudflare's rate-limiting rules instead.
If your store is password-protected (Shopify Admin → Online Store → Preferences → Password protection), /products.json returns a 401. There is no way to make the feed public while keeping the storefront gated — the password applies to the entire Online Store channel.
Some third-party apps add token-based authentication to product endpoints. Check whether any installed app modifies request headers or response codes for /products.json by testing from outside your network.
How CatalogScan checks your product feed
CatalogScan's free scan tests your /products.json from three different user-agents: a standard browser, GPTBot, and ClaudeBot. It scores each response and flags discrepancies — so you can see if bots are getting a different response than browsers. The scan also checks your product count, pagination behavior, and whether the feed is referenced in your sitemap.
Paste your store URL and get your feed score in under 2 minutes.
Check your product feed →Common questions
How many products does Shopify's product feed return per page?
Shopify limits /products.json to 250 products per page by default. For stores with more than 250 products, you must paginate using ?page=2, ?page=3, etc. (or use ?limit=250&page=N). Many AI agents only fetch the first page, meaning only your first 250 products get bulk-indexed. For full catalog coverage, add your sitemap as a secondary signal so agents can discover individual product URLs.
Can I use a custom product feed URL instead of /products.json?
/products.json is the standard URL that every AI shopping agent and aggregator knows to check. Custom URLs require custom crawlers and will not be discovered automatically. If you need a custom feed format (e.g., Google Merchant Center XML), use an app like Shopify's Google & YouTube channel or a feed app — but keep /products.json working in parallel for direct AI agent access.
My /products.json is behind a password — how do I make it public?
Go to Shopify Admin → Online Store → Preferences and disable "Restrict access to visitors with the password." Note: this makes your entire storefront public, not just the feed. If you are in a pre-launch phase and need a password, you will have to wait until launch to have a working product feed for AI agents.
Does /products.json include variants and inventory levels?
Yes — each product in the feed includes all its variants with price, SKU, and an available boolean (true/false). Shopify does not expose exact inventory quantities in /products.json; for inventory counts you need the Inventory API via a private app or partner credentials.