# 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:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $9.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=eunit/nextdoor-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Nextdoor Scraper",
        "description": "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.",
        "version": "0.0",
        "x-build-id": "gBWZ354niL6GXbFud"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/eunit~nextdoor-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-eunit-nextdoor-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/eunit~nextdoor-scraper/runs": {
            "post": {
                "operationId": "runs-sync-eunit-nextdoor-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/eunit~nextdoor-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-eunit-nextdoor-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Public Nextdoor pages to crawl. City pages are the primary supported entry points.",
                        "default": [
                            {
                                "url": "https://nextdoor.com/city/north-miami--fl/"
                            }
                        ],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "useStartUrlsFromJSONFile": {
                        "title": "Use start URLs from JSON file",
                        "type": "boolean",
                        "description": "If true, the Actor reads start URLs from data\\startURLs.json instead of using startUrls from this input.",
                        "default": false
                    },
                    "downloadStartUrlsToHtmlSources": {
                        "title": "Download start URLs to local HTML sources",
                        "type": "boolean",
                        "description": "When enabled, the Actor first saves start URLs as local HTML files, then parses those saved files immediately.",
                        "default": false
                    },
                    "downloadedHtmlDirectory": {
                        "title": "Downloaded HTML directory",
                        "type": "string",
                        "description": "Local directory used to store downloaded HTML source files and sidecar metadata.",
                        "default": "storage/html_sources/default"
                    },
                    "maxRequestsPerCrawl": {
                        "title": "Max requests per crawl",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of live pages to crawl.",
                        "default": 10
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Maximum number of parallel browser pages.",
                        "default": 2
                    },
                    "maxItemsPerSection": {
                        "title": "Max items per section",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of neighborhoods, directories, FAQs, groups, and related links stored per page.",
                        "default": 25
                    },
                    "followNeighborhoodPages": {
                        "title": "Follow neighborhood pages",
                        "type": "boolean",
                        "description": "Queue public neighborhood pages discovered from city pages.",
                        "default": false
                    },
                    "followBusinessDirectoryPages": {
                        "title": "Follow business directory pages",
                        "type": "boolean",
                        "description": "Queue public business or topic directory pages discovered from city pages.",
                        "default": false
                    },
                    "followAdditionalResourcePages": {
                        "title": "Follow additional resource pages",
                        "type": "boolean",
                        "description": "Queue public resource pages discovered from city pages.",
                        "default": false
                    },
                    "saveHtmlSnapshots": {
                        "title": "Save HTML snapshots",
                        "type": "boolean",
                        "description": "Save fetched or fixture HTML to the default key-value store for debugging.",
                        "default": false
                    },
                    "htmlSnapshotKeyPrefix": {
                        "title": "HTML snapshot key prefix",
                        "type": "string",
                        "description": "Prefix used when saving HTML snapshots.",
                        "default": "HTML"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
