Offers
Every offer on a listing (price, shipping, condition, seller, fulfilment, which one holds the buy box), and whether exact offers can still be bought.
Every offer on a listing (price, shipping, condition, seller, fulfilment, which one holds the buy box), and whether exact offers can still be bought.
Endpoints
Method | Path | Does |
|---|---|---|
|
| |
|
| |
|
|
How it works, when to use what, and what it costs: Offers & offer check. Base URL, authentication and errors: Overview.
POST /v1/offers
Get every offer for a list of items.
Every offer for 1 to 100 items on a platform and marketplace (platform default amazon, marketplace default us): price, shipping, condition, seller, FBA and which offer holds the buy box. One result per unique ASIN, in request order. Always 200 for a well-formed request.
Cost per unique ASIN: 1 credit for a listing with one offer or none (and for not_found), 3 for one with more (totalOffers says which). 3 per ASIN is reserved up front (402 if your balance cannot cover it) and the difference refunded; unavailable ASINs are refunded. X-Scrapely-Credits is the final charge.
Depth: every offer for the ASIN, up to 31 (featured offer first, then cheapest first). Duration: a 100-ASIN call usually takes well under a minute; allow up to 180 s. Uses one concurrency slot.
Request body
Name | Type | Required | Description |
|---|---|---|---|
| string | — | Which platform to read. Platforms: |
| string | — | The platform's regional storefront ( |
| string[] | — | The generic name for the item list ( |
| string[] | — | 1 to 100 ASINs. Upper-cased and de-duplicated; empty strings are ignored. Duplicates are fetched and charged once. |
| string | — |
|
Request
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/offers" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "amazon",
"marketplace": "us",
"ids": ["B0009KNLV6", "BZZZZZZZZZ"],
"condition": "all"
}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/offers",
headers=HEADERS,
json={
"platform": "amazon",
"marketplace": "us",
"ids": ["B0009KNLV6", "BZZZZZZZZZ"],
"condition": "all",
},
timeout=180,
)
r.raise_for_status()
data = r.json()const res = await fetch('https://api.scrapelyserp.com/v1/offers', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platform: 'amazon',
marketplace: 'us',
ids: ['B0009KNLV6', 'BZZZZZZZZZ'],
condition: 'all',
}),
signal: AbortSignal.timeout(180_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();Response
- 200 OK
- 400 Bad Request
{
"platform": "amazon",
"marketplace": "us",
"results": [
{
"id": "B0009KNLV6",
"asin": "B0009KNLV6",
"status": "ok",
"fetchedAt": "2026-10-16T14:02:11.402Z",
"buyboxOfferListingId": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=",
"totalOffers": 14,
"offers": [
{
"offerListingId": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=",
"price": 77.43,
"currency": "USD",
"priceDisplay": "$77.43",
"shipping": 0,
"condition": "new",
"seller": {
"id": "ATVPDKIKX0DER",
"name": "Amazon.com"
},
"fulfillment": {
"isFba": true,
"fulfillerName": "Amazon.com"
},
"isBuybox": true,
"delivery": "FREE delivery Tuesday, October 21"
},
{
"offerListingId": "cW1aMWx0dDNPcEdnbUo2UnBQOGJzcFJIVWZPRWlqUiUyRkR1NUwlMkZPRzZTJTJCQ3J6cFk=",
"price": 71.5,
"currency": "USD",
"priceDisplay": "$71.50",
"shipping": 5.99,
"condition": "new",
"seller": {
"id": "A2R2RITDJNW1Q6",
"name": "Retro Lunch Co",
"rating": 4.5,
"ratingCount": 1287
},
"fulfillment": {
"isFba": false,
"fulfillerName": "Retro Lunch Co"
},
"isBuybox": false,
"availability": "Only 3 left in stock - order soon.",
"delivery": "$5.99 delivery October 24 - 28"
}
]
},
{
"id": "BZZZZZZZZZ",
"asin": "BZZZZZZZZZ",
"status": "not_found",
"fetchedAt": "2026-10-16T14:02:10.977Z",
"offers": []
}
],
"stats": {
"requested": 2,
"ok": 1,
"partial": 0,
"notFound": 1,
"unavailable": 0,
"elapsedMs": 2210
},
"credits": 4
}{
"error": {
"code": "INVALID_PARAM",
"message": "At most 100 ASINs per call; split larger lists across calls.",
"param": "ids",
"docs": "/docs/errors#invalid_param"
}
}Responses
Status | Meaning |
|---|---|
| One result per unique ASIN, in request order. |
|
|
|
|
|
|
|
|
|
|
| The platform or marketplace is coming soon. Nothing is charged. |
Response fields
Field | Type | Description |
|---|---|---|
| string | — |
| string | — |
| object[] | One per unique requested ASIN, in request order. |
| string | The item id (the ASIN on Amazon). |
| string | — |
| string |
|
| string (date-time) | When this item was read. |
| string | The featured offer, when there is one (reported even if |
| integer | Offers on the listing in every condition, the buy box included. 1 or less: charged the single-offer rate. At least 0. |
| object[] | Featured offer first, then the rest cheapest first. Every offer for the ASIN, up to 31. |
| object | — |
| integer | Unique items after de-dup. |
| integer | Answered in full (charged). |
| integer | Answered with fields missing (refunded). Always 0 where an answer cannot be partial (offers). |
| integer | The platform says the item does not exist (charged). |
| integer | No answer this time (refunded; retry later). |
| integer | How long the call took, in milliseconds. |
| integer | Credits charged for the call (also |
POST /v1/offers/check
Check whether exact offers can be bought.
For 1 to 2000 offers ({ asin, offerListingId } from /v1/products or /v1/offers): can each exact offer be bought right now. A yes/no per offer: no price, no stock level (use lite for those). Always 200 for a well-formed request.
Cost: 0.5 credit per offer answered, rounded up once per call; reserved up front (402 if your balance cannot cover it), unavailable offers refunded. Duration: 2000 offers usually take 15–20 s; allow up to 120 s. Uses one concurrency slot.
Request body
Name | Type | Required | Description |
|---|---|---|---|
| string | — | Which platform to read. Platforms: |
| string | — | The platform's regional storefront ( |
| object[] | yes | 1 to 2000 offers, each its ASIN and offer listing id as /v1/products ( |
| string | yes | — |
| string | yes | — |
Request
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/offers/check" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "amazon",
"marketplace": "us",
"offers": [
{
"asin": "B0009KNLV6",
"offerListingId": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ="
},
{
"asin": "0060094664",
"offerListingId": "cW1aMWx0dDNPcEdnbUo2UnBQOGJzcFJIVWZPRWlqUiUyRkR1NUwlMkZPRzZTJTJCQ3J6cFk="
}
]
}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/offers/check",
headers=HEADERS,
json={
"platform": "amazon",
"marketplace": "us",
"offers": [
{
"asin": "B0009KNLV6",
"offerListingId": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=",
},
{
"asin": "0060094664",
"offerListingId": "cW1aMWx0dDNPcEdnbUo2UnBQOGJzcFJIVWZPRWlqUiUyRkR1NUwlMkZPRzZTJTJCQ3J6cFk=",
},
],
},
timeout=120,
)
r.raise_for_status()
data = r.json()const res = await fetch('https://api.scrapelyserp.com/v1/offers/check', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platform: 'amazon',
marketplace: 'us',
offers: [
{
asin: 'B0009KNLV6',
offerListingId: 'Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=',
},
{
asin: '0060094664',
offerListingId: 'cW1aMWx0dDNPcEdnbUo2UnBQOGJzcFJIVWZPRWlqUiUyRkR1NUwlMkZPRzZTJTJCQ3J6cFk=',
},
],
}),
signal: AbortSignal.timeout(120_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();Response
- 200 OK
- 400 Bad Request
{
"platform": "amazon",
"marketplace": "us",
"results": [
{
"id": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=",
"asin": "B0009KNLV6",
"offerListingId": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=",
"status": "ok",
"fetchedAt": "2026-10-16T19:02:11.402Z",
"buyable": true
},
{
"id": "cW1aMWx0dDNPcEdnbUo2UnBQOGJzcFJIVWZPRWlqUiUyRkR1NUwlMkZPRzZTJTJCQ3J6cFk=",
"asin": "0060094664",
"offerListingId": "cW1aMWx0dDNPcEdnbUo2UnBQOGJzcFJIVWZPRWlqUiUyRkR1NUwlMkZPRzZTJTJCQ3J6cFk=",
"status": "ok",
"fetchedAt": "2026-10-16T19:02:11.402Z",
"buyable": false
}
],
"stats": {
"requested": 2,
"ok": 2,
"partial": 0,
"notFound": 0,
"unavailable": 0,
"elapsedMs": 1210
},
"credits": 1
}{
"error": {
"code": "MISSING_PARAM",
"message": "Missing required parameter `offers` (an array of offers).",
"param": "offers",
"docs": "/docs/errors#missing_param"
}
}Responses
Status | Meaning |
|---|---|
| One result per unique offer, in request order. |
|
|
|
|
|
|
|
|
|
|
| The platform or marketplace is coming soon. Nothing is charged. |
Response fields
Field | Type | Description |
|---|---|---|
| string | — |
| string | — |
| object[] | One per unique requested id, in request order. |
| string | The offer listing id. |
| string | — |
| string | — |
| string |
|
| string (date-time) | When this item was read. |
| boolean | On |
| object | — |
| integer | Unique items after de-dup. |
| integer | Answered in full (charged). |
| integer | Answered with fields missing (refunded). Always 0 where an answer cannot be partial (offers). |
| integer | The platform says the item does not exist (charged). |
| integer | No answer this time (refunded; retry later). |
| integer | How long the call took, in milliseconds. |
| integer | Credits charged for the call (also |
GET /v1/products/{id}/offers
Get every offer for one item.
A convenience alias for a single-item POST /v1/offers: same response (results holds one entry), same price (1 or 3 credits, nothing when unavailable). A malformed id is a 400 whose param names the platform's id (asin on Amazon).
Path parameters
Name | Type | Required | Description |
|---|---|---|---|
| string | yes | The item id: on Amazon, the ASIN (10 letters or digits). |
Query parameters
Name | Type | Required | Description |
|---|---|---|---|
| string | — |
|
| string | — | Which platform to read. Platforms: |
| string | — | The platform's regional storefront ( |
Request
- cURL
- Python
- Node.js
curl -G "https://api.scrapelyserp.com/v1/products/B0009KNLV6/offers" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-d condition=new \
-d platform=amazon \
-d marketplace=usimport os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.get(
"https://api.scrapelyserp.com/v1/products/B0009KNLV6/offers",
headers=HEADERS,
params={"condition": "new", "platform": "amazon", "marketplace": "us"},
timeout=180,
)
r.raise_for_status()
data = r.json()const res = await fetch(`https://api.scrapelyserp.com/v1/products/B0009KNLV6/offers?${new URLSearchParams({ condition: 'new', platform: 'amazon', marketplace: 'us' })}`, {
headers: { Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}` },
signal: AbortSignal.timeout(180_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();Response
- 200 OK
- 400 Bad Request
{
"platform": "amazon",
"marketplace": "us",
"results": [
{
"id": "B0009KNLV6",
"asin": "B0009KNLV6",
"status": "ok",
"fetchedAt": "2026-10-16T14:02:11.402Z",
"buyboxOfferListingId": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=",
"totalOffers": 14,
"offers": [
{
"offerListingId": "Rk9vX3dqYlR4Q0pZcWt3dmlmZnpPOFZZJTJCUmN3dE92cmlMQ0o0R2ZtS1hYSjdNSmhqWWVEdkQ=",
"price": 77.43,
"currency": "USD",
"priceDisplay": "$77.43",
"shipping": 0,
"condition": "new",
"seller": {
"id": "ATVPDKIKX0DER",
"name": "Amazon.com"
},
"fulfillment": {
"isFba": true,
"fulfillerName": "Amazon.com"
},
"isBuybox": true,
"delivery": "FREE delivery Tuesday, October 21"
},
{
"offerListingId": "cW1aMWx0dDNPcEdnbUo2UnBQOGJzcFJIVWZPRWlqUiUyRkR1NUwlMkZPRzZTJTJCQ3J6cFk=",
"price": 71.5,
"currency": "USD",
"priceDisplay": "$71.50",
"shipping": 5.99,
"condition": "new",
"seller": {
"id": "A2R2RITDJNW1Q6",
"name": "Retro Lunch Co",
"rating": 4.5,
"ratingCount": 1287
},
"fulfillment": {
"isFba": false,
"fulfillerName": "Retro Lunch Co"
},
"isBuybox": false,
"availability": "Only 3 left in stock - order soon.",
"delivery": "$5.99 delivery October 24 - 28"
}
]
}
],
"stats": {
"requested": 1,
"ok": 1,
"partial": 0,
"notFound": 0,
"unavailable": 0,
"elapsedMs": 1630
},
"credits": 3
}{
"error": {
"code": "INVALID_PARAM",
"message": "asin (\"B0009\") is not an ASIN: expected 10 letters or digits, e.g. B0009KNLV6.",
"param": "asin",
"docs": "/docs/errors#invalid_param"
}
}Responses
Status | Meaning |
|---|---|
| One result, for the ASIN in the path. |
|
|
|
|
|
|
|
|
|
|
| The platform or marketplace is coming soon. Nothing is charged. |
Response fields
Field | Type | Description |
|---|---|---|
| string | — |
| string | — |
| object[] | One per unique requested ASIN, in request order. |
| string | The item id (the ASIN on Amazon). |
| string | — |
| string |
|
| string (date-time) | When this item was read. |
| string | The featured offer, when there is one (reported even if |
| integer | Offers on the listing in every condition, the buy box included. 1 or less: charged the single-offer rate. At least 0. |
| object[] | Featured offer first, then the rest cheapest first. Every offer for the ASIN, up to 31. |
| object | — |
| integer | Unique items after de-dup. |
| integer | Answered in full (charged). |
| integer | Answered with fields missing (refunded). Always 0 where an answer cannot be partial (offers). |
| integer | The platform says the item does not exist (charged). |
| integer | No answer this time (refunded; retry later). |
| integer | How long the call took, in milliseconds. |
| integer | Credits charged for the call (also |