nocode-amazon
v0.0.1
Published
No code Amazon scraper and Amazon API client: search, product, pricing and featured or sponsored placements via ScrapingBee.
Maintainers
Readme
nocode-amazon
Amazon product data for Node, by the job you are trying to do rather than by endpoint.
npm install nocode-amazonNode 16 or newer. One dependency, axios.
const { AmazonScraper } = require('nocode-amazon');
const bee = new AmazonScraper(process.env.SCRAPINGBEE_API_KEY);Grab a key with 1,000 free credits at scrapingbee.com. Auth goes in a header, which the client handles: Authorization: Bearer <key>.
Everything here was executed against the live API on 2026-09-10. Response shapes and credit numbers are recorded output, not documentation summaries.
"I want to know which listings are ads"
The one job CSS selectors cannot do. Amazon gives every result card identical markup, so a scraper looking at HTML sees no difference between a paid slot and rank 3. The API labels each result instead.
const page = await bee.search('fitness tracker', { sortBy: 'featured' });
const ads = AmazonScraper.featured(page); // sorted by ad slot
const earned = AmazonScraper.organic(page); // sorted by organic rank
console.log(`${ads.length} paid, ${earned.length} earned`);
ads.forEach((p) => console.log(p.sponsored_position, p.price, p.title));Two live runs on that query returned 7 ads out of 24 products, then 9 out of 26. Ad density moves between requests, so measure it per run rather than assuming a ratio.
The placement fields on each product: is_sponsored, sponsored_position, organic_position, is_amazons_choice, best_seller, sales_volume.
Careful with is_prime: it read false on every row of both pages, so confirm it against your own category before filtering on it.
"I want the badges too"
AmazonScraper.badged(page).forEach((p) => {
const label = p.is_amazons_choice ? "Amazon's Choice" : 'Best Seller';
console.log(label, p.asin, p.price, p.sales_volume);
});sales_volume comes back as text, for example 10K+ bought in past month.
"I want to price a product and see who is selling it"
Two calls, and they take different parameter names, which is worth knowing before you write the wrapper yourself.
const asin = 'B0GTMTZF3V';
const detail = await bee.product(asin); // sends query=<asin> internally
console.log(detail.brand, detail.price, detail.currency, detail.rating);
// Fitbit 99.99 USD 4.3
const offers = await bee.pricing(asin); // sends asin=<asin> internally
offers.pricing.forEach((o) =>
console.log(o.seller, o.price, o.condition, o.price_shipping)
);The product endpoint wants query. The pricing endpoint wants asin. Send the wrong one and the API tells you precisely which field it wanted:
{"errors": {"query": {"asin": ["Missing data for required field."], "query": ["Unknown field."]}}}That rejection is billed 0 credits. The client throws ScrapingBeeError with the API's own error object on .payload, so you never have to guess.
Use a real ASIN. Pull one from a search response rather than typing one, because a made up ASIN returns "Product not found" and makes your integration look broken.
"I want the full spec sheet"
product() returns 56 top level keys. The ones people reach for:
detail.bullet_points // feature bullets, newline separated
detail.category[0].ladder // breadcrumb steps, each with name and url
detail.product_details // spec table, includes best_sellers_rank
detail.technical_details // the second spec table
detail.rating_stars_distribution // review counts per star
detail.variations // other sizes and colours
detail.featured_merchant // name, seller_id, shipped_from
detail.images // image URLs
detail.delivery // promises with type and date"I want to filter the way Amazon filters"
Search returns Amazon's own facets, so you do not have to build a taxonomy.
const facets = AmazonScraper.facets(page);
Object.keys(facets).length; // 53 groups on 'fitness tracker'
facets.brands; // brand list with counts
facets.battery_average_life; // and every other category specific facetFeed a facet value back through categoryId or merchantId to narrow the next call.
"I want a different marketplace or a different postcode"
await bee.search('kettle', { domain: 'co.uk', currency: 'GBP' });
await bee.search('kettle', { domain: 'de', language: 'de' });
await bee.product(asin, { zipCode: '10001' });domain takes the top level domain: com, co.uk, de, in. zipCode matters more than it looks, because Amazon prices and delivery promises change with the postal code.
Other options: pages, sortBy, categoryId, merchantId, country, device, lightRequest, addHtml, autoselectVariant, screenshot, tag.
"I want to page through more results"
const three = await bee.search('fitness tracker', { pages: 3 });Billed per page, so three pages is 15 credits. One page returned 23 to 26 products.
"I want to know what a run cost"
await bee.search('fitness tracker');
console.log(bee.lastCost); // 5
const acct = await bee.usage(); // free
console.log(acct.used_api_credit, '/', acct.max_api_credit);lastCost reads the spb-cost response header after every call. Measured values:
| Call | Credits |
|---|---|
| Search, default light request | 5 per page |
| Search, lightRequest: false | 15 per page |
| Product | 5 |
| Pricing | 5 |
| Screenshot, any endpoint | 15 |
| Rejected request | 0 |
Light requests skip the browser and are the default. They carried search, product and pricing on every call made here, so only turn them off for content that appears after JavaScript runs, such as review text.
usage() lags by a few minutes, so do not call it straight after a batch to work out what the batch cost. Read lastCost instead.
Plan tiers are at ScrapingBee pricing.
"I do not want to write code at all"
Then you want the Make and Airtable version, which is what this package is named after. The scenario, the extraction rules and the Airtable mapping are in the repo: github.com/ScrapingBee/nocode-amazon. The Make, n8n and Zapier integrations all expose the same call.
Timeouts and retries
The API retries a failing fetch internally for up to 30 seconds, so keep your client timeout above that. The default here is 60 seconds, adjustable:
new AmazonScraper(key, { timeout: 90000 });Scope
Public Amazon listing and product pages. Nothing here signs in, and scraping under login credentials is prohibited by ScrapingBee's terms of service.
Elsewhere
Per target pages worth reading alongside this: Amazon featured products API, Amazon sponsored brands API, Amazon ads API, Amazon best sellers API, Amazon offers API, Amazon review API, Amazon seller API, Amazon ASIN API, Amazon zip code API, Amazon filters API.
Docs: Amazon API reference, Amazon feature page, AI web scraping.
License
MIT
