Products
POST /v1/products returns price, stock, seller and product details for a list of item ids on one platform and marketplace.
POST /v1/products returns price, stock, seller and product details for a list of item ids on one platform and marketplace.
Request
POST https://api.scrapelyserp.com/v1/products
Authorization: Bearer $SCRAPELY_API_KEY
Content-Type: application/json
{
"platform": "amazon" | "walmart" | "target" | "bestbuy",
"marketplace"?: "us",
"ids": string[],
"tier"?: string
}Field | Type | Description |
|---|---|---|
| string | The retailer: |
| string | The storefront. Default |
| string[], required | The platform's item ids. Duplicates are fetched and charged once. On Amazon, |
| string | The level of detail (Tiers). Required on Amazon ( |
| string[] | Amazon only, kept for compatibility: |
Example
cURL
curl -X POST "https://api.scrapelyserp.com/v1/products" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"target","ids":["83887639","54191097"]}'Python
import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/products",
headers=HEADERS,
json={"platform": "target", "ids": ["83887639", "54191097"]},
timeout=300,
)
r.raise_for_status()
data = r.json()
for item in data["results"]:
print(item["id"], item["status"], (item.get("price") or {}).get("amount"))Node.js
const res = await fetch('https://api.scrapelyserp.com/v1/products', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ platform: 'target', ids: ['83887639', '54191097'] }),
signal: AbortSignal.timeout(300_000),
});
const data = await res.json();
for (const item of data.results) console.log(item.id, item.status, item.price?.amount);Response
{
"platform": "target",
"marketplace": "us",
"tier": "standard",
"results": [
{
"id": "83887639",
"status": "ok",
"fetchedAt": "2026-10-16T21:27:22.940Z",
"title": "Nintendo Switch - OLED Model with White Joy-Con",
"url": "https://www.target.com/p/nintendo-switch-oled-model-with-white-joy-con/-/A-83887639",
"price": {
"amount": 399.99,
"currency": "USD"
},
"availability": {
"inStock": true,
"message": "In stock"
},
"target": {
"tcin": "83887639",
"regularPrice": 399.99,
"…": "…"
}
},
{
"id": "54191097",
"status": "not_found",
"fetchedAt": "2026-10-16T21:27:22.940Z"
}
],
"stats": {
"requested": 2,
"ok": 1,
"partial": 0,
"notFound": 1,
"unavailable": 0,
"elapsedMs": 1345
},
"credits": 2
}Results come back in the order you sent the ids, one per unique id. The envelope, statuses and common fields are described in Responses & statuses; what each platform adds is on its own page.
Per platform
Platform |
| Item id | Tiers (credits per item) | Ids per call | Typical full-size call |
|---|---|---|---|---|---|
| ASIN |
| 10,000 at | pulse: 10–20 s for 10,000 ASINs; lite: 35–45 s for 2,000 ASINs; full: 60–90 s for 2,000 ASINs | |
| item id |
| 100 | 3–10 s for 100 items | |
| TCIN |
| 1,000 | 5–15 s for 1,000 TCINs | |
| SKU |
| 1,000 | 10–15 s for 1,000 SKUs |
More ids than the limit is a 400; split the list across calls. Each call uses one concurrency slot, so for the lowest latency send several smaller calls in parallel. Allow 300 seconds client-side.
Billing
The call reserves unique ids × the tier rate up front (402 if your balance cannot cover it), then refunds every partial and unavailable item. You pay for ok and not_found. See What you pay for.
Errors
HTTP | Code | When |
|---|---|---|
400 |
|
|
400 |
| An unknown |
401 |
| Missing or invalid API key. |
402 |
| Your balance cannot cover the reservation. Nothing was charged. |
429 |
| All your slots are busy, or too many calls per second. Honour |
501 |
| The platform or marketplace is coming soon ( |
An item we could not read is never an HTTP error: it comes back unavailable inside a 200.