# Nextdoor Business Scraper (`parsebird/nextdoor-business-scraper`) Actor

Extract public Nextdoor business pages, city pages, and business directory search results: name, phone, categories, rating, address, and neighbor recommendations summary. No login required.

- **URL**: https://apify.com/parsebird/nextdoor-business-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.29 / 1,000 business profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Nextdoor Business Scraper

Nextdoor Business Scraper extracts public **Nextdoor business page** data — name, phone, categories, rating, address, location, images, and the neighbor recommendations summary — plus public **Nextdoor city page** metadata, without ever logging in.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Scrape a direct Nextdoor business URL, find businesses in any US city by category or keyword, or pull city-level population, FAQs, neighborhoods, and resources — all from Nextdoor's public pages.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor: Actor ID `parsebird/nextdoor-business-scraper` on Apify — call it with the `apify-client` SDK, e.g. `ApifyClient(token).actor("parsebird/nextdoor-business-scraper").call(run_input={"target": "businessPages", "businessPageUrls": [{"url": "https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/"}]})`; key inputs are `target` (string: `businessPages`, `businessDiscovery`, or `cityPages`, default `businessPages`), `businessPageUrls` (array of `{url}` for direct Nextdoor business pages), `businessDiscoveryArea` and `businessDiscoveryQuery` (strings, e.g. `"Los Angeles, CA"` and `"plumber"`, for area + keyword search), `cityPageUrls` (array of `{url}` for city pages), `followLinkedPages` (boolean, default `false`), `businessRecordFilter` (optional string keyword filter), and `maxItems` (optional integer cap); output rows have `resultType` (`business` or `city`), `sourceUrl`, `qualityStatus`, and either a `business` or `city` object; full API spec is on the Apify Console API tab for this actor, and an Apify API token is required to call it programmatically.

#### What does Nextdoor Business Scraper do?

