Nextdoor Scraper & API | Public Business Contacts · Apify
Nextdoor Scraper - Public Businesses & Neighborhoods avatar

Nextdoor Scraper - Public Businesses & Neighborhoods

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Nextdoor Scraper - Public Businesses & Neighborhoods

Nextdoor Scraper - Public Businesses & Neighborhoods

Extract public Nextdoor business profiles and neighborhood directories in the US, UK, and Canada, including published phones, emails, websites, and addresses. Pay per delivered row plus a start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

30

Total users

8

Monthly active users

5 hours ago

Last modified

Features

Limited permissions

Share

Extract public Nextdoor business and neighborhood data in the United States, United Kingdom, and Canada as rows you can export.

  • Business names, published phones, emails, websites, addresses, and license IDs.
  • City and neighborhood directories, topic catalogs, and limited free-finds data.
  • Batch public URLs or choose a city and business category.
  • Pay $3.00 per 1,000 rows on the Free plan, plus a start fee.

What does Nextdoor Scraper do?

Nextdoor Scraper collects public business profiles and directories for local research, business catalogs, and coverage comparisons. It does not log in, read private feeds, or send messages. This is an unofficial tool, not affiliated with Nextdoor.

  • Business discovery: topics or its alias business-search finds categories; neighborhood finds linked businesses.
  • Profiles: pages reads a business slug; detailUrls accepts several public URLs.
  • Location discovery: city explores a city; find-neighborhood lists cities in a state or region.
  • Catalogs: taxonomy lists topics; cities lists the US city catalog; free-finds returns limited classified identifiers.
  • Organization contacts: about reads Nextdoor's public organization contact pages, not local merchant leads.

enrichDetails is on by default. It adds available business details to discovery results, not a separate set of comment rows.

What data can you extract from Nextdoor?

Fields vary by row type.

Common fields

FieldDescriptionExample
idBusiness, topic, classified, or other row identifierbusiness_123
kindRow typepages
nameSource display name, when suppliedExample Business
urlSource page URLhttps://nextdoor.com/pages/example-business/
marketSelected marketus
scrapedAtCollection time in UTC2026-10-24T00:00:00+00:00

Business profiles: pages

FieldDescriptionExample
phonesPublished phone entries[{"value":"+1 555 0100","type":"phone","e164":null}]
emailsPublished email entries[{"value":"name@example.com","type":"email"}]
web.websitePublished websitehttps://example.com
addressStreet and locality, subject to privacy flags{"locality":"Oakland","country":"US"}
licenseIdLicense identifier, when suppliedEXAMPLE-123
openingHoursWeekly operating hours[{"dayOfWeek":"Monday","opens":"09:00","closes":"17:00"}]
claimedClaim indicator: true, false, or unknownnull
hasContactContact presence indicator, not proof of ownershiptrue
hideAddressWhether precise location must be withheldtrue
leadAbsencesReasons fields are missing, as English codes (see FAQ){}

Directory cards: directory

FieldDescriptionExample
topicRequested categoryplumber
phonesPhone shown on the directory card[]

Linked business cards: pages-card

FieldDescriptionExample
slugPublic business page slug; name may be absentexample-business

Neighborhood rows: neighborhood

FieldDescriptionExample
slugNeighborhood identifierrockridge--oakland--ca
cityCity associated with the neighborhood, when suppliedoakland--ca

City rows: city

FieldDescriptionExample
stateState or regionCA
neighborhoodCountNeighborhood count, when supplied12

Topic rows: topic

FieldDescriptionExample
topicIdsTopic identifiers[123]
namePluralPlural topic label, when suppliedPlumbers
parentIdParent topic identifier10

Free-finds rows: classified

FieldDescriptionExample
legacyClassifiedIdClassified identifier123456
isSoldSource sold flagfalse
neighborhoodOrigin neighborhood reference{"id":"123","city":"Oakland","state":"CA"}

Organization contacts: about

FieldDescriptionExample
emailsPublished organization contact entries, not merchant contacts[{"value":"name@example.com","type":"email"}]

How to scrape Nextdoor

  1. Open Nextdoor Scraper in Apify Console.
  2. Select auto for searchType, then fill a target such as query and a city.
  3. Set maxResults to 3 for a small first run.
  4. Click Start and wait for completion.
  5. Open the dataset and download the rows.

