Skip to content

Amazon API

The TrueScrape Amazon API exposes 4 public endpoints covering All seller offers for a product, Product details and Search results. Every call is a GET against public, logged-out pages and returns the same unified schema as every other platform here. Calls cost 1–3 credits each. A cache hit is free, and a failed or empty response is never charged.

Endpoints

EndpointReturnsCreditsCacheableBatchable
/v1/amazon/offersAll seller offers for a product3yesyes
/v1/amazon/productProduct details3yesyes
/v1/amazon/searchSearch results3yesyes
/v1/amazon/shopAmazon Shop page1yesyes

Reference

GET/v1/amazon/offers3 creditscacheablebatchable

All seller offers for a product

Every offer on an Amazon listing (price, seller, condition, Prime eligibility and shipping), alongside the product itself.

ParameterTypeRequiredDescription
asinstringyesAmazon ASIN, e.g. "B08N5WRWNW"
tldstringnoMarketplace TLD, default "com". One of: com, co.uk, ca, de, es, fr, ie, it, co.jp, co.za, in, cn, com.sg, com.mx, ae, com.br, nl, com.au, com.tr, sa, se, pl
country_codestringnoBest-effort locale hint (ISO 3166-1 alpha-2).
conditionnew | used_like_new | used_very_good | used_good | used_acceptablenoFilter offers to one condition.

Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).

Returns an object with item, offers.

Fields
FieldTypePresent
itemProductalways
offersOffer[]always
curl
curl "$API/v1/amazon/offers?asin=%3Casin%3E&cache_max_age=7d" \
  -H "x-api-key: $KEY"
TypeScript
const query = new URLSearchParams({
  asin: '<asin>',
  cache_max_age: '7d',
});

const response = await fetch(`${API}/v1/amazon/offers?${query}`, {
  headers: { 'x-api-key': KEY },
});

const body = await response.json();
if (!body.success) throw new Error(body.error.code);

// 3 credits, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);
Python
Python
import os, httpx

r = httpx.get(
    f"{os.environ['API']}/v1/amazon/offers",
    params={
        "asin": "<asin>",
        "cache_max_age": "7d",
    },
    headers={"x-api-key": os.environ["KEY"]},
    timeout=30,
)

body = r.json()
if not body["success"]:
    raise RuntimeError(body["error"]["code"])

print(body["data"], body["meta"]["creditsCharged"])
Response codes
200Success
400invalid_request. Not charged
401missing_api_key / invalid_api_key / revoked_api_key. Never a billing error
402insufficient_credits. The key is valid, the balance is not
429daily_cap_exceeded or upstream_rate_limited. Not charged
501not_configured. This deployment is not set up to serve this endpoint. Not charged.
502upstream_blocked / upstream_schema_drift. Not charged
504upstream_timeout. Not charged
Try it here
GET/v1/amazon/offers
Open the full playground
GET/v1/amazon/product3 creditscacheablebatchable

Product details

Public details for one Amazon listing: title, brand, price, availability, rating, specifications and an inline review sample.

ParameterTypeRequiredDescription
asinstringyesAmazon ASIN, e.g. "B08N5WRWNW"
tldstringnoMarketplace TLD, default "com". One of: com, co.uk, ca, de, es, fr, ie, it, co.jp, co.za, in, cn, com.sg, com.mx, ae, com.br, nl, com.au, com.tr, sa, se, pl
country_codestringnoBest-effort locale hint (ISO 3166-1 alpha-2).

Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).

Returns one Product.

