# Craigslist Scraper - Housing, For Sale, Jobs, Cars in Any City (`unbrowseai/craigslist-scraper`) Actor

Scrape Craigslist search results in any city: apartments, for sale, cars, jobs, gigs, services. Title, price, neighborhood, map coordinates, post date, photos; optional full description and attributes (bedrooms, sqft, make, model, odometer). Keyword, price and date filters. Half the usual price.

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

## Pricing

from $0.65 / 1,000 posts

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 – Housing, For Sale, Cars, Jobs and Gigs in Any City

Turn Craigslist searches into clean, structured data. Pick one or more cities and a category (apartments, rooms, real estate, cars and trucks, furniture, electronics, jobs, gigs, services and more), add a keyword, price range or date filter, and get every matching post with its title, price, currency, neighborhood, map coordinates, post date and photos. Switch on **post details** to also get the full description, every attribute (bedrooms, bathrooms, square feet, housing type, laundry, parking, pets, make and model, odometer, condition, fuel, transmission, employment type, compensation), the street address when the poster gave one, and the date the post was last updated.

It reads the whole result set of a search, not just the first page, so a city with thousands of apartments listed returns thousands of posts.

### What people use it for

- **Rental market research** – asking rents by neighborhood, bedrooms and square feet, with coordinates ready for a map.
- **Used car and resale pricing** – price, mileage, make and model across cities to spot deals or set your own price.
- **Lead generation** – new gigs, service requests and job posts in the categories you serve, every morning.
- **Deal alerts** – schedule a run with "Posted today" and a keyword and get only fresh posts.
- **Academic and housing-policy studies** – large, repeatable samples of listings with dates and locations.

### How to use it

1. Enter one or more **cities**: the Craigslist subdomain (`austin`, `sfbay`, `newyork`, `chicago`, `seattle`) or the site name (`Austin`, `SF bay area`). Add a subarea with a slash, for example `sfbay/sfc` or `newyork/brk`. More than 700 Craigslist sites worldwide work.
2. Choose a **category**, and optionally a **keyword**, **min and max price**, **Posted today**, **Has image**, item **condition**, or a **ZIP code and radius**.
3. Set **Max posts per search** (per city).
4. Turn on **Include post details** if you need descriptions and attributes. Runs take longer because each post is opened.
5. Or paste **Craigslist search URLs** with any filters already applied on the site (for example minimum bedrooms or cats allowed).
6. Run, then download the dataset as JSON, CSV or Excel, or read it through the API.

### Output example

```json
{
  "id": "7971806211",
  "url": "https://sfbay.craigslist.org/pen/apa/d/fremont-rent-great-bed-bath/7971806211.html",
  "title": "Rent a great 2 bed / 2 bath!",
  "price": 4323,
  "priceText": "$4,323",
  "currency": "USD",
  "category": "apa",
  "categoryName": "apartments / housing for rent",
  "site": "sfbay",
  "city": "SF bay area",
  "region": "CA",
  "subarea": "pen",
  "location": "Fremont",
  "latitude": 37.501962,
  "longitude": -121.943248,
  "postedAt": "2026-09-23T22:40:37.000Z",
  "updatedAt": "2026-09-28T04:02:59.000Z",
  "imageUrl": "https://images.craigslist.org/01010_b9MfgfvJsCy_0eE09L_600x450.jpg",
  "images": ["https://images.craigslist.org/01010_b9MfgfvJsCy_0eE09L_600x450.jpg", "…"],
  "bedrooms": 2,
  "sqft": 1204,
  "description": "Monthly Price: $4323 - $5194 …",
  "attributes": {
    "bedrooms": "2", "bathrooms": "2", "sqft": "1204", "available": "oct 3",
    "housing_type": "apartment", "laundry": "w/d in unit", "parking": "off-street parking",
    "pets_cat": "cats are OK - purrr", "pets_dog": "dogs are OK - wooof", "rent_period": "monthly"
  },
  "address": { "street": "45060 Synergy St.", "city": "Fremont", "region": "CA", "postalCode": "94538", "country": "US" },
  "petsAllowed": true
}
```

Cars add `odometer` and attributes such as `makemodel`, `year`, `condition`, `fuel`, `transmission`, `title_status`. Jobs and gigs add `compensation`, `company` and `jobTitle`. Fields a post does not have are `null`.

### Pricing

One price per post, details included:

| Apify plan | Price per 1,000 posts |
|---|---|
| Free | $0.90 |
| Starter | $0.75 |
| Scale | $0.70 |
| Business and Enterprise | $0.65 |

That is about half of what the most used Craigslist scrapers charge per result. Searches that fail or return nothing are free. A small fee applies to each run start. Set a maximum cost per run and the scraper stops cleanly at that limit.

### FAQ

**How many posts can I get per search?** As many as Craigslist has for that search, up to 10,000 per city. Use several cities in one run to cover a region.

**Why is a price missing?** Some posts have no price (many jobs, gigs, free stuff and services). The post is still returned.

**Do I need details?** Titles, prices, locations, coordinates, dates and photos come without them. Details add the description, attributes and address, and take longer.

**Can I get contact emails or phone numbers?** No. Craigslist hides contact details behind its reply system, and this scraper does not collect them.

**Is it legal?** It collects publicly visible posts. You are responsible for how you use the data, including Craigslist's terms and data protection law.

Missing a field, city or filter? Open an issue on the Issues tab.

# Actor input Schema

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

Craigslist sites to search: the subdomain (austin, sfbay, newyork, losangeles, chicago, seattle) or the site name (Austin, SF bay area). Add a subarea with a slash, e.g. sfbay/sfc or newyork/brk. 700+ sites worldwide are supported.

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

What to search. For any other category, paste a Craigslist search URL below.

## `searchQuery` (type: `string`):

Optional search words, as in the Craigslist search box (e.g. "honda civic", "studio", "react developer").

## `titleOnly` (type: `boolean`):

Match the keyword in post titles only.

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

Minimum price in the site currency.

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

Maximum price in the site currency.

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

Only posts from today.

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

Only posts with at least one photo.

## `condition` (type: `array`):

For-sale items only: keep these conditions.

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

Optional. Search around this ZIP code (use with Search radius).

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

Distance from the ZIP code, in miles (km outside the US).

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

Order of results.

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

Stop after this many posts for each city (or search URL). The whole search is available, not just the first page.

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

Open every post for the full description, all attributes (bedrooms, bathrooms, sqft, housing type, laundry, parking, make and model, odometer, condition, VIN, employment type...), street address, precise map location, all photos and the updated date. Slower.

## `startUrls` (type: `array`):

Optional. Craigslist search result URLs with your filters already set, e.g. https://austin.craigslist.org/search/apa?min_bedrooms=2. The filters above do not apply to these.

## Actor input object example

```json
{
  "cities": [
    "austin"
  ],
  "category": "apa",
  "titleOnly": false,
  "postedToday": false,
  "hasImage": false,
  "sort": "date",
  "maxResults": 10,
  "includeDetails": false,
  "startUrls": []
}
```

# Actor output Schema

## `posts` (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 = {
    "cities": [
        "austin"
    ],
    "category": "apa",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("unbrowseai/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 = {
    "cities": ["austin"],
    "category": "apa",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("unbrowseai/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 '{
  "cities": [
    "austin"
  ],
  "category": "apa",
  "maxResults": 10
}' |
apify call unbrowseai/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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