Amazon Product Pricing API: Retrieve Offers and Seller Prices
Learn which Amazon API returns offers by ASIN or seller SKU, how to handle marketplaces and throttling, and how to build reliable price comparisons.
Short answer: use Amazon Selling Partner API (SP-API) Product Pricing. Call getItemOffers when you have an ASIN, or getListingOffers when you have a seller SKU. Always provide the marketplace and item condition; prices are not meaningful without that context. Amazon’s Product Advertising API (PA-API) GetItems can also return offer listings and summaries, but its documentation carries a deprecation notice directing new work toward Creators API, so verify the current migration path and eligibility before building on it.
1. Choose the right Amazon pricing operation
| Need | Operation | Identifier | Scope | Documented default limit |
|---|---|---|---|---|
| Lowest-priced offers for a catalog item | getItemOffers |
ASIN | Offers for one item in a marketplace | 0.5 requests/second, burst 1 |
| Lowest-priced offers for one seller listing | getListingOffers |
Seller SKU | The seller’s listing, qualified by seller ID | 1 request/second, burst 2 |
| Offer listings or summaries through PA-API | GetItems with offer resources |
Item ID/ASIN | Depends on operation, locale, and eligibility | Check the current PA-API plan |
The official SP-API references describe getItemOffers as returning the lowest-priced offers for one ASIN and getListingOffers as returning the lowest-priced offers for one SKU listing. Use the endpoint that matches the identifier you actually own; do not convert a seller SKU into an ASIN or assume that an ASIN identifies one seller’s inventory.
2. SP-API endpoint shapes
Get offers by ASIN
GET https://sellingpartnerapi-na.amazon.com/products/pricing/v0/items/{Asin}/offers
?MarketplaceId={MarketplaceId}
&ItemCondition={ItemCondition}
&CustomerType={CustomerType}
MarketplaceId and ItemCondition are required context for this operation. CustomerType distinguishes consumer and business offers when supported. Replace the regional host with the SP-API host for the region you operate in.
Get offers by seller SKU
GET https://sellingpartnerapi-na.amazon.com/products/pricing/v0/listings/{SellerSKU}/offers
?MarketplaceId={MarketplaceId}
&ItemCondition={ItemCondition}
The SKU is qualified by your SellerId through the SP-API authorization context. URL-encode SKUs that contain spaces, slashes, or other reserved characters.
Both calls require Amazon’s SP-API authentication and authorization. In production, use Amazon’s signing flow or an official/maintained SDK for your language; a plain unsigned request will be rejected.
3. Complete request examples
cURL request template for an ASIN
curl --request GET \
--url 'https://sellingpartnerapi-na.amazon.com/products/pricing/v0/items/B000123456/offers?MarketplaceId=ATVPDKIKX0DER&ItemCondition=New&CustomerType=Consumer' \
--header 'host: sellingpartnerapi-na.amazon.com' \
--header 'x-amz-access-token: YOUR_LWA_ACCESS_TOKEN' \
--header 'x-amz-date: YYYYMMDDTHHMMSSZ' \
--header 'authorization: AWS4-HMAC-SHA256 ...'
The authorization value must be generated with AWS Signature Version 4. Keep tokens and signing keys outside source control.
Python with requests
import os
import requests
host = "sellingpartnerapi-na.amazon.com"
asin = "B000123456"
params = {
"MarketplaceId": "ATVPDKIKX0DER",
"ItemCondition": "New",
"CustomerType": "Consumer",
}
headers = {
"host": host,
"x-amz-access-token": os.environ["LWA_ACCESS_TOKEN"],
# Add the AWS SigV4 Authorization and x-amz-date headers here.
"authorization": os.environ["SP_API_AUTHORIZATION"],
"x-amz-date": os.environ["SP_API_DATE"],
}
url = f"https://{host}/products/pricing/v0/items/{asin}/offers"
response = requests.get(url, params=params, headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
print(data)
Node.js 18+
const host = 'sellingpartnerapi-na.amazon.com';
const asin = 'B000123456';
const query = new URLSearchParams({
MarketplaceId: 'ATVPDKIKX0DER',
ItemCondition: 'New',
CustomerType: 'Consumer'
});
const res = await fetch(
`https://${host}/products/pricing/v0/items/${asin}/offers?${query}`,
{
headers: {
host,
'x-amz-access-token': process.env.LWA_ACCESS_TOKEN,
// Supply SigV4-generated values in real requests.
authorization: process.env.SP_API_AUTHORIZATION,
'x-amz-date': process.env.SP_API_DATE
}
}
);
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
console.log(await res.json());
4. Reading the response correctly
Offer responses contain more than one price. Depending on the operation and resources returned, preserve:
- item price and currency;
- seller or merchant identity;
- condition and availability;
- delivery-related information;
- savings, promotions, or deal details;
- buy-box status;
- offer counts and summary lowest/highest prices.
Store the response timestamp and the marketplace ID beside every value. A lowest offer can change rapidly, and a comparison that drops seller identity or condition cannot be audited later.
Normalize before comparing
- Group records by marketplace and currency.
- Filter to the requested condition (for example, New versus Used).
- Decide whether “price” includes delivery costs, taxes, promotions, or loyalty benefits in your product’s definition.
- Keep merchant and fulfillment fields so users can distinguish offers that are not economically equivalent.
- Display the retrieval time; do not present a cached value as live.
5. PA-API and Creators API
PA-API GetItems can request resources such as Offers.Listings.Price, Offers.Listings.MerchantInfo, Offers.Summaries.HighestPrice, Offers.Summaries.LowestPrice, and Offers.Summaries.OfferCount. Condition and merchant parameters can filter results, although support varies by operation and locale.
Amazon’s PA-API pages state that PA-API will be deprecated on May 15, 2026 and direct readers to Creators API documentation. Treat that as a lifecycle decision: verify your account’s eligibility, the current Creators API migration path, and the exact resources available in your marketplace before starting a new integration.
6. Throttling, retries, and reliability
- Respect the plan: the documented default for
getItemOffersis 0.5 requests/second with burst 1;getListingOffersis 1 request/second with burst 2. Seller-specific higher limits may exist. - Read the limit header: inspect
x-amzn-RateLimit-Limitwhen Amazon returns it instead of hard-coding an assumed quota. - Use bounded exponential backoff: retry throttling and transient 5xx responses with jitter. Do not retry malformed requests or authorization failures indefinitely.
- Cache deliberately: cache by identifier, marketplace, condition, customer type, and a short freshness window. Never reuse a US price for another marketplace.
- Make jobs idempotent: persist the request key and retrieval timestamp so a worker restart does not create duplicate downstream records.
- Monitor partial data: an HTTP success does not guarantee that every requested offer field is present.
7. Common errors and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| 401 or 403 | Missing/expired LWA token, invalid role, or bad SigV4 signature | Refresh the token, verify the SP-API role and seller authorization, and regenerate the signature with the exact host, path, query, and date. |
| 400 validation error | Missing marketplace or condition, invalid enum, or malformed SKU | Check required query parameters, use the marketplace’s valid condition values, and URL-encode the SKU. |
| 429 | Usage-plan limit exceeded | Honor Retry-After when present, apply jittered backoff, reduce concurrency, and inspect x-amzn-RateLimit-Limit. |
| No offers | Item unavailable, condition mismatch, or marketplace mismatch | Confirm the ASIN/SKU, marketplace, condition, and seller authorization. Record the empty result instead of treating it as a zero price. |
| Unexpected response order | Results are not a stable ranking contract | Sort explicitly using your price and tie-breaking rules, while retaining the original seller and offer fields. |
| Prices disagree with the Amazon page | Different customer type, currency, delivery cost, promotion, or freshness | Compare the same marketplace, customer type, condition, and retrieval time; document your total-price calculation. |
8. Performance and cost design
Throughput is usually constrained by Amazon’s usage plan rather than JSON parsing. Queue requests, schedule refreshes by marketplace, and batch your own downstream processing without exceeding the endpoint rate. For large catalogs, prioritize changed or high-value listings, cache recent results, and persist raw responses for debugging.
Your Amazon commercial terms, eligibility, and API access depend on Amazon’s current programs and account requirements. The research for this guide does not establish a universal per-request price, commission, or quota beyond the documented default rate limits, so verify those terms in your account before forecasting costs.
9. Or skip the browser setup
If your workflow also needs a visual record of an Amazon offer page, ScreenshotNeo can capture the URL with one request. Its consent handling removes cookie banners, newsletter popups, and chat widgets before the shot. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, and the response identifies the page verdict and billing status in headers. An MCP server lets Claude, Cursor, and other MCP clients take screenshots. See the ScreenshotNeo API documentation for all options.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' }); const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
ScreenshotNeo includes 1,000 screenshots per month free with no card; paid plans start at $5 for 3,000 screenshots. Create a free ScreenshotNeo account.
10. Implementation checklist
- Choose
getItemOffersfor ASINs andgetListingOffersfor seller SKUs. - Require marketplace and condition in every internal price record.
- Capture customer type when business and consumer offers differ.
- Preserve seller, fulfillment, availability, currency, and retrieval time.
- Implement SigV4/LWA authentication with secret storage.
- Throttle to the documented plan and monitor Amazon’s rate-limit header.
- Use bounded retries and record empty or inaccessible results distinctly.
- Review PA-API’s May 15, 2026 deprecation notice and Creators API migration before new work.
FAQ
Can I get the single lowest Amazon price?
SP-API returns lowest-priced offers for the requested ASIN or seller listing, but “lowest” remains contextual to marketplace, condition, customer type, and the fields your application includes in its comparison.
Should I use an ASIN or SKU?
Use an ASIN to compare offers for a catalog item across merchants. Use a seller SKU to inspect the listing owned by a particular seller.
Can I compare prices across countries?
Yes, after keeping marketplace and currency separate and applying an explicit currency and delivery-cost normalization policy. Never compare raw numbers from different marketplaces.
What if an item ID is invalid?
PA-API documents invalid or inaccessible item IDs in an Errors container, and response order can change. Match results by identifier rather than array position and log those errors for reprocessing.
Is PA-API the safest choice for a new integration?
Check the current migration guidance first: Amazon’s documentation announces deprecation on May 15, 2026 and points developers toward Creators API.