Fields
FieldTypePresentDescription
platformone of 32 stringsalways
idstringalwaysThe product id on its marketplace: the ASIN on Amazon, the item id on Walmart and eBay. Always a string.
titlestring | nullalways
brandstring | nullalways
descriptionstring | nullalways
urlstring | nullalways
imageUrlsstring[]always
pricenumber | nullalwaysThe price a buyer pays now, in `currency`.
currencystring | nullalwaysISO 4217 currency code for the amounts in this record, such as USD or EUR.
listPricenumber | nullalwaysThe struck-through reference price shown next to `price` when the listing shows a discount.
availabilityin_stock | out_of_stock | preorder | discontinued | unknown | nullalwaysStock status. `unknown` means the listing showed a status that could not be read as one of the other values.
ratingnumber | nullalwaysAverage customer rating, out of 5.
reviewCountnumber | nullalwaysNumber of ratings or reviews the marketplace reports for the product, not the number of entries in `reviews`.
sellerNamestring | nullalways
shipsFromstring | nullalwaysThe party the item ships from, as the listing names it.
marketplacestring | nullalwaysThe marketplace site this product was read from, such as `amazon.co.uk`.
categoriesstring[]alwaysCategory breadcrumb, from the broadest category to the most specific.
featureBulletsstring[]always
attributesRecord<string, string>alwaysSpecifications as label and value pairs. Which labels appear varies by marketplace and category.
reviewsProductReview[]alwaysA sample of reviews shown on the product page, not the full review list.
fetchedAtstringalwaysWhen this record was retrieved, as an ISO 8601 timestamp.
curl
curl "$API/v1/amazon/product?asin=%3Casin%3E&cache_max_age=7d" \
  -H "x-api-key: $KEY"
TypeScript
const query = new URLSearchParams({
  asin: '<asin>',
  cache_max_age: '7d',
});

const response = await fetch(`${API}/v1/amazon/product?${query}`, {
  headers: { 'x-api-key': KEY },
});

const body = await response.json();
if (!body.success) throw new Error(body.error.code);

// 3 credits, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);
Python
Python
import os, httpx

r = httpx.get(
    f"{os.environ['API']}/v1/amazon/product",
    params={
        "asin": "<asin>",
        "cache_max_age": "7d",
    },
    headers={"x-api-key": os.environ["KEY"]},
    timeout=30,
)

body = r.json()
if not body["success"]:
    raise RuntimeError(body["error"]["code"])

print(body["data"], body["meta"]["creditsCharged"])
Response codes
200Success
400invalid_request. Not charged
401missing_api_key / invalid_api_key / revoked_api_key. Never a billing error
402insufficient_credits. The key is valid, the balance is not
429daily_cap_exceeded or upstream_rate_limited. Not charged
501not_configured. This deployment is not set up to serve this endpoint. Not charged.
502upstream_blocked / upstream_schema_drift. Not charged
504upstream_timeout. Not charged
Try it here
GET/v1/amazon/product
Open the full playground
GET/v1/amazon/shop1 creditcacheablebatchable

Amazon Shop page

A creator's public Amazon storefront: their name, the product links the page exposes, and the storefront feed of idea lists (with Amazon's own item count), shoppable videos (id, title, thumbnail and attached ASINs) and shoppable photos. The first request needs no pageToken and already returns the videos embedded on the page. Pass pagination.cursor back as pageToken, unchanged, with the same shop URL for the next page; a page can carry lists, videos, photos or any mix. A continuation page carries the feed ONLY. Amazon serves it as a fragment with no profile markup, so every identity field (display name, bio, avatar) is null on page two onwards. ASINs are the products the storefront shows attached to an item, which for a long idea list is the first screenful rather than the whole list; itemCount is the true total.

ParameterTypeRequiredDescription
urlstringyesStorefront URL (https://www.amazon.com/shop/<handle>) or just the handle
pageTokenstringnoOpaque page token returned by a previous response for the same shop URL. Pass it back unchanged and do not infer the response type from its value.

Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).

Returns an object with platform, id, handle, displayName, bio, avatarUrl, bannerUrl, url, verified, followerCount, followingCount, postCount, viewCount, likeCount, isPrivate, isBusiness, category, location, externalLinks, createdAt, fetchedAt, storefront.

