# Craigslist Apartments Scraper - Housing, Cars, Jobs & For Sale (`kamerozkan/craigslist-apartments-listings-scraper`) Actor

Craigslist apartments and listings scraper: pick cities and categories (apartments, rooms, cars, jobs, for sale) and get each listing with price, bedrooms, sqft, odometer, salary, employer, neighborhood, GPS, photos and posted date. New-listings monitor, no login.

- **URL**: https://apify.com/kamerozkan/craigslist-apartments-listings-scraper.md
- **Developed by:** [Kamer Ozkan](https://apify.com/kamerozkan) (community)
- **Categories:** Real estate, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Craigslist Apartments Scraper - Housing, Cars, Jobs & For Sale

A **Craigslist apartments scraper** for every Craigslist city and category: pick cities (newyork, sfbay, chicago, or any search URL from your browser) and get each listing with price, bedrooms, square feet, neighborhood, GPS coordinates, photos and posted date, plus odometer for cars and employer and salary for jobs. A built-in **new-listings monitor** turns a scheduled run into a feed of fresh listings, and you only pay for listings you have not seen. No login, no API key.

### What does Craigslist Apartments Scraper do?

Give it cities or Craigslist search URLs and it reads the same public search data the Craigslist website loads, newest listings first. Plain cities use the category and filters you choose in the input (apartments / housing for rent by default; rooms, sublets, real estate for sale, cars and trucks, motorcycles, RVs, boats, for sale, furniture, electronics, free stuff, jobs, gigs and services are one click away). A pasted search URL keeps its own category and every filter you set on the Craigslist site (price, bedrooms, bathrooms, pets, laundry, parking, model year, odometer, keyword and more).

Craigslist shows the newest 360 listings of a search. When you ask for more, the scraper splits the search into price ranges and collects the newest 360 of each range, so a big city like New York gives thousands of apartment listings in one run. Turn on **Include listing details** to add the full description, all attributes (laundry, parking, rent period, housing type, VIN, condition, fuel, transmission, title status...), bathrooms and the updated date.

Typical runs: a daily feed of new rentals in the cities you invest in, rent comps by bedroom count and neighborhood, used-car inventory and prices by owner or dealer, local job postings with pay, or a price index across many cities.

### Who is it for?

- **Real-estate investors, property managers and rental aggregators**: rent comps by bedrooms, square feet and neighborhood with GPS for mapping; a monitor of new rentals in target ZIPs and cities.
- **Used-car dealers and car flippers**: new cars and trucks by owner under your price cap, with odometer, condition and title status.
- **Market researchers and analysts**: price indexes and listing volume across hundreds of US and international Craigslist cities.
- **Recruiters and staffing agencies**: local job and gig postings with employer, compensation and category.
- **Lead-generation agencies**: businesses advertising services, rentals or vehicles in a region.

### What data can you get?

| Field | Example |
|---|---|
| `postingId`, `url` | 7986633888, https://www.craigslist.org/view/d/chicago-furnished-chicago-far-north/p1qMgo1eyxb6nB2tELrrZq |
| `title`, `price`, `priceText`, `currency` | Furnished Chicago ( Far North) 2Bed/1Ba Non-Smoking Condo for Rent, 1680, $1,680, USD |
| `category`, `categoryName` | apa, apartments / housing for rent |
| `postedAt` | 2026-10-20T11:37:29Z |
| `area`, `subArea`, `location`, `neighborhood` | chicago, chc, Chicago, null |
| `latitude`, `longitude` | 41.9973, -87.7879 |
| `bedrooms`, `squareFeet` | 2, 850 (housing) |
| `odometer` | 131012 (cars and vehicles) |
| `jobTitle`, `employer`, `compensation` | Applied R\&D Engineer, Weyerhaeuser, $98800 to $160400 per year (jobs) |
| `imageCount`, `images` | 15, \["https://images.craigslist.org/01414_8S0WA1NBvp0_0CI0t2_600x450.jpg", ...] |
| `searchInput`, `scrapedAt` | the city or URL the row came from, the time of the run |

With **Include listing details**: `description` (the ad text), `attributes` (for example {"condition": "excellent", "fuel": "gas", "title status": "clean", "transmission": "automatic", "VIN": "JTEEW21A170046868"} or {"rent period": "monthly", "features": \["apartment", "w/d in unit", "street parking"]}), `headlineAttributes` (3BR / 2Ba), `bathrooms`, `updatedAt`, `postedAtLocal`, `placeName`, `region`, `detailStatus`.

Craigslist hides posters' email and phone behind its own reply relay; the scraper never collects contact details or poster names.

### How much does it cost?

You pay per listing: **$1.50 per 1,000 listings** ($0.0015 per listing) on the Free plan, with Store discounts on paid Apify plans: Bronze $1.35, Silver $1.275, Gold and above $1.20 per 1,000 listings. Platform usage is included, and listing details cost nothing extra.

Worked examples:

- The newest 360 apartments in New York: 360 x $0.0015 = **$0.54**.
- 2,000 cars and trucks by owner in Los Angeles (price slicing past 360): 2,000 x $0.0015 = **$3.00**.
- A daily new-listings monitor on 5 cities with about 100 new rentals per city per day: 500 x $0.0015 = **$0.75 per day**; listings the monitor has already seen are **not charged**.

Listings outside your **Posted after** date, repeats skipped by the monitor and cities that cannot be read (listed in the OUTPUT record) are never charged. Set **Max listings in total** or a maximum cost per run to cap spending.

### How to use it

1. Click **Try for free**.
2. Add cities to **Cities or Craigslist search URLs** (newyork, sfbay, losangeles, chicago, or a city name like New York), or paste a search URL from craigslist.org with your filters already set.
3. Pick a **Category** and optional filters (keyword, price, bedrooms, only with photos, posted today, posted after).
4. Optional: turn on **Only new listings since the last run** and schedule the actor hourly or daily; turn on **Include listing details** for descriptions and attributes.
5. Click **Start** and download the table as CSV, Excel, JSON or through the API. The **Cars and vehicles** and **Jobs** views show the fields of those categories.

### Input example

```json
{
  "searches": ["newyork", "https://sfbay.craigslist.org/search/apa?max_price=3500"],
  "category": "apa",
  "minBedrooms": 1,
  "hasImage": true,
  "maxListingsPerSearch": 360,
  "maxItems": 1000,
  "onlyNewListings": true,
  "monitorName": "rentals-ny-sf",
  "includeDetails": false
}
```

### Output example

An unedited row from a live run (images shortened):

```json
{
  "postingId": 7986633888,
  "title": "Furnished Chicago ( Far North) 2Bed/1Ba Non-Smoking Condo for Rent",
  "price": 1680,
  "priceText": "$1,680",
  "currency": "USD",
  "category": "apa",
  "categoryName": "apartments / housing for rent",
  "postedAt": "2026-10-20T11:37:29Z",
  "area": "chicago",
  "subArea": "chc",
  "location": "Chicago",
  "neighborhood": null,
  "latitude": 41.9973,
  "longitude": -87.7879,
  "bedrooms": 2,
  "squareFeet": 850,
  "odometer": null,
  "jobTitle": null,
  "employer": null,
  "compensation": null,
  "imageCount": 15,
  "images": ["https://images.craigslist.org/01414_8S0WA1NBvp0_0CI0t2_600x450.jpg", "..."],
  "url": "https://www.craigslist.org/view/d/chicago-furnished-chicago-far-north/p1qMgo1eyxb6nB2tELrrZq",
  "searchInput": "chicago",
  "scrapedAt": "2026-10-20T12:18:52.665472Z"
}
```

A car listing with **Include listing details** adds:

```json
{
  "title": "2008 Toyota Camry Hybrid Clean Title 131K Miles Smog Sunroof Gas Saver",
  "price": 6000,
  "categoryName": "cars & trucks - by owner",
  "location": "hayward / castro valley",
  "odometer": 131012,
  "attributes": {"condition": "excellent", "cylinders": "4 cylinders", "drive": "fwd", "fuel": "gas", "odometer": "131,012", "paint color": "silver", "title status": "clean", "transmission": "automatic", "type": "sedan"},
  "placeName": "Hayward",
  "region": "US-CA",
  "detailStatus": "ok"
}
```

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it in Apify (with **Only new listings** each run returns just the fresh ones), or connect it to Make, n8n, Zapier, Google Sheets, Slack or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/craigslist-apartments-listings-scraper").call(run_input={
    "searches": ["newyork", "losangeles"],
    "category": "apa",
    "minBedrooms": 2,
    "maxPrice": 4000,
    "onlyNewListings": True,
    "monitorName": "two-bed-rentals",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["bedrooms"], item["location"], item["url"])