Empty {} starts the Oakland (oakland--ca) example with at most 3 rows and enrichment enabled. With auto, a target field selects the mode; explicitly chosen catalog modes need no target.

Fill query with a category such as plumber and city with a city slug. Without query, this mode lists the city's topic index rather than businesses.

Neighborhood: neighborhood

Fill neighborhood, or select this mode with a city to use its first neighborhood.

Business profiles: pages

Use pageSlug or paste public /pages/ URLs into detailUrls. Replace the example slug below with an actual page slug.

City discovery: city

Fill city. With enrichDetails: false, get neighborhood identity rows. With the default true, the Actor looks for linked business profiles; it falls back to neighborhood rows if none are collected.

State or region: find-neighborhood

Fill state, for example wa or england, and select the matching market.

Topic catalog: taxonomy

Select this mode to list topic names and identifiers.

City catalog: cities

Select this mode for the US city catalog.

Free classifieds: free-finds

Select this mode for public free-finds identifiers and sold flags.

Organization contacts: about

Select this mode for Nextdoor's public organization contacts.

What to fill in

FieldWhat to enterDefault
searchTypeauto or a mode described aboveauto; form prefills city
cityCity slug, such as oakland--caoakland--ca when needed and omitted
stateState or region for find-neighborhoodor when omitted
neighborhoodNeighborhood slugFirst city neighborhood in that mode
pageSlugPublic business page slugEmpty
detailUrlsArray of public Nextdoor /pages/ or /city/ URLsEmpty
queryCategory such as plumber or bakeryEmpty
marketus, gb, ca; fr has limited coverage; au unavailableus
enrichDetailsAdd available business profile detailstrue
maxResultsMaximum rows per input, from 1 to 20070; form prefills 3
maxPagesDirectory pages for topics, from 1 to 501

Auto-selected category directory:

{"query":"plumber","city":"hillsboro--or","maxResults":3}

Topics:

{"searchType":"topics","query":"bakery","city":"oakland--ca","maxResults":3}

Business-search alias:

{"searchType":"business-search","query":"plumber","city":"hillsboro--or","maxResults":3}

Neighborhood:

{"searchType":"neighborhood","city":"ajax--on","market":"ca","maxResults":3}

Business profile:

{"searchType":"pages","pageSlug":"example-business","maxResults":1}

City:

{"searchType":"city","city":"oakland--ca","enrichDetails":false,"maxResults":3}

State index:

{"searchType":"find-neighborhood","state":"wa","maxResults":3}

Topic catalog:

{"searchType":"taxonomy","maxResults":3}

City catalog:

{"searchType":"cities","market":"us","maxResults":3}

Free finds:

{"searchType":"free-finds","market":"us","maxResults":3}

Organization contacts:

{"searchType":"about","maxResults":3}
  • maxItems and limit are aliases of maxResults.
  • Unknown fields alone do not fail input handling: close misspellings can be corrected; other names are ignored with a note.
  • Missing required targets stop collection with an error such as INVALID_INPUT: pageSlug — searchType pages needs pageSlug or detailUrls. No rows are charged; the start fee still applies. Some invalid optional values are ignored or adjusted instead.
  • INPUT_REPORT in the run's key-value store records filled, inferred, corrected, and ignored fields. Incompatible targets use this priority: detailUrls, pageSlug, query, neighborhood, city, state.

Output example

Illustrative profile row; names and contact details below are placeholders, not collected leads.

{
"id": "business_123",
"kind": "pages",
"name": "Example Business",
"slug": "example-business",
"url": "https://nextdoor.com/pages/example-business/",
"market": "us",
"phones": [{"value": "+1 555 0100", "type": "phone", "e164": null}],
"emails": [{"value": "name@example.com", "type": "email"}],
"web": {"website": "https://example.com", "socials": []},
"address": {"street": null, "locality": "Oakland", "region": "CA", "country": "US"},
"claimed": null,
"hasContact": true,
"leadAbsences": {}
}

Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. RUN_SUMMARY records the row count and warnings; ERROR_SUMMARY contains details for handled failures.

