ASINScope API Documentation
The ASINScope API lets you retrieve detailed Amazon product data (title, brand, UPC, EAN, MPN, imagery, and more) so you can enrich catalogs, validate listings, or power downstream workflows directly from your applications.
Base URL
https://api.asinscope.com
Authentication
- Pass your API key as the
keyquery parameter on every request. - Find your key in the ASINScope API Dashboard after subscribing.
Example
curl --get 'https://api.asinscope.com/products/lookup' \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "asin=B01NAL48FU,B00NNUMI86" \
--data-urlencode "domain=com"
Products Lookup
Endpoint
GET /products/lookup
What it does
Returns product details for up to 10 identifiers per request. Use one identifier type per call:
asin— Amazon ASINsupc— UPC codesean— EAN codes
Parameters (query)
asin|upc|ean(string, required): Comma-separated list of 1–10 codes. Provide only one of these parameters per request.domain(string, optional): Amazon marketplace domain. Default:com. Supported:com,ca,de,fr,it,nl,es,in,uk,jp,au,mx.key(string, required): Your API key.
Sample requests
Lookup by ASIN:
curl --get 'https://api.asinscope.com/products/lookup' \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "asin=B01NAL48FU" \
--data-urlencode "domain=com"
Lookup by UPC:
curl --get 'https://api.asinscope.com/products/lookup' \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "upc=012345678905,098765432109" \
--data-urlencode "domain=com"
Lookup by EAN:
curl --get 'https://api.asinscope.com/products/lookup' \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "ean=4006381333931" \
--data-urlencode "domain=de"
Response
200 OK — JSON payload with product data and token usage info.
{
"items": [
{
"asin": "B088H39PXX",
"ean": "0793610399007",
"upc": "793610399007",
"mpn": "2143",
"bsr": 95,
"category": "Sports & Outdoors",
"brand": "CUKU",
"title": "Magnetic Dart Board - 12pcs Magnetic Darts (Red Green Yellow) - Excellent Indoor Game and Party Games - Magnetic Dart Board Toys Gifts for 5 6 7 8 9 10 11 12 Year Old Boy Kids",
"productGroup": "Sports",
"lowestNewPrice": 22.79,
"lowestFormattedPrice": "$22.79",
"soldByAmazon": false,
"packageDimensions": {
"height": 1.77,
"width": 13.46,
"length": 13.58,
"weight": 2.07
},
"upcList": ["793610399007"],
"eanList": ["0793610399007"],
"totalNew": 2,
"smallImage": "https://images-na.ssl-images-amazon.com/images/I/91we94LQPhL.jpg",
"mediumImage": "https://images-na.ssl-images-amazon.com/images/I/91we94LQPhL.jpg",
"images": [
"https://images-na.ssl-images-amazon.com/images/I/91we94LQPhL.jpg",
"https://images-na.ssl-images-amazon.com/images/I/91WKu-Y+P4L.jpg",
"https://images-na.ssl-images-amazon.com/images/I/91-9rELjLsL.jpg"
]
}
],
"dailyTokensLeft": 9998,
"bucketSize": 119,
"msBeforeNextDailyToken": 82524143,
"consumedTokens": 1
}
Errors
| Status | Description |
|---|---|
400 Bad Request | Missing or malformed parameters (e.g., more than 10 codes, mixed identifier types) |
401 Unauthorized | Invalid or missing API key |
429 Too Many Requests | Rate limit exceeded; retry with backoff |
500 Internal Server Error | Unexpected server issue |
Account Tokens
Endpoint
GET /account/tokens
What it does Returns your current token usage and limits without consuming any tokens. Use this endpoint to check available capacity before making data requests — especially useful when processing jobs from a queue where you want to avoid losing messages if tokens are exhausted.
Parameters (query)
key(string, required): Your API key.
Sample request
curl --get 'https://api.asinscope.com/account/tokens' \
--data-urlencode "key=YOUR_API_KEY"
Response
200 OK — JSON payload with current token status.
{
"dailyTokensLeft": 9812,
"dailyTokensLimit": 10000,
"minutelyTokensLeft": 119,
"minutelyBucketCapacity": 120,
"tokensPerMinute": 60,
"msBeforeNextDailyReset": 82524143
}
| Field | Description |
|---|---|
dailyTokensLeft | Remaining tokens for the current day |
dailyTokensLimit | Maximum daily tokens for your subscription |
minutelyTokensLeft | Current tokens available in the short-term bucket |
minutelyBucketCapacity | Maximum bucket capacity for your subscription |
tokensPerMinute | Rate at which the bucket refills (tokens per minute) |
msBeforeNextDailyReset | Milliseconds until the daily limit resets |
Errors
| Status | Description |
|---|---|
400 Bad Request | Missing API key |
401 Unauthorized | Invalid API key |
403 Forbidden | No active subscription |
Rate Limits
Daily tokens
- Basic: 1,000 tokens/day
- Pro: 10,000 tokens/day
Short-term capacity (rolling bucket)
- Basic: bucket capacity 60 tokens, refill rate 10 tokens/minute
- Pro: bucket capacity 120 tokens, refill rate 60 tokens/minute
How tokens are used
- Each product identifier (ASIN/UPC/EAN) consumes one token.
- Two limits apply:
- Daily limit: If daily tokens are exhausted, responses are
429 Too Many Requestswith{ "error": "The daily requests limit has been reached." }. - Short-term bucket: If the minute bucket is empty, responses are
429 Too Many Requestswith{ "error": "Not enough tokens in the bucket. Restore rate: <rate> / min" }.
- Daily limit: If daily tokens are exhausted, responses are
- Daily tokens reset at the start of the next day; the short-term bucket refills continuously at the listed rate.
Code Samples
Python (requests)
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.asinscope.com/products/lookup"
def lookup_by_asin(asins, domain="com"):
params = {
"key": API_KEY,
"asin": ",".join(asins),
"domain": domain,
}
response = requests.get(BASE_URL, params=params, timeout=30)
response.raise_for_status()
return response.json()
if __name__ == "__main__":
try:
data = lookup_by_asin(["B01NAL48FU", "B00NNUMI86"])
for item in data.get("items", []):
print(item["asin"], item.get("upc"), item.get("ean"))
except requests.HTTPError as err:
if err.response.status_code == 429:
print("Rate limited — wait briefly and retry.")
else:
print(f"Request failed: {err.response.status_code} {err.response.text}")
Node.js (axios)
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.asinscope.com/products/lookup';
async function lookupByUpc(upcs, domain = 'com') {
const params = new URLSearchParams({
key: API_KEY,
upc: upcs.join(','),
domain,
});
const url = `${BASE_URL}?${params.toString()}`;
const response = await axios.get(url, { timeout: 30000 });
return response.data;
}
(async () => {
try {
const data = await lookupByUpc(['012345678905', '098765432109']);
data.items.forEach(item => {
console.log(item.upc, item.title);
});
} catch (err) {
if (err.response?.status === 429) {
console.error('Rate limited — wait briefly and retry.');
} else {
console.error('Request failed:', err.message);
}
}
})();
Tips
- Send at most 10 codes per call and use only one identifier type (
asin,upc, orean) per request. - Always specify
domainif you target a marketplace other thancom. - URL-encode query parameters; using
curl --get --data-urlencodehelps avoid encoding issues. - On
429responses, apply exponential backoff or wait for the bucket to refill before retrying. - If you hit 429s, check the error body to see which limit fired (
Not enough tokens in the bucket...vsThe daily requests limit has been reached.) and adjust usage accordingly.