Shopify hub

Shopify Product API

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

GET /v1/shopify/products/{handle}

1 credit Failed requests are free

About this endpoint

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.

Shopify Product API 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.