4.0 KiB
E-commerce APIs — Amazon & Shopify
| Endpoint | Returns |
|---|---|
/scrape/amazon/product |
Single product (price, ratings, variants, other sellers, A+) |
/scrape/amazon/search |
Search results (sponsored + organic) |
/scrape/amazon/seller |
Seller profile |
/scrape/amazon/seller-products |
Seller catalog |
/scrape/shopify/products |
Products from any Shopify store |
/scrape/shopify/collections |
Collections from any Shopify store |
All synchronous GET.
Amazon Product
import requests
resp = requests.get(
"https://api.hasdata.com/scrape/amazon/product",
headers={"x-api-key": API_KEY},
params={"asin": "B0DHJ7SBDR", "domain": "www.amazon.com", "otherSellers": "true"},
timeout=300,
)
| Param | Notes |
|---|---|
asin |
Required.. |
domain |
www.amazon.com (default), .co.uk, .de, .co.jp, … |
language |
Locale per domain. |
deliveryZip |
Affects shipping/availability fields. |
shippingLocation |
2-letter country code. |
otherSellers |
true (default) to include other-seller block. |
Response: top-level requestMetadata + product. The product object's keys (verified live): asin, url, title, brand, isAvailable, primaryFeatures, features, featureBullets, description, badges, breadcrumbs, whatIsInTheBox, variants, totalImages, primaryImage, images, descriptionImages, totalVideos, primaryVideo, videos, specification, reviewsInfo (rating + count + sample reviews live here, not at the root). Pricing fields are surfaced via variants and specification.
Amazon Search
params = {"q": "mechanical keyboard", "domain": "www.amazon.com", "page": 1}
Params: q (required), domain, language, page, deliveryZip, shippingLocation, sortBy.
Amazon Seller / Seller Products
profile = requests.get(
"https://api.hasdata.com/scrape/amazon/seller",
headers={"x-api-key": API_KEY},
params={"sellerId": "A1MNOPQR", "domain": "www.amazon.com"},
timeout=300,
).json()
catalog = requests.get(
"https://api.hasdata.com/scrape/amazon/seller-products",
headers={"x-api-key": API_KEY},
params={"sellerId": "A1MNOPQR", "page": 1},
timeout=300,
).json()
Use cases: counterfeit detection, MAP enforcement, competitor catalog mirroring.
Shopify Products
Works on any Shopify storefront with no authentication.
def shopify_all(store_url):
page, out = 1, []
while True:
batch = requests.get(
"https://api.hasdata.com/scrape/shopify/products",
headers={"x-api-key": API_KEY},
params={"url": store_url, "page": page, "limit": 250},
timeout=300,
).json().get("products", [])
if not batch:
return out
out.extend(batch)
page += 1
| Param | Notes |
|---|---|
url |
Required. Storefront URL. |
limit |
1–250, default 1. Bump to 250 for catalog work. |
page |
1-indexed. |
collection |
Collection handle filter. |
/scrape/shopify/collections has the same shape and returns the collection list.
Patterns
Cross-merchant price comparison
a = requests.get("https://api.hasdata.com/scrape/amazon/search",
headers={"x-api-key": API_KEY},
params={"q": query}, timeout=300).json()
g = requests.get("https://api.hasdata.com/scrape/google/shopping",
headers={"x-api-key": API_KEY},
params={"q": query, "gl": "us"}, timeout=300).json()
Reviews & bestsellers go through Scraper Jobs
The Product API only includes a sample of reviews. For all reviews use the amazon-product-reviews Scraper Job. For bestseller ranks use amazon-bestsellers — there's no synchronous API. See scraper-jobs.md.
Gotchas
- Same ASIN ≠ same product across
domains..comvs.co.ukcan differ. deliveryZipchanges availability. Pass it when stock matters; omit for spec-only scrapes.- Shopify
limitdefaults to 1 — always set 250 for catalog crawls.