# Craigslist Scraper - Listings, Prices, Photos, GPS (`om_kh/craigslist-scraper`) Actor

Scrape Craigslist listings in any city: title, price, date, neighborhood, GPS, photos, optional description, emails and phones. Filters: keyword, price range, condition, photo, posted today; sort by date or price. Beyond the 360-result limit. $1 per 1,000 listings, no start fee.

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

## Pricing

Pay per event

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 Scraper — Listings, Prices, Photos, GPS

> Scrape **Craigslist listings** from any city, category and search link: title, **price**,
> date, area and neighborhood, **GPS coordinates**, **photos** and link — and optionally the
> **full description and attributes** (bedrooms, condition, odometer, make…). Works **beyond
> Craigslist's 360-result limit**. No login. **$1 per 1,000 listings, no start fee.**

### Free tier — 20 results free on every run

**The first 20 results of every run are free**, on every run you ever make — not a one-off trial. One guard: the free allowance never covers more than half of a run, so the offer stays sustainable.

### What does this Craigslist scraper do?

Paste the Craigslist search links you already use (with your filters: price, bedrooms,
keywords, "has image"…), or just pick **cities + a category + keywords**. The scraper reads
Craigslist's own search API, so it is fast and returns every listing of the search, newest
first. Big searches (more than 360 results) are split automatically into price bands and
merged without duplicates.

### Compared with solidcode/craigslist-scraper

Read on the Store on 2026-10-23 (Craigslist Scraper). Where it does better, this section says so.

- **Built on the site's own data**, not a resold scraper: no second Actor between you and the source.
- **Free results on every run** and a hard cost cap (`maxTotalChargeUsd`).
- **Price:** $1 per 1,000 here, $1.8 there.

### Why use it

1. **Every result, not just the first page.** Searches with thousands of listings are covered.
2. **GPS + neighborhood on every listing** — map housing, cars or deals instantly.
3. **Photos** as direct image links.
4. **Details option:** description, all attributes and the map address.
5. **Any city in the world** (US, Canada, Europe, Asia…) and any category: housing, cars, jobs,
   for sale, services, gigs.
6. **Cheaper than the market leaders** and no start fee.

### How to use it in 3 steps

1. Click **Try for free** — a search link is prefilled.
2. Paste your Craigslist search links, or choose cities, a category and keywords.
3. Click **Start** and download JSON, CSV or Excel.

### Input

| Field | What it does |
|---|---|
| `searchUrls` | Craigslist search links with your filters (up to 50). |
| `cities` | Or Craigslist city hostnames: `newyork`, `losangeles`, `sfbay`, `chicago`, `london`, `paris`, `toronto`… |
| `category` | With cities: for sale, apartments, housing, rooms, cars & trucks, jobs, gigs, services, furniture, electronics, bicycles, free stuff. |
| `keywords` | With cities: one search per city and keyword. |
| `priceMin` / `priceMax` | Price range. |
| `condition` | `new`, `like-new`, `excellent`, `good`, `fair` or `salvage` (for sale only). |
| `hasImage` | Only postings with a photo. |
| `postedToday` | Only postings from the last 24 hours. |
| `sort` | `date` (default), `rel`, `priceasc` or `pricedsc`. |
| `maxItemsPerSearch` | Newest first, 1 to 10,000. Default 100. |
| `postedAfter` | Optional `YYYY-MM-DD`. |
| `includeDetails` | Description, attributes and address (one extra page per listing). Also adds `condition`, `emails` and `phoneNumbers` found in the text. |
| `maxTotalChargeUsd` | Optional hard cost cap for the run. |

```json
{
  "searchUrls": ["https://newyork.craigslist.org/search/brk/apa?max_price=3000&min_bedrooms=2"],
  "maxItemsPerSearch": 500,
  "includeDetails": true
}
```

### Output

Real example with details (description and photos trimmed):

```json
{
  "postingId": 7976179122,
  "title": "Giant Contend Road Bike",
  "price": 500,
  "priceText": "$500",
  "url": "https://www.craigslist.org/view/d/brentwood-giant-contend-road-bike/1PB6ceiMSvGMPzgDqEj1hz",
  "postedAt": "2026-10-01T17:13:32Z",
  "category": "bia",
  "area": "sfbay",
  "subarea": "eby",
  "latitude": 37.9324,
  "longitude": -121.6894,
  "imageUrls": ["https://images.craigslist.org/00m0m_2mu5FwFEw2_0t20CI_600x450.jpg"],
  "imageCount": 6,
  "description": "Like new Giant Contend Road Bike. Hardly ridden.…",
  "attributes": [
    "bicycle type: road",
    "frame size: Medium",
    "condition: like new",
    "make / manufacturer: Giant",
    "model name / number: Contend"
  ],
  "updatedAt": "2026-10-01T10:09:32-0700",
  "searchTotal": 214,
  "status": "ok"
}
```

