# Craigslist Scraper - Listings, Prices & Geo to CSV/Excel (`matrix-crawl/craigslist-scraper`) Actor

Scrape Craigslist classifieds — listings, prices, locations, GPS coordinates, attributes, photos, and post dates — to CSV, Excel, or JSON. Any region, any category (housing, for-sale, jobs, gigs, services). Residential anti-block. No login, no API key.

- **URL**: https://apify.com/matrix-crawl/craigslist-scraper.md
- **Developed by:** [Matrix Crawl](https://apify.com/matrix-crawl) (community)
- **Categories:** E-commerce, Real estate, Lead generation
- **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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## 📍 Craigslist Scraper — Listings, Prices & Geo to CSV/Excel

**Fast Craigslist scraper for classifieds data.** Pull listings from any Craigslist region and category — titles, prices, locations, GPS coordinates, attributes, photos, and post dates — into clean, spreadsheet-ready rows. No login, no API key.

`craigslist scraper` · `classifieds data` · `real estate leads` · `used car listings` · `apartment data` · `market research`

Built for real-estate analysts, automotive valuation, resale arbitrage, and local market research — with geo coordinates and parsed bed/bath/sqft ready for mapping and filtering.

***

### 👥 Who Is This For?

- **Real-Estate & Rental Analysts:** Pull apartments/housing with price, neighborhood, lat/long, beds, baths, and sqft — map and filter instantly.
- **Automotive & Resale Traders:** Track car/for-sale prices across regions to spot under-market deals.
- **Market Researchers:** Build a structured, multi-region classifieds dataset without wrestling messy HTML.

***

### ⚡ Features

- **Geo coordinates** — latitude/longitude per listing (enrichment mode) for maps and proximity filtering.
- **Parsed real-estate fields** — `br`, `ba`, `sqft` pulled out of listing attributes into typed columns.
- **Images & attributes** — full photo-gallery URLs and the attribute list per post.
- **Multi-region × multi-category** — scrape many subdomains and categories in one run.
- **Smart filters** — keyword, min/max price, search radius + ZIP, photos-only.
- **De-duplicated** — repeat listings and reposts removed by id.
- **Cost control** — hard `maxItems` cap so large regions can't run away with your bill.
- **Residential anti-block** — routes through Apify residential proxy with automatic session rotation, since Craigslist blocks datacenter IPs hard.

***

### 🚀 How to Use

1. Add one or more **regions** (subdomains) like `newyork`, `sfbay`, `losangeles`.
2. Add one or more **category codes** (see table below — e.g. `hhh` housing, `sss` for sale, `jjj` jobs).
3. Optionally set **filters** (keyword, price range, radius+ZIP, photos-only).
4. Keep **Visit each post** on for geo/attributes/images, set your **Maximum Items** cap, and click **Start**.
5. Export as **CSV, Excel, JSON, or HTML** — or call it as a tool via Apify's MCP server.

#### Category Codes

Use either a **whole section** code or a **specific** sub-category code.

| Section | Code | | Common specific codes |
|---------|------|---|------------------------|
| Community | `ccc` | | `apa` apts/housing · `hhh` all housing |
| Events | `eee` | | `cto` cars by owner · `cta` cars by dealer |
| For sale | `sss` | | `sss` all for-sale · `ele` electronics |
| Gigs | `ggg` | | `ggg` all gigs · `cpg` computer gigs |
| Housing | `hhh` | | `jjj` all jobs |
| Jobs | `jjj` | | `bbb` all services |
| Resumes | `rrr` | | `rrr` resumes · `eee` events |
| Services | `bbb` | | |

Example — scrape every section: `"categories": ["ccc","eee","sss","ggg","hhh","jjj","rrr","bbb"]`

#### Sample Input

```json
{
  "subdomains": ["newyork"],
  "categories": ["apa"],
  "minPrice": 1500,
  "maxPrice": 3500,
  "hasPic": true,
  "enrichPosts": true,
  "maxPagesPerSearch": 3,
  "maxItems": 500,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

***

### 📊 Output Data Dictionary

| Field | Type | Example |
|-------|------|---------|
| `id` | string | `"7654321"` |
| `title` | string | `"Sunny 2BR Apt"` |
| `price` | number | null | `2500` |
| `location` | string | `"Brooklyn"` |
| `subdomain` | string | `"newyork"` |
| `url` | string | `"https://newyork.craigslist.org/.../7654321.html"` |
| `latitude` | number | null | `40.6782` |
| `longitude` | number | null | `-73.9442` |
| `br` | number | null | `2` |
| `ba` | number | null | `1` |
| `sqft` | integer | null | `950` |
| `description` | string | null | `"Great place near the park..."` |
| `attributes` | string\[] | `["2BR / 1Ba","laundry in bldg"]` |
| `imageUrls` | string\[] | `["https://images.craigslist.org/a_600x450.jpg"]` |
| `postedAt` | string (ISO) | null | `"2026-06-20T10:00:00-0400"` |
| `scrapedAt` | string (ISO) | `"2026-06-27T10:00:00.000Z"` |

> Geo, `br`/`ba`/`sqft`, attributes, images, and description require **Visit each post** (enrichment) enabled. With it off, you get the search-page fields only (id, title, price, location, url).
>
> `price`/`br`/`ba`/`sqft` are `null` where not applicable — e.g. gigs/jobs have no price; only housing has beds/baths/sqft. Output keeps one consistent schema across all sections.

***

### 💰 Pricing

Charged per delivered dataset row. With enrichment on, one row = one enriched listing.

### ⚖️ Compliance & Responsible Use

This actor collects **publicly visible** classifieds data only. It does **not** extract phone numbers, emails, or other personal contact details. You are responsible for lawful use: respect Craigslist's Terms of Service and `robots.txt`, applicable data-protection laws, and reasonable request rates.

# Actor input Schema

## `subdomains` (type: `array`):

Regional subdomain prefixes, e.g. 'newyork', 'losangeles', 'sfbay'. One row per region.

## `categories` (type: `array`):

Craigslist category shorthand codes. Common: apa (apts), hhh (housing), cto (cars by owner), cta (cars by dealer), sss (for sale), ggg (gigs), jjj (jobs).

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

Optional search keyword applied to every region/category.

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

Optional minimum price filter.

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

Optional maximum price filter.

## `searchDistance` (type: `integer`):

Optional radius in miles. Pairs with the postal/ZIP below.

## `postal` (type: `string`):

Optional center ZIP code for the search-distance radius.

## `hasPic` (type: `boolean`):

Restrict to listings that include at least one image.

## `enrichPosts` (type: `boolean`):

If on, opens each listing page for lat/long, attributes, description, images, and post date. Off = faster/cheaper, search-page fields only.

## `maxPagesPerSearch` (type: `integer`):

Search result pages per region/category (120 listings per page).

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

Hard cap on total dataset rows across all regions, to control cost. 0 = unlimited.

## `debugLog` (type: `boolean`):

Enable DEBUG-level logs to diagnose blocked or empty regions.

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

Defaults to Apify residential proxy. Craigslist blocks datacenter IPs hard — residential strongly recommended.

## Actor input object example

```json
{
  "subdomains": [
    "newyork"
  ],
  "categories": [
    "apa"
  ],
  "hasPic": false,
  "enrichPosts": true,
  "maxPagesPerSearch": 1,
  "maxItems": 20,
  "debugLog": false,
  "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 = {
    "subdomains": [
        "newyork"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("matrix-crawl/craigslist-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 = { "subdomains": ["newyork"] }

# Run the Actor and wait for it to finish
run = client.actor("matrix-crawl/craigslist-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 '{
  "subdomains": [
    "newyork"
  ]
}' |
apify call matrix-crawl/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/lQ2UPrcAfgWKAw33y/builds/KvoVSqJ2OTmdDr6lM/openapi.json
