The Asin Amazon Offers API tells you who sells a product and at what price, cheapest first, with Amazon's own price and the cheapest new and used offers.
- Offers Already Known — Who sells the product and at what price, as last read, cheapest first, with Amazon's own price and the cheapest new and used offers (used is only known for Amazon's own outlet).
- Read Every Offer from Amazon — Reads the offers on Amazon for 1 credit, refunded if it doesn't answer.
Use it to watch resellers, check Amazon's own price or find the cheapest offer for an ASIN.
| Endpoint | Request | Cost |
|---|---|---|
| Offers Already Known | GET /offers |
Free |
| Read Every Offer from Amazon | POST /offers |
1 credit |
- How it works
- Offers Already Known
- Read Every Offer from Amazon
- Code examples in other languages
- Use cases
- Why Asin?
- FAQ
- Official SDKs
- Related repositories
- Support
- Create an Asin account and copy your API key from your account.
- Call
https://www.asin.dev/api/v1with the headerAuthorization: Bearer YOUR_API_KEY. - Use the result in your app, or let Asin email you when a price moves.
export ASIN_API_KEY="your-api-key"
pip install requests # Python
# TypeScript: Node.js 18+ (native fetch), run with `npx tsx file.ts`Who sells the product and at what price, as last read, cheapest first, with Amazon's own price and the cheapest new and used offers (used is only known for Amazon's own outlet). Free: this never reads Amazon or spends a credit. When nobody read this product's offers yet, the list is empty and fetched_at is null: POST /offers reads them.
GET https://www.asin.dev/api/v1/offers · Free · API reference
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
asin |
query | string | ✅ | 10-character ASIN |
marketplace |
query | string (com, co.uk, de, fr, it, es) |
— | Amazon store, e.g. com for amazon.com |
import os
import requests
API_KEY = os.environ["ASIN_API_KEY"]
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get(
"https://www.asin.dev/api/v1/offers",
headers=HEADERS,
params={
"asin": "B09DFCB66S",
"marketplace": "com",
},
timeout=120,
)
response.raise_for_status()
data = response.json()
print(data)type OffersAlreadyKnown = {
asin?: string;
marketplace?: string;
currency?: string;
fetched_at?: string;
charged?: boolean;
amazon_price?: number;
lowest_new_price?: number;
lowest_used_price?: number;
offers?: {
seller?: string;
seller_id?: string;
price?: number;
amazon?: boolean;
fulfilled_by_amazon?: boolean;
used?: boolean;
delivery_time?: string;
delivery_price?: string;
}[];
};
const headers = { Authorization: `Bearer ${process.env.ASIN_API_KEY!}`, "Content-Type": "application/json" };
const params = new URLSearchParams({
"asin": "B09DFCB66S",
"marketplace": "com",
});
const response = await fetch(`https://www.asin.dev/api/v1/offers?${params}`, { headers });
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const data = (await response.json()) as OffersAlreadyKnown;
console.log(data);Example response from the API reference, abridged.
{
"asin": "B09DFCB66S",
"marketplace": "com",
"currency": "USD",
"fetched_at": "2026-11-03T08:00:12.441Z",
"charged": false,
"amazon_price": 79.99,
"lowest_new_price": 74.5,
"lowest_used_price": 61.2,
"offers": [
{
"seller": "example",
"seller_id": null,
"price": 61.2,
"amazon": false,
"fulfilled_by_amazon": false,
"used": true,
"delivery_time": "Friday, November 6",
"delivery_price": "FREE"
},
{
"seller": "example",
"seller_id": "A10IJ5BG4OYOQ1",
"price": 74.5,
"amazon": false,
"fulfilled_by_amazon": true,
"used": false,
"delivery_time": "Friday, November 6",
"delivery_price": "FREE"
}
]
}| Field | Type | Description |
|---|---|---|
asin |
string | 10-character ASIN |
marketplace |
string | Amazon store |
currency |
string | ISO 4217 code of the marketplace |
fetched_at |
string | When Amazon was read; null when nobody asked yet |
charged |
boolean | Whether this answer used a credit |
amazon_price |
number | Amazon's own offer, when Amazon sells it |
lowest_new_price |
number | Cheapest offer that isn't used |
lowest_used_price |
number | Cheapest used or renewed offer, when Amazon's outlet has one |
offers[] |
object[] | |
offers[].seller |
string | Seller's name |
offers[].seller_id |
string | Amazon's id of the seller |
offers[].price |
number | Price of the offer |
offers[].amazon |
boolean | Sold by Amazon itself |
offers[].fulfilled_by_amazon |
boolean | Shipped by Amazon |
offers[].used |
boolean | Used or renewed |
offers[].delivery_time |
string | Delivery date, as Amazon says it |
offers[].delivery_price |
string | Delivery cost, as Amazon says it |
Reads the offers on Amazon for 1 credit, refunded if it doesn't answer. A read made in the last 3 hours, by anyone, is returned instead, for free (charged: false). The answer is the same as GET /offers.
POST https://www.asin.dev/api/v1/offers · 1 credit · API reference
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
asin |
body | string | ✅ | 10-character ASIN |
marketplace |
body | string (com, co.uk, de, fr, it, es) |
— | Amazon store, e.g. com for amazon.com |
refresh |
body | boolean | — | Read Amazon again unless the last read is under 5 minutes old (1 credit) |
import os
import requests
API_KEY = os.environ["ASIN_API_KEY"]
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
response = requests.post(
"https://www.asin.dev/api/v1/offers",
headers=HEADERS,
json={'asin': 'B09DFCB66S', 'marketplace': 'com'},
timeout=120,
)
response.raise_for_status()
data = response.json()
print(data)type ReadEveryOfferFromAmazon = {
asin?: string;
marketplace?: string;
currency?: string;
fetched_at?: string;
charged?: boolean;
amazon_price?: number;
lowest_new_price?: number;
lowest_used_price?: number;
offers?: {
seller?: string;
seller_id?: string;
price?: number;
amazon?: boolean;
fulfilled_by_amazon?: boolean;
used?: boolean;
delivery_time?: string;
delivery_price?: string;
}[];
};
const headers = { Authorization: `Bearer ${process.env.ASIN_API_KEY!}`, "Content-Type": "application/json" };
const response = await fetch("https://www.asin.dev/api/v1/offers", {
method: "POST",
headers,
body: JSON.stringify({
"asin": "B09DFCB66S",
"marketplace": "com"
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const data = (await response.json()) as ReadEveryOfferFromAmazon;
console.log(data);Example response from the API reference, abridged.
{
"asin": "B09DFCB66S",
"marketplace": "com",
"currency": "USD",
"fetched_at": "2026-11-03T08:00:12.441Z",
"charged": true,
"amazon_price": 79.99,
"lowest_new_price": 74.5,
"lowest_used_price": 61.2,
"offers": [
{
"seller": "example",
"seller_id": null,
"price": 61.2,
"amazon": false,
"fulfilled_by_amazon": false,
"used": true,
"delivery_time": "Friday, November 6",
"delivery_price": "FREE"
},
{
"seller": "example",
"seller_id": "A10IJ5BG4OYOQ1",
"price": 74.5,
"amazon": false,
"fulfilled_by_amazon": true,
"used": false,
"delivery_time": "Friday, November 6",
"delivery_price": "FREE"
}
]
}| Field | Type | Description |
|---|---|---|
asin |
string | 10-character ASIN |
marketplace |
string | Amazon store |
currency |
string | ISO 4217 code of the marketplace |
fetched_at |
string | When Amazon was read; null when nobody asked yet |
charged |
boolean | Whether this answer used a credit |
amazon_price |
number | Amazon's own offer, when Amazon sells it |
lowest_new_price |
number | Cheapest offer that isn't used |
lowest_used_price |
number | Cheapest used or renewed offer, when Amazon's outlet has one |
offers[] |
object[] | |
offers[].seller |
string | Seller's name |
offers[].seller_id |
string | Amazon's id of the seller |
offers[].price |
number | Price of the offer |
offers[].amazon |
boolean | Sold by Amazon itself |
offers[].fulfilled_by_amazon |
boolean | Shipped by Amazon |
offers[].used |
boolean | Used or renewed |
offers[].delivery_time |
string | Delivery date, as Amazon says it |
offers[].delivery_price |
string | Delivery cost, as Amazon says it |
Ready-to-run examples live in examples/; each reads your key from ASIN_API_KEY.
| Language | get-offers |
read-offers |
|---|---|---|
| cURL (Bash) | get_offers.sh | read_offers.sh |
| PHP | get_offers.php | read_offers.php |
| C# | GetOffers.cs | ReadOffers.cs |
| Go | get_offers.go | read_offers.go |
| Java | GetOffersExample.java | ReadOffersExample.java |
| Ruby | get_offers.rb | read_offers.rb |
| Node.js | get_offers.mjs | read_offers.mjs |
- Reseller monitoring — See which sellers offer your products and at what price.
- Cheapest offer — Get the lowest new and used prices for an ASIN.
- Amazon vs sellers — Compare Amazon's own price with third-party offers.
- A watchlist that runs on its own — each product is checked on schedule, from every 5 minutes to every 24 hours depending on the plan.
- Price history for any ASIN — read every price Asin has seen, free and without tracking the product.
- Alerts by email — price drops, target prices and products back in stock.
- Pay for what you check — each price check costs 1 credit (about 30 credits a month for a product checked daily) and failed checks are refunded. Free for 50 products.
- Use it your way — the same API key works with the REST API, the MCP server and the Chrome extension, with official SDKs in 7 languages.
- Copy-paste examples — Python and TypeScript in each README, 7 more languages in
examples/.
Create an Asin account, copy your API key from your account and send it as Authorization: Bearer YOUR_API_KEY with every request to https://www.asin.dev/api/v1. Keys start with asin_.
GET /offers: Free, POST /offers: 1 credit. Asin is free for 50 products; a product checked daily uses about 30 credits a month and failed checks are refunded. See Asin pricing.
GET /offers returns what is already known, for free, and never reads Amazon. POST /offers reads Amazon for 1 credit, refunded if it doesn't answer; a read made in the last 3 hours, by anyone, is returned for free instead (charged: false).
Nobody read this product's offers yet: fetched_at is null. Call POST /offers.
11 marketplaces, set with marketplace: com (default), co.uk, de, fr, it, es, ca, co.jp, com.br, com.mx and in.
Yes: Python, Node.js & TypeScript, Go, PHP, Ruby, Java and .NET, plus a CLI and an MCP server. The examples here use plain HTTP so you can see the raw API.
Any language that can make an HTTP request. This README shows Python and TypeScript; the examples/ folder contains cURL, PHP, C#, Go, Java, Ruby and Node.js.
Use Asin from your own language with a typed client:
| SDK | Package | Install |
|---|---|---|
| Node.js | @asindev/sdk |
npm install @asindev/sdk |
| Python | asindotdev |
pip install asindotdev |
| Go | asin-go |
go get github.com/asindotdev/asin-go |
| .NET | Asin |
dotnet add package Asin |
| Ruby | asindotdev |
gem install asindotdev |
| PHP | asindotdev/sdk |
composer require asindotdev/sdk |
| Java | asin-java |
build from source, see its README |
| CLI | @asindev/cli |
npm install -g @asindev/cli |
| MCP server | @asindev/mcp |
npx -y @asindev/mcp |
- Amazon Price Tracker API
- Amazon Price History API
- Amazon Price Alerts API
- Amazon Search API
- All Asin repositories
- 📚 Read the API reference.
- ✉️ Write to contact@asin.dev.
- 🔑 Get your API key.
Built by Asin. Examples are released under the MIT license.
