{
  "openapi": "3.0.1",
  "info": {
    "title": "Nextdoor Scraper — Businesses, Reviews & Neighborhoods",
    "description": "Scrape public Nextdoor business listings, neighbor recommendations and city demographics. No login, no session cookies, nothing that expires.",
    "version": "0.1",
    "x-build-id": "LW54aGrhLUj3h1iPp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/oswaldocarabano~nextdoor-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-oswaldocarabano-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/oswaldocarabano~nextdoor-scraper/runs": {
      "post": {
        "operationId": "runs-sync-oswaldocarabano-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/oswaldocarabano~nextdoor-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-oswaldocarabano-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",
        "properties": {
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "Nextdoor city slugs in the format city-name--state, lowercase, two-letter state. Example: san-clemente--ca. Cities are processed in the order you give them, and each one is finished before the next starts, so put the ones you care about most first: if the run hits its timeout you get complete cities rather than every city half done. Rough guide: one city with the default 50 businesses takes about a minute, and twenty cities with 100 each take around half an hour, so raise the run timeout for a sweep that big.",
            "default": [
              "san-clemente--ca"
            ],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Business categories",
            "type": "array",
            "description": "Leave empty to sweep every category a city exposes — Nextdoor publishes 54 per city. The per-city limit is split evenly between the categories you list.",
            "default": [
              "Dentist"
            ],
            "items": {
              "type": "string"
            }
          },
          "onlyRequestedCity": {
            "title": "Only businesses located in the requested city",
            "type": "boolean",
            "description": "Nextdoor's category directory is REGIONAL, not municipal: it lists the surrounding trade area. Measured in San Clemente, CA — only 36 % of 200 results were in San Clemente itself, the rest spread across 8 nearby towns. Leave off to get the whole trade area (Nextdoor's own behaviour); turn on to keep only the city you asked for. Either way, every row carries address_city so you can filter yourself.",
            "default": false
          },
          "directBusinessUrls": {
            "title": "Business URLs",
            "type": "array",
            "description": "Scrape these business pages directly, in addition to whatever discovery finds. Use this when you already know which businesses you want.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxBusinessesPerCity": {
            "title": "Max businesses per city",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Cap PER CITY, shared evenly between the categories you ask for. The default of 50 keeps a first run fast and cheap; raise it for a full sweep. Nextdoor's directory is ordered by distance, so a cap near the city's real inventory keeps results local. This is the setting that drives run time: each business costs two requests, so doubling it roughly doubles the run.",
            "default": 50
          },
          "includeRecommendations": {
            "title": "Include neighbor recommendations",
            "type": "boolean",
            "description": "Individual posts neighbors wrote about the business, with the author left exactly as Nextdoor anonymizes them. Each one is classified as a real recommendation, a request for a provider, or noise. Measured over 741 businesses: 42.4 % have at least one.",
            "default": true
          },
          "maxRecommendationsPerBusiness": {
            "title": "Max recommendations per business",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Measured over 741 businesses: 2.5 recommendations each on average, 33 the most seen on one, and 57.6 % have none at all. Raising this rarely changes the result.",
            "default": 100
          },
          "includeCityData": {
            "title": "Include city data",
            "type": "boolean",
            "description": "One row per city in a separate `cities` dataset: population, average income and age, homeowner percentage, safety and friendliness scores, all 54 categories, neighborhoods, and counts of classifieds, groups and events.",
            "default": true
          },
          "includeBusinessActivity": {
            "title": "Include business posts",
            "type": "boolean",
            "description": "Corporate content the businesses published themselves. No neighbor personal data. Goes to a separate `posts` dataset.",
            "default": false
          },
          "includeCityPosts": {
            "title": "Include public neighbor posts",
            "type": "boolean",
            "description": "⚠️ Contains personal data: a partial author name and free text, sometimes about local safety incidents. Off by default. If you turn this on, you are responsible for how you use the results — including under CCPA, if that applies to you. Posts come from the city page that is already downloaded, so they cost no extra requests, and they are delivered after that city's businesses.",
            "default": false
          },
          "includeAuthorNeighborhood": {
            "title": "Include the author's neighborhood on posts",
            "type": "boolean",
            "description": "⚠️ A partial name next to a precise neighborhood can identify a real person in a small community. Only applies if you enabled neighbor posts above.",
            "default": false
          },
          "expandNearbyCities": {
            "title": "Expand to nearby cities",
            "type": "boolean",
            "description": "Discover neighbouring cities through Nextdoor's own cross-links, up to the hard cap below.",
            "default": false
          },
          "maxExpandedCities": {
            "title": "Cap on expanded cities",
            "minimum": 0,
            "maximum": 25,
            "type": "integer",
            "description": "A hard cap, and it is not optional: Nextdoor's city graph connects the whole of the United States, so without a limit one run could keep going indefinitely.",
            "default": 3
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Measured: clean up to 5; at 10 Nextdoor returns HTTP 429 with a cooldown of about four minutes, which costs more time than the extra speed saves. Raising this is rarely worth it.",
            "default": 5
          },
          "maxCacheAgeDays": {
            "title": "Maximum acceptable age of the data",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Results may be served from a shared cache, which makes runs faster. Set 0 to force a fresh fetch of everything. Every row tells you what you got: `from_cache`, `fetched_at` and `data_age_hours`.",
            "default": 7
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. The Actor already routes through US residential IPs, so you do not need to configure anything here.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}