> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/shopify/products-batch>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/shopify/products-batch.mdx>

---

# Shopify Products Batch API

Up to 25 product handles in one call, with per-handle results.

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

## Request

- **Endpoint:** `GET /v1/shopify/products/batch`
- **Credits:** 1 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
- **Input:** by store and handles
- **Full reference:** [docs](https://www.socialfetch.dev/docs/api/v1/shopify/products/batch/get)
- **Platform page:** [/platforms/shopify](https://www.socialfetch.dev/platforms/shopify)

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