Amazon Offers API. Offers, page by page.
Every seller's price, condition and delivery for an ASIN. We handle the proxies, blocks and platform changes.
Amazon Offers API at a glance
Returns every seller's offer of an Amazon product, from its link, short link or ASIN, on any Amazon marketplace. Each offer has the seller with its ID, star rating and rating count, the price and list price, the condition with the seller's notes, the shipping fee and delivery dates, and who ships it. The buy box offer comes first, marked featured when Amazon's offers panel pins it; a product nobody sells right now returns an empty list.
GET /v1/amazon/offers
- 1 credit per page, $0.75–$1.97 per 1,000 pages
- 19 typed fields null when unknown
- 11 offers per page, the buy box offer first, then every other offer in Amazon's order: by price plus delivery, lowest first
urlis all it needs, e.g.https://www.amazon.com/dp/B0FQFB8FMG
Send one request. Get up to 11 offers back.
Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.
$ npm install socialtapurl = https://www.amazon.com/dp/B0FQFB8FMGconst params = new URLSearchParams({
url: "https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG",
});
const res = await fetch(`https://socialtap.dev/v1/amazon/offers?${params}`, {
headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, page, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/amazon/offers",
params={"url": "https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG"},
headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, page, meta = body["data"], body["page"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/amazon/offers")
uri.query = URI.encode_www_form('url' => 'https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]<?php
$query = http_build_query([
'url' => 'https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG',
]);
$ch = curl_init('https://socialtap.dev/v1/amazon/offers?' . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("url", "https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/amazon/offers?"+q.Encode(), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data json.RawMessage `json:"data"`
Page json.RawMessage `json:"page"`
Meta map[string]any `json:"meta"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
log.Fatal(err)
}
if body.Error != nil {
log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
}
fmt.Println(string(body.Data), body.Meta["credits_charged"])
}curl -G 'https://socialtap.dev/v1/amazon/offers' \
--data-urlencode 'url=https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": [
{
"approximate_fields": [
"shipping.earliest_delivery_at",
"shipping.latest_delivery_at"
],
"availability": "in_stock",
"condition": "new",
"condition_label": "New",
"country_code": "US",
"currency": "USD",
"id": "B0FQFB8FMG:ATVPDKIKX0DER:new",
"is_featured": true,
"metrics": {
"seller_rating_count": null
},
"original_price": 249,
"platform": "amazon",
"platform_specific": {
"amazon": {
"condition_note": null,
"is_fulfilled_by_amazon": true,
"seller_positive_percent": null,
"ships_from": "Amazon.com"
}
},
"price": 199,
"product_id": "B0FQFB8FMG",
"seller": {
"avatar_url": null,
"display_name": "Amazon.com",
"id": "ATVPDKIKX0DER",
"is_verified": null,
"url": null,
"username": null
},
"seller_rating": null,
"shipping": {
"earliest_delivery_at": "2026-11-15T00:00:00Z",
"fee": 0,
"is_offered": true,
"latest_delivery_at": "2026-11-15T00:00:00Z"
},
"title": null,
"unknown_fields": [],
"url": "https://www.amazon.com/dp/B0FQFB8FMG?smid=ATVPDKIKX0DER"
},
{
"approximate_fields": [
"shipping.earliest_delivery_at",
"shipping.latest_delivery_at"
],
"availability": "in_stock",
"condition": "used",
"condition_label": "Used - Acceptable",
"country_code": "US",
"currency": "USD",
"id": "B0FQFB8FMG:amazon-resale:used-acceptable",
"is_featured": false,
"metrics": {
"seller_rating_count": null
},
"original_price": null,
"platform": "amazon",
"platform_specific": {
"amazon": {
"condition_note": "Minor packaging damage observed during inspection.",
"is_fulfilled_by_amazon": true,
"seller_positive_percent": null,
"ships_from": "Amazon.com"
}
},
"price": 183.08,
"product_id": "B0FQFB8FMG",
"seller": {
"avatar_url": null,
"display_name": "Amazon Resale",
"id": null,
"is_verified": null,
"url": null,
"username": null
},
"seller_rating": null,
"shipping": {
"earliest_delivery_at": "2026-11-15T00:00:00Z",
"fee": 0,
"is_offered": true,
"latest_delivery_at": "2026-11-15T00:00:00Z"
},
"title": null,
"unknown_fields": [],
"url": null
},
{
"approximate_fields": [
"shipping.earliest_delivery_at",
"shipping.latest_delivery_at"
],
"availability": "in_stock",
"condition": "used",
"condition_label": "Used - Good",
"country_code": "US",
"currency": "USD",
"id": "B0FQFB8FMG:amazon-resale:used-good",
"is_featured": false,
"metrics": {
"seller_rating_count": null
},
"original_price": null,
"platform": "amazon",
"platform_specific": {
"amazon": {
"condition_note": "Item may not come in original packaging.",
"is_fulfilled_by_amazon": true,
"seller_positive_percent": null,
"ships_from": "Amazon.com"
}
},
"price": 185.07,
"product_id": "B0FQFB8FMG",
"seller": {
"avatar_url": null,
"display_name": "Amazon Resale",
"id": null,
"is_verified": null,
"url": null,
"username": null
},
"seller_rating": null,
"shipping": {
"earliest_delivery_at": "2026-11-15T00:00:00Z",
"fee": 0,
"is_offered": true,
"latest_delivery_at": "2026-11-15T00:00:00Z"
},
"title": null,
"unknown_fields": [],
"url": null
}
],
"page": {
"has_more": false,
"next_cursor": null,
"next_cursor_expires_at": null,
"end_reason": "end"
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "amazon",
"source": "page",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 0,
"fetched_at": "2026-10-25T12:00:00Z",
"input": {
"kind": "product",
"id": "B0FQFB8FMG",
"url": "https://www.amazon.com/dp/B0FQFB8FMG"
},
"credits_remaining": 9999,
"client_request_id": null,
"warnings": []
}
}import { SocialTap } from "socialtap";
const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY
const res = await client.amazon.offers.list({ url: "https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG" });
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws Exception {
String query = "url=" + encode("https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/amazon/offers?" + query))
.header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
static String encode(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));
var query = string.Join("&",
"url=" + Uri.EscapeDataString("https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG"));
var res = await http.GetAsync("https://socialtap.dev/v1/amazon/offers?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
var error = body.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::Client::new()
.get("https://socialtap.dev/v1/amazon/offers")
.query(&[("url", "https://www.amazon.com/Apple-AirPods-Pro-3/dp/B0FQFB8FMG")])
.header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
.send()?;
let ok = res.status().is_success();
let body: serde_json::Value = res.json()?;
if !ok {
return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
}
println!("{} {}", body["data"], body["meta"]["credits_charged"]);
Ok(())
}200 OK · GET https://socialtap.dev/v1/amazon/offersLong arrays and strings are shortened here. Real responses are complete.Docs What you send and what comes back.
The response reference lists every field, its type and when it is null. See the full schema.
Null means unknown
A field Amazon doesn't show is null, never zero or an empty string, so a real zero always means zero.
What it accepts
The product: its link on any Amazon marketplace (amazon.com/dp/B0FQFB8FMG, with or without the title before /dp/, /gp/product/, /gp/aw/d/, /gp/offer-listing/, /product-reviews/ and the older /exec/obidos/ASIN/ links), a short link (amzn.to, a.co/d/, amzn.eu/d/, amzn.asia/d/, amzn.com), or its ASIN alone (B0FQFB8FMG, or a book's ISBN-10).
What comes back
Every seller's offer of a product: price, condition, availability, shipping fee and delivery estimate, and the seller with its rating.
platformstring- Platform ID (amazon, …).
idstring- The offer's ID: the platform's own where it is stable across fetches, else derived from the product, the seller and the condition (B0FQFB8FMG:ALAQLAKJ574UN:new), with ~2, ~3 for a seller's further offers in one condition, counted across the list's pages in the platform's order. A derived ID is stable while the seller's offers in that condition keep their order; two of them can swap IDs when their order changes.
product_idstring- ID of the product offered (equals product.id of the platform's product endpoints).
urlstring- The offer's own page (the merchant's page, the listing, or the product page with this seller selected); null when the platform has none.
titlestring- The seller's own title for the product, where offers carry one (an eBay listing's, a shop's on Google Shopping); null where every offer shares the product's title.
sellerobject- The seller (a shop on the platform, or a merchant's site on a comparison platform); fields null when not shown.
pricenumber- The offer's price in major units of currency (58.47), discounts applied; shipping and tax excluded. 0 = free; null when not shown.
original_pricenumber- Price before the discount (the struck-through list or earlier price), in major units of currency; null when the offer shows none.
Live data from 33 platforms.
What teams build with the Amazon Offers API.
Find the lowest new or used price
Track who holds the buy box
Monitor resellers of your brand
Compare sellers' ratings and delivery
Good to know before you build.
- The buy box offer comes first on the first page, with is_featured true, when Amazon's offers panel pins it. When the panel pins none and does not say there is none, is_featured is null on every offer. The other offers follow in Amazon's order, by price plus delivery.
- Amazon gives offers no stable ID, so id is built from the product, the seller and the condition. A seller's second offer in the same condition ends in ~2.
- Amazon's own retail is named with its merchant ID, like any other seller, on every marketplace but Turkey, India, Singapore and South Africa. Amazon Resale shows no seller ID, so its seller.id is null.
- Delivery dates are the standard estimate Amazon shows a visitor who is not signed in, as days in approximate_fields. Prime members' faster delivery is not included.
- shipping.fee is null when free delivery depends on the order total, such as free over a minimum.
1 credit per page. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful page | Per 1,000 pages |
|---|---|---|
Public page page | 1 credit | $0.75–$1.97 |
- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.
Questions about the Amazon Offers API.
More in the API reference.
Does it include used and renewed offers?
Which marketplaces does it support?
How much does the Amazon Offers API cost?
How do I get the next page?
Try it on a link you already have.
Paste it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints