curl --request POST \
--url https://api.zinc.com/agent/products/detailsimport requests
url = "https://api.zinc.com/agent/products/details"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.zinc.com/agent/products/details', 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/agent/products/details",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$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/agent/products/details"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.zinc.com/agent/products/details")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/agent/products/details")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyAgent Product Details
Retrieve full product details for a single product, paid per call via the Machine Payments Protocol (MPP).
curl --request POST \
--url https://api.zinc.com/agent/products/detailsimport requests
url = "https://api.zinc.com/agent/products/details"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.zinc.com/agent/products/details', 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/agent/products/details",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$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/agent/products/details"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.zinc.com/agent/products/details")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/agent/products/details")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyPOST /agent/products/details returns the full product details for a specific product on a retailer (amazon or walmart) — title, images, description, specs, and more. It’s the agent-native, MPP-paid counterpart to the authenticated Get Product Details endpoint.
No Zinc account is required. Each call is paid per request via the Machine Payments Protocol (MPP).
Pricing
| Price | $0.01 per call (fixed) |
| Payment | MPP (HTTP 402 challenge-credential flow) |
| Account | Not required |
Caching and freshness
Retailer data is cached. Use these optional query parameters to control freshness:max_age— accept a cached response only if it is no older than this many seconds.newer_than— accept a cached response only if it was retrieved at or after this Unix timestamp.async— return immediately withstatus: "processing"instead of waiting for a fresh fetch. Poll again to retrieve the completed result.
402 Payment Required
If no valid payment credential is provided, the API returns402 Payment Required with one WWW-Authenticate header per payable method (per RFC 9110 §11.6.1). Your MPP client uses these to complete payment and resubmit the request. See the MPP guide for details.Query Parameters
Product identifier (e.g. ASIN)
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