Fields
FieldTypePresentDescription
platformone of 32 stringsalways
idstringalwaysThe platform's own id for the account, such as a channel id or a numeric user id, always as a string.
handlestring | nullalwaysThe account handle without the leading @. Null when the platform has no handles.
displayNamestring | nullalways
biostring | nullalways
avatarUrlstring | nullalways
bannerUrlstring | nullalways
urlstring | nullalways
verifiedboolean | nullalwaysWhether the platform shows a verification badge on the account. Null where the platform has no public badge or does not expose it.
followerCountnumber | nullalwaysFollowers, subscribers, or the platform's nearest equivalent. Null when the account hides the count or the platform does not expose it.
followingCountnumber | nullalways
postCountnumber | nullalwaysPosts, videos, tracks, repositories, or the platform's nearest equivalent that the account has published.
viewCountnumber | nullalwaysLifetime views across the account, where the platform exposes a total.
likeCountnumber | nullmay be absentTotal likes received across all of the creator's posts. Distinct from `viewCount`. Absent when the platform does not expose it.
isPrivateboolean | nullalways
isBusinessboolean | nullalwaysWhether the platform classifies the account as a business or organisation rather than a person or creator. Null where the platform draws no such line or does not expose it. On Facebook every Page counts, including Pages for public figures.
categorystring | nullalwaysA label the platform attaches to the account, such as a business category, a genre or an account type. What it holds varies by platform.
locationstring | nullalwaysLocation as the platform shows it: a city, a country, a region code or an address, depending on the platform.
externalLinksstring[]alwaysLinks the account lists on its profile, such as a website or other social accounts.
createdAtstring | nullalwaysWhen the account was created. Usually an ISO 8601 timestamp; some platforms expose only the date as shown on the profile.
fetchedAtstringalwaysWhen this record was fetched from the platform, as an ISO 8601 timestamp. A cached response keeps the time of the original fetch.
storefrontobjectalways
storefront.listsobject[]always
storefront.lists[].idstringalways
storefront.lists[].titlestring | nullalways
storefront.lists[].urlstring | nullalways
storefront.lists[].itemCountnumber | nullalways
storefront.lists[].thumbnailUrlstring | nullalways
storefront.videosobject[]always
storefront.videos[].idstringalways
storefront.videos[].titlestring | nullalways
storefront.videos[].urlstring | nullalways
storefront.videos[].thumbnailUrlstring | nullalways
storefront.videos[].asinsstring[]always
storefront.photosobject[]always
storefront.photos[].idstringalways
storefront.photos[].urlstring | nullalways
storefront.photos[].thumbnailUrlstring | nullalways
storefront.photos[].asinsstring[]always
curl
curl "$API/v1/amazon/shop?url=8XkPqR2nLvE&cache_max_age=7d" \
  -H "x-api-key: $KEY"
TypeScript
const query = new URLSearchParams({
  url: '8XkPqR2nLvE',
  cache_max_age: '7d',
});

const response = await fetch(`${API}/v1/amazon/shop?${query}`, {
  headers: { 'x-api-key': KEY },
});

const body = await response.json();
if (!body.success) throw new Error(body.error.code);

// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);
Python
Python
import os, httpx

r = httpx.get(
    f"{os.environ['API']}/v1/amazon/shop",
    params={
        "url": "8XkPqR2nLvE",
        "cache_max_age": "7d",
    },
    headers={"x-api-key": os.environ["KEY"]},
    timeout=30,
)

body = r.json()
if not body["success"]:
    raise RuntimeError(body["error"]["code"])

print(body["data"], body["meta"]["creditsCharged"])
Response codes
200Success
400invalid_request. Not charged
401missing_api_key / invalid_api_key / revoked_api_key. Never a billing error
402insufficient_credits. The key is valid, the balance is not
429daily_cap_exceeded or upstream_rate_limited. Not charged
501not_configured. This deployment is not set up to serve this endpoint. Not charged.
502upstream_blocked / upstream_schema_drift. Not charged
504upstream_timeout. Not charged

Questions

How much does the Amazon API cost?
Calls cost 1–3 credits each. Every endpoint is cacheable, and a cache hit costs nothing. A failed request and an empty result are both free, on every endpoint.
Does the Amazon API need a login or cookies?
No. Every endpoint reads public, logged-out pages only — no account, no cookies, no session. An API key identifies your own TrueScrape account and nothing else.
Can I fetch many Amazon targets in one request?
Yes. 4 of 4 are batchable: one POST to /v1/jobs/batch takes many targets and returns a job id to poll.
Can I watch Amazon endpoints for changes?
Yes, 3 of 4. A subscription polls on your schedule and fires your webhook only when the content changed; the rest carry x-subscribable: false in the spec.