Why use this Nextdoor scraper?

  • Pay per delivered row. No row fee for a page that produces no dataset row.
  • Usable partial results. Available partial results can be delivered when collection ends early. Rows already written remain in the dataset; an abrupt stop does not guarantee delivery of unwritten rows.
  • No account setup on Nextdoor. You do not need to set up proxies.

How much does it cost to scrape Nextdoor?

Pricing is pay-per-event: $0.005 per start event, plus the price per delivered row. Platform usage is included in these prices.

Apify planPrice per rowPrice per 1,000 rows
Free$0.003$3.00
Starter$0.003$3.00
Scale$0.0026$2.60
Business$0.0022$2.20
Platinum$0.002$2.00
Diamond$0.0016$1.60

Start billing uses one event per GB of allocated memory, with a minimum of one. Default memory is 1024 MB, so a normal start costs $0.005.

  • maxResults applies to each detail URL or single search input. Default: 70; larger requests are collected in parts of 70, up to the input limit of 200. All row types count together.
  • The Free Apify plan is capped at 200 rows per run and 10 total runs of this Actor.
  • Maximum cost per run (maxTotalChargeUsd in the API) caps the whole run's charges. Set enough to cover the start and desired rows.
  • The Apify Free plan includes $5.00 in monthly usage credit (about 1,666 rows at $0.003 per row).

Example: one input delivering 3 rows on the Free plan at 1024 MB costs 3 × $0.003 + $0.005 = $0.014, assuming one start.

What happens when the run timeout is too short

A short timeout can trigger an automatic pause rather than a failure. The status message says "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." The run temporarily appears as ABORTED.

When results are ready, the same run resumes and delivers to the same dataset, finishing as SUCCEEDED if collection succeeds. Previously delivered rows are skipped, not delivered or charged twice. Delivery may report "Resumed: delivering N rows."

  • Automatic pauses are limited to 3 per run. Keep the default timeout of 3600 seconds to reduce the need for them.
  • Synchronous endpoints (run-sync, run-sync-get-dataset-items) wait at most 300 seconds and may return an empty dataset during a pause. For longer runs, start asynchronously and read the dataset after SUCCEEDED, or use a success webhook.

Use with AI agents and the API

Apify MCP server (Claude, ChatGPT, Cursor, VS Code)

Add this remote server to an MCP-capable client:

https://mcp.apify.com?tools=lentic_clockss/nextdoor-scraper

Sign in with Apify using OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent reads rows with get-dataset-items. Ensure that dataset-reading tool is also available in your client.

For clients without remote-server support, use npx @apify/actors-mcp-server --tools lentic_clockss/nextdoor-scraper with APIFY_TOKEN set.

Example prompt: "Use Nextdoor Scraper to find up to 3 plumbers in Hillsboro, Oregon, using city hillsboro--or. Return published contacts and note missing fields."

  • Agent execution note: Set maxResults between 5 and 20 on exploratory tool calls to keep responses compact, and read RUN_SUMMARY and INPUT_REPORT from the default key-value store to inspect normalized inputs and delivered row counts.

Apify API

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/nextdoor-scraper").call(
run_input={"query": "plumber", "city": "hillsboro--or", "maxResults": 3}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/nextdoor-scraper').call({
query: 'plumber', city: 'hillsboro--or', maxResults: 3
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For HTTP, send the input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~nextdoor-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. Read results with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after completion.

Integrations

Use the Actor's Integrations tab for Google Sheets, Make, Zapier, n8n, Slack, Airtable, or webhooks. Use Apify Schedules for repeated runs.

FAQ

Public access is not blanket permission for every use. You are responsible for Nextdoor's terms, applicable data-protection law, and a lawful basis for processing personal data.

Why did my run end as ABORTED?

Check its status message. The automatic-pause message above means the run will resume when results are ready.

How many results can I get?

Request 1–200 rows per input, subject to source availability, directory pages, your cost cap, and Free-plan limits.

Why are some fields empty?

A business may publish a phone but no email. With hideAddress: true, street, unit, full address, and precise coordinates are withheld.

Does it work in the UK and Canada?

Both have city and neighborhood support. Directory availability varies; if a UK category returns no rows, try neighborhood with enrichment. Use gb for the UK and ca for Canada.

What about France and Australia?

France has limited profile and location support, not the same public category or state directories. Australia is unavailable.

