curl --request GET \
--url https://api.zinc.com/retailers/checkimport requests
url = "https://api.zinc.com/retailers/check"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.zinc.com/retailers/check', 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/retailers/check",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/retailers/check"
req, _ := http.NewRequest("GET", url, nil)
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/retailers/check")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/retailers/check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"url": "https://www.amazon.com/dp/B08N5WRWNW",
"domain": "amazon.com",
"orderable": true,
"support": "verified",
"retailer": {
"retailer": "amazon",
"brand": "amazon",
"display_name": "Amazon",
"country": "US"
},
"platform": null,
"checkout": {
"guest_checkout": true,
"use_your_account": true
},
"ships_to": ["US"],
"evidence": {
"orders_placed": true,
"last_order_at": "2026-09-18"
},
"support_detail": "Zinc curates this retailer and places a test order here every day; the most recent one succeeded. Order normally.",
"unsupported_reason": null,
"how_to_order": "POST /orders with this URL in products[]; Zinc resolves the retailer from the URL."
}
{
"url": "https://www.hodinkee.com/products/xyz",
"domain": "hodinkee.com",
"orderable": true,
"support": "untested",
"retailer": null,
"platform": null,
"checkout": null,
"ships_to": null,
"evidence": null,
"support_detail": "Zinc has never ordered from this store, but that is not a refusal: go ahead and submit the order, and Zinc will attempt checkout exactly as it does for any other store. Most stores are untested only because no one has asked for them yet — Zinc's catalog lists the retailers it verifies, not the limit of what it can buy from.",
"unsupported_reason": null,
"how_to_order": "POST /orders with this URL in products[]; Zinc resolves the retailer from the URL."
}
{
"url": "https://www.amazon.com/dp/B08N5WRWNW",
"domain": "amazon.com",
"orderable": false,
"support": "unsupported",
"retailer": {
"retailer": "amazon",
"brand": "amazon",
"display_name": "Amazon",
"country": "US"
},
"platform": null,
"checkout": {
"guest_checkout": true,
"use_your_account": true
},
"ships_to": ["US"],
"evidence": {
"orders_placed": true,
"last_order_at": "2026-09-18"
},
"support_detail": "Zinc can order from this store, but not to the country you asked about — it has declared the destinations in `ships_to` and yours is not among them. Re-check with a country it ships to, or ship there instead; the store itself is fine.",
"unsupported_reason": "retailer_country_not_supported",
"how_to_order": "Do not submit this order — `POST /orders` would reject it. See `unsupported_reason` and `support_detail`."
}
Check a Retailer
Ask whether Zinc can buy from a given store URL and ship it to a country — no authentication required.
curl --request GET \
--url https://api.zinc.com/retailers/checkimport requests
url = "https://api.zinc.com/retailers/check"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.zinc.com/retailers/check', 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/retailers/check",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/retailers/check"
req, _ := http.NewRequest("GET", url, nil)
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/retailers/check")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/retailers/check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"url": "https://www.amazon.com/dp/B08N5WRWNW",
"domain": "amazon.com",
"orderable": true,
"support": "verified",
"retailer": {
"retailer": "amazon",
"brand": "amazon",
"display_name": "Amazon",
"country": "US"
},
"platform": null,
"checkout": {
"guest_checkout": true,
"use_your_account": true
},
"ships_to": ["US"],
"evidence": {
"orders_placed": true,
"last_order_at": "2026-09-18"
},
"support_detail": "Zinc curates this retailer and places a test order here every day; the most recent one succeeded. Order normally.",
"unsupported_reason": null,
"how_to_order": "POST /orders with this URL in products[]; Zinc resolves the retailer from the URL."
}
{
"url": "https://www.hodinkee.com/products/xyz",
"domain": "hodinkee.com",
"orderable": true,
"support": "untested",
"retailer": null,
"platform": null,
"checkout": null,
"ships_to": null,
"evidence": null,
"support_detail": "Zinc has never ordered from this store, but that is not a refusal: go ahead and submit the order, and Zinc will attempt checkout exactly as it does for any other store. Most stores are untested only because no one has asked for them yet — Zinc's catalog lists the retailers it verifies, not the limit of what it can buy from.",
"unsupported_reason": null,
"how_to_order": "POST /orders with this URL in products[]; Zinc resolves the retailer from the URL."
}
{
"url": "https://www.amazon.com/dp/B08N5WRWNW",
"domain": "amazon.com",
"orderable": false,
"support": "unsupported",
"retailer": {
"retailer": "amazon",
"brand": "amazon",
"display_name": "Amazon",
"country": "US"
},
"platform": null,
"checkout": {
"guest_checkout": true,
"use_your_account": true
},
"ships_to": ["US"],
"evidence": {
"orders_placed": true,
"last_order_at": "2026-09-18"
},
"support_detail": "Zinc can order from this store, but not to the country you asked about — it has declared the destinations in `ships_to` and yours is not among them. Re-check with a country it ships to, or ship there instead; the store itself is fine.",
"unsupported_reason": "retailer_country_not_supported",
"how_to_order": "Do not submit this order — `POST /orders` would reject it. See `unsupported_reason` and `support_detail`."
}
GET /retailers cannot answer. That endpoint returns the curated catalog, but the order path accepts any reachable store — so a caller holding an arbitrary product URL finds nothing in the list and has no way to tell whether an order would go through. Pass the URL here instead.
No authentication required. Read-only: asking never adds a store to the catalog.
curl "https://api.zinc.com/retailers/check?url=https://www.amazon.com/dp/B08N5WRWNW&country=US"
orderable is the answer. support grades how much evidence Zinc has behind it.
Support tiers
| Tier | Meaning | orderable |
|---|---|---|
verified | Curated, and its daily test order is passing. | true |
active | Real customer orders succeeded here in the last 90 days. | true |
observed | Zinc has attempted orders here. | true |
untested | Never seen — and Zinc will still attempt it. | true |
unsupported | Zinc refuses; unsupported_reason says why. | false |
untested is not a refusal — it means no one has asked for that store yet.
support yourself. support_detail spells out what the tier means and whether to proceed, and how_to_order gives the next step — both are written for this purpose and stay correct if a tier is added.support_detail distinguishes cases the tier alone hides. An observed store that has completed an order before reads “Real customer orders have succeeded at this store before, though none within the last 90 days”, while one that never has says so plainly — most observed stores have never completed an order, and attempts also fail for ordinary reasons like the item being out of stock or over the price cap.
orderable is about the store, not your request
orderable: true does not promise a credential-less order. Where checkout.guest_checkout is false, the store still requires a linked account, and POST /orders will refuse unless you pass retailer_credentials_id. Read both fields to predict a credential-less order.| Field | Meaning |
|---|---|
checkout.guest_checkout | Zinc can check out without a customer account — the store allows guests, or Zinc holds a shared account for it. |
checkout.use_your_account | The customer can supply their own retailer login. |
checkout is null when Zinc has no catalog row for the domain (an untested store). That is an absence of information, not false — a null there would read as a refusal if you treated it as one.
Checking a destination country
country takes an ISO 3166-1 alpha-2 code (US, GB), case-insensitive. Longer spellings such as USA are rejected, and the error names the code to use. Omit it — or send it blank — to skip the shipping check rather than invent a refusal.
This applies the same two gates in the same order as POST /orders, so a check and an order can never disagree about the same URL.
ships_to: null means the store makes no claim either way — not that it is US-only. Auto-catalogued stores carry no country list precisely so the long tail stays orderable everywhere. Only a populated array is a statement about destinations.Refusals
Whenorderable is false, unsupported_reason carries the same error code POST /orders would reject with — see error handling.
unsupported_reason | Meaning |
|---|---|
retailer_not_supported | The store is marked unsupported or retired. |
retailer_country_not_supported | The store ships, but not to the country you asked about. The store itself is fine. |
invalid_product_url | The URL has no registrable domain (an IP, localhost, a bare path). |
Other fields
platformis a hostname heuristic, not a fetch. A Shopify-hosted store is unambiguous from a*.myshopify.comdomain; a custom domain running Shopify reportsnullrather than paying for a page load. Treatnullas “not determined”, not “not Shopify”.evidenceis deliberately coarse — whether Zinc has ever placed an order here, and the date of the last one. Success rates are not exposed. It isnullfor a store with no catalog row.retailer.retaileris the storefront slug (e.g.amazon-de);retailer.brandis the brand slug (e.g.amazon).
{
"url": "https://www.amazon.com/dp/B08N5WRWNW",
"domain": "amazon.com",
"orderable": true,
"support": "verified",
"retailer": {
"retailer": "amazon",
"brand": "amazon",
"display_name": "Amazon",
"country": "US"
},
"platform": null,
"checkout": {
"guest_checkout": true,
"use_your_account": true
},
"ships_to": ["US"],
"evidence": {
"orders_placed": true,
"last_order_at": "2026-09-18"
},
"support_detail": "Zinc curates this retailer and places a test order here every day; the most recent one succeeded. Order normally.",
"unsupported_reason": null,
"how_to_order": "POST /orders with this URL in products[]; Zinc resolves the retailer from the URL."
}
{
"url": "https://www.hodinkee.com/products/xyz",
"domain": "hodinkee.com",
"orderable": true,
"support": "untested",
"retailer": null,
"platform": null,
"checkout": null,
"ships_to": null,
"evidence": null,
"support_detail": "Zinc has never ordered from this store, but that is not a refusal: go ahead and submit the order, and Zinc will attempt checkout exactly as it does for any other store. Most stores are untested only because no one has asked for them yet — Zinc's catalog lists the retailers it verifies, not the limit of what it can buy from.",
"unsupported_reason": null,
"how_to_order": "POST /orders with this URL in products[]; Zinc resolves the retailer from the URL."
}
{
"url": "https://www.amazon.com/dp/B08N5WRWNW",
"domain": "amazon.com",
"orderable": false,
"support": "unsupported",
"retailer": {
"retailer": "amazon",
"brand": "amazon",
"display_name": "Amazon",
"country": "US"
},
"platform": null,
"checkout": {
"guest_checkout": true,
"use_your_account": true
},
"ships_to": ["US"],
"evidence": {
"orders_placed": true,
"last_order_at": "2026-09-18"
},
"support_detail": "Zinc can order from this store, but not to the country you asked about — it has declared the destinations in `ships_to` and yours is not among them. Re-check with a country it ships to, or ship there instead; the store itself is fine.",
"unsupported_reason": "retailer_country_not_supported",
"how_to_order": "Do not submit this order — `POST /orders` would reject it. See `unsupported_reason` and `support_detail`."
}
Query Parameters
A product or store URL, e.g. https://shop.aloyoga.com/products/x
2048Destination country as an ISO 3166-1 alpha-2 code (e.g. 'US', 'GB'). Case-insensitive. Longer spellings such as 'USA' are rejected — the error names the code to use. Omit to skip the shipping check. Runs the same gate POST /orders applies, so the two cannot disagree.
64Response
Successful Response
Can Zinc buy from this store, and ship it where the caller wants?
Zinc will attempt an order here, given whatever the store requires. True for every support tier except unsupported — including untested, a store Zinc has never seen. It is a fact about the store, not about one request: where checkout.guest_checkout is false the store still needs a linked account, so pass retailer_credentials_id to POST /orders or it will refuse. Check both fields to predict a credential-less order.
verified: curated, daily test order passing. active: real orders succeeded in the last 90 days. observed: Zinc has attempted orders here. untested: never seen, and Zinc will still try. unsupported: Zinc refuses; see unsupported_reason.
What support means for this store, in prose, and whether to go ahead. Every orderable tier says so explicitly — untested in particular means 'never seen it, try anyway', which the tier name alone does not convey.
What to do next. Carries the ordering instruction when orderable is true, and tells you not to submit when it is false.
Canonical registrable domain, or null if the URL has none.
Null when Zinc has no catalog row for the domain.
Show child attributes
Show child attributes
Detected storefront platform, e.g. 'shopify'.
How a customer can pay at this store.
Show child attributes
Show child attributes
Declared destination countries. Null means no claim either way — the order path enforces nothing, so do not read it as 'US only'.
What Zinc has actually done at this store.
Deliberately coarse — a boolean and a date. Success rates are a competitive signal.
Show child attributes
Show child attributes
Error code Zinc would refuse with, matching POST /orders.

