npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

nocode-amazon

v0.0.1

Published

No code Amazon scraper and Amazon API client: search, product, pricing and featured or sponsored placements via ScrapingBee.

Readme

nocode-amazon

Amazon product data for Node, by the job you are trying to do rather than by endpoint.

npm install nocode-amazon

Node 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 facet

Feed 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