```

### FAQ

**Which cities work?** Every Craigslist site: use the subdomain (newyork, sfbay, losangeles, chicago, seattle, austin, denver, boston, toronto, london...) or a city name (New York, Los Angeles, San Francisco). Unknown names are reported in the OUTPUT record and not charged.

**Can I use the filters from the Craigslist website?** Yes. Set them on craigslist.org, copy the search URL and paste it as an entry. Price, bedrooms, bathrooms, square feet, pets, laundry, parking, model year, odometer, keyword and all other URL filters are passed through.

**Why does a search stop at 360 listings?** That is what Craigslist shows per search. Raise **Max listings per city or URL** above 360 and the scraper splits the search by price range to reach more. Those extra rows come grouped by price band, and listings without a price (most jobs, free stuff) are only reachable in the first 360.

**How does the new-listings monitor work?** With **Only new listings since the last run** on, the scraper keeps the listing ids each search returned in a named key-value store in your account and outputs only listings it has not seen before. Use one **Monitor name** per watchlist. Repeats are skipped and not charged.

**Do I get the poster's email or phone?** No. Craigslist relays replies through anonymous addresses and the scraper never collects contact details or poster names. Ad text may contain whatever the advertiser wrote.

**How fast is it?** One request returns up to 360 listings, so 1,000 listings take about 10 to 20 seconds. Listing details add one page per listing (three at a time, with a short pause), about 1,000 listings in 10 to 15 minutes.

**Is it legal to collect this data?** It collects publicly visible classified ads only, without logins. You are responsible for how you use the data, including privacy laws like GDPR and CCPA and Craigslist's terms.

**Something is not working?** Open an issue on the Issues tab with your run link and we will fix it fast.

### Support

Questions, a city or category that answers oddly, or a field you need (for example a parsed bathrooms count without details, or alerts to Slack)? Open an issue on the **Issues** tab of this actor with your run link. Issues are read every working day and fixes ship within a few days; feature requests that other users share get built.

# Actor input Schema

## `searches` (type: `array`):

One per line: a Craigslist city (newyork, sfbay, losangeles, chicago, seattle, austin, or a city name like 'New York'), or a full search URL copied from your browser (https://newyork.craigslist.org/search/apa?min_price=2000\&max_bedrooms=2). A URL keeps its own category and filters; plain cities use the category and filters below.

## `category` (type: `string`):

Used for plain city entries. Apartments / housing for rent is the default.

## `query` (type: `string`):

Optional search words, for example 'studio', 'no fee', 'toyota tacoma' or 'warehouse'.

## `minPrice` (type: `integer`):

Lowest price or rent in the local currency.

## `maxPrice` (type: `integer`):

Highest price or rent in the local currency.

## `minBedrooms` (type: `integer`):

Housing categories only.

## `maxBedrooms` (type: `integer`):

Housing categories only.

## `hasImage` (type: `boolean`):

Skip listings without pictures.

## `postedToday` (type: `boolean`):

Only listings posted today (Craigslist's own filter).

## `postedAfter` (type: `string`):

Only listings posted on or after this date, for example 2026-10-01. Older listings are skipped and not charged.

## `maxListingsPerSearch` (type: `integer`):

Newest first. Craigslist shows the newest 360 listings of a search; above that the scraper splits the search by price range to reach more (those rows come grouped by price band, and listings without a price are only in the first 360).

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

Stop after this many listings across all cities. You pay per listing, so this also caps the cost of the run.

## `onlyNewListings` (type: `boolean`):

Remembers the listings each search returned (in a named key-value store) and outputs only ones not seen before. Schedule the run every hour or day to get a feed of fresh listings; repeats are not charged.

## `monitorName` (type: `string`):

Name of the key-value store that keeps the seen listings. Use a different name for each separate watchlist.

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

One extra page per listing adds the full description text, attributes (laundry, parking, pets, rent period, housing type, car condition, fuel, transmission, title status and more), bathrooms, updated date and place name. Slower; the price per listing is the same.

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

Apify Proxy (datacenter) spreads the requests. Switch to residential only if a run reports 403 or 429 errors.

## Actor input object example

```json
{
  "searches": [
    "newyork",
    "https://sfbay.craigslist.org/search/apa?max_price=3500"
  ],
  "category": "apa",
  "hasImage": false,
  "postedToday": false,
  "maxListingsPerSearch": 100,
  "maxItems": 200,
  "onlyNewListings": false,
  "monitorName": "craigslist-monitor",
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per result in the default dataset.

# 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 = {
    "searches": [
        "newyork",
        "https://sfbay.craigslist.org/search/apa?max_price=3500"
    ],
    "maxListingsPerSearch": 100,
    "maxItems": 200,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/craigslist-apartments-listings-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 = {
    "searches": [
        "newyork",
        "https://sfbay.craigslist.org/search/apa?max_price=3500",
    ],
    "maxListingsPerSearch": 100,
    "maxItems": 200,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/craigslist-apartments-listings-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 '{
  "searches": [
    "newyork",
    "https://sfbay.craigslist.org/search/apa?max_price=3500"
  ],
  "maxListingsPerSearch": 100,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kamerozkan/craigslist-apartments-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kamerozkan/craigslist-apartments-listings-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/DpLrQEfqhGLtmocxU/builds/l2YtEBoBrIQvPMhrZ/openapi.json
