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

Scrape Craigslist listings from any city or all US sites: for sale, cars & trucks, housing, jobs, gigs. Price, location, photos, map coordinates and details.

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

## Pricing

from $1.50 / 1,000 listings

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

Scrape Craigslist listings from any city, or from every US Craigslist site in one run: for sale, cars and trucks, apartments and housing, jobs, gigs and services. You get title, price, location, map coordinates, posting date and photos for each listing, and with details on, the full description plus attributes such as odometer, condition, make and model, bedrooms and square footage. Car flippers, rental researchers and resellers use it as a Craigslist API they can schedule and export to a spreadsheet.

The Actor reads the same JSON search API that craigslist.org's own search page uses. One request returns every matching listing ID, and one more fills in titles and photos for up to 1,080 listings. No browser and no login.

### What you get

For each listing:

- Posting ID, URL, title, price, price text and currency
- Category code (for example `cto`) and category ID
- Site, subarea, location text and neighborhood
- Latitude and longitude
- Posting date
- Photo URLs (600x450)
- Category-specific fields when Craigslist provides them: `bedrooms` and `sqft` for housing, `odometer` and `monthlyPayment` for cars, `salary`, `company` and `jobTitle` for jobs and gigs, open house dates and event dates

With **Include posting details** on, the Actor opens each posting and adds:

- Full description
- Last updated date
- Address (street when shown, city, region, ZIP, country) and map accuracy
- Readable category name
- Year and make/model for vehicles
- Bedrooms, bathrooms, square footage and availability date for housing
- All posting attributes (condition, fuel, odometer, paint color, title status, transmission...) and features such as "w/d in unit" or "street parking"
- The full photo list

Search options:

- One or many sites (`sfbay`, `newyork`, `losangeles`...) or all ~400 US sites
- Any category code: `sss` for sale, `cta` cars and trucks, `apa` apartments, `hhh` housing, `jjj` jobs, `ggg` gigs, `bbb` services, and every sub-category
- Keyword, minimum and maximum price, posted today, has image, ZIP code with a radius in miles, and sort order (newest, relevance, price, distance)
- Search URLs pasted from your browser, with every filter in the URL kept (make/model, model year, bedrooms, owner or dealer...)

Listings that appear in more than one of your searches are saved once.

### Use cases

- **Car flipping and dealer sourcing:** watch cars and trucks by make, model, price and mileage across many cities.
- **Rental market research:** collect rents, bedrooms, square footage and coordinates for apartments in any metro.
- **Resale and arbitrage:** catch underpriced furniture, electronics, tools or free stuff soon after it's posted.
- **Job and gig market analysis:** pull job titles, companies and pay across cities.
- **Local market lists:** see which dealers, property managers and service businesses post in your area.
- **Price monitoring:** schedule a daily run with "posted today" on to get only new listings.

### How to use

1. Open the Actor in the Apify Console.
2. Enter one or more Craigslist sites (the part before `.craigslist.org`), or turn on **Search all US sites**. Or paste search URLs from your browser.
3. Add category codes, a keyword and any filters you want.
4. Set **Max listings per search**. Turn on **Include posting details** if you need descriptions and attributes.
5. Click **Start**, then download the dataset as JSON, CSV, Excel or HTML, or read it through the Apify API.

### Input example

```json
{
  "sites": ["sfbay", "losangeles"],
  "categories": ["cta"],
  "query": "honda civic",
  "maxPrice": 15000,
  "hasPic": true,
  "postedToday": false,
  "sort": "date",
  "searchUrls": ["https://www.craigslist.org/search/area/newyork?cat=apa&min_bedrooms=2&max_price=3500"],
  "maxItems": 200,
  "includeDetails": true
}
```

- `categories`: the Actor runs one search for each site and category pair.
- `postal` + `searchDistance`: search in a radius around a ZIP code. Listings Craigslist marks as "nearby" (outside the radius) are left out.
- `maxItems` applies to each search, not to the whole run.

### Output example

A real listing scraped with `includeDetails: true` (photo list shortened):