Can I scrape private feeds or send messages?

No. Generic search, feeds, login, maps, and contact-form actions are outside this Actor's scope. No Nextdoor account is needed.

What if I get zero rows?

Check the selected mode, market, and target. Inspect INPUT_REPORT and RUN_SUMMARY. No matches or an unsupported scope can finish successfully with zero rows; handled failures have ERROR_SUMMARY. If a run stops with "New runs are paused until the live proxy configuration is confirmed.", start it again later. Before 13 November 2026 this message, some run warnings and the about row note contained Chinese; the message began with "\u5b9e\u65f6\u4ee3\u7406\u914d\u7f6e\u5c1a\u672a\u5b8c\u6210\u5bf9\u8d26" (JSON-escaped).

Why do leadAbsences reasons look different from earlier runs?

From November 2026 the reasons are English codes. Earlier runs returned Chinese-language labels; the table shows which new code each one became. List rows: pages-card, neighborhood, city, topic, classified. Card rows: pages rows with inlineEnriched: true.

FieldEarlier label (JSON-escaped)New value
address.street, geo on pages rows with hideAddress: true"hideAddress<note>" or "\u672c\u7ad9\u65e0<evidence>"gated (<note>)
phones, emails, name, address.street on other pages rows"\u672c\u7ad9\u65e0<evidence>" or "\u8be6\u60c5<note>"Not on source: <evidence>; not_collected (<note>) when only the SSR fallback was read; not_on_list_page (<note>) on card rows
person on pages rows"\u672c\u7ad9\u65e0<evidence>"Not on source: <evidence> when the profile page was read; not_verified (<note>) when only GraphQL or the SSR fallback was read; not_on_list_page (<note>) on card rows
hours on pages rows"\u8be5\u5546\u5bb6<note>" or "SSR Business<note>"Not on source: <evidence> when GraphQL hours were read; otherwise not_collected (<note>), or not_on_list_page (<note>) on card rows
socials on pages rows; phones on profile-page pages rows; phones, emails, address.street on about rows"\u672c\u7ad9\u65e0<evidence>" or "SSR Business<note>"not_verified (<note>)
emails on pages rows; person on about rows"\u672a\u91c7\u96c6\uff08<note>\uff09" or "\u9886\u5bfc\u5728<note>"not_collected (<note>)
emails, person on directory rows; address.street, person on list rows"\u672a\u91c7\u96c6"not_collected
emails on list rows"\u5217\u8868\u65e0\u7ebf\u7d22"not_on_list_page
name, phones, address.street on directory rows; phones, name, title, price on list rows"\u76ee\u5f55\u5361<note>" or "\u5217\u8868<note>" or "GQL-only<note>" or "\u514d\u8d39\u680f<note>" or "\u8be5\u6761<note>"not_on_list_page (<note>)
phones on topic index rows and city catalog rows"\u7d22\u5f15\u65e0\u7ebf\u7d22<note>" or "\u57ce\u5e02\u76ee\u5f55\u884c<note>"not_on_index_page (<note>)
phones, emails, address.street, person on topic catalog rows"\u672c\u7ad9\u65e0<evidence>", "\u5217\u8868\u65e0\u7ebf\u7d22" or "\u672a\u91c7\u96c6"not_queried (<note>)
claimed on pages rows"\u672a\u8ba4\u9886<note>" or "\u5e73\u53f0<note>"No longer written; read the claimed field

Before 13 November 2026:

  • Not on source could also appear with a source answer or field missing or unreadable (now not_verified (<note>)).
  • Profile-page phones and about emails were Not on source: <evidence>.
  • topic catalog rows had not_on_list_page for emails and not_collected for address.street and person.
  • The person evidence Business owner is only a UserProfile id or null, no name is now detail page SSR Business owner is null or has an empty name.

Limitations

  • Enrichment can return sparse cards instead of complete profiles. No contact coverage percentage is guaranteed.
  • The city catalog is US-only. Free-finds exposes identifiers, not full listing content; other markets may return no rows.
  • jobHours describes recruiting shifts, not operating hours. Use openingHours where supplied.
  • Category searches have no date-window or automatic query-translation option.

More local services and lead generation scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request another field through the Issues tab of this Actor's page. Include the run ID and the input you used.