Amazon products
https://scrapelyserp.com /api/v1/products Product and buy-box data on a platform and marketplace (platform default amazon, marketplace default us; see GET /v1/platforms for what is live) for 1 to 2,000 ASINs (10,000 at pulse). One result per unique ASIN, in request order, each with a status. Always 200 for a well-formed request, even when every ASIN is unavailable.
Cost per unique ASIN: pulse 0.25, lite 1, full 5. Delivery dates are included in lite and full at no extra cost. The whole call is reserved up front, rounded up once per call (402 if your balance cannot cover it); partial and unavailable ASINs are refunded, so you pay for ok and not_found. X-Scrapely-Credits is the final charge.
Duration (typical): pulse 10–20 s for 10,000 ASINs; lite 35–45 s for 2,000 ASINs; full 60–90 s for 2,000 ASINs. Smaller calls are proportionally faster. Allow up to 300 s. Uses one concurrency slot.
Walmart (platform: "walmart", marketplace us): send 1 to 100 numeric item ids (from walmart.com/ip/<slug>/<id>) as ids; 1 credit per ok or not_found item. Results carry the neutral fields plus walmart (list price, offer, seller type, shipping, brand, UPC, rating, category). Typical: 3–10 s for 100 items.
Best Buy (platform: "bestbuy", marketplace us): send 1 to 1,000 numeric SKUs as ids; 1 credit per ok or not_found SKU (not_found also covers SKUs Best Buy no longer sells). Results carry the neutral fields plus bestbuy (state, regular price, savings, brand, condition, category). Typical: 10–15 s for 1,000 SKUs.
Target (platform: "target", marketplace us): send 1 to 1,000 TCINs (the number after /A- in a product URL) as ids; 1 credit per ok or not_found TCIN. A variation parent answers with its featured variant (target.tcin). Results carry the neutral fields plus target (regular price, shipping, store pickup). Typical: 5–15 s for 1,000 TCINs.
Request body application/json
Send the items as asins (Amazon) or the generic ids.
platformstringamazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (live: us), ebay (coming soon), target (live: us), bestbuy (live: us; coming soon: ca), aliexpress (coming soon). A coming-soon platform or marketplace answers 501 NOT_IMPLEMENTED with "coming_soon": true (nothing charged); an unknown one is a 400 listing the valid values. GET /v1/platforms has the full list.marketplacestringus, uk, de…); default the platform's main one. Prices come back in its currency.idsstring[]asins on Amazon). Send one or the other.asinsstring[]pulse. Upper-cased and de-duplicated; empty strings are ignored. Duplicates are fetched and charged once.tierstringrequiredpulse (0.25 credits per ASIN): New-offer count and lowest new price. The cheapest way to sweep a whole catalogue for change. lite (1 credit per ASIN): Everything about the offer: buy-box price and list price, stock, seller, FBA, offer listing id, offer counts, rating and delivery dates. full (5 credits per ASIN): Lite plus the listing: description, images, attributes, binding, other editions and offer summaries for every condition. Pulse returns no buy box: its lowest new price equals the buy-box price for ~92% of ASINs, so use it to detect change, not as a price. standard was merged into lite: it is still accepted and answered as lite. Walmart has one tier, standard (1 credit per item, the default there): Title, price and list price, stock, seller, fulfilment, shipping, images, brand, UPC, rating and category. Best Buy has one tier, standard (1 credit per SKU, the default there): Title, current and regular price, stock, brand, condition and category. Target has one tier, standard (1 credit per TCIN, the default there): Title, current and regular price, stock, shipping and store pickup.includestring[]["delivery"] changes nothing and costs nothing. Echoed back as include in the response. Any other entry is a 400.{
"platform": "amazon",
"marketplace": "us",
"ids": [
"string"
],
"asins": [
"0060094664",
"B0009KNLV6",
"BZZZZZZZZZ"
],
"tier": "lite",
"include": [
"delivery"
]
}cURL
curl -X POST "https://scrapelyserp.com/api/v1/products" \
-H "Content-Type: application/json" \
-d '{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["0060094664","B0009KNLV6","BZZZZZZZZZ"],"tier":"lite","include":["delivery"]}'TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/products', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({"platform":"amazon","marketplace":"us","ids":["string"],"asins":["0060094664","B0009KNLV6","BZZZZZZZZZ"],"tier":"lite","include":["delivery"]}),
});
const data = await res.json();Python
import requests
res = requests.request(
"POST",
"https://scrapelyserp.com/api/v1/products",
headers={
"Content-Type": "application/json",
},
json={"platform": "amazon", "marketplace": "us", "ids": ["string"], "asins": ["0060094664", "B0009KNLV6", "BZZZZZZZZZ"], "tier": "lite", "include": ["delivery"]},
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
req, _ := http.NewRequest("POST", "https://scrapelyserp.com/api/v1/products", strings.NewReader(`{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["0060094664","B0009KNLV6","BZZZZZZZZZ"],"tier":"lite","include":["delivery"]}`))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapelyserp.com/api/v1/products');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["0060094664","B0009KNLV6","BZZZZZZZZZ"],"tier":"lite","include":["delivery"]}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;Ruby
require 'net/http'
require 'uri'
uri = URI('https://scrapelyserp.com/api/v1/products')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = 'application/json'
req.body = '{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["0060094664","B0009KNLV6","BZZZZZZZZZ"],"tier":"lite","include":["delivery"]}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts res.bodyJava
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://scrapelyserp.com/api/v1/products"))
.header("Content-Type", "application/json")
.method("POST", BodyPublishers.ofString("{\"platform\":\"amazon\",\"marketplace\":\"us\",\"ids\":[\"string\"],\"asins\":[\"0060094664\",\"B0009KNLV6\",\"BZZZZZZZZZ\"],\"tier\":\"lite\",\"include\":[\"delivery\"]}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
Example
{
"platform": "amazon",
"marketplace": "us",
"tier": "pulse",
"include": [
"delivery"
],
"results": [
{
"asin": "B0009KNLV6",
"id": "B0009KNLV6",
"price": {
"amount": null,
"currency": null
},
"availability": {
"inStock": true,
"message": "In Stock"
},
"seller": {
"id": "string",
"name": "string"
},
"fulfillment": {
"byPlatform": true,
"name": "string"
},
"url": "string",
"images": [
"string"
],
"status": "ok",
"fetchedAt": "2024-01-01T00:00:00Z",
"buybox": {
"price": null,
"currency": null,
"priceDisplay": null,
"listPrice": null,
"savings": null,
"deal": null,
"inStock": null,
"availabilityType": null,
"fulfillerName": null,
"isFba": null,
"availabilityMessage": null,
"condition": null,
"merchant": null,
"offerListingId": null
},
"title": "string",
"brand": "Lumen",
"category": "Health and Beauty",
"description": [
"string"
],
"offers": {
"newCount": 0,
"newMinPrice": 0,
"usedCount": 0,
"usedMinPrice": 0,
"refurbishedCount": 0,
"refurbishedMinPrice": 0,
"collectibleCount": 0,
"collectibleMinPrice": 0,
"currency": "USD"
},
"reviews": {
"rating": 4.6,
"count": "1,204"
},
"isParent": true,
"full": {
"images": [
null
],
"attributes": {
"Publisher": "HarperCollins",
"Print length": "208 pages"
},
"variationChildren": [
null
],
"binding": "Paperback"
},
"bestbuy": {
"sku": "6505727",
"state": "available",
"purchasable": true,
"brand": "Sony",
"condition": "new",
"regularPrice": null,
"savings": null,
"onSale": true,
"category": {
"department": null,
"class": null,
"subclass": null
}
},
"walmart": {
"brand": "Mainstays",
"upc": "810004819238",
"modelNumber": "string",
"parentId": "string",
"listPrice": null,
"offerId": "string",
"offerType": "ONLINE_AND_STORE",
"thirdPartySeller": true,
"onlineAvailable": true,
"shipping": {
"standard": null,
"twoDay": null,
"twoDayEligible": null,
"freeOverThreshold": null
},
"maxPerOrder": 0,
"clearance": true,
"preOrder": true,
"condition": "New",
"category": "Home/Appliances/Fans",
"rating": 4.4,
"reviewsCount": 1250,
"size": "string",
"color": "string"
},
"target": {
"tcin": "83887639",
"parentTcin": "1011697103",
"brand": "string",
"priceDisplay": "$399.99",
"regularPrice": 399.99,
"unitPrice": "$0.06/fluid ounce",
"itemType": "Video Game Consoles",
"soldOut": true,
"shipping": {
"status": null,
"free": null,
"minDeliveryDate": null,
"maxDeliveryDate": null
},
"pickup": {
"status": null,
"storeId": null,
"storeName": null,
"quantity": null,
"date": null
},
"sameDayDelivery": {
"status": null
}
},
"delivery": {
"standard": null,
"fastest": null,
"isPrime": null,
"shipsFrom": null,
"freeOver": null,
"currency": null
},
"deliveryError": "not_fetched"
}
],
"stats": {
"requested": 0,
"ok": 0,
"partial": 0,
"notFound": 0,
"unavailable": 0,
"elapsedMs": 0,
"delivery": {
"requested": 0,
"ok": 0,
"failed": 0
}
},
"credits": 3
}Schema
platformstringrequiredmarketplacestringrequiredtierstringrequiredincludestring[]include; absent without it. It changes nothing.resultsProductResult[]requiredShow child parameters
asinstringrequiredidstringrequiredpriceMoneyShow child parameters
amountnumberrequiredcurrencystringrequiredavailabilityobjectShow child parameters
inStockbooleanrequiredmessagestringsellerobjectShow child parameters
idstringnamestringrequiredfulfillmentobjectShow child parameters
byPlatformbooleanrequirednamestringurlstringimagesstring[]statusstringrequiredok: returned with no errors (charged). partial: returned, but some fields could not be read: do not trust price or stock, re-fetch at a higher tier (refunded). not_found: Amazon says the product does not exist: delist, do not retry (charged). unavailable: we could not get an answer this time: retry later, not evidence the ASIN is dead (refunded).fetchedAtstringrequiredbuyboxBuyboxok and partial at lite and full. Never at pulse.Show child parameters
pricenumbercurrency.currencystringprice.priceDisplaystringlistPricenumbercurrency. Only when Amazon shows one above price.savingsobjectlistPrice.dealstringinStockbooleanrequiredavailabilityTypestringfulfillerNamestringisFbabooleanrequiredavailabilityMessagestringconditionstringmerchantobjectofferListingIdstringtitlestringbrandstringcategorystringdescriptionstring[]offersobjectnewCount and newMinPrice only (lowest new price from any seller, not necessarily the buy box); lite adds used; refurbished and collectible are full only.Show child parameters
newCountintegernewMinPricenumberusedCountintegerusedMinPricenumberrefurbishedCountintegerrefurbishedMinPricenumbercollectibleCountintegercollectibleMinPricenumbercurrencystringreviewsobjectShow child parameters
ratingnumbercountstringisParentbooleanfullobjectShow child parameters
imagesstring[]requiredattributesobjectrequiredvariationChildrenstring[]requiredbindingstringbestbuyobjectplatform: "bestbuy"): what Best Buy says beyond the neutral fields.Show child parameters
skustringrequiredstatestringrequiredavailable: can be bought online now (the only state where availability.inStock is true). sold_out: sold out online. in_store_only: only through a store. pre_order, coming_soon: not shipping yet. queue: released in limited drops. unavailable / other: not buyable online at the moment.purchasablebooleanrequiredbrandstringconditionstringregularPriceMoneysavingsMoneyonSalebooleanrequiredcategoryobjectwalmartobjectplatform: "walmart"): what Walmart says beyond the neutral fields. Every field is optional: absent when Walmart does not say.Show child parameters
brandstringupcstringmodelNumberstringparentIdstringlistPriceMoneyprice.offerIdstringofferTypestringthirdPartySellerbooleanonlineAvailablebooleanavailability.inStock for whether it can be bought now.shippingobjectmaxPerOrderintegerclearancebooleanpreOrderbooleanconditionstringcategorystringratingnumberreviewsCountintegersizestringcolorstringtargetobjectplatform: "target"): what Target says beyond the neutral fields. Stock and pickup are for one reference store.Show child parameters
tcinstringrequiredparentTcinstringbrandstringpriceDisplaystringregularPricenumberunitPricestringitemTypestringsoldOutbooleanrequiredshippingobjectpickupobjectsameDayDeliveryobjectdeliveryDeliverydeliveryError). Never at pulse.Show child parameters
standardDeliveryPromiserequiredfastestDeliveryPromiseisPrimebooleantrue; absent otherwise.shipsFromstringfreeOvernumbercurrencystringcost and freeOver; present with either.deliveryErrorstringdelivery is null. not_fetched: the product was not ok/partial. no_offer: no buy-box offer. no_promise: the offer had no delivery date. fetch_failed: we could not get the promise this time (retry later). deadline: the call ran out of time.statsobjectrequiredShow child parameters
requestedintegerrequiredokintegerrequiredpartialintegerrequirednotFoundintegerrequiredunavailableintegerrequiredelapsedMsintegerrequireddeliveryobjectShow child parameters
requestedintegerrequiredokintegerrequiredfailedintegerrequiredcreditsintegerrequiredX-Scrapely-Credits).MISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINSUFFICIENT_CREDITS: nothing was charged.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringExample
{
"error": {
"code": {},
"message": "Amazon UK is coming soon.",
"param": "marketplace",
"docs": "string"
},
"coming_soon": {}
}Schema
errorobjectrequiredShow child parameters
codemessagestringparamstringdocsstringcoming_soonrequiredhttps://scrapelyserp.com /api/v1/offers/check 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 application/json
platformstringamazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (live: us), ebay (coming soon), target (live: us), bestbuy (live: us; coming soon: ca), aliexpress (coming soon). A coming-soon platform or marketplace answers 501 NOT_IMPLEMENTED with "coming_soon": true (nothing charged); an unknown one is a 400 listing the valid values. GET /v1/platforms has the full list.marketplacestringus, uk, de…); default the platform's main one. Prices come back in its currency.offersobject[]requiredasin + buybox.offerListingId) or /v1/offers (asin + offers[].offerListingId) returned them. Both are required. ids is accepted too.Show child parameters
asinstringrequiredofferListingIdstringrequired{
"platform": "amazon",
"marketplace": "us",
"offers": [
{
"asin": "B0009KNLV6",
"offerListingId": "pQ4/z9Lr0sT="
}
]
}cURL
curl -X POST "https://scrapelyserp.com/api/v1/offers/check" \
-H "Content-Type: application/json" \
-d '{"platform":"amazon","marketplace":"us","offers":[{"asin":"B0009KNLV6","offerListingId":"pQ4/z9Lr0sT="}]}'TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/offers/check', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({"platform":"amazon","marketplace":"us","offers":[{"asin":"B0009KNLV6","offerListingId":"pQ4/z9Lr0sT="}]}),
});
const data = await res.json();Python
import requests
res = requests.request(
"POST",
"https://scrapelyserp.com/api/v1/offers/check",
headers={
"Content-Type": "application/json",
},
json={"platform": "amazon", "marketplace": "us", "offers": [{"asin": "B0009KNLV6", "offerListingId": "pQ4/z9Lr0sT="}]},
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
req, _ := http.NewRequest("POST", "https://scrapelyserp.com/api/v1/offers/check", strings.NewReader(`{"platform":"amazon","marketplace":"us","offers":[{"asin":"B0009KNLV6","offerListingId":"pQ4/z9Lr0sT="}]}`))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapelyserp.com/api/v1/offers/check');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"platform":"amazon","marketplace":"us","offers":[{"asin":"B0009KNLV6","offerListingId":"pQ4/z9Lr0sT="}]}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;Ruby
require 'net/http'
require 'uri'
uri = URI('https://scrapelyserp.com/api/v1/offers/check')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = 'application/json'
req.body = '{"platform":"amazon","marketplace":"us","offers":[{"asin":"B0009KNLV6","offerListingId":"pQ4/z9Lr0sT="}]}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts res.bodyJava
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://scrapelyserp.com/api/v1/offers/check"))
.header("Content-Type", "application/json")
.method("POST", BodyPublishers.ofString("{\"platform\":\"amazon\",\"marketplace\":\"us\",\"offers\":[{\"asin\":\"B0009KNLV6\",\"offerListingId\":\"pQ4/z9Lr0sT=\"}]}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
Example
{
"platform": "amazon",
"marketplace": "us",
"results": [
{
"id": "string",
"asin": "string",
"offerListingId": "string",
"status": "ok",
"fetchedAt": "2024-01-01T00:00:00Z",
"buyable": true
}
],
"stats": {
"requested": 0,
"ok": 0,
"partial": 0,
"notFound": 0,
"unavailable": 0,
"elapsedMs": 0
},
"credits": 1
}Schema
platformstringrequiredmarketplacestringrequiredresultsOfferCheckResult[]requiredShow child parameters
idstringrequiredasinstringrequiredofferListingIdstringrequiredstatusstringrequiredok: answered (charged). unavailable: no answer this time (refunded; retry later).fetchedAtstringrequiredbuyablebooleanok: Amazon accepts this exact offer for purchase right now. Scarce, backorder and pre-order offers are buyable; no price or stock level. false does not say why (a gone offer and a mistyped id read the same).statsobjectrequiredShow child parameters
requestedintegerrequiredokintegerrequiredpartialintegerrequirednotFoundintegerrequiredunavailableintegerrequiredelapsedMsintegerrequiredcreditsintegerrequiredX-Scrapely-Credits).MISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINSUFFICIENT_CREDITS: nothing was charged.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringExample
{
"error": {
"code": {},
"message": "Amazon UK is coming soon.",
"param": "marketplace",
"docs": "string"
},
"coming_soon": {}
}Schema
errorobjectrequiredShow child parameters
codemessagestringparamstringdocsstringcoming_soonrequiredhttps://scrapelyserp.com /api/v1/offers 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 application/json
Send the items as asins (Amazon) or the generic ids.
platformstringamazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (live: us), ebay (coming soon), target (live: us), bestbuy (live: us; coming soon: ca), aliexpress (coming soon). A coming-soon platform or marketplace answers 501 NOT_IMPLEMENTED with "coming_soon": true (nothing charged); an unknown one is a 400 listing the valid values. GET /v1/platforms has the full list.marketplacestringus, uk, de…); default the platform's main one. Prices come back in its currency.idsstring[]asins on Amazon).asinsstring[]conditionstringall (default), new, or used (every non-new condition: used, renewed/refurbished, collectible).{
"platform": "amazon",
"marketplace": "us",
"ids": [
"string"
],
"asins": [
"B0009KNLV6",
"BZZZZZZZZZ"
],
"condition": "all"
}cURL
curl -X POST "https://scrapelyserp.com/api/v1/offers" \
-H "Content-Type: application/json" \
-d '{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["B0009KNLV6","BZZZZZZZZZ"],"condition":"all"}'TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/offers', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({"platform":"amazon","marketplace":"us","ids":["string"],"asins":["B0009KNLV6","BZZZZZZZZZ"],"condition":"all"}),
});
const data = await res.json();Python
import requests
res = requests.request(
"POST",
"https://scrapelyserp.com/api/v1/offers",
headers={
"Content-Type": "application/json",
},
json={"platform": "amazon", "marketplace": "us", "ids": ["string"], "asins": ["B0009KNLV6", "BZZZZZZZZZ"], "condition": "all"},
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
req, _ := http.NewRequest("POST", "https://scrapelyserp.com/api/v1/offers", strings.NewReader(`{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["B0009KNLV6","BZZZZZZZZZ"],"condition":"all"}`))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapelyserp.com/api/v1/offers');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["B0009KNLV6","BZZZZZZZZZ"],"condition":"all"}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;Ruby
require 'net/http'
require 'uri'
uri = URI('https://scrapelyserp.com/api/v1/offers')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = 'application/json'
req.body = '{"platform":"amazon","marketplace":"us","ids":["string"],"asins":["B0009KNLV6","BZZZZZZZZZ"],"condition":"all"}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts res.bodyJava
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://scrapelyserp.com/api/v1/offers"))
.header("Content-Type", "application/json")
.method("POST", BodyPublishers.ofString("{\"platform\":\"amazon\",\"marketplace\":\"us\",\"ids\":[\"string\"],\"asins\":[\"B0009KNLV6\",\"BZZZZZZZZZ\"],\"condition\":\"all\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
Example
{
"platform": "amazon",
"marketplace": "us",
"results": [
{
"id": "B0009KNLV6",
"asin": "B0009KNLV6",
"status": "ok",
"fetchedAt": "2024-01-01T00:00:00Z",
"buyboxOfferListingId": "string",
"totalOffers": 0,
"offers": [
{
"offerListingId": null,
"price": null,
"currency": null,
"priceDisplay": null,
"shipping": null,
"condition": null,
"conditionNote": null,
"seller": null,
"fulfillment": null,
"isBuybox": null,
"availability": null,
"delivery": null
}
]
}
],
"stats": {
"requested": 0,
"ok": 0,
"partial": 0,
"notFound": 0,
"unavailable": 0,
"elapsedMs": 0
},
"credits": 5
}Schema
platformstringrequiredmarketplacestringrequiredresultsOffersResult[]requiredShow child parameters
idstringrequiredasinstringrequiredstatusstringrequiredok: the offer list was read (charged; may be empty). not_found: Amazon has no such product (charged). unavailable: we could not get an answer this time, or the call ran out of time (refunded; retry later).fetchedAtstringrequiredbuyboxOfferListingIdstringcondition filters it out of offers).totalOffersintegeroffersOffer[]requiredShow child parameters
offerListingIdstringrequiredpricenumberrequiredcurrency.currencystringprice and shipping.priceDisplaystringshippingnumbercurrency; 0 for free delivery; absent when Amazon does not state it.conditionstringrequirednew, used_like_new, used_very_good, used_good, used_acceptable, refurbished, collectible_*.conditionNotestringsellerobjectrequiredfulfillmentobjectrequiredisBuyboxbooleanrequiredavailabilitystringdeliverystringstatsobjectrequiredShow child parameters
requestedintegerrequiredokintegerrequiredpartialintegerrequirednotFoundintegerrequiredunavailableintegerrequiredelapsedMsintegerrequiredcreditsintegerrequiredX-Scrapely-Credits).MISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINSUFFICIENT_CREDITS: nothing was charged.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringExample
{
"error": {
"code": {},
"message": "Amazon UK is coming soon.",
"param": "marketplace",
"docs": "string"
},
"coming_soon": {}
}Schema
errorobjectrequiredShow child parameters
codemessagestringparamstringdocsstringcoming_soonrequiredhttps://scrapelyserp.com /api/v1/products/{id}/offers 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).
Parameters
idstringpathrequiredconditionstringqueryall (default), new, or used (every non-new condition: used, renewed/refurbished, collectible).platformstringqueryamazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (live: us), ebay (coming soon), target (live: us), bestbuy (live: us; coming soon: ca), aliexpress (coming soon). A coming-soon platform or marketplace answers 501 NOT_IMPLEMENTED with "coming_soon": true (nothing charged); an unknown one is a 400 listing the valid values. GET /v1/platforms has the full list.marketplacestringqueryus, uk, de…); default the platform's main one. Prices come back in its currency.cURL
curl -X GET "https://scrapelyserp.com/api/v1/products/{id}/offers?condition=&platform=&marketplace="TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/products/{id}/offers?condition=&platform=&marketplace=', {
method: 'GET',
});
const data = await res.json();Python
import requests
res = requests.request(
"GET",
"https://scrapelyserp.com/api/v1/products/{id}/offers?condition=&platform=&marketplace=",
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scrapelyserp.com/api/v1/products/{id}/offers?condition=&platform=&marketplace=", nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapelyserp.com/api/v1/products/{id}/offers?condition=&platform=&marketplace=');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;Ruby
require 'net/http'
require 'uri'
uri = URI('https://scrapelyserp.com/api/v1/products/{id}/offers?condition=&platform=&marketplace=')
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts res.bodyJava
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://scrapelyserp.com/api/v1/products/{id}/offers?condition=&platform=&marketplace="))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
Example
{
"platform": "amazon",
"marketplace": "us",
"results": [
{
"id": "B0009KNLV6",
"asin": "B0009KNLV6",
"status": "ok",
"fetchedAt": "2024-01-01T00:00:00Z",
"buyboxOfferListingId": "string",
"totalOffers": 0,
"offers": [
{
"offerListingId": null,
"price": null,
"currency": null,
"priceDisplay": null,
"shipping": null,
"condition": null,
"conditionNote": null,
"seller": null,
"fulfillment": null,
"isBuybox": null,
"availability": null,
"delivery": null
}
]
}
],
"stats": {
"requested": 0,
"ok": 0,
"partial": 0,
"notFound": 0,
"unavailable": 0,
"elapsedMs": 0
},
"credits": 5
}Schema
platformstringrequiredmarketplacestringrequiredresultsOffersResult[]requiredShow child parameters
idstringrequiredasinstringrequiredstatusstringrequiredok: the offer list was read (charged; may be empty). not_found: Amazon has no such product (charged). unavailable: we could not get an answer this time, or the call ran out of time (refunded; retry later).fetchedAtstringrequiredbuyboxOfferListingIdstringcondition filters it out of offers).totalOffersintegeroffersOffer[]requiredShow child parameters
offerListingIdstringrequiredpricenumberrequiredcurrency.currencystringprice and shipping.priceDisplaystringshippingnumbercurrency; 0 for free delivery; absent when Amazon does not state it.conditionstringrequirednew, used_like_new, used_very_good, used_good, used_acceptable, refurbished, collectible_*.conditionNotestringsellerobjectrequiredfulfillmentobjectrequiredisBuyboxbooleanrequiredavailabilitystringdeliverystringstatsobjectrequiredShow child parameters
requestedintegerrequiredokintegerrequiredpartialintegerrequirednotFoundintegerrequiredunavailableintegerrequiredelapsedMsintegerrequiredcreditsintegerrequiredX-Scrapely-Credits).MISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINSUFFICIENT_CREDITS: nothing was charged.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringExample
{
"error": {
"code": {},
"message": "Amazon UK is coming soon.",
"param": "marketplace",
"docs": "string"
},
"coming_soon": {}
}Schema
errorobjectrequiredShow child parameters
codemessagestringparamstringdocsstringcoming_soonrequired