Amazon products

POSThttps://scrapely.15.204.158.166.sslip.io/api/v1/products
Get 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, standard 3, full 10; include: ["delivery"] adds 3. 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, plus delivery only where it came back. X-Scrapely-Credits is the final charge.

Duration (typical): pulse 10–20 s for 10,000 ASINs; lite 20–35 s for 2,000 ASINs; standard 25–45 s for 2,000 ASINs; full about a minute for 2,000 ASINs. Smaller calls are proportionally faster; include: ["delivery"] makes a call noticeably slower. Allow up to 300 s. Uses one concurrency slot.

Request body application/json

Send the items as asins (Amazon) or the generic ids.

platformstring
Which platform to read. Platforms: amazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (coming soon), ebay (coming soon), target (coming soon), bestbuy (coming soon), 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.
= amazon
marketplacestring
The platform's regional storefront (us, uk, de…); default the platform's main one. Prices come back in its currency.
= us
idsstring[]
The generic name for the item list (asins on Amazon). Send one or the other.
asinsstring[]
1 to 2,000 ASINs; up to 10,000 at tier pulse without include. Upper-cased and de-duplicated; empty strings are ignored. Duplicates are fetched and charged once.
tierstringrequired
pulse (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): Buy-box price, stock and FBA. Built for recurring change-detection sweeps. standard (3 credits per ASIN): Adds title, description, merchant, condition, offer listing id and new/used offer summaries. For repricing. full (10 credits per ASIN): Everything: images, attributes, variations, list price, binding, reviews. For building a listing. 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.
pulse | lite | standard | full
includestring[]
Optional add-ons, billed per ASIN on top of the tier. delivery (+3 credits per ASIN): the buy-box delivery promise for every ok / partial ASIN, any tier. Caps the call at 2,000 ASINs. Charged only for ASINs whose delivery comes back non-null.
{
  "platform": "amazon",
  "marketplace": "us",
  "ids": [
    "string"
  ],
  "asins": [
    "0060094664",
    "B0009KNLV6",
    "BZZZZZZZZZ"
  ],
  "tier": "lite",
  "include": [
    "delivery"
  ]
}
Code samples
cURL
curl -X POST "https://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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.body
Java
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://scrapely.15.204.158.166.sslip.io/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
200 One result per unique ASIN, in request order.
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,
        "inStock": null,
        "availabilityType": null,
        "fulfillerName": null,
        "isFba": null,
        "availabilityMessage": null,
        "condition": null,
        "merchant": null,
        "offerListingId": null
      },
      "title": "string",
      "description": [
        "string"
      ],
      "offers": {
        "newCount": 0,
        "newMinPrice": 0,
        "usedCount": 0,
        "usedMinPrice": 0,
        "refurbishedCount": 0,
        "refurbishedMinPrice": 0,
        "collectibleCount": 0,
        "collectibleMinPrice": 0,
        "currency": "USD"
      },
      "isParent": true,
      "full": {
        "listPrice": 0,
        "currency": "USD",
        "images": [
          null
        ],
        "attributes": {
          "Brand": "Acme",
          "Item Weight": "1.2 Pounds"
        },
        "variationChildren": [
          null
        ],
        "binding": "Paperback",
        "reviews": {
          "count": null,
          "rating": null
        }
      },
      "delivery": {
        "standard": null,
        "fastest": null,
        "isPrime": null,
        "shipsFrom": 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
platformstringrequired
marketplacestringrequired
tierstringrequired
pulse | lite | standard | full
includestring[]
Echoes the add-ons requested; absent without include.
resultsProductResult[]required
One per unique requested ASIN, in request order. Every ASIN appears exactly once.
Show child parameters
asinstringrequired
idstringrequired
The item id as the platform knows it (the ASIN on Amazon).
priceMoney
The featured (buy-box) price, with its currency.
Show child parameters
amountnumberrequired
currencystringrequired
ISO 4217.
availabilityobject
Show child parameters
inStockbooleanrequired
messagestring
sellerobject
Show child parameters
idstring
namestringrequired
fulfillmentobject
Show child parameters
byPlatformbooleanrequired
Shipped by the platform itself (Amazon: FBA).
namestring
urlstring
The product page on the marketplace.
imagesstring[]
statusstringrequired
ok: 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).
ok | partial | not_found | unavailable
fetchedAtstringrequired
buyboxBuybox
Present for ok and partial at lite, standard and full. Never at pulse.
Show child parameters
pricenumber
In currency.
currencystring
ISO 4217: the marketplace's currency. Present with price.
priceDisplaystring
standard + full.
inStockbooleanrequired
At least one option has a price and is not OUT_OF_STOCK.
availabilityTypestring
IN_STOCK, OUT_OF_STOCK, …
fulfillerNamestring
isFbabooleanrequired
fulfillerName starts with "amazon" (case-insensitive).
availabilityMessagestring
standard + full.
conditionstring
standard + full: NEW, USED, PARENT_ASIN, …
merchantobject
standard + full.
offerListingIdstring
standard + full. The buy-box offer listing id, URL-decoded.
titlestring
standard + full.
descriptionstring[]
standard + full: one entry per paragraph.
offersobject
standard + full; pulse has newCount and newMinPrice only (lowest new price from any seller, not necessarily the buy box). Refurbished and collectible fields are full only.
Show child parameters
newCountinteger
newMinPricenumber
usedCountinteger
usedMinPricenumber
refurbishedCountinteger
refurbishedMinPricenumber
collectibleCountinteger
collectibleMinPricenumber
currencystring
ISO 4217 of the min prices; present with any of them.
isParentboolean
standard: a PARENT_ASIN option; full: also no buyable option while variations exist.
fullobject
full only.
Show child parameters
listPricenumber
List (basis) price, in currency.
currencystring
ISO 4217 of listPrice; present with it.
imagesstring[]required
One URL per image variant, hi-res preferred: https://m.media-amazon.com/images/I/{id}.{ext}
attributesobjectrequired
variationChildrenstring[]required
Variation ASINs (children for a parent, siblings for a child).
bindingstring
reviewsobject
deliveryDelivery
Only with include: ["delivery"]. null when there is no promise (see deliveryError); that ASIN's delivery credits are refunded.
Show child parameters
standardDeliveryPromiserequired
The primary promise shown under the buy box.
fastestDeliveryPromise
The "Or fastest delivery" promise, when Amazon offers one.
isPrimeboolean
The buy-box offer is Prime eligible. Absent when Amazon does not say.
shipsFromstring
Where the buy-box offer ships from. Absent when Amazon does not say.
deliveryErrorstring
Only when delivery 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.
not_fetched | no_offer | no_promise | fetch_failed | deadline
statsobjectrequired
Show child parameters
requestedintegerrequired
Unique items after de-dup.
okintegerrequired
Answered in full (charged).
partialintegerrequired
Answered with fields missing (refunded). Always 0 where an answer cannot be partial (offers).
notFoundintegerrequired
The platform says the item does not exist (charged).
unavailableintegerrequired
No answer this time (refunded; retry later).
elapsedMsintegerrequired
deliveryobject
Only with include: ["delivery"].
Show child parameters
requestedintegerrequired
ASINs delivery was asked for (the ok + partial ones).
okintegerrequired
ASINs with a delivery promise (billed).
failedintegerrequired
requested − ok (refunded).
creditsintegerrequired
Credits charged for the call (also X-Scrapely-Credits).
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
402 INSUFFICIENT_CREDITS: nothing was charged.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
501 The platform or marketplace is coming soon. Nothing is charged.
Example
{
  "error": {
    "code": {},
    "message": "Amazon UK is coming soon.",
    "param": "marketplace",
    "docs": "string"
  },
  "coming_soon": {}
}
Schema
errorobjectrequired
Show child parameters
code
messagestring
paramstring
docsstring
coming_soonrequired
POSThttps://scrapely.15.204.158.166.sslip.io/api/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: 5 credits per unique ASIN, reserved up front (402 if your balance cannot cover it); 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.

