Shopify Product Data by Store & Handle — Variants, SKU, Stock
Send a store domain and a product handle (or product URL) and this source returns the product as structured data: title, brand, product type, tags, images, options, and every variant with its price, SKU, barcode, availability and stock fields.
{
"session_id": "11111111-1111-1111-1111-111111111111",
"kind": "shopify_product",
"store_domain": "allbirds.com",
"product": "mens-tree-runners",
"human": "# Shopify product\n\n- **Store:** allbirds.com\n- **Product:** mens-tree-runners\n- **Proxy traffic:** 8.9 KB\n- **Title:** Men's Tree Runner - Jet Black (White Sole)\n- **Brand:** Allbirds\n- **Type:** Shoes\n- **Price:** 100 USD\n- **Available:** yes",
"machine": {
"store_domain": "allbirds.com",
"product": {
"id": 4870548979792,
"alias": "mens-tree-runners",
"title": "Men's Tree Runner - Jet Black (White Sole)",
"url": "https://allbirds.com/products/mens-tree-runners",
"description": "The Allbirds Tree Runner is a breathable and lightweight sneaker made with responsibly sourced eucalyptus tree fiber that feels silky smooth and cool on your skin. These shoes are perfect for everyday",
"description_html": "<p>The Allbirds Tree Runner is a breathable and lightweight sneaker made with responsibly sourced eucalyptus tree fiber that feels silky smooth and cool on your skin. These shoes are perfect for every",
"brand": "Allbirds",
"product_type": "Shoes",
"tags": [
"allbirds::carbon-score => 4.52",
"allbirds::cfId => color-mens-tree-runners-jet-black-white"
],
"image": "https://cdn.shopify.com/s/files/1/1104/4168/files/TR3MJBW080_SHOE_LEFT_GLOBAL_MENS_TREE_RUNNER_JET_BLACK_WHITE.png?v=1751165486",
"images": [
"https://cdn.shopify.com/s/files/1/1104/4168/files/TR3MJBW080_SHOE_LEFT_GLOBAL_MENS_TREE_RUNNER_JET_BLACK_WHITE.png?v=1751165486",
"https://cdn.shopify.com/s/files/1/1104/4168/files/TR3MJBW080_SHOE_BACK_GLOBAL_MENS_TREE_RUNNER_JET_BLACK_WHITE.png?v=1751165486"
],
"options": [
{
"name": "Size",
"position": 1,
"values": [
"8",
"9"
]
}
],
"variants": [
{
"id": 33179624669264,
"title": "8",
"sku": "TR3MJBW080",
"barcode": "843416184854",
"price": 100,
"list_price": null,
"currency": "USD",
"available": true,
"inventory_quantity": 57,
"inventory_policy": "deny",
"inventory_management": "shopify",
"fulfillment_service": "manual",
"requires_shipping": true,
"taxable": true,
"option1": "8",
"option2": null,
"option3": null,
"grams": 860,
"weight": 1.896,
"weight_unit": "lb",
"position": 1,
"image": null,
"created_at": "2021-01-29T13:57:15-08:00",
"updated_at": "2026-09-30T08:12:23-07:00"
},
{
"id": 33179624702032,
"title": "9",
"sku": "TR3MJBW090",
"barcode": "843416184861",
"price": 100,
"list_price": null,
"currency": "USD",
"available": false,
"inventory_quantity": 0,
"inventory_policy": "deny",
"inventory_management": "shopify",
"fulfillment_service": "manual",
"requires_shipping": true,
"taxable": true,
"option1": "9",
"option2": null,
"option3": null,
"grams": 935,
"weight": 2.061,
"weight_unit": "lb",
"position": 2,
"image": null,
"created_at": "2021-01-29T13:57:15-08:00",
"updated_at": "2026-09-30T08:12:23-07:00"
}
],
"currency": "USD",
"price_min": 100,
"price_max": 100,
"available": true,
"published_at": "2026-09-25T16:57:46-07:00",
"created_at": "2021-01-29T13:57:15-08:00",
"updated_at": "2026-09-30T08:12:23-07:00",
"source": "json"
},
"proxy_traffic_bytes": 9067
},
"total_points": 5
}- You send
- A Shopify store domain and a product handle or URL
- You get back
- Brand, type, tags, images, options and all variants with price, SKU, barcode, availability and stock
- Coverage
- Products on Shopify-powered storefronts with a public product page.
- Price
- 5 pts — $5 per 1,000
- Flat 5 points per returned product. A product that doesn't resolve is not billed.
Ways to get this data
Three approaches teams use today, and where each one runs into trouble.
| Approach | What it takes | Cost | Trade-off |
|---|---|---|---|
| Opening the product page by hand | Open the page and click through each option | Free, and slow | Fine for one product, useless across a competitor's range |
| Building a scraper | Write it, host it, and adapt it to each store's theme | Engineering time | A maintenance commitment for something that isn't your product |
| NeuralVerge | One request per product, the same shape for every store | $5 per 1,000, misses not billed | Returns what the store publishes; stock fields can be null |
What you get back
Every field in the response shown above.
| Field | Type | Description |
|---|---|---|
store_domain | string | The store the product was read from. |
product.id | number | Shopify product ID. |
product.alias | string | Product handle. |
product.title | string | Product title. |
product.url | string | Link to the product page. |
product.description | string | Plain-text description. |
product.description_html | string | Description as HTML. |
product.brand | string | Brand or vendor. |
product.product_type | string | Product type as set by the store. |
product.tags | array | Tags attached to the product. |
product.image | string | Primary image URL. |
product.images | array | All image URLs. |
product.options | array | Options a buyer picks (e.g. Size), each with name, position and values. |
product.variants | array | One row per variant: id, title, sku, barcode, price, list_price, currency, available, inventory fields, weight, option values and timestamps. |
product.currency | string | Currency of the prices. |
product.price_min | number | Lowest variant price. |
product.price_max | number | Highest variant price. |
product.available | boolean | Whether any variant is available. |
product.published_at | string | When the product was published. |
product.created_at | string | When the product was created. |
product.updated_at | string | When the product was last updated. |
product.source | string | How the product record was read. |
How to run it
The same lookup works from the app, the API, or as a tool an agent can call mid-task.
Both store_domain and product are required. product accepts a handle (the last part of the product URL) or the full URL. The store domain is the storefront's own domain, not a myshopify.com address.
curl -X POST https://api.neuralverge.ai/functions/v1/run-shopify-products \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "store_domain": "allbirds.com", "product": "mens-tree-runners" }'What teams use it for
Where this field shows up in an actual workflow.
Track current and list price per variant for products you compete with.
Match a store's SKUs and barcodes to your own product data.
See which variants are available at the moment of the request.
Add brand, type, tags and images to a list of product URLs.
Coverage, freshness and limits
What this source covers, how fresh it is, and where it stops.
Products on Shopify-powered storefronts with a public product page.
Read at request time.
This source returns publicly visible product information, stamped with the store and handle it was read from and a session id you can trace.
- —Stock fields (inventory_quantity, inventory_policy and others) are null where the store doesn't expose them.
- —Prices and availability reflect the moment of the request and can change right after.
- —Descriptions and tags are whatever the store set, including internal-looking tags.
Questions, answered
It's the last part of a Shopify product URL, for example mens-tree-runners in /products/mens-tree-runners. You can also paste the full URL.
Related sources
List a store's products to find handles.
Details of a collection the product belongs to.
Products inside a collection.
Amazon, eBay, Walmart, Rakuten, Shopify, Zalando and more: product, seller and review data.
Try shopify product on your own data
One request format across every source in the catalog.