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

Scrape every NYC and northern NJ rental and sales listing on StreetEasy, past the 100-page limit its own search stops at. Price, net effective rent, beds, baths, sq ft, photos, amenities, price history and agent direct phones. Export to Excel, CSV or Sheets; schedule for new listings only.

- **URL**: https://apify.com/alkausari\_mujahid/streeteasy-scraper.md
- **Developed by:** [Alkausari M](https://apify.com/alkausari_mujahid) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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/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

**Scrape New York City and northern New Jersey rentals and sales from
[StreetEasy](https://streeteasy.com) into a clean spreadsheet or JSON feed.** Paste a
search link, press Start, get every matching listing.

Export to **Excel, CSV, JSON or HTML**, or pipe it into Google Sheets, Zapier, Make or your
own code through the Apify API. Schedule it daily to get only what is new.

### Use cases

- 📊 **Market analysis** — track asking prices, cuts and days on market by neighborhood
- 🔍 **Comparables** — pull every 2-bed in a price band and ZIP in minutes
- 🎁 **Concession tracking** — net effective rent is captured separately from asking rent
- 📇 **Lead generation** — an inventory pull doubles as a broker contact list
- 🔔 **New inventory alerts** — scheduled runs return only listings you have not seen

### What you get

|                          |                                                                                               |
| ------------------------ | --------------------------------------------------------------------------------------------- |
| 💰**Pricing**      | Asking price, net effective rent, months free, price per sq ft, monthly maintenance and taxes |
| 🏢**Property**     | Beds, baths, square footage, floor, property type, furnished, new development                 |
| 📍**Location**     | Address, unit, neighborhood, ZIP, latitude and longitude                                      |
| 📅**Availability** | Status, available date, lease term, days on market, open houses                               |
| 🏗️**Building**   | Building name, year built, floor count, unit count, amenities                                 |
| 📈**History**      | Dated price changes, status changes, full property history                                    |
| 📞**Agents**       | Name, direct phone, brokerage and licence type                                                |
| 🖼️**Media**      | Full-resolution photos, floor plans, video and 3D tour flags                                  |

### How to run the Actor

1. Click **Try for free**.
2. Paste a StreetEasy link into **Start URLs** — a search such as
   `https://streeteasy.com/for-rent/manhattan`, or a single listing. Filters you already
   applied on StreetEasy are respected.
3. Set **Maximum listings** to `20` for your first run.
4. Press **Start**, then open the **Output** tab and export.

#### Past StreetEasy's search limit

StreetEasy serves at most **100 pages of any one search**. Page to the end of a borough-wide
search on the site and it simply stops, however many listings actually match — and any
scraper reading that search stops with it.

This Actor gets past that on its own. A broad search is read as several narrower ones and
the results de-duplicated, so a whole-borough link returns far more than StreetEasy will
hand over in a single search. There is nothing to configure: paste the link.

#### Results mode vs full details

| Mode                                 | Fields | Price       | Best for                          |
| ------------------------------------ | ------ | ----------- | --------------------------------- |
| **Results mode** *(default)* | 36     | $2 / 1,000  | Market, comps and pricing work    |
| **Full details**               | 59     | $10 / 1,000 | Depth, history and agent contacts |

Full details adds the description, amenities, building facts, dated price history, schools,
transit and agent contacts to every listing.

### Input

| Setting                                    | What it does                                    |
| ------------------------------------------ | ----------------------------------------------- |
| **Start URLs**                       | Search links or individual listing links        |
| **Maximum listings**                 | Stop after this many (`0` = no limit)         |
| **Scrape full listing details**      | Add descriptions, amenities, history and agents |
| **Only new listings since last run** | Skip anything an earlier run returned           |

#### Example input

```json
{
  "startUrls": [{ "url": "https://streeteasy.com/for-rent/manhattan" }],
  "maxItems": 200,
  "scrapeDetails": false,
  "monitoringMode": false
}
```

### Output

One dataset, one row per listing, agents nested on the row — no second table to join.

```json
{
  "listingId": "5089714",
  "url": "https://streeteasy.com/building/507-west-chelsea/404",
  "address": "507 West 28th Street",
  "unit": "#404",
  "neighborhood": "West Chelsea",
  "zipCode": "10001",
  "latitude": 40.7513,
  "longitude": -74.0024,
  "price": 5981,
  "netEffectivePrice": 5981,
  "hasConcession": false,
  "bedrooms": 1,
  "unitType": "1 Bedroom",
  "bathrooms": 1,
  "sqft": null,
  "status": "ACTIVE",
  "availableAt": "2026-07-20",
  "brokerage": "Lalezarian Properties",
  "images": ["https://photos.zillowstatic.com/fp/af3f38cb...-p_e.webp"],
  "agents": {
    "count": 1,
    "primary": {
      "name": "Steve Eisenstein",
      "phone": "+13476332768",
      "company": "Sovereign Realty NYC",
      "licenseType": "Associate Broker",
      "email": null
    },
    "contacts": [{ "name": "Steve Eisenstein", "phone": "+13476332768" }]
  },
  "scrapedAt": "2026-09-15T11:14:50+00:00"
}
```

Every record carries the same fields in the same order, with `null` where StreetEasy
published nothing — so Zapier, Make and Sheets can map them from a single sample. Switching
detail mode changes the column set, so pick a mode before building a mapping.

### Pricing

You pay per result, so the bill is simply how many listings you asked for:

| Listings | Results mode | Full details |
| -------- | ------------ | ------------ |
| 100      | $0.20        | $1.00        |
| 1,000    | $2.00        | $10.00       |
| 10,000   | $20.00       | $100.00      |

The extra $8 per 1,000 covers opening each listing's own page. **Pages that cannot be read
are not charged** — if a listing's page fails to open you still get the listing, and pay
nothing extra for it.

Start in results mode. It costs a fifth as much and already covers pricing, comps and
market work.

### Integrations & scheduling

Results don't have to stay on Apify. Without writing any code you can:

- **Send listings to Google Sheets, Airtable or Slack** — pick the integration on the
  Actor's Integrations tab and every run appends its results automatically.
- **Connect anything else via Zapier or Make** — thousands of apps, triggered when a run
  finishes.
- **Fire a webhook** to your own server the moment a run completes, with a link to the
  fresh dataset.
- **Pull the data over the API** in JSON, CSV, Excel or XML — one URL, no auth juggling,
  ideal for a script or notebook.

**Run it on a schedule.** Point the Actor at a StreetEasy search, set it to run every
morning and send the output to a sheet — that is a working new-listing alert with no code
at all. Turn on **Only new listings since last run** so each run returns only what has
appeared since the last one, and set **Maximum listings** to keep any single run's cost
predictable.

### Tips

- Start with 20 listings and confirm the fields you need are populated.
- Filter on StreetEasy first, then paste the filtered link — a neighborhood search is far
  cheaper than a borough- or town-wide one.
- Two-stage your detail runs: find candidates in results mode, then feed those links back
  in with full details on.
- Always set a maximum. It is the simplest guard against an unexpectedly large search.
- For recurring work, run results mode with **Only new listings** enabled.

### Good to know

- **Sales and rentals** — both work. Paste a for-sale or for-rent search link.
- **Single listings** — paste a listing's own link instead of a search. A few fields come
  back empty that way, so a search link gives the fullest record.
- **Coverage** — all five NYC boroughs, plus the northern New Jersey waterfront from Jersey
  City to Fort Lee. Not the rest of New Jersey.
- **Agent emails** — not available. StreetEasy publishes names, direct phones and
  brokerages, not emails.
- **Fewer listings than expected** — check **Maximum listings**, and any filter on the link
  you pasted. If the gap persists, open an issue with your run ID.

### 📮 Support

Bugs, feature requests, or custom scraping work — open an issue on Apify, email
alkausarimujahid@gmail.com, or visit my website [ayzalsoft.com](https://ayzalsoft.com).

# Actor input Schema

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

StreetEasy search links, or links to individual listings. A search link such as https://streeteasy.com/for-rent/manhattan collects everything that search matches; a listing link collects just that listing. Any filters you have already applied on StreetEasy — price, bedrooms, neighborhood, amenities — are respected. Large searches are handled automatically, so you do not need to split them up yourself.

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

Stop after this many listings. Use 0 for no limit. Setting a maximum is the simplest way to keep a first run small and predictable.

## `scrapeDetails` (type: `boolean`):

Off by default. Leave it off and each listing returns about 28 fields — price, net effective rent and concessions, beds, baths, square footage, address, neighborhood, ZIP, coordinates, photos, availability, status and brokerage — which is enough for most market and comparables work. Turn it on to add around twenty more fields per listing: the listing description, amenities and in-unit features, building name, year built, floor and unit counts, dated price and status history, nearby schools and transit, floor plans, days on market, and agent contacts. Full details visits every listing individually, so it costs several times more per listing.

## `monitoringMode` (type: `boolean`):

Remember which listings have already been returned and skip them next time. Combine this with a schedule to track new inventory without paying for listings you have already seen.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://streeteasy.com/for-rent/manhattan"
    }
  ],
  "maxItems": 100,
  "scrapeDetails": false,
  "monitoringMode": false
}
```

# Actor output Schema

## `listings` (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://streeteasy.com/for-rent/manhattan"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alkausari_mujahid/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-rent/manhattan" }] }

# Run the Actor and wait for it to finish
run = client.actor("alkausari_mujahid/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": [
    {
      "url": "https://streeteasy.com/for-rent/manhattan"
    }
  ]
}' |
apify call alkausari_mujahid/streeteasy-scraper --silent --output-dataset

```

## MCP server setup

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