platformstring
Which platform to read. Platforms: amazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (coming soon), ebay (coming soon), target (coming soon), bestbuy (coming soon), 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.
= amazon
marketplacestring
The platform's regional storefront (us, uk, de…); default the platform's main one. Prices come back in its currency.
= us
idsstring[]
The generic name for the item list (asins on Amazon).
asinsstring[]
1 to 100 ASINs. Upper-cased and de-duplicated; empty strings are ignored. Duplicates are fetched and charged once.
conditionstring
all (default), new, or used (every non-new condition: used, renewed/refurbished, collectible).
new | used | all = all
{
  "platform": "amazon",
  "marketplace": "us",
  "ids": [
    "string"
  ],
  "asins": [
    "B0009KNLV6",
    "BZZZZZZZZZ"
  ],
  "condition": "all"
}
Code samples
cURL
curl -X POST "https://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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.body
Java
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://scrapely.15.204.158.166.sslip.io/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
200 One result per unique ASIN, in request order.
Example
{
  "platform": "amazon",
  "marketplace": "us",
  "results": [
    {
      "id": "B0009KNLV6",
      "asin": "B0009KNLV6",
      "status": "ok",
      "fetchedAt": "2024-01-01T00:00:00Z",
      "buyboxOfferListingId": "string",
      "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
platformstringrequired
marketplacestringrequired
resultsOffersResult[]required
One per unique requested ASIN, in request order.
Show child parameters
idstringrequired
The item id (the ASIN on Amazon).
asinstringrequired
statusstringrequired
ok: 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).
ok | not_found | unavailable
fetchedAtstringrequired
buyboxOfferListingIdstring
The featured offer, when there is one (reported even if condition filters it out of offers).
offersOffer[]required
Featured offer first, then the rest cheapest first. Every offer for the ASIN, up to 31.
Show child parameters
offerListingIdstringrequired
Identifies this exact offer.
pricenumberrequired
In currency.
currencystring
ISO 4217: the currency of the marketplace, for price and shipping.
priceDisplaystring
shippingnumber
In currency; 0 for free delivery; absent when Amazon does not state it.
conditionstringrequired
new, used_like_new, used_very_good, used_good, used_acceptable, refurbished, collectible_*.
conditionNotestring
The seller's condition comment.
sellerobjectrequired
fulfillmentobjectrequired
isBuyboxbooleanrequired
The featured (buy-box) offer.
availabilitystring
deliverystring
The delivery promise as Amazon words it.
statsobjectrequired
Show child parameters
requestedintegerrequired
Unique items after de-dup.
okintegerrequired
Answered in full (charged).
partialintegerrequired
Answered with fields missing (refunded). Always 0 where an answer cannot be partial (offers).
notFoundintegerrequired
The platform says the item does not exist (charged).
unavailableintegerrequired
No answer this time (refunded; retry later).
elapsedMsintegerrequired
creditsintegerrequired
Credits charged for the call (also X-Scrapely-Credits).
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
402 INSUFFICIENT_CREDITS: nothing was charged.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
501 The platform or marketplace is coming soon. Nothing is charged.
Example
{
  "error": {
    "code": {},
    "message": "Amazon UK is coming soon.",
    "param": "marketplace",
    "docs": "string"
  },
  "coming_soon": {}
}
Schema
errorobjectrequired
Show child parameters
code
messagestring
paramstring
docsstring
coming_soonrequired
GEThttps://scrapely.15.204.158.166.sslip.io/api/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 (5 credits unless unavailable). A malformed id is a 400 whose param names the platform's id (asin on Amazon).

Parameters
idstringpathrequired
The item id: on Amazon, the ASIN (10 letters or digits).
conditionstringquery
all (default), new, or used (every non-new condition: used, renewed/refurbished, collectible).
new | used | all = all
platformstringquery
Which platform to read. Platforms: amazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (coming soon), ebay (coming soon), target (coming soon), bestbuy (coming soon), 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.
= amazon
marketplacestringquery
The platform's regional storefront (us, uk, de…); default the platform's main one. Prices come back in its currency.
= us
Code samples
cURL
curl -X GET "https://scrapely.15.204.158.166.sslip.io/api/v1/products/{id}/offers?condition=&platform=&marketplace="
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/products/{id}/offers?condition=&platform=&marketplace=', {
  method: 'GET',
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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://scrapely.15.204.158.166.sslip.io/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.body
Java
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://scrapely.15.204.158.166.sslip.io/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
200 One result, for the ASIN in the path.
Example
{
  "platform": "amazon",
  "marketplace": "us",
  "results": [
    {
      "id": "B0009KNLV6",
      "asin": "B0009KNLV6",
      "status": "ok",
      "fetchedAt": "2024-01-01T00:00:00Z",
      "buyboxOfferListingId": "string",
      "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
platformstringrequired
marketplacestringrequired
resultsOffersResult[]required
One per unique requested ASIN, in request order.
Show child parameters
idstringrequired
The item id (the ASIN on Amazon).
asinstringrequired
statusstringrequired
ok: 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).
ok | not_found | unavailable
fetchedAtstringrequired
buyboxOfferListingIdstring
The featured offer, when there is one (reported even if condition filters it out of offers).
offersOffer[]required
Featured offer first, then the rest cheapest first. Every offer for the ASIN, up to 31.
Show child parameters
offerListingIdstringrequired
Identifies this exact offer.
pricenumberrequired
In currency.
currencystring
ISO 4217: the currency of the marketplace, for price and shipping.
priceDisplaystring
shippingnumber
In currency; 0 for free delivery; absent when Amazon does not state it.
conditionstringrequired
new, used_like_new, used_very_good, used_good, used_acceptable, refurbished, collectible_*.
conditionNotestring
The seller's condition comment.
sellerobjectrequired
fulfillmentobjectrequired
isBuyboxbooleanrequired
The featured (buy-box) offer.
availabilitystring
deliverystring
The delivery promise as Amazon words it.
statsobjectrequired
Show child parameters
requestedintegerrequired
Unique items after de-dup.
okintegerrequired
Answered in full (charged).
partialintegerrequired
Answered with fields missing (refunded). Always 0 where an answer cannot be partial (offers).
notFoundintegerrequired
The platform says the item does not exist (charged).
unavailableintegerrequired
No answer this time (refunded; retry later).
elapsedMsintegerrequired
creditsintegerrequired
Credits charged for the call (also X-Scrapely-Credits).
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
402 INSUFFICIENT_CREDITS: nothing was charged.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
501 The platform or marketplace is coming soon. Nothing is charged.
Example
{
  "error": {
    "code": {},
    "message": "Amazon UK is coming soon.",
    "param": "marketplace",
    "docs": "string"
  },
  "coming_soon": {}
}
Schema
errorobjectrequired
Show child parameters
code
messagestring
paramstring
docsstring
coming_soonrequired
Updated