# Craigslist Scraper — Listings, Prices, Photos & Details (`fabrikit/craigslist-scraper`) Actor

Scrape Craigslist listings from any city: for sale, cars, housing, jobs, gigs, services and events. Search by keyword, category and filters or paste search links. Title, price, location, map point, photos, date; optional full text and attributes.

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

## Pricing

from $1.10 / 1,000 listing scrapeds

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 & Details

**Craigslist Scraper extracts listings from craigslist.org** for any city or region it serves: items for sale, cars and trucks, apartments and other housing, jobs, gigs, services and events. Type search terms, pick a location and a category, add filters (price, posted today, has photos, ZIP radius, bedrooms, model year ...) or paste search links straight from your browser. Every listing becomes one flat JSON row with its title, price, currency, category, location with map coordinates, photos, posted date and link. Turn on the details add-on to also get the full posting text and attributes. It reads the same data the craigslist website loads, over plain HTTP: no browser, no account, and a small run finishes in seconds.

### Data you get

- **Listing:** posting ID, link, title, price as a number and as shown (`$445`, `£250`), currency of the area, posted date (ISO), category code and name, section (for sale, housing, jobs ...).
- **Location:** craigslist site (`sfbay`), sub-area (`sfc`), the location text of the post, neighborhood, latitude and longitude.
- **Photos:** main image and all image links (600 x 450), photo count.
- **Extras when craigslist lists them:** bedrooms and square feet (housing), open-house dates, compensation, company and job title (jobs and gigs), odometer (cars), monthly payment, event dates.
- **Search context:** the search term, location, category and the public craigslist link of the search, so rows from many searches stay apart.
- **Details add-on (optional):** full posting text, attributes (condition, make / manufacturer, model year, fuel, transmission, bathrooms, laundry, parking, employment type ...), first-posted and last-updated dates, repost reference, area and sub-area names, and for housing the street address or cross streets when the poster published them.

E-mail addresses, phone numbers and @handles are removed from titles, locations, attributes and texts, and contact details hidden behind craigslist's reply button are never requested. Every run also stores a `SUMMARY` record with the result count craigslist reports for each search, rows saved and request statistics.

### How to use it

| Input | What it does |
|---|---|
| `searchQueries` | One search per term and location: `road bike`, `2 bedroom`, `toyota tacoma`. Empty = everything in the category. |
| `locations` | Craigslist sites by the name in their address (`sfbay`, `newyork`, `losangeles`, `chicago`, `toronto`, `london`), area names (`new york city`) or sub-areas (`sfbay/sfc`, `newyork/brk`). |
| `category` / `categoryCode` | A dropdown with 120+ categories (for sale, cars & trucks, furniture, apartments, rooms, software jobs, labor gigs, household services, events ...) or any craigslist code such as `cto`. |
| `sortBy` | Newest, relevance, oldest, price up or down. |
| `minPrice`, `maxPrice`, `sellerType`, `postedToday`, `hasImage`, `searchTitlesOnly`, `hideDuplicates` | The common filters of the craigslist form. |
| `postalCode`, `searchDistance` | Search around a ZIP or postal code. |
| `extraFilters` | Any other filter by its craigslist name, e.g. `{"min_bedrooms": 2, "pets_dog": 1}` or `{"min_auto_year": 2018, "auto_make_model": "toyota"}`. |
| `searchUrls` | Craigslist search links with all their filters, old style (`https://sfbay.craigslist.org/search/bia?query=road+bike`) or new (`https://www.craigslist.org/search/area/newyork?cat=apa`). |
| `includeDetails` | Adds the details listed above (one extra request per listing, billed as an add-on). |
| `includeNearby` | Keep the listings craigslist adds from nearby sites when a search has few local results (marked `isNearby`). |
| `maxItems`, `maxItemsPerSearch` | Exact limits for the run and for each search. |

**Bikes in the San Francisco Bay Area (the default input):**

```json
{ "searchQueries": ["road bike"], "locations": ["sfbay"], "category": "sss", "maxItems": 30 }
```

**Two-bedroom apartments under US$4,000 in New York that allow dogs, newest first:**

```json
{
  "locations": ["newyork"],
  "category": "apa",
  "maxPrice": 4000,
  "extraFilters": { "min_bedrooms": 2, "pets_dog": 1 },
  "maxItems": 500
}
```

**Used Toyotas in three cities, with the full text and attributes:**

```json
{
  "locations": ["losangeles", "sandiego", "phoenix"],
  "category": "cta",
  "extraFilters": { "auto_make_model": "toyota", "min_auto_year": 2018 },
  "includeDetails": true,
  "maxItemsPerSearch": 100
}
```

**Your own saved searches:**

```json
{ "searchUrls": ["https://sfbay.craigslist.org/search/sfc/jjj?is_telecommuting=1"], "maxItems": 200 }
```

### Example output

A real row from a test run (23 October 2026, details add-on on, image list shortened):

