Shopify API
Shopify Product Feed API: Endpoints, Pagination, and What AI Agents Use
Shopify exposes your product catalog through three different APIs. AI shopping agents, comparison engines, and catalog aggregators all use them differently — knowing which one to care about saves you from chasing the wrong fix.
/products.json — the public, unauthenticated storefront endpoint. The Admin REST API and Storefront GraphQL API are for your own integrations, not for external crawlers. If /products.json returns a 403 or empty array, you are invisible to AI agents. The Admin API won't save you.
Three ways to access Shopify product data via API
Shopify provides three distinct APIs for reading product catalog data. Each serves a different audience and requires different credentials:
| API | Auth required | Who uses it | Format |
|---|---|---|---|
/products.json |
None (public) | AI agents, aggregators, comparison tools | REST JSON |
| Admin REST API | API key + secret | Your own apps, partner integrations | REST JSON |
| Storefront API | Public access token | Custom storefronts (Hydrogen, Next.js) | GraphQL |
For AI agent discoverability, only the first one matters. /products.json is the endpoint external crawlers can reach without credentials. If that endpoint is broken or blocked, no amount of Admin API configuration will fix your AI visibility problem.
The /products.json API (what AI agents actually use)
Every Shopify store exposes its catalog at https://yourdomain.com/products.json. No API key, no OAuth, no Shopify account — just an HTTP GET request.
Basic request
curl "https://allbirds.com/products.json?limit=5"
The response is a JSON object with a single products array. Each item includes:
- id, handle, title — product identity
- vendor, product_type, tags — classification signals AI agents use for category matching
- variants — array of size/color combinations with price, SKU, and availability
- images — array of image URLs
- body_html — product description (HTML)
What it does NOT include: GTINs/barcodes, metafields, SEO meta titles/descriptions, or inventory quantities. For those fields you need the Admin REST API — but external AI agents cannot reach the Admin API, so those fields must be embedded in your Product JSON-LD markup on each product page instead.
Pagination
The default page size is 250 products. For stores with larger catalogs:
# Page 1 curl "https://yourdomain.com/products.json?limit=250&page=1" # Page 2 curl "https://yourdomain.com/products.json?limit=250&page=2" # Keep incrementing until products array is empty
Most AI shopping agents only fetch page 1. If your store has more than 250 products, only your first page gets bulk-indexed. Your sitemap (/sitemap.xml) is the secondary mechanism for agents to discover individual product pages beyond the first 250.
Filtering parameters
# Filter by vendor curl "https://yourdomain.com/products.json?vendor=Nike" # Filter by product type curl "https://yourdomain.com/products.json?product_type=Sneakers" # Filter by collection handle (via collection endpoint) curl "https://yourdomain.com/collections/sale/products.json"
AI agents typically ignore filter parameters and fetch the unfiltered feed from /products.json or /products.json?page=N. Collection-specific endpoints (/collections/{handle}/products.json) are useful for your own integrations when you need a subset of the catalog.
Admin REST API (for your own integrations)
The Shopify Admin Products REST API lives at https://{shop}.myshopify.com/admin/api/2024-01/products.json. It requires an API key and access token — either from a private app or a Shopify Partners custom app with the read_products scope.
The Admin API returns more fields than /products.json, including:
- Metafields (including custom fields you define for AI agents)
- SEO title and description
- Product status (draft, active, archived)
- Barcode (GTIN) on each variant
- Inventory quantities across locations
Use the Admin API for bulk operations: pre-populating GTINs, rewriting descriptions with Claude API, or syncing data to your own database. Do not expose Admin API credentials in client-side code.
If your Admin API integration shows that GTINs are populated on all variants, that does not mean AI agents can see them. GTINs from the Admin API only reach AI agents if they are also emitted in the Product JSON-LD structured data on each product page. /products.json does not include barcode/GTIN fields. Check your theme's JSON-LD output separately.
Storefront API (GraphQL, for headless storefronts)
The Shopify Storefront API is a GraphQL API intended for custom storefronts built with Hydrogen, Next.js, or other frameworks. It requires a storefront access token (a public, non-secret token).
If you have a headless store, your /products.json endpoint may return 404 because the request never reaches Shopify — it hits your Next.js or Vercel server instead, which has no route for it. The fix is to add a proxy route in your framework that fetches from the Storefront API and mirrors the /products.json response shape.
See our guide on the four signals you silently lose when you go headless for the complete proxy implementation for both Hydrogen and Next.js.
How to verify all three endpoints are working
# 1. Test public product feed (AI agent access)
curl -sI -A "GPTBot/1.0" https://yourdomain.com/products.json | head -3
# 2. Count products in feed (check for truncation)
curl -s "https://yourdomain.com/products.json?limit=250" | \
node -e "const d=require('fs').readFileSync('/dev/stdin','utf8'); console.log(JSON.parse(d).products.length + ' products on page 1')"
# 3. Check if feed is referenced in sitemap (secondary discovery)
curl -s https://yourdomain.com/sitemap.xml | grep -c "products.json"
CatalogScan automates these checks and tests from multiple bot user-agents simultaneously, flagging cases where Cloudflare or a WAF treats bots and browsers differently.
See which of your product feed API endpoints AI shopping agents can actually reach.
Run a free scan →Common questions
Does /products.json count against Shopify API rate limits?
No. The /products.json storefront endpoint is not the same as the Admin API and is not subject to the same rate limits. However, Shopify does apply general storefront rate limits — if your store receives hundreds of requests per second on /products.json, Shopify may throttle responses. For normal AI agent crawling patterns (one full catalog fetch every few hours), this is not an issue.
Can I block specific bots from hitting /products.json?
You can add rules in robots.txt to disallow specific crawlers, but robots.txt is advisory — well-behaved bots respect it, malicious scrapers do not. ChatGPT, Perplexity, and Google's AI agents all respect robots.txt directives. If you want to block a specific bot from your product feed, add User-agent: GPTBot / Disallow: /products.json in your robots.txt — though this will also block it from your AI Shopping visibility.
What is the difference between /products.json and the Storefront API products query?
/products.json is a legacy REST endpoint that has been part of Shopify since 2012. The Storefront API is a newer GraphQL API with more flexible querying but requiring a storefront access token. External AI agents use /products.json because it is public and well-known. The Storefront API is intended for your own custom storefronts, not for external crawler access.
Does /products.json include draft or archived products?
No. /products.json only returns products with a status of active that are published to the Online Store sales channel. Draft products, archived products, and products not published to Online Store are excluded. This means AI agents only see products that are publicly available for purchase.