# Craigslist Listings Scraper - Cars, Housing, Jobs & For Sale (`seemuapps/craigslist-listings-scraper`) Actor

Scrape Craigslist listings for any city and category - title, price, description, attributes, photos and map location - with keyword, price and photo filters.

- **URL**: https://apify.com/seemuapps/craigslist-listings-scraper.md
- **Developed by:** [Andrew](https://apify.com/seemuapps) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listing (search only)s

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/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 Listings Scraper - Cars, Housing, Jobs & For Sale

Scrape Craigslist listings from any city and category - cars & trucks, apartments, rooms, real estate, jobs, gigs, services, electronics, furniture, free stuff and more - with keyword, price, posted-today and has-photo filters. Every listing comes back with its full description, structured attributes (odometer, VIN, bedrooms, square footage, compensation…), all photo URLs, address and map coordinates.

Search "toyota" in **sfbay** cars & trucks and you get every matching listing - or paste listing links directly and get their full details. Export to JSON, CSV, Excel or Google Sheets from the Apify console.

### What you get

One row per listing:

- **title**, **url**, **listingId**, **price** (number) and **currency** (USD, CAD, GBP … based on the site)
- **city** (Craigslist site name), **category** and **categoryCode** (e.g. `cto` = cars & trucks by owner)
- **postedAt** and **updatedAt** timestamps (ISO 8601)
- **location** (street address or neighbourhood), **latitude**, **longitude**
- **body** - the full listing description as clean text
- **attributes** - every structured attribute the poster filled in, as key/value pairs: `year`, `makeModel`, `odometer`, `VIN`, `condition`, `fuel`, `transmission`, `title status`, `bedrooms`, `bathrooms`, `sqft`, `availableDate`, `rent period`, `compensation`, `employment type`, `boat type` …
- **imageUrls** (600x450 photo URLs), **imageCount**, **hasImage**
- **replyAvailable** - whether the listing still accepts replies
- **query** - the keyword that surfaced the listing

Search mode also lists results sorted by relevance, newest, or price, and skips the "nearby area" filler Craigslist mixes in when a local search has few results.

### Use cases

- **Used car and vehicle market research** - track Toyota, Honda or truck prices by city, mileage and condition
- **Rental and real-estate monitoring** - pull every apartment under your budget with bedrooms, square footage and availability date
- **Lead generation for dealers, movers, property managers and service businesses** - find private sellers and landlords posting right now
- **Price intelligence for resellers** - scan "for sale" and "free stuff" for underpriced furniture, electronics, bikes and tools
- **Job market and gig research** - collect job titles, compensation and employment types across cities
- **Dataset building** - archive classified listings, photos and locations for analysis or machine-learning

### How to use

#### Search mode

1. Enter the **City / area** - the Craigslist site name from the URL (`sfbay`, `newyork`, `losangeles`, `chicago`, `toronto`, `london`). A full Craigslist URL works too.
2. Pick a **Category** from the dropdown, or type any Craigslist category code (`cto`, `boo`, `pta`, `sof` …) into **Custom category code**.
3. Optionally add a **Keyword**, **Min / Max price**, **Posted today only**, **Has image only** and a **Sort by** order.
4. Set **Max items** (default 100, `0` = every matching listing, up to the site's 10,000-result limit).
5. Leave **Fetch full listing details** on to open each listing for its description, attributes, photos and address. Turn it off for a faster title/price/location-only crawl.
6. Run the actor - listings stream into the **Dataset** tab. A `SUMMARY` record with match and result counts is written to the **Key-value store**.

#### URLs mode

1. Set **Mode** to *Scrape specific listing URLs*.
2. Paste listing links into **Listing URLs**, one per line. Both `https://sfbay.craigslist.org/sby/cto/d/slug/1234567890.html` and `https://www.craigslist.org/view/d/slug/key` formats work.
3. Run - one row per live listing. Removed or expired listings are logged and skipped.

### Output format

Each dataset record:

```json
{
  "listingId": "7969579212",
  "url": "https://www.craigslist.org/view/d/vallejo-2009-toyota-prius/21jnTYMNqNTQcoq8DjcWUW",
  "title": "2009 Toyota Prius",
  "price": 4900,
  "currency": "USD",
  "city": "sfbay",
  "category": "cars & trucks - by owner",
  "categoryCode": "cto",
  "postedAt": "2026-09-20T01:01:16.000Z",
  "updatedAt": "2026-09-20T01:25:28.000Z",
  "location": "vallejo / benicia",
  "latitude": 38.0985,
  "longitude": -122.2124,
  "body": "Clean title 1 owner 120,000 miles runs and drives great maintenance always done on time new tires ac works and heater works great .",
  "attributes": {
    "odometer": 120000,
    "subarea": "eby",
    "year": "2009",
    "makeModel": "toyota prius",
    "fuel": "hybrid",
    "title status": "clean",
    "transmission": "automatic",
    "type": "hatchback"
  },
  "imageUrls": [
    "https://images.craigslist.org/00D0D_lQnOSDKLNCR_0t20CI_600x450.jpg",
    "https://images.craigslist.org/01414_7uG6OSaJ7T3_0t20CI_600x450.jpg",
    "https://images.craigslist.org/00c0c_7GvdA2dpR6_0t20CI_600x450.jpg"
  ],
  "imageCount": 5,
  "hasImage": true,
  "replyAvailable": true,
  "query": "toyota"
}
```

Housing listings add `bedrooms`, `bathrooms`, `sqft`, `availableDate`, `rent period` and amenity flags to `attributes`; job listings add `compensation`, `employment type`, `experience level` and `job title`.

### Pricing

You pay per listing returned to the dataset: a small `listing-result` event for search-only rows, or a `listing-details-result` event when **Fetch details** is on (or in URLs mode) and the row carries the full body, attributes and images. Free-plan runs are capped at 50 listings; paid plans have no cap.

### Notes

- Prices are in the local currency of the Craigslist site (USD for US cities, CAD for Canadian, GBP for London, and so on). Listings without a price return `price: null`.
- With **Fetch full listing details** off, records still include title, price, posted date, neighbourhood, coordinates, image URLs and search-level attributes such as odometer, bedrooms or salary - but no description or full attribute list.
- Craigslist returns at most 10,000 results per search. Narrow by category, keyword or price to see everything in a busy market.

# Actor input Schema

## `mode` (type: `string`):

Search: browse a Craigslist city + category with optional keyword and filters. URLs: paste listing links and get their full details.

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

Craigslist site name - the subdomain in the URL, e.g. 'sfbay', 'newyork', 'losangeles', 'chicago', 'toronto', 'london'. A full Craigslist URL is accepted too. Required in Search mode.

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

The Craigslist section to search. For any other category use the 'Custom category code' field below, which overrides this choice.

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

Any Craigslist category code as it appears in a search URL, e.g. 'cto' (cars by owner), 'boo' (boats), 'pta' (auto parts), 'sof' (software jobs), 'vga' (video gaming). Overrides the Category dropdown when set.

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

Search terms, exactly as you would type them into the Craigslist search box. Leave empty to list everything in the category.

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

Only return listings priced at or above this amount (in the city's local currency).

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

Only return listings priced at or below this amount (in the city's local currency).

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

Only return listings posted within the last 24 hours.

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

Only return listings that include at least one photo.

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

Order in which results are returned; matters when Max items cuts the list short.

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

Maximum number of listings to return in Search mode. 0 = every matching listing (up to the site's 10,000-result limit).

## `fetchDetails` (type: `boolean`):

Open every listing page to capture the full description, attributes, all photo URLs, address and posting dates. Turn off for a faster, cheaper title/price/location-only crawl.

## `urls` (type: `array`):

Craigslist listing links to scrape in URLs mode, one per line. Both classic (https://sfbay.craigslist.org/sby/cto/d/slug/1234567890.html) and new (https://www.craigslist.org/view/d/slug/key) link formats work.

## Actor input object example

```json
{
  "mode": "search",
  "city": "sfbay",
  "category": "cta",
  "query": "toyota",
  "postedToday": false,
  "hasImage": false,
  "sort": "relevance",
  "maxItems": 20,
  "fetchDetails": true
}
```

# Actor output Schema

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

One record per listing: listingId, url, title, price, currency, city, category, categoryCode, postedAt, updatedAt, location, latitude, longitude, body, attributes (object), imageUrls, imageCount, hasImage, replyAvailable, query.

## `summary` (type: `string`):

SUMMARY record in the default key-value store: matched, pushed, detailsFetched, detailsFailed, skipped counts.

# 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": "sfbay",
    "query": "toyota",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/craigslist-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 = {
    "city": "sfbay",
    "query": "toyota",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/craigslist-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 '{
  "city": "sfbay",
  "query": "toyota",
  "maxItems": 20
}' |
apify call seemuapps/craigslist-listings-scraper --silent --output-dataset

```

## MCP server setup

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