curl --request GET \
--url https://api.zinc.com/products/{product_id}/offers \
--header 'Authorization: <api-key>'import requests
url = "https://api.zinc.com/products/{product_id}/offers"
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}/offers', 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}/offers",
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}/offers"
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}/offers")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/products/{product_id}/offers")
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_bodyGet Product Offers
Retrieve all seller offers and prices for a product from a retailer via the Zinc API.
curl --request GET \
--url https://api.zinc.com/products/{product_id}/offers \
--header 'Authorization: <api-key>'import requests
url = "https://api.zinc.com/products/{product_id}/offers"
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}/offers', 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}/offers",
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}/offers"
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}/offers")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/products/{product_id}/offers")
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_bodyPricing
| 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/offers is the same call at the same price, paid per request instead of from a wallet.
Retailer coverage
retailer | Offers |
|---|---|
amazon | Per-seller offers. marketplace_fulfilled means the offer ships with Prime. |
walmart | Per-seller offers. |
bestbuy | Best Buy prices per condition rather than per seller. Read offers[] on Get Product Details instead. |
| A Shopify store’s domain | Rejected with 400. A storefront has one seller; per-variant price and availability are in variants[] on Get Product Details. |
etsy | Rejected with 400. A listing has one seller; price and variants[] are on Get Product Details. |
price excludes shipping; each entry in shipping_options[] carries its own price.
status is the one field every response carries. It is completed when offers[] 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
Seller offers for the product, passed through from the retailer. status is always present; offers is populated when status is completed.
Every seller's offer for the product, passed through from the retailer. Shopify stores and Etsy listings have a single seller, so they are rejected here and report price and availability on the details endpoint; Best Buy's per-condition prices are on the details endpoint too.
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 offers, e.g. amazon.
Amazon only. The product's ASIN.
One entry per seller offer. Empty when the product has no buyable offers.
Show child attributes
Show child attributes
Unix time the offers were retrieved.

