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

boltscraper

v1.0.2

Published

Official Node.js SDK for Bolt Scraper — Fast, cloud-native Google Maps, reviews, and website data extraction API.

Downloads

718

Readme

Google Maps Scraper Node.js SDK (boltscraper)

npm version Node versions License: MIT Free Tier

The official Node.js and TypeScript SDK for Bolt Scraper — fast, proxy-free, cloud-native data extraction for Google Maps listings, Google customer reviews, and company websites.

Extract 60+ business attributes (names, phones, direct emails, social profiles, hours, ratings, coordinates) without Puppeteer, Playwright, browser overhead, CAPTCHAs, or IP bans.


Why Developers Use boltscraper

| Feature | Puppeteer / Playwright | Google Places API (New) | Bolt Scraper Node.js SDK | | :--- | :--- | :--- | :--- | | Speed & Setup | Heavy Chromium instances | Complex GCP billing setup | 5 lines of JavaScript/TypeScript | | IP Bans & CAPTCHAs | Constant Cloudflare/Google blocks | None (metered API) | 0% bans (automatic proxy rotation) | | Direct Emails | Requires custom DOM scraping | Not offered (0% returned) | Included (crawls company websites) | | Customer Reviews | Fragile DOM selectors | Max 5 reviews only | Extracts all 5,000+ reviews | | Data Storage | Unstructured text | 30-day cache ban | 100% owned indefinitely | | Pricing | Proxy costs ($50+/mo) | $32 – $65+ per 1k requests | $0 Free tier ($0.38 / 1k on paid) |


Installation

npm install boltscraper

Requires Node.js 18.0.0 or higher (supports native fetch, ESM, and CommonJS).


Quickstart

Get your free API key at app.boltscraper.com (includes 1,000 free lead credits every month).

TypeScript / ES Modules

import { BoltScraper } from "boltscraper";

// Initialize client (or set BOLTSCRAPER_API_KEY environment variable)
const client = new BoltScraper({ apiKey: "bs_live_YOUR_API_KEY" });

// 1. Real-time Google Maps search (~2-4 seconds)
const response = await client.maps.search("Coffee shops in Seattle", 1);

console.log(`Found ${response.total_results || response.data?.length} places:`);
for (const place of response.data || []) {
  console.log(`Name:    ${place.Name}`);
  console.log(`Phone:   ${place.Phone} (${place["Phone Type"]})`);
  console.log(`Website: ${place.Website}`);
  console.log(`Rating:  ${place["Average Rating"]} (${place["Review Count"]} reviews)`);
  console.log("-".repeat(40));
}

CommonJS (Node.js)

const { BoltScraper } = require("boltscraper");

const client = new BoltScraper({ apiKey: process.env.BOLTSCRAPER_API_KEY });

async function run() {
  const response = await client.maps.search("Plumbers in Austin, TX");
  console.log(response.data);
}
run();

Core Capabilities & Examples

1. Synchronous Real-time Maps Search

Ideal for live search bars, agentic AI tool calling, and instant results without polling:

const results = await client.maps.search({
  keyword: "Dentists in Austin, TX",
  page: 1,
  hl: "en"
});

for (const lead of results.data || []) {
  console.log(lead.Name, lead["Full Address"], lead.Coordinates);
}

2. Large-Scale Asynchronous Batch Jobs

Scrape entire cities or hundreds of queries with automatic website email enrichment:

// Launch background scraping job
const job = await client.maps.createJob({
  keywords: ["Roofers in Miami, FL", "Solar contractors in Miami, FL"],
  title: "Miami Home Services",
  scrapeWebsites: true,   // Crawls company websites for direct emails & socials
  ultraMode: true,        // Multi-point grid scan for up to 3x more results
  webhookUrl: "https://your-crm.com/api/webhooks/bolt"
});

console.log(`Started job: ${job.job_id}`);

// Download CSV dataset upon completion
const csvText = await client.maps.downloadCsv(job.job_id);

3. Google Reviews Extraction (Without OAuth)

Bypass Google's 5-review API limitation and extract all customer reviews, ratings, reviewer levels, and owner responses:

const reviewsData = await client.reviews.search({
  placeId: "ChIJb8Jg9q-1RIYRAxvq_mZ0gXY",
  maxReviews: 500,
  sort: "newest"
});

const reviews = reviewsData.data || reviewsData.reviews || [];
for (const review of reviews) {
  const stars = review.stars || review.rating;
  const author = review.reviewer?.name || review.reviewer_name || "Anonymous";
  const text = review.review_text || review.text;
  console.log(`★ ${stars} by ${author}`);
  console.log(`Text: ${text}`);
}

4. Website Email & Social Link Enrichment

Turn raw domain lists into enriched B2B contact lists:

const res = await client.website.scrape("https://example.com");
const company = res.data || res;

console.log("Direct Emails:", company.emails);
console.log("Phone Numbers:", company.phones);
console.log("Social Links: ", company.social_links || company.socials);

5. Webhook Signature Verification

Verify incoming webhook payloads with HMAC SHA-256:

import { WebhooksResource } from "boltscraper";

// In your Express / Next.js API route:
const isValid = WebhooksResource.verifySignature(
  req.rawBody,
  req.headers["x-bolt-signature"],
  process.env.BOLT_WEBHOOK_SECRET!
);

if (!isValid) {
  return res.status(401).send("Invalid signature");
}

60+ Extracted Data Points

  • Identity: Business Name, Category, Sub-categories, Google Category IDs, Place ID, CID, KGMID, Feature ID.
  • Location: Full Address, Street Address, City, State, ZIP/Postal Code, Country, Municipality, Latitude, Longitude, Timezone.
  • Contact: Formatted Phone, Phone Type (Mobile, Landline, VOIP), International Phone, Phone URI (tel:), Website URL, Domain.
  • Enrichment: Direct Emails discovered from company websites, Social Media URLs (LinkedIn, Facebook, Instagram, Twitter/X, YouTube).
  • Reputation & Hours: Star Rating, Total Reviews Count, Review URL, Operating Status (Open, Closed), Opening Hours (Monday–Sunday schedules).
  • Media Assets: Logo URL, Main Photo URL, Photos Page URL, Favicon URL.

Error Handling & Rate Limits

import {
  BoltScraper,
  AuthenticationError,
  QuotaExceededError,
  RateLimitError,
  BoltScraperError
} from "boltscraper";

try {
  const results = await client.maps.search("Roofers Denver");
} catch (error) {
  if (error instanceof AuthenticationError) {
    console.error("Invalid API key. Check https://app.boltscraper.com");
  } else if (error instanceof QuotaExceededError) {
    console.error("Monthly quota exhausted. Upgrade plan at https://boltscraper.com/pricing");
  } else if (error instanceof RateLimitError) {
    console.error(`Rate limited. Retry in ${error.retryAfter} seconds.`);
  } else if (error instanceof BoltScraperError) {
    console.error(`API Error (${error.statusCode}): ${error.message}`);
  }
}

Documentation & Resources


License

MIT License. Copyright (c) 2026 Bolt Scraper.