```json
{
  "postingId": 7983732696,
  "url": "https://www.craigslist.org/view/d/alameda-2022-bmc-roadmachine-one-58cm/qGwKXg5xQtP9EBNtdESgG5",
  "title": "2022 BMC Roadmachine X One 58cm SRAM Force AXS Carbon wheels",
  "price": 2850,
  "priceText": "$2,850",
  "currency": "USD",
  "postedAt": "2026-10-23T05:04:55.000Z",
  "category": "bik",
  "categoryName": "bicycles - by owner",
  "section": "for sale",
  "area": "sfbay",
  "subarea": "eby",
  "location": "alameda",
  "neighborhood": "alameda",
  "latitude": 37.7351,
  "longitude": -122.2431,
  "imageUrl": "https://images.craigslist.org/00000_jxcnRXYu9Rn_0fu0bC_600x450.jpg",
  "images": [
    "https://images.craigslist.org/00000_jxcnRXYu9Rn_0fu0bC_600x450.jpg",
    "https://images.craigslist.org/01717_ah7F4s03Tj7_0bC0fu_600x450.jpg"
  ],
  "imageCount": 9,
  "bedrooms": null,
  "squareFeet": null,
  "salary": null,
  "odometer": null,
  "isNearby": false,
  "searchQuery": "road bike",
  "searchLocation": "sfbay",
  "searchCategory": "sss",
  "searchUrl": "https://www.craigslist.org/search/area/sfbay?cat=sss&query=road%20bike&sort=date",
  "description": "Selling my 2022 BMC Roadmachine X One in size 58cm. Excellent condition. This is BMC's all-road platform, so it covers fast road through light gravel.\n\nBuild:\n- SRAM Force eTap AXS XPLR 12-speed: 10-44 cassette, 44T chainring, 175mm cranks\n...",
  "attributes": {
    "bicycle type": "road",
    "frame size": "58cm",
    "wheel size": "700C",
    "bicycle frame material": "carbon fiber",
    "brake type": "disc (hydraulic)",
    "condition": "like new",
    "make / manufacturer": "BMC",
    "model name / number": "Roadmachine X One"
  },
  "createdAt": "2026-10-15T00:30:17.000Z",
  "updatedAt": "2026-10-23T05:00:38.000Z",
  "areaName": "SF bay area",
  "subareaName": "east bay",
  "detailsIncluded": true,
  "scrapedAt": "2026-10-23T08:29:35.629Z"
}
```

Some empty extras (open houses, company, job title, event dates, street address ...) are left out above; every row carries all of them, as `null` when craigslist has no value. Without the details add-on the last block (`description` to `detailsIncluded`) is not included.

### Use cases

- **Resale and price research:** what used bikes, cars, phones or furniture really ask for in each city, and how fast new listings appear.
- **Deal alerts:** schedule a search every hour with `postedToday` and send new rows to Slack, e-mail or a spreadsheet.
- **Rental market analysis:** asking rents by neighborhood, bedrooms and square feet, with map coordinates for heat maps.
- **Jobs and gigs:** local hiring demand, pay ranges and company names by category and city.
- **Automotive data:** asking prices by make, model year and odometer across regions.

### Pricing

Pay per listing saved, nothing per run:

- **Listing** (`listing-result`): each listing saved.
- **Details add-on** (`listing-details`): only when `includeDetails` is on and the posting was found.

See the Pricing tab for current prices; paid Apify plans get lower rates. Duplicates are never charged, and the run stops at the maximum charge you set.

### Compared with other options

This Actor covers every craigslist site and every section except personal posts, accepts both search terms and pasted search links, pages through up to 10,000 results per search, and keeps the extra fields craigslist shows for housing, jobs, cars and events. The full text is an optional add-on, so you only pay for it when you need it.

### Good to know

