# StreetEasy Scraper: NYC Rentals & Sales Listings (`dltik/streeteasy-scraper`) Actor

Scrape StreetEasy rentals and sales from any search URL or NYC neighborhood. Price, net-effective rent, months free, beds/baths, sqft, address, GPS, photos, brokerage, status, plus optional nearby transit, schools and parks. US residential proxy handled. $2.5/1K listings.

- **URL**: https://apify.com/dltik/streeteasy-scraper.md
- **Developed by:** [Walid](https://apify.com/dltik) (community)
- **Categories:** Real estate, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 listing scrapeds

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/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

## StreetEasy Scraper: NYC Rentals & Sales Listings

Scrape **StreetEasy** rental and sale listings from any search URL or NYC neighborhood. This StreetEasy Scraper returns price, net-effective rent, months free, beds, baths, living area, full address, neighborhood, GPS coordinates, photos, source brokerage and status, plus optional nearby transit, schools and parks. Export to JSON, CSV or Excel.

> ⭐ **Bookmark this actor** (button at the top right) if it is useful. It takes 2 seconds and genuinely helps the actor reach more people.

### What this StreetEasy Scraper does

StreetEasy is NYC's primary real estate marketplace, protected by PerimeterX anti-bot. This StreetEasy Scraper handles the proxy and anti-bot layer for you and pulls structured data straight from the page's data layer, so every field arrives clean and typed. It supports:

- **Rental search** pages (`/for-rent/nyc`, `/for-rent/brooklyn`, filtered searches)
- **Sales search** pages (`/for-sale/manhattan`, `/for-sale/kips-bay`, filtered searches)
- **Building and unit** pages (`/building/<slug>/<unit>`)
- **Neighborhood input** (just type `brooklyn`, `manhattan`, `Williamsburg, Brooklyn`)

You pay per listing actually delivered, so your spend is capped by `maxItems`.

### How to use it

1. Paste one or more StreetEasy URLs into **Start URLs**, or list **Areas** and pick a **Listing type** (rent or sale).
2. Set **Max listings** to cap your spend.
3. (Optional) Turn on **Fetch per-listing details** to add nearby transit, schools and parks.
4. Run. Download results as JSON, CSV or Excel.

#### Example input

```json
{
  "startUrls": [
    "https://streeteasy.com/for-rent/nyc",
    "https://streeteasy.com/for-sale/brooklyn"
  ],
  "maxItems": 200,
  "includeDetails": false
}
```

Or by neighborhood:

```json
{
  "areas": ["manhattan", "Williamsburg, Brooklyn"],
  "listingType": "rent",
  "maxItems": 500
}
```

### Output

Each listing is one dataset record. Example (rental):

| Field | Example |
|---|---|
| street | 496 Wilson Avenue |
| unit | #1B |
| areaName | Bushwick |
| zipCode | 11221 |
| price | 4350 |
| netEffectivePrice | 3806 |
| monthsFree | 1.5 |
| bedroomCount | 1 |
| fullBathroomCount | 1 |
| halfBathroomCount | 1 |
| latitude / longitude | 40.692135 / -73.91093 |
| status | ACTIVE |
| sourceGroupLabel | Compass |
| url | https://streeteasy.com/building/496-wilson-avenue-brooklyn/1b |

Sales listings add `saleType` and `soldPrice`. With `includeDetails` on, each record also gets `nearbyTransit`, `nearbySchools`, `nearbyParks`, `yearBuilt` and the full unit address.

```json
{
  "id": "5083352",
  "listingType": "rental",
  "street": "496 Wilson Avenue",
  "unit": "#1B",
  "areaName": "Bushwick",
  "zipCode": "11221",
  "state": "NY",
  "price": 4350,
  "netEffectivePrice": 3806,
  "monthsFree": 1.5,
  "leaseTermMonths": 12,
  "bedroomCount": 1,
  "fullBathroomCount": 1,
  "halfBathroomCount": 1,
  "livingAreaSize": 0,
  "buildingType": "MULTIFAMILY",
  "latitude": 40.692135,
  "longitude": -73.91093,
  "status": "ACTIVE",
  "sourceGroupLabel": "Compass",
  "photos": ["https://photos.zillowstatic.com/fp/...-p_e.webp"],
  "url": "https://streeteasy.com/building/496-wilson-avenue-brooklyn/1b"
}
```

### Proxy and anti-bot

StreetEasy is behind PerimeterX and blocks datacenter IPs. **This actor ships with its own US residential proxy, so it works out of the box, no proxy setup required.** It rotates residential sessions until one clears the anti-bot, then reuses it. If you would rather use your own pool or unblocker (IPRoyal, Bright Data, Oxylabs, ScraperAPI), paste it into **Custom proxy URL** and it will be used for every request.

### Pricing

Pay-per-event, so you only pay for data you actually receive:

- **$0.0025 per listing** delivered (search-level, 25+ fields)
- **$0.008 per listing** enriched with its detail page (only when `includeDetails` is on)

### Use cases

- Rental and sales market analysis across NYC neighborhoods
- Lead generation for brokers, investors and proptech
- Price, net-effective rent and concession (months free) tracking over time
- Building and inventory monitoring
- Feeding listings into your own CRM, dashboard or model

### FAQ

**Which StreetEasy pages are supported?** Rental and sales search pages, filtered searches, neighborhood slugs, and building/unit pages.

**Do I need my own proxy?** No. Apify US residential is used by default. A custom residential URL is optional and improves reliability for very large runs.

**What is net-effective rent?** The effective monthly rent after free months are spread across the lease. The actor returns both the gross `price` and `netEffectivePrice`.

**Is this affiliated with StreetEasy or Zillow?** No. This is an independent tool. You are responsible for complying with StreetEasy's Terms of Service and applicable laws.

# Actor input Schema

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

StreetEasy URLs to scrape. Accepts search pages (https://streeteasy.com/for-rent/nyc, https://streeteasy.com/for-sale/brooklyn), filtered searches (https://streeteasy.com/for-rent/area:302/price:-4000) and individual building/unit pages (https://streeteasy.com/building/<slug>/<unit>). Use this OR `areas` + `listingType`.

## `listingType` (type: `string`):

Whether `areas` are turned into for-rent or for-sale search URLs. Ignored for URLs you pass in `startUrls` (their type is detected automatically).

## `areas` (type: `array`):

NYC areas or neighborhoods (e.g. 'nyc', 'brooklyn', 'manhattan', 'Williamsburg, Brooklyn', 'Kips Bay'). Each is converted to a StreetEasy search URL for the chosen `listingType`. Alternative to `startUrls`.

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

Maximum number of listings to deliver across all searches. Caps your spend — you pay per listing actually delivered.

## `maxPages` (type: `integer`):

How many result pages to page through per search URL. StreetEasy caps a single search at roughly 1,050 results; raise this to go deeper, lower it to spend less.

## `includeDetails` (type: `boolean`):

When true, opens each listing's page to add nearby transit stations, schools and parks, the full unit address, year built and confirmed price. Charged as a separate `listing-details` event ($0.008/listing) on top of the base listing event.

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

Parallel requests for detail pages. Keep moderate (3-8) — StreetEasy is behind PerimeterX and aggressive concurrency raises the block rate.

## `customProxyUrl` (type: `string`):

Optional. By default this actor ships with its own US residential proxy, so you do NOT need to provide anything here. Set this only if you prefer to route through your own pool or unblocker (IPRoyal, Bright Data, Oxylabs, ScraperAPI) as http://user:pass@host:port. When set, it is used for every request.

## `proxyConfiguration` (type: `object`):

Fallback only. The actor already uses a bundled US residential proxy by default. This Apify proxy is used only if the bundled proxy is unavailable. StreetEasy is behind PerimeterX, so US RESIDENTIAL is required here.

## Actor input object example

```json
{
  "startUrls": [
    "https://streeteasy.com/for-rent/nyc"
  ],
  "listingType": "rent",
  "areas": [],
  "maxItems": 100,
  "maxPages": 20,
  "includeDetails": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

All scraped StreetEasy listings.

# 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": [
        "https://streeteasy.com/for-rent/nyc"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/streeteasy-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": ["https://streeteasy.com/for-rent/nyc"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("dltik/streeteasy-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": [
    "https://streeteasy.com/for-rent/nyc"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call dltik/streeteasy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dltik/streeteasy-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/Hq2MiHSoNPsfpiRwc/builds/gbpGpglOcKsA5xj9e/openapi.json
