Shopify Products Batch API
Up to 25 product handles in one call, with per-handle results.
GET /v1/shopify/products/batch1 credit per product handle Up to 25 handles per request Max 25 credits A handle the store does not know is still charged Failed requests are free
About this endpoint
GET /v1/shopify/products/batch?store=…&handles=a,b,c returns data.results in request order. Each entry has handle, lookupStatus of found or not_found, and product as a product summary when found. data.summary counts requested, found and notFound.
Pass 1 to 25 handles, comma-separated or repeated. Duplicates are dropped and order is kept. A missing handle does not fail the batch: its entry is not_found while the others resolve.
Shopify Products Batch API FAQ
Are the results in the same order as the handles?
Yes. results has one entry per unique requested handle, in request order, and duplicates are dropped.
What happens when one handle is missing?
That entry has lookupStatus not_found and product null. The other handles still resolve.
Do I get full product detail?
No. Each found entry carries a product summary. Call the product route when you need variants, media or stock detail.
How is a batch billed?
The batch route bills each unique requested handle separately, up to 25, and repeats count once. A handle that is missing, or a store that is private, is still a completed lookup and is billed. Confirm every response with meta.creditsCharged, the billing source of truth.
How do I name the store?
The store is the domain, for example allbirds.com, www.allbirds.com or weareallbirds.myshopify.com. A full URL is reduced to its host.
How is it billed?
Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged: that field is the billing source of truth.
What does lookupStatus mean?
found means the lookup succeeded. not_found means the store or entity does not exist or is not a Shopify store. private means the storefront is password-protected. restricted means it is paused or frozen. HTTP 200 only means the request finished, so branch on lookupStatus.