curl --request POST \
--url https://api.zinc.com/agent/products/searchimport requests
url = "https://api.zinc.com/agent/products/search"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.zinc.com/agent/products/search', 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/search",
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/search"
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/search")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/agent/products/search")
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_body{
"status": "completed",
"results": [
{
"product_id": "B000NPYY04",
"title": "Nature's Bounty Fish Oil, 1200 mg Omega-3, 200 Rapid Release Softgels",
"image": "https://m.media-amazon.com/images/I/51KGjV22PWL._AC_US218_.jpg",
"brand": "Nature's Bounty",
"price": 1248,
"stars": 4.5,
"num_reviews": 39510,
"num_offers_estimate": 12,
"num_sales": 30000,
"product_details": [
"200 Count (Pack of 1)"
],
"fresh": false,
"prime": true,
"pantry": false,
"addon": false
},
{
"product_id": "B004U3Y9FU",
"title": "Nature Made Burpless Fish Oil 1000 mg Softgels, 150 Count",
"image": "https://m.media-amazon.com/images/I/516F1UWawAL._AC_US218_.jpg",
"brand": "Nature Made",
"price": 1299,
"stars": 4.7,
"num_reviews": 22087,
"num_offers_estimate": 8,
"num_sales": 20000,
"product_details": [
"150 Count (Pack of 1)"
],
"fresh": false,
"prime": true,
"pantry": false,
"addon": false
}
],
"next_page": 2
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Agent Product Search
Search a retailer’s catalog for AI agents, paid per call via the Machine Payments Protocol (MPP).
curl --request POST \
--url https://api.zinc.com/agent/products/searchimport requests
url = "https://api.zinc.com/agent/products/search"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.zinc.com/agent/products/search', 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/search",
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/search"
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/search")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/agent/products/search")
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_body{
"status": "completed",
"results": [
{
"product_id": "B000NPYY04",
"title": "Nature's Bounty Fish Oil, 1200 mg Omega-3, 200 Rapid Release Softgels",
"image": "https://m.media-amazon.com/images/I/51KGjV22PWL._AC_US218_.jpg",
"brand": "Nature's Bounty",
"price": 1248,
"stars": 4.5,
"num_reviews": 39510,
"num_offers_estimate": 12,
"num_sales": 30000,
"product_details": [
"200 Count (Pack of 1)"
],
"fresh": false,
"prime": true,
"pantry": false,
"addon": false
},
{
"product_id": "B004U3Y9FU",
"title": "Nature Made Burpless Fish Oil 1000 mg Softgels, 150 Count",
"image": "https://m.media-amazon.com/images/I/516F1UWawAL._AC_US218_.jpg",
"brand": "Nature Made",
"price": 1299,
"stars": 4.7,
"num_reviews": 22087,
"num_offers_estimate": 8,
"num_sales": 20000,
"product_details": [
"150 Count (Pack of 1)"
],
"fresh": false,
"prime": true,
"pantry": false,
"addon": false
}
],
"next_page": 2
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}POST /agent/products/search searches a single retailer (amazon or walmart) and is the agent-native, MPP-paid counterpart to the authenticated Search Products endpoint. Use it when you want to search one retailer at a time; use Agent Search when you want breadth across every retailer in one call.
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 |
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
Search term
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)
Page number for pagination
Only return items that ship for free (Walmart and Best Buy: ship price of 0). Currently a no-op for Amazon: the upstream search data under-reports Prime, so filtering on it would drop valid items — Amazon results are returned unfiltered. Filtering happens after pagination, so per-page counts vary; use next_page in the response to keep paging — an empty page with a non-null next_page is not the end of results. Rejected for Shopify stores: their search data carries no shipping information, so the filter cannot be honored.
Response
Normalized search results. Common fields are always present; retailer-specific fields are null or omitted for other retailers.
Response from the product search endpoint.
Show child attributes
Show child attributes
Only set on free_shipping searches: the page to request to keep paging. An empty results with a non-null next_page is NOT the end of results — request next_page to continue. None means results are exhausted (or the search was unfiltered).

