# Nextdoor Scraper (`eunit/nextdoor-scraper`) Actor

Extracts structured place-level data from public Nextdoor city pages such as city metadata, FAQs, neighborhood links, business directory links, local group summaries, resource links, city descriptions, resident counts, directory-style public resources, and city statistics.

- **URL**: https://apify.com/eunit/nextdoor-scraper.md
- **Developed by:** [Emmanuel Uchenna](https://apify.com/eunit) (community)
- **Categories:** AI, Developer tools, Other
- **Stats:** 54 total users, 8 monthly users, 97.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $90.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Nextdoor Public City Scraper do?

This Actor extracts **structured place-level data from public Nextdoor city pages** such as city metadata, FAQs, neighborhood links, business directory links, local group summaries, resource links, and city statistics.

Use it when you need a repeatable way to collect public city information from Nextdoor for research, market analysis, local discovery, or downstream workflows. On Apify, you also get API access, scheduling, monitoring, integrations, dataset exports, and run history.

### Why use Nextdoor Public City Scraper?

Nextdoor city pages expose useful public information even without logging in: city descriptions, resident counts, affordability and friendliness indicators, FAQ content, neighborhood discovery links, and directory-style public resources. This Actor turns those public signals into structured JSON so they are easier to search, analyze, and connect to other systems.

Typical use cases:

1. Build local market or neighborhood discovery datasets.
2. Track public city-page changes over time.
3. Feed public place metadata into internal search, analytics, or enrichment pipelines.
4. Export public links for additional compliant processing.

### How to use Nextdoor Public City Scraper

1. Open the Actor in Apify Console.
2. In the **Input** tab, add one or more public Nextdoor URLs, ideally city pages such as `https://nextdoor.com/city/north-miami--fl/`.
3. Set crawl limits such as `maxRequestsPerCrawl`, `maxConcurrency`, and `maxItemsPerSection`.
4. Run the Actor and inspect the dataset output.

The Actor is intentionally designed for **public pages only**. If Nextdoor responds with a login wall, verification step, or other access restriction, the Actor records that state instead of trying to circumvent it.

### Input

Configure the Actor in the **Input** tab.

```json
{
  "startUrls": [
    { "url": "https://nextdoor.com/city/north-miami--fl/" }
  ],
  "downloadStartUrlsToHtmlSources": false,
  "downloadedHtmlDirectory": "storage/html_sources/default",
  "maxRequestsPerCrawl": 10,
  "maxConcurrency": 2,
  "maxItemsPerSection": 25,
  "followNeighborhoodPages": false,
  "followBusinessDirectoryPages": false,
  "followAdditionalResourcePages": false,
  "saveHtmlSnapshots": false,
  "htmlSnapshotKeyPrefix": "HTML"
}
```

#### Main input fields

| Field | Description |
| --- | --- |
| `startUrls` | Public Nextdoor URLs to crawl. City pages are the main supported entry point. |
| `downloadStartUrlsToHtmlSources` | Saves `startUrls` to local HTML files first, then scrapes those saved files offline. |
| `downloadedHtmlDirectory` | Local directory where downloaded HTML files and sidecar metadata are stored. |
| `maxRequestsPerCrawl` | Limit the number of live pages. |
| `maxConcurrency` | Browser concurrency for live crawling. |
| `maxItemsPerSection` | Caps stored arrays such as FAQs and neighborhoods. |
| `followNeighborhoodPages` | Queues public neighborhood pages found on city pages. |
| `followBusinessDirectoryPages` | Queues public topic and business directory pages. |
| `followAdditionalResourcePages` | Queues additional public resource pages. |
| `saveHtmlSnapshots` | Saves page HTML to the default key-value store for debugging. |

Use one entry per URL. This is correct:

```json
"startUrls": [
  { "url": "https://nextdoor.com/city/bellaire--oh/" },
  { "url": "https://nextdoor.com/city/bellbrook--oh/" },
  { "url": "https://nextdoor.com/city/belle-center--oh/" }
]
```

Do **not** put multiple `"url"` keys inside one object. In JSON, duplicate keys are overwritten and only the last one survives.

### Output

The Actor stores one dataset item per parsed page.

```json
{
  "url": "https://nextdoor.com/city/north-miami--fl/",
  "finalUrl": "https://nextdoor.com/city/north-miami--fl/",
  "pageType": "city",
  "title": "North Miami, Florida | Nextdoor",
  "description": "Public city summary extracted from Nextdoor.",
  "cityName": "North Miami",
  "state": "FL",
  "residentsCount": 59854,
  "neighborhoodCount": 26,
  "businessDirectoryCount": 54,
  "faqCount": 7,
  "accessStatus": "public",
  "faqs": [
    {
      "question": "What is the population of North Miami?",
      "answer": "According to US Census Data, there are 59,854 residents in North Miami."
    }
  ],
  "neighborhoods": [
    {
      "title": "128th St",
      "url": "https://nextdoor.com/neighborhood/128thst--north-miami--fl/",
      "pageType": "neighborhood"
    }
  ]
}
```

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

### Data table

| Field | Description |
| --- | --- |
| `pageType` | The detected public page type, usually `city`. |
| `title` | HTML title or structured page title. |
| `description` | Meta description or structured city description. |
| `cityName` | City name from structured data. |
| `state` | State abbreviation. |
| `residentsCount` | Parsed public resident count when available. |
| `faqCount` | Number of FAQ entries captured. |
| `neighborhoodCount` | Number of neighborhood links captured. |
| `businessDirectoryCount` | Number of business directory links captured. |
| `accessStatus` | `public`, `restricted`, or `partial`. |

### Read more

To learn more about configuring this Actor through a step-by-step guide, please check out our article on [How to Scrape Nextdoor Public Pages for Demographics and Community Insight](https://www.eunit.me/blog/how-to-scrape-nextdoor-for-hyper-local-demographics-and-community-sentiment).

# Actor input Schema

## `startUrls` (type: `array`):

Public Nextdoor pages to crawl. City pages are the primary supported entry points.

## `useStartUrlsFromJSONFile` (type: `boolean`):

If true, the Actor reads start URLs from data\startURLs.json instead of using startUrls from this input.

## `downloadStartUrlsToHtmlSources` (type: `boolean`):

When enabled, the Actor first saves start URLs as local HTML files, then parses those saved files immediately.

## `downloadedHtmlDirectory` (type: `string`):

Local directory used to store downloaded HTML source files and sidecar metadata.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of live pages to crawl.

## `maxConcurrency` (type: `integer`):

Maximum number of parallel browser pages.

## `maxItemsPerSection` (type: `integer`):

Maximum number of neighborhoods, directories, FAQs, groups, and related links stored per page.

## `followNeighborhoodPages` (type: `boolean`):

Queue public neighborhood pages discovered from city pages.

## `followBusinessDirectoryPages` (type: `boolean`):

Queue public business or topic directory pages discovered from city pages.

## `followAdditionalResourcePages` (type: `boolean`):

Queue public resource pages discovered from city pages.

## `saveHtmlSnapshots` (type: `boolean`):

Save fetched or fixture HTML to the default key-value store for debugging.

## `htmlSnapshotKeyPrefix` (type: `string`):

Prefix used when saving HTML snapshots.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://nextdoor.com/city/north-miami--fl/"
    }
  ],
  "useStartUrlsFromJSONFile": false,
  "downloadStartUrlsToHtmlSources": false,
  "downloadedHtmlDirectory": "storage/html_sources/default",
  "maxRequestsPerCrawl": 10,
  "maxConcurrency": 2,
  "maxItemsPerSection": 25,
  "followNeighborhoodPages": false,
  "followBusinessDirectoryPages": false,
  "followAdditionalResourcePages": false,
  "saveHtmlSnapshots": false,
  "htmlSnapshotKeyPrefix": "HTML"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `htmlSnapshots` (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 = {
    "startUrls": [
        {
            "url": "https://nextdoor.com/city/north-miami--fl/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eunit/nextdoor-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 = { "startUrls": [{ "url": "https://nextdoor.com/city/north-miami--fl/" }] }

# Run the Actor and wait for it to finish
run = client.actor("eunit/nextdoor-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 '{
  "startUrls": [
    {
      "url": "https://nextdoor.com/city/north-miami--fl/"
    }
  ]
}' |
apify call eunit/nextdoor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eunit/nextdoor-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/8MfL2VlB2kpANiLUK/builds/dMLdbqdbqLY27AYAa/openapi.json