Housing listings also carry `bedrooms` and `neighborhood`.

### How much does it cost?

| Event | Price |
|---|---|
| Listing (search data) | **$0.001** ($1 per 1,000) |
| Listing with description and attributes | **$0.0015** |
| Start fee | none |

Up to 20 listings of every run are free (at most half of the run). A listing that was deleted
before its details could be read is charged as a plain listing. Paid Apify plans get lower
tier prices.

### Use cases

- **Real estate** — rents by neighborhood, new rentals every morning.
- **Car dealers and flippers** — new cars under a price, with odometer and condition.
- **Resellers** — underpriced items and free stuff, mapped with GPS.
- **Lead generation** — services and gigs posted in your area.
- **Market research** — price distributions by city and category.

### Use it from code (API)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/craigslist-scraper").call(run_input={
    "cities": ["losangeles", "sandiego"],
    "category": "cta",
    "keywords": ["tesla"],
    "maxItemsPerSearch": 1000,
})
for car in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(car["postedAt"], car["price"], car["title"], car["url"])
```

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~craigslist-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchUrls": ["https://sfbay.craigslist.org/search/sss?query=bike"], "maxItemsPerSearch": 50}'
```

### Integrations and MCP

Schedule it every hour with `postedAfter` and send new listings to Slack, Telegram, Google
Sheets or a CRM with n8n, Make or Zapier. AI agents can call it through
`https://mcp.apify.com` as `om_kh/craigslist-scraper`.

### Tips and limits

- Craigslist hides posters' emails behind a relay; contact details are not provided.
- Craigslist may add a few listings from nearby areas, exactly as on its website.
- For very large cities and categories, add filters (price, keywords) to keep runs short.

### FAQ

**Do I need a Craigslist account?** No.

**Is it legal?** It reads public listings. Use the data in line with the laws and terms that
apply to you.

### Related Actors

- [Zillow Listings Scraper - Homes, Prices, Full Details](https://apify.com/om_kh/zillow-listings-scraper) — homes for sale and rent in the US.
- [eBay Sold Listings Scraper - Sold Price, Date, Title](https://apify.com/om_kh/ebay-sold-listings-scraper) — what items really sell for.
- [Google Maps Business Scraper - Name, Rating, Address](https://apify.com/om_kh/google-maps-business-scraper) — local businesses in the same cities.

### Your feedback

Did this Actor save you time? A short review on the **Reviews** tab helps other people find it, and every review is read. Something missing or broken? Open an issue on the **Issues** tab: it is answered and fixed fast.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste search links from Craigslist with your filters, e.g. https://newyork.craigslist.org/search/brk/apa?max_price=3000 (up to 50).

## `cities` (type: `array`):

Or build searches: Craigslist city hostnames such as newyork, losangeles, sfbay, chicago, london, paris, toronto.

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

Category used with Cities.

## `keywords` (type: `array`):

Keywords used with Cities; one search per city and keyword.

## `priceMin` (type: `integer`):

Only postings priced at or above this amount.

## `priceMax` (type: `integer`):

Only postings priced at or below this amount.

## `condition` (type: `string`):

Craigslist's own condition filter.

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

Only postings that have at least one photo.

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

Only postings published in the last 24 hours.

## `sort` (type: `string`):

Order of the results.

## `maxItemsPerSearch` (type: `integer`):

Newest first, 1 to 10,000. Searches with more than 360 results are split automatically. Default 100.

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

Only listings posted on or after this date (YYYY-MM-DD).

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

Open each listing for its full description, attributes (bedrooms, condition, odometer...) and address. $0.0015 instead of $0.001 per listing.

## `maxTotalChargeUsd` (type: `number`):

Optional hard cost cap for this run.

## Actor input object example

```json
{
  "searchUrls": [
    "https://sfbay.craigslist.org/search/sss?query=bike"
  ],
  "category": "sss",
  "condition": "",
  "hasImage": false,
  "postedToday": false,
  "sort": "date",
  "maxItemsPerSearch": 50,
  "includeDetails": false
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, and source issues.

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

Listings in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

# 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 = {
    "searchUrls": [
        "https://sfbay.craigslist.org/search/sss?query=bike"
    ],
    "maxItemsPerSearch": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/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 = {
    "searchUrls": ["https://sfbay.craigslist.org/search/sss?query=bike"],
    "maxItemsPerSearch": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("om_kh/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 '{
  "searchUrls": [
    "https://sfbay.craigslist.org/search/sss?query=bike"
  ],
  "maxItemsPerSearch": 50
}' |
apify call om_kh/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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