```json
{
  "id": 7974687042,
  "url": "https://www.craigslist.org/view/d/pleasanton-2008-honda-civic/9GYFErjp5ChgvA7RDBM9Z4",
  "title": "2008 Honda Civic",
  "price": 5500,
  "priceText": "$5,500",
  "currency": "USD",
  "category": "cto",
  "categoryId": 145,
  "site": "sfbay",
  "subarea": "eby",
  "location": "Dublin",
  "neighborhood": null,
  "latitude": 37.7159,
  "longitude": -121.8527,
  "postedAt": "2026-09-29T03:04:28.000Z",
  "images": ["https://images.craigslist.org/00101_abdMGR16n0E_0t20CI_600x450.jpg"],
  "odometer": 155000,
  "description": "2008 honda civic low miles 155k miles mechanically in excellent condition...",
  "updatedAt": "2026-09-29T14:44:50.000Z",
  "address": { "street": null, "city": "Pleasanton", "region": "CA", "postalCode": "94588", "country": "US" },
  "categoryName": "cars+trucks",
  "year": 2008,
  "makeModel": "honda civic",
  "attributes": {
    "condition": "excellent",
    "fuel": "gas",
    "odometer": "155,000",
    "paint color": "silver",
    "title status": "clean",
    "transmission": "automatic"
  },
  "features": []
}
```

### Pricing

You pay per result: each listing saved to the dataset counts as one result, and you're charged only for results saved. A listing with posting details costs more than a search-only listing, because the Actor loads one extra page for it. If a posting page fails to load, the Actor saves the search data with a `detailsError` field and doesn't charge for it. There's no monthly rental. Set a spending limit on the run and the Actor stops cleanly when it reaches it.

### FAQ

**Is it legal to scrape Craigslist?**
The Actor reads only public search results and public posting pages, the same pages anyone sees without logging in. It never uses Craigslist's reply or contact flow, and it replaces phone numbers and email addresses written inside listings with `[phone removed]` and `[email removed]`. You are responsible for how you use the data, including Craigslist's terms and the privacy laws that apply to you.

**Do I need a proxy? Will I get blocked?**
Craigslist may block data-center IPs, so the default proxy is Apify residential. The Actor also limits itself to 4 parallel requests and 120 requests a minute, and retries failed requests. If the JSON search API still fails, it falls back to Craigslist's static HTML results page, which gives the first ~340 results without posting IDs until details are fetched.

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

**How many listings can one search return?**
As many as Craigslist has for that search, often several thousand, up to your **Max listings per search**.

**Why is `category` a code like `cto`?**
That's Craigslist's own category code (`cto` = cars by owner, `ctd` = cars by dealer, `apa` = apartments). With details on, `categoryName` gives the readable name.

**Can I scrape other countries?**
You can put any Craigslist site name in **Sites** (for example `toronto`), but the Actor has only been tested on US sites. **Search all US sites** covers the US only.

**What are the limits?**

- `neighborhood` is set only when the poster picked one. `location` is the free text the poster typed.
- The updated date, description and attributes need **Include posting details**.
- Photo URLs are the 600x450 size Craigslist serves on its site.
- "All US sites" runs one search per site and category, so it takes a few minutes and uses more requests.

# Actor input Schema

## `sites` (type: `array`):

Craigslist site names, the part before .craigslist.org, e.g. sfbay, newyork, losangeles, chicago, seattle.

## `allUsSites` (type: `boolean`):

Run the search on every US craigslist site (~400). maxItems applies to each site and category.

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

Craigslist category codes: sss (all for sale), cta (cars+trucks), cto (cars by owner), ctd (cars by dealer), hhh (all housing), apa (apartments for rent), rea (real estate for sale), roo (rooms), jjj (jobs), ggg (gigs), bbb (services), ccc (community), eee (events), fua (furniture), ela (electronics), zip (free stuff).

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

Keywords, e.g. "honda civic" or "standing desk".

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

Min price.

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

Max price.

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

Posted today.

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

Has image.

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

Search around this ZIP code. Use with Search distance.

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

Radius around the ZIP code. Listings outside the radius are left out.

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

Leave empty for craigslist's default (relevance with a query, newest otherwise).

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

Craigslist search URLs copied from your browser, e.g. https://sfbay.craigslist.org/search/cta?query=tacoma or https://www.craigslist.org/search/area/newyork?cat=apa\&max_price=3000. All filters in the URL are kept.

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

Maximum number of results to return. See the README for whether this applies per search or to the whole run.

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

Open each posting for its description, attributes (odometer, condition, make/model, bedrooms, sqft...), updated date and address. One extra request per listing.

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

Proxy settings. Apify Proxy is recommended for larger runs.

## Actor input object example

```json
{
  "sites": [
    "sfbay"
  ],
  "allUsSites": false,
  "categories": [
    "sss"
  ],
  "postedToday": false,
  "hasPic": false,
  "maxItems": 100,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "sites": [
        "sfbay"
    ],
    "categories": [
        "sss"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("uber_byte/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 = {
    "sites": ["sfbay"],
    "categories": ["sss"],
}

# Run the Actor and wait for it to finish
run = client.actor("uber_byte/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 '{
  "sites": [
    "sfbay"
  ],
  "categories": [
    "sss"
  ]
}' |
apify call uber_byte/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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