curl --request GET \
--url https://api.zinc.com/products/{product_id} \
--header 'Authorization: <api-key>'import requests
url = "https://api.zinc.com/products/{product_id}"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.zinc.com/products/{product_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zinc.com/products/{product_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zinc.com/products/{product_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zinc.com/products/{product_id}")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/products/{product_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "completed",
"retailer": "amazon",
"product_id": "B00KFP6NHO",
"asin": "B00KFP6NHO",
"title": "Nuby Garden Fresh Fruitsicle Frozen Pop Tray",
"brand": "Nuby",
"price": 799,
"original_retail_price": 899,
"ship_price": 0,
"stars": 4.4,
"review_count": 829,
"question_count": 44,
"main_image": "https://m.media-amazon.com/images/I/61K0YbuLi-L.jpg",
"images": [
"https://m.media-amazon.com/images/I/61K0YbuLi-L.jpg",
"https://m.media-amazon.com/images/I/81KtOn8ddTL.jpg",
"https://m.media-amazon.com/images/I/71%2BruDKMSoL.jpg"
],
"feature_bullets": [
"Includes four freeze-and-feed popsicle molds with handles shaped for little hands",
"Wide popsicle-holder base catches drips as the popsicle melts",
"6 Months + / BPA Free"
],
"product_description": "Nuby's Garden Fresh Fruitsicle Frozen Popsicle Tray is specially designed for making fresh puree popsicles at home. This set includes four fruitsicle handles and a tray to mold the pops.",
"product_details": [
"Product Dimensions: 5.8 x 5.8 x 4 inches ; 7.8 ounces",
"Shipping Weight: 8.5 ounces",
"UPC: 048526054381",
"Item model number: 5438"
],
"categories": [
"Home & Kitchen",
"Kitchen & Dining",
"Kitchen Utensils & Gadgets",
"Ice Pop Molds"
],
"variant_specifics": [
{
"dimension": "Size",
"value": "1"
}
],
"all_variants": [
{
"product_id": "B00KFP6NHO",
"variant_specifics": [
{
"dimension": "Size",
"value": "1"
}
]
},
{
"product_id": "B00Q3H18EQ",
"variant_specifics": [
{
"dimension": "Size",
"value": "2"
}
]
}
],
"epids": [
{
"type": "MPN",
"value": "5438"
},
{
"type": "UPC",
"value": "048526054381"
},
{
"type": "EAN",
"value": "0048526054381"
}
],
"epids_map": {
"MPN": "5438",
"UPC": "048526054381",
"EAN": "0048526054381"
},
"package_dimensions": {
"weight": {
"amount": 8.5,
"unit": "ounces"
},
"size": {
"width": {
"amount": 4,
"unit": "inches"
},
"depth": {
"amount": 5.8,
"unit": "inches"
},
"length": {
"amount": 5.8,
"unit": "inches"
}
}
},
"aplus_html": "present",
"fresh": false,
"pantry": false,
"handmade": false,
"digital": false,
"buyapi_hint": true,
"timestamp": 1756425600
}Get Product Details
Retrieve product details, images, and attributes from a retailer via the Zinc API.
curl --request GET \
--url https://api.zinc.com/products/{product_id} \
--header 'Authorization: <api-key>'import requests
url = "https://api.zinc.com/products/{product_id}"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.zinc.com/products/{product_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zinc.com/products/{product_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zinc.com/products/{product_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zinc.com/products/{product_id}")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/products/{product_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "completed",
"retailer": "amazon",
"product_id": "B00KFP6NHO",
"asin": "B00KFP6NHO",
"title": "Nuby Garden Fresh Fruitsicle Frozen Pop Tray",
"brand": "Nuby",
"price": 799,
"original_retail_price": 899,
"ship_price": 0,
"stars": 4.4,
"review_count": 829,
"question_count": 44,
"main_image": "https://m.media-amazon.com/images/I/61K0YbuLi-L.jpg",
"images": [
"https://m.media-amazon.com/images/I/61K0YbuLi-L.jpg",
"https://m.media-amazon.com/images/I/81KtOn8ddTL.jpg",
"https://m.media-amazon.com/images/I/71%2BruDKMSoL.jpg"
],
"feature_bullets": [
"Includes four freeze-and-feed popsicle molds with handles shaped for little hands",
"Wide popsicle-holder base catches drips as the popsicle melts",
"6 Months + / BPA Free"
],
"product_description": "Nuby's Garden Fresh Fruitsicle Frozen Popsicle Tray is specially designed for making fresh puree popsicles at home. This set includes four fruitsicle handles and a tray to mold the pops.",
"product_details": [
"Product Dimensions: 5.8 x 5.8 x 4 inches ; 7.8 ounces",
"Shipping Weight: 8.5 ounces",
"UPC: 048526054381",
"Item model number: 5438"
],
"categories": [
"Home & Kitchen",
"Kitchen & Dining",
"Kitchen Utensils & Gadgets",
"Ice Pop Molds"
],
"variant_specifics": [
{
"dimension": "Size",
"value": "1"
}
],
"all_variants": [
{
"product_id": "B00KFP6NHO",
"variant_specifics": [
{
"dimension": "Size",
"value": "1"
}
]
},
{
"product_id": "B00Q3H18EQ",
"variant_specifics": [
{
"dimension": "Size",
"value": "2"
}
]
}
],
"epids": [
{
"type": "MPN",
"value": "5438"
},
{
"type": "UPC",
"value": "048526054381"
},
{
"type": "EAN",
"value": "0048526054381"
}
],
"epids_map": {
"MPN": "5438",
"UPC": "048526054381",
"EAN": "0048526054381"
},
"package_dimensions": {
"weight": {
"amount": 8.5,
"unit": "ounces"
},
"size": {
"width": {
"amount": 4,
"unit": "inches"
},
"depth": {
"amount": 5.8,
"unit": "inches"
},
"length": {
"amount": 5.8,
"unit": "inches"
}
}
},
"aplus_html": "present",
"fresh": false,
"pantry": false,
"handmade": false,
"digital": false,
"buyapi_hint": true,
"timestamp": 1756425600
}Pricing
| Price | $0.01 per call, drawn from your wallet |
| Charged | On each successful call, before any order is placed |
| Empty wallet | 402 with {"detail": "Insufficient wallet balance for data API call"} |
| Sandbox | Free — zn_test_ keys are never metered |
GET /wallet/me rather than retrying into a 402.POST /agent/products/details is the same call at the same price, paid per request instead of from a wallet.
What to pass, and where the price is
retailer | product_id | Price and availability |
|---|---|---|
amazon | ASIN | price is the buy-box price and is often not the cheapest. Use Get Product Offers for every seller’s price. |
walmart | Walmart item id | price, plus Get Product Offers for all sellers. |
bestbuy | bsin, the trailing id in a Best Buy product URL (/product/{slug}/{bsin}) | offers[] lists the price for New and each open-box grade. |
A Shopify store’s domain, e.g. yetch.studio | Product handle, the slug in /products/{handle} | variants[] carries per-variant price and available. |
etsy | Numeric listing id | price in minor units of currency_code (not converted to USD), plus variants[] when the listing exposes them. |
status is the one field every response carries. It is completed when the payload is populated, processing when you passed async=true and the fetch is still running (poll again), and failed when the retailer returned an error, in which case code and message say why.Authorizations
Zinc API key (Bearer zn_...)
Headers
Path Parameters
Query Parameters
Retailer identifier: amazon, amazon_uk, amazon_ca, amazon_de, amazon_mx, amazon_fr, walmart, bestbuy, etsy, or a Shopify store's domain (e.g. retailer=yetch.studio)
Max response age in seconds, at least 31 (mutually exclusive with newer_than)
x >= 31Minimum retrieval timestamp, as a unix time (mutually exclusive with max_age). Windows shorter than 31s are widened to it.
Return immediately with status=processing
Response
Product details. The payload is the retailer's, passed through unmodified, so the exact field set depends on retailer — the schema below lists every field each retailer returns, and the example dropdown shows one real response per retailer. status is always present.
Product details, passed through from the retailer. Common fields are listed first; fields marked with a retailer name are only present in that retailer's payload. Anything the retailer returns that is not listed here is passed through as well.
completed when the payload below is populated. processing when async=true was passed and the fetch is still running — poll again. failed when the retailer returned an error; see code and message.
completed, processing, failed Only on status: failed. Machine-readable error code, e.g. product_not_found, invalid_request.
Only on status: failed. Human-readable explanation.
Retailer that served the payload: amazon, walmart, bestbuy, etsy, or shopify (with the store's hostname in domain).
Identifier you passed in: ASIN (Amazon), item id (Walmart), bsin (Best Buy), product handle (Shopify), or listing id (Etsy).
Product title.
Brand or manufacturer. Shopify: the store's vendor. Etsy: not set — see shop_name.
URL of the primary product image.
URLs of all product images.
Long-form description (Amazon, Walmart, Best Buy). Shopify and Etsy use description.
Long-form description (Shopify, Etsy). Plain text on Etsy; may contain HTML on Shopify.
Price in cents (minor units of currency_code on Etsy). Amazon: the buy-box price, which is not always present and is often not the cheapest offer — use the offers endpoint for pricing. Best Buy: the New condition price. Shopify: the default variant's price.
Average product rating, 0–5 (Amazon, Walmart, Best Buy). Not set on Etsy — see shop_review_average.
Number of product reviews (Amazon, Walmart).
Number of product reviews (Best Buy).
Highlight bullets (Amazon, Walmart, Best Buy).
Specification lines, e.g. Item model number: 5438 (Amazon, Walmart, Best Buy).
Category breadcrumb, broadest first (Amazon, Walmart, Best Buy).
The variant axes and values that identify this product (Amazon, Walmart, Best Buy).
Show child attributes
Show child attributes
Every sibling variant of this product and its identifier (Amazon, Walmart).
Show child attributes
Show child attributes
External product identifiers (Amazon, Walmart, Best Buy).
Show child attributes
Show child attributes
The same identifiers keyed by type, e.g. {"UPC": "048526054381"} (Amazon, Walmart).
Show child attributes
Show child attributes
Unix time the retailer page was retrieved (Amazon, Walmart).
Canonical product URL (Shopify, Etsy).
Whether the product can currently be bought (Shopify, Etsy). Etsy: false while the shop is on vacation even if stock exists — see shop_is_vacation.
Merchant-assigned tags (Shopify, Etsy).
Amazon only. The product's ASIN.
Amazon only. Crossed-out list price in cents, when the retailer shows one.
Amazon only. Shipping price in cents.
Amazon only. Number of customer questions.
Amazon only. Shipping weight and package size.
Show child attributes
Show child attributes
Amazon only. Author names, for books.
Amazon only. present when the listing has A+ marketing content. The HTML itself is not returned.
Amazon only. Amazon Fresh item.
Amazon only. Amazon Pantry item.
Amazon only. Amazon Handmade item.
Amazon only. Digital-only item (software, video, game codes). Zinc cannot order these.
Amazon only. false when the item cannot be ordered through Zinc; true when it might be.
Best Buy only. Numeric SKU, for cross-referencing with search results (which return the SKU as product_id).
Best Buy only. Canonical product URL.
Best Buy only. Price per condition (new plus each open-box grade). For Amazon and Walmart offers use the offers endpoint.
Show child attributes
Show child attributes
Shopify only. Store hostname you passed as retailer.
Shopify only. Product handle (same value as product_id).
Shopify only. The store's numeric product id.
Shopify only. The store's product type.
Shopify only. Cheapest variant price in cents.
Shopify only. Most expensive variant price in cents.
Etsy only. Listing id (same as product_id).
Etsy only. ISO 4217 currency of price, e.g. USD, EUR. Prices are not converted.
Etsy only. Units the shop has in stock.
Etsy only. Listing state: active, inactive, sold_out, expired, …
Etsy only. Materials listed by the shop.
Etsy only. Etsy's category id. No category name is returned.
Etsy only. i_did, someone_else, or collective.
Etsy only. Etsy's production-era bucket, e.g. made_to_order, 2020_2026, before_2006.
Etsy only. Craft supply, not a finished good.
Etsy only. Buyer can request customization.
Etsy only. physical, download, or both. A download has nothing to ship.
Etsy only. Users who favorited the listing.
Etsy only. Listing view count.
Etsy only. Whether the listing has variants at all. When true but variants is empty, Etsy did not expose the inventory matrix.
Etsy only. Selling shop's name.
Etsy only. Selling shop's URL.
Etsy only. The shop's average rating over the past year, 0–5. Null when the shop has no recent reviews.
Etsy only. The shop's review count over the past year.
Etsy only. Shop is on vacation mode.
Shopify and Etsy only. Per-variant price and availability. Amazon and Walmart use variant_specifics / all_variants instead.
Show child attributes
Show child attributes