- **10,000 results per search** is craigslist's own limit. Split very broad searches by sub-area, price range or category.
- **Community and resumes are not supported**: they are personal posts (missed connections, rants, job seekers' resumes).
- **Contact details are not part of the data.** Craigslist hides them behind its reply button and this Actor never asks for them.
- **Currency** follows the area (USD, CAD, GBP ...); prices are what the poster typed.
- Some craigslist locations outside North America have few listings; then craigslist fills the page with nearby sites, which you can keep with `includeNearby`.

### Integrations

Export results as JSON, CSV or Excel, or read them through the Apify API and the JavaScript or Python clients. Schedule runs, send rows to Google Sheets, Slack or a webhook, or use the Actor inside **n8n**, **Make** and **Zapier**. AI agents can call it as a tool through the Apify **MCP** server.

### FAQ

**Is scraping craigslist legal?** The Actor reads public listings that any visitor can see without an account, at a gentle pace, and skips the pages craigslist's robots.txt excludes (such as reply and flag pages). It removes e-mails, phone numbers and @handles of posters and never collects contact details. You are responsible for how you use the data and for respecting craigslist's terms and privacy laws.

**Do I need a proxy?** The default Apify datacenter proxy is the starting point. If craigslist blocks it, the Actor changes its browser profile and then moves to a US residential proxy on its own.

**Why fewer listings than `maxItems`?** The search has fewer results, nearby listings were left out, `maxItemsPerSearch` capped a search, or a location was not recognised (see the log and the `SUMMARY` record).

**How fast is it?** One request returns 360 listings and one more request lists up to 1,080 at a time, so 1,000 listings take a few seconds. The details add-on needs one request per listing (about four per second).

### En español

Craigslist Scraper extrae avisos de craigslist.org de cualquier ciudad: venta, autos, vivienda, empleos, gigs, servicios y eventos. Busca por palabras clave, ubicación, categoría y filtros (precio, publicados hoy, con fotos, código postal, dormitorios, año del auto ...) o con enlaces de búsqueda copiados del navegador. Entrega título, precio y moneda, categoría, ubicación con coordenadas, fotos, fecha y enlace; con el complemento de detalles, el texto completo y los atributos. Quita emails, teléfonos y @usuarios de los textos. Consulta la pestaña Pricing para ver los precios actuales; los planes de pago de Apify tienen tarifas más bajas.

### Changelog

- **0.1 (October 2026):** first release. Search terms x locations, 120+ categories and any category code, common and extra craigslist filters, ZIP radius, search links (old and new style), paging up to 10,000 results per search, nearby-results switch, details add-on, contact removal, automatic header and residential fallback.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search, one search per term and location (for example "road bike", "2 bedroom", "toyota tacoma"). Leave empty to list everything in the category.

## `locations` (type: `array`):

Craigslist sites to search: the name in the site address (sfbay, newyork, losangeles, chicago, seattle, toronto, vancouver, london ...), an area name ("new york city"), or a sub-area as site/sub-area (sfbay/sfc, newyork/brk).

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

What to search. Community and resumes are not available (personal posts).

## `categoryCode` (type: `string`):

Any other craigslist category code, as in the site links: cto (cars by owner), ctd (cars by dealer), bik, fuo, ele ... Leave empty to use the category above.

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

Order of the results. Price sorting is only offered for categories with prices; relevance needs search terms.

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

In the currency of the area (US$ in the US, C$ in Canada ...).

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

In the currency of the area.

## `sellerType` (type: `string`):

For sale categories only: everyone, owners or dealers.

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

Only listings posted today.

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

Only listings with photos.

## `searchTitlesOnly` (type: `boolean`):

Match the search terms in titles only, not in the posting text.

## `hideDuplicates` (type: `boolean`):

Keep one listing when craigslist marks several as copies of the same ad (the site's "hide duplicates").

## `postalCode` (type: `string`):

Search around a ZIP or postal code (use together with Search distance). It must be inside the location searched.

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

Radius around the ZIP / postal code, in the distance unit of the area (miles in the US).

## `extraFilters` (type: `object`):

Any other filter of the craigslist search form, by its URL name. Examples: {"min_bedrooms": 2, "pets_dog": 1} for apartments, {"min_auto_year": 2015, "max_auto_miles": 100000, "auto_make_model": "toyota"} for cars, {"is_telecommuting": 1} for jobs.

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

Search pages copied from your browser, with all their filters (for example https://sfbay.craigslist.org/search/bia?query=road+bike or https://www.craigslist.org/search/area/newyork?cat=apa\&min_bedrooms=2). Each link runs as is, in addition to the searches above.

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

Adds the full posting text (contacts removed), attributes (condition, make, odometer, bedrooms, employment type ...), first-posted and updated dates and area names. One extra request per listing, billed as an add-on.

## `includeNearby` (type: `boolean`):

When a search has few local results, craigslist adds listings from nearby sites. Off: only the location you asked for. On: nearby listings too, marked isNearby.

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

Exact cap for the whole run (all searches together).

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

Optional cap for each search term x location (and each search link). Craigslist lists up to 10,000 results per search.

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

Apify datacenter proxy by default. If craigslist blocks it, the Actor moves to a US residential proxy on its own.

## Actor input object example

```json
{
  "searchQueries": [
    "road bike"
  ],
  "locations": [
    "sfbay"
  ],
  "category": "sss",
  "sortBy": "newest",
  "sellerType": "all",
  "postedToday": false,
  "hasImage": false,
  "searchTitlesOnly": false,
  "hideDuplicates": false,
  "includeDetails": false,
  "includeNearby": false,
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All listings collected during the run

# 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 = {
    "searchQueries": [
        "road bike"
    ],
    "locations": [
        "sfbay"
    ],
    "category": "sss",
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/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 = {
    "searchQueries": ["road bike"],
    "locations": ["sfbay"],
    "category": "sss",
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/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 '{
  "searchQueries": [
    "road bike"
  ],
  "locations": [
    "sfbay"
  ],
  "category": "sss",
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabrikit/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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