> **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-handle>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/shopify/products-handle.mdx>

---

# Shopify Product API

One product with its variants, media, collections and stock detail.

`GET /v1/shopify/products/{handle}?store=…` returns `data.product` with the summary fields plus `description`, `descriptionHtml`, `isGiftCard`, `hasOnlyDefaultVariant`, `category`, `seo`, `options`, `variants`, `images`, `media`, `collections`, `sellingPlanGroups`, `requiresSellingPlan` and `templateSuffix`.

Each variant carries `id`, `title`, `sku`, `barcode`, `available`, `currentlyNotInStock`, `price`, `compareAtPrice`, `options`, `weight`, `inventoryQuantity`, `inventoryPolicy`, `inventoryManagement`, `image`, `quantityRule`, `taxCode`, `unitPrice`, `unitPriceMeasurement` and `sellingPlanAllocations`.

`variantsTruncated` and `imagesTruncated` are true above 250 rows. `stockAvailable` is true only when the store's stock route answered, so null inventory fields with `stockAvailable: false` mean not exposed, not zero stock.

## Request

- **Endpoint:** `GET /v1/shopify/products/{handle}`
- **Credits:** 1 credit
Failed requests are free
- **Input:** by store and handle
- **Full reference:** [docs](https://www.socialfetch.dev/docs/api/v1/shopify/products/handle/get)
- **Platform page:** [/platforms/shopify](https://www.socialfetch.dev/platforms/shopify)

## FAQ

### Why are inventoryQuantity and inventoryPolicy null?

The store did not expose stock detail for this answer. Check stockAvailable: false means the fields are null for that reason, not that the product is out of stock.

### How many variants and images come back?

Up to 250 of each. variantsTruncated or imagesTruncated is true when the product has more.

### What if the handle has changed?

The answer is not_found with product null. Try the product list or search to find the current handle.

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