# StreetEasy Scraper (`crawlerbros/streeteasy-scraper`) Actor

Scrape NYC real estate listings from StreetEasy including sales and rentals with prices, addresses, amenities, agent info, and more.

- **URL**: https://apify.com/crawlerbros/streeteasy-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 2 total users, 0 monthly users, 85.7% runs succeeded, 11 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## StreetEasy Scraper

Comprehensive scraper for StreetEasy NYC real estate listings. Extract prices, addresses, property details, amenities, agent info, and more from any StreetEasy search URL — for both sales and rentals.

### What does it do?

This scraper collects real estate listings from StreetEasy across all five NYC boroughs. Paste any StreetEasy search URL — with whatever filters you have applied — and the scraper will paginate through all matching results and return structured data. Enable detailed mode to visit each individual listing page for richer data such as building amenities, agent details, transit access, and floor plans.

### Features

- Scrape sales and rental listings from any StreetEasy search URL
- Apply any StreetEasy filter (price range, bedrooms, neighborhood, property type, etc.) via URL
- Optional detailed mode extracts rich data from individual listing pages
- Automatic pagination to collect all matching results
- All output fields guaranteed non-null
- Built-in retry logic for reliability

### How to build a search URL

Browse to [streeteasy.com](https://streeteasy.com), set your search filters, and copy the URL from your browser. Paste it into `startUrls`. A few examples:

| Goal | URL |
|------|-----|
| All Manhattan sales | `https://streeteasy.com/for-sale/manhattan` |
| Brooklyn rentals under $3,000/mo | `https://streeteasy.com/for-rent/brooklyn/price:-3000` |
| NYC sales $500K–$1M, 2+ beds | `https://streeteasy.com/for-sale/nyc/price:500000-1000000|beds>=2` |
| East Village no-fee 1+ bed rentals | `https://streeteasy.com/for-rent/east-village|beds>=1|no_fee:1` |

Any filter combination you can build on StreetEasy's website will work here.

### Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| startUrls | array | Yes | — | StreetEasy search URLs. Build your search on streeteasy.com with any filters, then paste the URL. |
| maxResults | integer | No | 50 | Maximum listings to scrape per search URL (1–500). |
| detailedMode | boolean | No | false | Visit each listing page for rich details. Slower but more comprehensive. |
| proxyConfiguration | object | Ignored | Residential | Ignored — a US RESIDENTIAL proxy is hardcoded inside the scraper because StreetEasy's PerimeterX bot protection blocks Apify datacenter IPs. Left in the schema only for legacy compatibility. |

#### Example input

```json
{
    "startUrls": [
        { "url": "https://streeteasy.com/for-sale/manhattan/price:500000-1500000|beds>=2" }
    ],
    "maxResults": 50,
    "detailedMode": true
}
````

### Output

#### Search result fields (always present)

| Field | Type | Description |
|-------|------|-------------|
| url | string | Direct link to the listing page |
| price | number | Listed price (sale price or monthly rent) |
| address | string | Full street address including unit |
| neighborhood | string | StreetEasy neighborhood label |
| bedrooms | number | Number of bedrooms |
| bathrooms | number | Number of bathrooms |
| squareFeet | number | Interior square footage |
| propertyType | string | Co-op, Condo, Townhouse, etc. |
| photoUrl | string | Main listing photo URL |
| listingType | string | `sale` or `rental` |
| searchUrl | string | The search URL that produced this result |
| scrapedAt | string | ISO 8601 extraction timestamp |

#### Additional fields in detailed mode

| Field | Type | Description |
|-------|------|-------------|
| description | string | Full listing description |
| amenities | array | Building/unit amenities (doorman, gym, laundry, etc.) |
| buildingName | string | Name of the building |
| agentName | string | Listing agent's name |
| agentBrokerage | string | Agent's brokerage firm |
| latitude | number | GPS latitude |
| longitude | number | GPS longitude |
| daysOnStreetEasy | number | Days the listing has been active |
| photos | array | All listing photo URLs |
| nearbyTransit | array | Nearby subway lines and stops |
| maintenanceFee | number | Monthly maintenance or HOA fee |
| taxes | number | Annual property taxes |
| pricePerSqFt | number | Price per square foot |
| status | string | Listing status (e.g., Resale, New Development) |
| yearBuilt | number | Year the building was constructed |

#### Example output

```json
{
    "url": "https://streeteasy.com/building/example-building/1a",
    "price": 850000,
    "address": "123 West 72nd Street #1A",
    "neighborhood": "Upper West Side",
    "bedrooms": 2,
    "bathrooms": 1,
    "squareFeet": 950,
    "propertyType": "Co-op",
    "photoUrl": "https://photos.zillowstatic.com/example.webp",
    "listingType": "sale",
    "description": "Charming pre-war two-bedroom in the heart of the Upper West Side...",
    "amenities": ["doorman", "elevator", "laundry", "gym"],
    "buildingName": "The Chatsworth",
    "agentName": "Jane Smith",
    "agentBrokerage": "Compass",
    "latitude": 40.7789,
    "longitude": -73.9784,
    "daysOnStreetEasy": 14,
    "photos": ["https://photos.zillowstatic.com/1.webp", "https://photos.zillowstatic.com/2.webp"],
    "nearbyTransit": ["1, 2, 3 at 72nd St", "B, C at 72nd St"],
    "maintenanceFee": 1200,
    "taxes": 0,
    "pricePerSqFt": 895,
    "status": "Resale",
    "yearBuilt": 1928,
    "searchUrl": "https://streeteasy.com/for-sale/upper-west-side",
    "scrapedAt": "2026-04-12T15:30:00.000Z"
}
```

### Use cases

- **Market analysis** — Track price trends and inventory across neighborhoods over time
- **Investment research** — Identify undervalued properties by comparing price per square foot
- **Lead generation** — Build targeted lists of listings matching specific criteria
- **Competitive analysis** — Monitor how long comparable properties sit on the market
- **Academic research** — Study housing affordability and market dynamics in NYC

### FAQ

**Does this require a StreetEasy account?**
No. All data is extracted from publicly visible listings without any login.

**Why is a residential proxy required?**
StreetEasy uses PerimeterX bot protection that blocks Apify datacenter IPs. The scraper hardcodes a US RESIDENTIAL Apify proxy and applies it automatically — no configuration needed. PerimeterX still occasionally challenges a session, so the scraper retries up to 3 times with exponential backoff (8s, 16s, 24s) before failing the URL.

**Can I scrape listings from all five NYC boroughs?**
Yes. StreetEasy covers Manhattan, Brooklyn, Queens, The Bronx, and Staten Island. Use the appropriate neighborhood or borough in your search URL.

**What is the difference between normal mode and detailed mode?**
Normal mode collects data shown on search result cards — price, address, bedrooms, bathrooms, and a photo. Detailed mode also visits each individual listing page to extract descriptions, amenities, agent info, transit details, floor plans, and more. Detailed mode is slower due to the additional page visits.

**How many results can I get per search URL?**
Up to 500 listings per URL. For larger datasets, split your search into multiple narrower URLs (e.g., by neighborhood or price band) and add them all to `startUrls`.

**How fresh is the data?**
The scraper fetches live data directly from StreetEasy at the time of the run, so results reflect what is currently listed on the platform.

# Actor input Schema

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

StreetEasy search URLs for sales or rentals. Build your search on streeteasy.com with any filters, then paste the URL here.

## `maxResults` (type: `integer`):

Maximum number of listings to scrape per search URL.

## `detailedMode` (type: `boolean`):

Visit each listing page to extract rich details (description, all photos, amenities, agent info, coordinates, etc.). Slower but more comprehensive.

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

Ignored. A US RESIDENTIAL proxy is hardcoded and applied automatically because StreetEasy's PerimeterX bot protection blocks Apify datacenter IPs. Left in the schema only for legacy compatibility.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://streeteasy.com/for-sale/manhattan"
    }
  ],
  "maxResults": 3,
  "detailedMode": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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://streeteasy.com/for-sale/manhattan"
        }
    ],
    "maxResults": 3,
    "detailedMode": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/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": [{ "url": "https://streeteasy.com/for-sale/manhattan" }],
    "maxResults": 3,
    "detailedMode": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/streeteasy-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://streeteasy.com/for-sale/manhattan"
    }
  ],
  "maxResults": 3,
  "detailedMode": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call crawlerbros/streeteasy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/streeteasy-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "StreetEasy Scraper",
        "description": "Scrape NYC real estate listings from StreetEasy including sales and rentals with prices, addresses, amenities, agent info, and more.",
        "version": "1.0",
        "x-build-id": "7Wcq9nBfc7ZT9iT7d"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~streeteasy-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-streeteasy-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/crawlerbros~streeteasy-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-streeteasy-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/crawlerbros~streeteasy-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-streeteasy-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": "Search URLs",
                        "type": "array",
                        "description": "StreetEasy search URLs for sales or rentals. Build your search on streeteasy.com with any filters, then paste the URL here.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxResults": {
                        "title": "Maximum Results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of listings to scrape per search URL.",
                        "default": 50
                    },
                    "detailedMode": {
                        "title": "Detailed Mode",
                        "type": "boolean",
                        "description": "Visit each listing page to extract rich details (description, all photos, amenities, agent info, coordinates, etc.). Slower but more comprehensive.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Ignored. A US RESIDENTIAL proxy is hardcoded and applied automatically because StreetEasy's PerimeterX bot protection blocks Apify datacenter IPs. Left in the schema only for legacy compatibility."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
