# Craigslist Scraper (`maged120/craigslist-scraper`) Actor

Scrape Craigslist listings (apartments, jobs, for sale, etc.) for any US city. Returns title, price, beds, sqft, location, and listing URL.

- **URL**: https://apify.com/maged120/craigslist-scraper.md
- **Developed by:** [Maged](https://apify.com/maged120) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 4 total users, 1 monthly users, 96.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.
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?

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 — Fast, Full Data, Verified Links

Extract **complete, structured Craigslist listing data** for any US city and category. Apartments, jobs, cars, electronics, furniture, free stuff, and more — with verified working links, all photos, full descriptions, exact timestamps, and neighborhood context. Ready for analysis, lead generation, price monitoring, or automation in seconds.

***

### Why this scraper beats the rest

Most Craigslist scrapers share the same problems: broken links, missing data, slow page-by-page fetching, and thumbnail-only images. Here's how we solve every one of them.

#### ⚡ 360 results per request — not one page at a time

Other scrapers load Craigslist search pages one by one. This scraper retrieves **up to 360 listings in a single call**, making bulk extraction 10–30× faster. Fetching 3,600 listings takes the same number of round-trips as fetching 10 listings the old way.

#### 🔗 Every URL actually works

Craigslist uses a regional routing system that most scrapers get wrong. Listings don't just live at `city.craigslist.org/category` — they require a subarea path like `/eby/`, `/sfc/`, `/brk/` that's specific to each listing. We decode this from the listing data itself, so **every URL we return resolves to the real listing page**. No dead links, no 404s.

#### 🖼️ All photos — not just the thumbnail

We extract **every image in the listing** (up to 24 photos per post), not just the search result thumbnail. Critical for real estate analysis, vehicle inspection, or inventory tracking where you need to see the full picture.

#### 🕐 Exact posted timestamps

Every listing includes the **precise UTC datetime it was posted**, accurate to the second. No vague "3 hours ago" — a real ISO 8601 timestamp you can sort, filter, and compare programmatically.

#### 📍 Neighborhood-level context

Beyond GPS coordinates, each result includes the **neighborhood or district name** as listed by the poster — useful for market segmentation, heatmaps, and local trend analysis.

#### 📄 Full descriptions and attributes (optional)

Enable `scrapeDetails` to get the **complete listing description**, structured **attribute list** (parking type, pet policy, laundry, A/C, car specs, availability date), and **street address** when shown. This is the data you normally only see when you click through to the listing itself.

#### 🎛️ Real filter controls

Price range, photo requirement, posted-today filter, and sort order (newest / cheapest / most expensive / most relevant) — all applied **server-side** so you only retrieve the results you need.

***

### Use cases

- **Real estate market research** — track rental prices, inventory, and availability by neighborhood
- **Lead generation** — catch new job posts, service listings, or for-sale items the moment they appear
- **Price intelligence** — monitor vehicle, electronics, or furniture prices across cities over time
- **Competitive analysis** — track listing volume, pricing trends, and time-to-removal
- **Deal hunting** — sort by price ascending with a keyword filter to surface the best deals first
- **Academic and journalistic research** — large-scale classified data without manual effort

***

### How to use

1. Open the Actor in [Apify Console](https://console.apify.com)
2. Enter your **City** (e.g. `newyork`, `chicago`, `losangeles`, `sfbay`)
3. Select a **Category** from the dropdown
4. Add optional filters — price range, sort order, photos only, posted today
5. Enable **Scrape Full Details** if you need descriptions and attributes
6. Click **Start** — results appear in the Output tab within seconds

***

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `city` | string | `newyork` | Craigslist city subdomain (e.g. `newyork`, `chicago`, `losangeles`, `sfbay`, `seattle`, `boston`, `miami`, `dallas`, `denver`, `phoenix`, `austin`, `philadelphia`) |
| `category` | string | `apa` | Category code — see table below. You can also type any Craigslist code directly (e.g. `mcy` for motorcycles, `mvs` for RVs, `mus` for musical instruments) |
| `query` | string | *(empty)* | Keyword search query |
| `maxResults` | integer | `100` | Maximum listings to return (0 = unlimited) |
| `sortBy` | string | `date` | `date` (newest), `rel` (relevant), `priceasc`, `pricedsc` |
| `minPrice` | integer | *(none)* | Minimum price filter |
| `maxPrice` | integer | *(none)* | Maximum price filter |
| `postedToday` | boolean | `false` | Only listings posted in the last 24 hours |
| `hasPic` | boolean | `false` | Only listings with at least one photo |
| `scrapeDetails` | boolean | `false` | Fetch each listing page for full description, attributes, and address. Adds ~10–20s per 100 listings. |

#### Supported categories

| Code | Category | Code | Category |
|------|----------|------|----------|
| `apa` | Apartments / Housing for Rent | `mcy` | Motorcycles |
| `roo` | Rooms & Shares | `boa` | Boats |
| `sub` | Sublets & Temporary | `bik` | Bikes |
| `reo` | Real Estate for Sale | `ele` | Electronics |
| `jjj` | Jobs | `fua` | Furniture |
| `ggg` | Gigs | `zip` | Free Stuff |
| `sss` | For Sale (General) | `bbb` | Services |
| `cta` | Cars & Trucks | | |

**Example — newest cheap cars with photos:**

```json
{
  "city": "chicago",
  "category": "cta",
  "query": "honda civic",
  "minPrice": 3000,
  "maxPrice": 12000,
  "hasPic": true,
  "sortBy": "priceasc",
  "maxResults": 200
}
```

**Example — today's apartments with full details:**

```json
{
  "city": "losangeles",
  "category": "apa",
  "maxPrice": 2500,
  "postedToday": true,
  "scrapeDetails": true,
  "maxResults": 100
}
```

***

### Output

Each listing returns a rich JSON object. Standard fields are always present. Detail fields (`description`, `attributes`, `address`) require `scrapeDetails: true`.

```json
{
  "postingId": 7937348715,
  "title": "Spacious 2BR in Williamsburg – laundry in unit, no broker fee",
  "price": "$2,800",
  "priceValue": 2800,
  "beds": 2,
  "sqft": 950,
  "neighborhood": "williamsburg",
  "latitude": 40.7128,
  "longitude": -73.9441,
  "postedAt": "2026-05-29T14:22:10Z",
  "url": "https://newyork.craigslist.org/brk/apa/d/brooklyn-spacious-2br-williamsburg/7937348715.html",
  "imageUrl": "https://images.craigslist.org/00f0f_abc123_0t20CI_600x450.jpg",
  "imageUrls": [
    "https://images.craigslist.org/00f0f_abc123_0t20CI_600x450.jpg",
    "https://images.craigslist.org/00K0K_xyz456_0CI0t2_600x450.jpg"
  ],
  "imageCount": 2,
  "description": "Beautifully renovated 2BR with hardwood floors, exposed brick, and in-unit W/D. Steps from the L train. No broker fee. Available June 1st.",
  "attributes": ["2BR / 1Ba", "950ft²", "available Jun 1", "cats are OK - purrr", "w/d in unit", "no smoking", "street parking"],
  "address": "123 Bedford Ave",
  "city": "newyork",
  "category": "apa"
}
```

Download results as JSON, CSV, Excel, or XML from the Output tab.

### Data fields

| Field | Description |
|-------|-------------|
| `postingId` | Unique Craigslist listing ID |
| `title` | Listing title |
| `price` | Formatted price string (e.g. `$2,800`) |
| `priceValue` | Numeric price in dollars |
| `beds` | Number of bedrooms (housing) |
| `sqft` | Square footage (housing) |
| `neighborhood` | Neighborhood or district name |
| `latitude` / `longitude` | GPS coordinates |
| `postedAt` | Exact UTC timestamp the listing was posted |
| `url` | Direct verified link to the listing page |
| `imageUrl` | First listing photo |
| `imageUrls` | All listing photos (up to 24) |
| `imageCount` | Total number of photos |
| `description` | Full listing description text *(scrapeDetails only)* |
| `attributes` | Structured list of amenities/specs *(scrapeDetails only)* |
| `address` | Street address from listing map *(scrapeDetails only)* |
| `city` | City input used |
| `category` | Category code used |

***

### Pricing

This Actor uses **pay-per-result** billing — you pay only for the listings you actually receive. There are two components to every run cost:

#### 1. Actor fee (per result)

Charged per listing pushed to the dataset. Higher Apify plans get a better rate:

| Apify Plan | Price per 1,000 results | Price per result |
|------------|------------------------|------------------|
| Free | $1.00 | $0.001 |
| Starter ($29/mo) | $0.80 | $0.0008 |
| Scale ($199/mo) | $0.65 | $0.00065 |
| Business ($999/mo) | $0.50 | $0.0005 |

#### 2. Platform compute cost (infrastructure)

Apify charges for the server time your run uses. The formula is:

```
Cost = (RAM in GB) × (run duration in hours) × (CU rate)
```

This Actor uses ~512 MB RAM. Typical durations and platform costs per plan:

| Run | Duration | Free ($0.20/CU) | Starter/Scale ($0.16/CU) | Business ($0.13/CU) |
|-----|----------|-----------------|--------------------------|---------------------|
| 100 results | ~15s | $0.0004 | $0.0003 | $0.0003 |
| 100 results + details | ~25s | $0.0007 | $0.0006 | $0.0005 |
| 1,000 results | ~30s | $0.0008 | $0.0007 | $0.0005 |
| 10,000 results | ~2 min | $0.006 | $0.005 | $0.004 |

Platform compute costs are a fraction of a cent per run — the actor fee dominates at scale.

#### Total cost examples

Platform compute costs are a fraction of a cent — the actor fee is the dominant cost at any scale.

| Scenario | Free plan | Starter plan | Scale plan | Business plan |
|----------|-----------|--------------|------------|---------------|
| 100 listings | ~$0.10 | ~$0.08 | ~$0.065 | ~$0.05 |
| 1,000 listings | ~$1.00 | ~$0.80 | ~$0.65 | ~$0.50 |
| 10,000 listings | ~$10.01 | ~$8.01 | ~$6.51 | ~$5.00 |
| 100,000 listings | ~$100.01 | ~$80.01 | ~$65.01 | ~$50.01 |

#### Monthly plan credits

Every paid plan includes a monthly credit that applies toward both platform costs and actor fees:

| Plan | Monthly cost | Included credit | Listings covered (Starter rate) |
|------|-------------|-----------------|----------------------------------|
| Free | $0 | $5 (one-time) | ~6,250 |
| Starter | $29/mo | $29/mo | ~36,250/mo |
| Scale | $199/mo | $199/mo | ~306,000/mo |
| Business | $999/mo | $999/mo | ~1,998,000/mo |

See [Apify pricing](https://apify.com/pricing) for full plan details.

***

### Tips

- **Monitor new listings**: combine `postedToday: true` + `hasPic: true` + a keyword to catch fresh posts the moment they appear
- **Price floor analysis**: use `sortBy: priceasc` to find the cheapest listings first
- **Multiple cities**: run the Actor separately per city or use [Apify Schedules](https://docs.apify.com/platform/schedules) to automate across markets
- **Unlimited extraction**: set `maxResults: 0` to retrieve all available listings (often 10,000–25,000)
- **Any category**: the dropdown covers the most common categories but you can type any Craigslist code directly — `mcy` (motorcycles), `mvs` (RVs), `mus` (musical instruments), `pho` (photography gear), `atq` (antiques), `clt` (clothing), and hundreds more
- **Deal hunting**: `sortBy: priceasc` + `hasPic: true` + keyword is the fastest way to surface real deals

***

### FAQ

**Why are some fields null?**
Price, beds, sqft, and neighborhood are optional on Craigslist. Listings that don't include them return `null` for those fields.

**How fresh is the data?**
Each run fetches live data directly. Results reflect what's on Craigslist at the moment you run the Actor.

**Can I run multiple cities?**
Not in a single run — set up separate runs per city, or use the Apify API/Schedules to run them in parallel.

**Is this legal?**
This Actor accesses publicly available Craigslist listings the same way a browser does. Users are responsible for ensuring compliance with Craigslist's [Terms of Use](https://www.craigslist.org/about/terms.of.use) and applicable laws. Do not use scraped data for spam, fraud, or harassment.

**Need help or found a bug?**
Open an issue in the [Issues tab](../../issues) or reach out through Apify Console.

# Actor input Schema

## `city` (type: `string`):

Craigslist city subdomain (e.g. newyork, chicago, losangeles, sfbay, seattle, boston, washingtondc, miami, dallas, houston, denver, phoenix, portland, sandiego, lasvegas, austin, philadelphia)

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

Craigslist category code. You can also type any Craigslist category abbreviation directly (e.g. mcy for motorcycles, boa for boats).

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

Optional keyword search query

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

Maximum number of listings to return (0 = unlimited, up to 10,000+)

## `sortBy` (type: `string`):

Order of results

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

Only return listings at or above this price

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

Only return listings at or below this price

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

Only return listings posted within the last 24 hours

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

Only return listings that include at least one photo

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

Visit each listing page to extract the full description, housing/item attributes (parking, laundry, A/C, car specs, etc.), and street address when available. Increases run time but returns significantly more data.

## Actor input object example

```json
{
  "city": "newyork",
  "category": "apa",
  "query": "",
  "maxResults": 100,
  "sortBy": "date",
  "postedToday": false,
  "hasPic": false,
  "scrapeDetails": false
}
```

# 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 = {
    "city": "newyork"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maged120/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 = { "city": "newyork" }

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

```

## MCP server setup

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