Nextdoor Business Scraper reads the same public pages any visitor to [nextdoor.com](https://nextdoor.com) can see — no sign-in, no cookies, no session required. It supports three ways to collect data:

- 🏪 **Business pages** — paste one or more direct Nextdoor business page URLs and get back structured fields: name, phone number, business categories, star rating and review count, street address, latitude/longitude, logo and cover images, and Nextdoor's AI-written "what neighbors say" summary.
- 🔎 **Business search** — give it a US city (e.g. `Austin, TX`) and a category or keyword (e.g. `plumber`, `coffee shop`, or a business name fragment) and it walks Nextdoor's public business directory pages to return every matching business profile, fully paginated.
- 🏙️ **City pages** — paste one or more Nextdoor city page URLs and get back population, friendliness/safety scores, city FAQs, linked neighborhoods, business directories, local groups, and resource pages. Turn on **Follow linked public pages** to also pull a short public description from each linked neighborhood, directory, and resource page.

Other things it does:

- Runs on Apify's infrastructure with **scheduling**, **REST API access**, and native **JSON, CSV, Excel, HTML, and XML export** — no code required to try it.
- Applies an optional keyword filter to business results after they're collected, so you can narrow a search without a second run.
- Skips broken or non-public URLs automatically and keeps going, logging a warning instead of failing the whole run.
- Uses no browser and no residential proxy by default — Nextdoor's public pages are plain server-rendered HTML, so runs are fast and cheap.

#### What data can you extract from Nextdoor?

| Field | Description |
|-------|-------------|
| `business.name` | Business name |
| `business.phone` | Business phone number |
| `business.categories` | Nextdoor business categories/topics |
| `business.rating` | Star rating value and review count |
| `business.neighborSummary` | Nextdoor's AI-written summary of neighbor recommendations |
| `business.address` | Street address, city, state, ZIP (when public) |
| `business.location` | Latitude/longitude (when public) |
| `business.imageUrls` | Logo and cover photo URLs |
| `business.isClaimed` | Whether the page has a registered owner |
| `city.name` / `city.region` | City name and state |
| `city.residentCount` | Resident count from US Census data, as shown by Nextdoor |
| `city.statistics` | Friendliness score, safety score, and other city stats when available |
| `city.faqs` | Nextdoor's public city FAQ entries |
| `city.neighborhoods` / `city.businessDirectories` / `city.localGroups` / `city.resources` | Public pages linked from the city page |

#### How to scrape Nextdoor with Nextdoor Business Scraper

1. Click **Try for free** (or **Run**) on this Actor's page.
2. Pick a **Target**: `Business pages`, `Business search`, or `City pages`.
3. Fill in the matching fields — one or more URLs, or an area + category/keyword — and optionally set a keyword filter or a max item limit.
4. Click **Start** and watch results land in the dataset in real time.
5. Export results as JSON, CSV, or Excel, or pull them programmatically via the [Apify API](https://docs.apify.com/api/v2).

#### How much does it cost to scrape Nextdoor?

This Actor uses **pay-per-event pricing** — you pay only for results, not for compute time.

| Event | Price per event | Price per 1,000 |
|-------|-----------------|------------------|
| `business-profile-scraped` | $0.00499 | **$4.99** |
| `city-metadata-scraped` | $0.00399 | **$3.99** |

A `business-profile-scraped` event fires once for every business result saved (from a direct URL or from a search), and a `city-metadata-scraped` event fires once per city page — turning on **Follow linked public pages** does not add extra charges. Scraping 500 business pages costs about $2.50; a single city page costs under half a cent. Apify's monthly platform usage credits apply to this Actor like any other.

#### Input and output

Configure the run from the **Input** tab: pick a Target, then fill in URLs or an area + keyword. See the JSON example below, or use the visual form in Apify Console.

```json
{
  "target": "businessPages",
  "businessPageUrls": [
    { "url": "https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/" }
  ],
  "maxItems": 50
}
```

Output example (one business result):

```json
{
  "resultType": "business",
  "sourceUrl": "https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/",
  "qualityStatus": "standard",
  "business": {
    "businessId": "51653264",
    "name": "Near & Best Plumber",
    "phone": "+13102548035",
    "categories": ["Plumber"],
    "rating": { "value": 2, "reviewCount": 2 },
    "neighborSummary": "Near & Best Plumber emerges as a trusted choice for those actively seeking a recommended professional for plumbing needs...",
    "isClaimed": false,
    "imageUrls": [
      "https://us1-photo.nextdoor.com/business_logo/09/6b/096beefd4197a329bce4cf34b9991b60.jpg"
    ]
  }
}
```

Download results in JSON, HTML, CSV, or Excel from the **Storage** tab, or fetch them via the [dataset API endpoint](https://docs.apify.com/api/v2#/reference/datasets).

##### Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/nextdoor-business-scraper").call(run_input={
    "target": "businessDiscovery",
    "businessDiscoveryArea": "Austin, TX",
    "businessDiscoveryQuery": "coffee shop",
    "maxItems": 100,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["business"]["name"], item["business"]["phone"])
```

##### JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/nextdoor-business-scraper').call({
    target: 'cityPages',
    cityPageUrls: [{ url: 'https://nextdoor.com/city/biscayne-park--fl/' }],
    followLinkedPages: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].city);
```

#### Is it legal to scrape Nextdoor?

Nextdoor Business Scraper only collects data that Nextdoor already publishes on public pages without requiring a login — it does not access private posts, private messages, or anything behind Nextdoor's authentication wall. Scraping publicly available data is generally legal, but you're responsible for how you use the data — check [Nextdoor's Terms of Service](https://nextdoor.com/tos/) and read Apify's [guide on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) before running large or commercial scrapes.

#### Other business and directory scrapers

- [BBB Scraper](https://apify.com/parsebird/bbb-scraper) — Better Business Bureau profiles and ratings
- [Yellow Pages Scraper](https://apify.com/parsebird/yellowpages-scraper) — US business listings from Yellow Pages
- [Avvo Lawyers Scraper](https://apify.com/parsebird/avvo-lawyers-scraper) — lawyer profiles, ratings, and reviews
- [Checkatrade Scraper](https://apify.com/parsebird/checkatrade-scraper) — UK tradesperson profiles and reviews

#### FAQ

**Do I need a Nextdoor account to use this Actor?**
No. It only reads public pages that Nextdoor serves to logged-out visitors.

**Can I search by keyword instead of a fixed category?**
Yes. `businessDiscoveryQuery` accepts any free-text keyword, not just Nextdoor's predefined categories — Nextdoor matches it against business names and categories in the chosen area.

**Why did my Business search return zero results?**
The **Area** field must be a US city Nextdoor recognizes, in `City, ST` format (e.g. `Austin, TX`). An unrecognized city or a non-US location returns zero results instead of an error.

**Why is `business.address` or `business.location` sometimes missing?**
Not every Nextdoor business page publishes a street address or coordinates. These fields are included whenever Nextdoor makes them public.

**Does Follow linked public pages cost extra?**
No. It adds extra requests and run time, but the `city-metadata-scraped` charge is per city page, not per linked page.

**Can I schedule this to run automatically?**
Yes. Use Apify's built-in [Task Scheduler](https://docs.apify.com/platform/schedules) to run it daily, weekly, or at any interval, and connect it to Zapier, Make, or a webhook for downstream integrations.

**Something looks wrong or missing — how do I report it?**
Open an issue on the Actor's **Issues** tab in Apify Console, or use the **API** tab to inspect the exact request/response for your run.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/nextdoor-business-scraper/changelog.md

# Actor input Schema

## `target` (type: `string`):

Choose Business pages for direct business URLs, Business search for one area and a category or keyword, or City pages for city URLs. Only the fields for the selected target are used.

## `businessPageUrls` (type: `array`):

Public Nextdoor business page URLs, e.g. https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/. Used when Target is Business pages.

## `businessDiscoveryArea` (type: `string`):

One US city and state for Business search, in "City, ST" format, e.g. Los Angeles, CA. Used when Target is Business search.

## `businessDiscoveryQuery` (type: `string`):

A business category or keyword to search for in the area above, e.g. plumber or coffee shop. Used when Target is Business search.

## `cityPageUrls` (type: `array`):

Public Nextdoor city page URLs, e.g. https://nextdoor.com/city/biscayne-park--fl/. Used when Target is City pages.

## `followLinkedPages` (type: `boolean`):

For City pages, also visit the public neighborhood, business-directory, local-group, and resource pages linked from each city page and attach a short summary of each. This adds requests and run time; it does not add extra dataset rows or extra charges.

## `businessRecordFilter` (type: `string`):

Optional. Only keep business results whose name, categories, or description contain this word or phrase (case-insensitive). Runs after pages are collected. Leave empty to keep all business results.

## `maxItems` (type: `integer`):

Maximum number of dataset items to return. Leave empty to collect all available results (capped internally for run safety).

## Actor input object example

```json
{
  "target": "businessPages",
  "businessPageUrls": [
    {
      "url": "https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/"
    }
  ],
  "businessDiscoveryArea": "Los Angeles, CA",
  "businessDiscoveryQuery": "plumber",
  "cityPageUrls": [
    {
      "url": "https://nextdoor.com/city/biscayne-park--fl/"
    }
  ],
  "followLinkedPages": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "target": "businessPages",
    "businessPageUrls": [
        {
            "url": "https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/"
        }
    ],
    "businessDiscoveryArea": "Los Angeles, CA",
    "businessDiscoveryQuery": "plumber",
    "cityPageUrls": [
        {
            "url": "https://nextdoor.com/city/biscayne-park--fl/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/nextdoor-business-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "target": "businessPages",
    "businessPageUrls": [{ "url": "https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/" }],
    "businessDiscoveryArea": "Los Angeles, CA",
    "businessDiscoveryQuery": "plumber",
    "cityPageUrls": [{ "url": "https://nextdoor.com/city/biscayne-park--fl/" }],
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/nextdoor-business-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "target": "businessPages",
  "businessPageUrls": [
    {
      "url": "https://nextdoor.com/pages/near-best-plumber-west-hollywood-ca/"
    }
  ],
  "businessDiscoveryArea": "Los Angeles, CA",
  "businessDiscoveryQuery": "plumber",
  "cityPageUrls": [
    {
      "url": "https://nextdoor.com/city/biscayne-park--fl/"
    }
  ]
}' |
apify call parsebird/nextdoor-business-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/nextdoor-business-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/apZytJo12LvP7y3Ke/builds/6AEzDX9sCTbpyAWE3/openapi.json
