# Craigslist Scraper (`anyxsolutions/craigslist-scraper`) Actor

Scrape Craigslist listings from any city and category: housing, cars, for sale, jobs and services. Get price, location, coordinates, posting dates, description, attributes, bedrooms and photos for each listing. Paste any Craigslist search URL with your filters.

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

## Pricing

from $2.50 / 1,000 results

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

![banner](https://anyx.solutions/banners/craigslist-scraper.png)

## Craigslist Scraper

**Craigslist listings from any city and category — price, location, map coordinates, dates, full description, attributes and photos — as clean JSON.**

Scrape Craigslist listings from any city and category: housing, cars, for sale, jobs and services.
Get price, location, coordinates, posting dates, description, attributes, bedrooms and photos for
each listing. Paste any Craigslist search URL with your filters: the Actor keeps your search words,
price range, bedroom count, make and model, or any other filter you set on the site, and returns
every matching listing. Apartments come with bedrooms, bathrooms, square footage and availability;
cars with year, make and model, odometer, title status and transmission; jobs with compensation and
employment type. There is no login and no API key. Built for rental market research, car dealers
and resellers, price monitoring, lead generation and local-market analysts.

### ⚡ Quick start

```json
{
  "startUrls": [{ "url": "https://sfbay.craigslist.org/search/apa" }],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                                                       |
| -------------------- | ------- | -------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | yes      | —                            | Craigslist search pages for any city and category, such as `https://sfbay.craigslist.org/search/apa` or `https://newyork.craigslist.org/search/sss?query=bike`. Search words and filters are kept. Single listing pages work too. |
| `includeDetails`     | boolean | no       | `true`                       | Open every listing for its description, attributes, posting dates, street address, housing details and all photos. Turn it off for a faster run with the search-page fields only.                                                 |
| `maxItems`           | integer | no       | —                            | Maximum number of listings per search URL. The input form starts at 5; a search page shows up to about 360 listings, so leave it empty to get them all.                                                                           |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. Craigslist works without a proxy for most runs; switch to a residential proxy if requests get blocked.                                                                                                            |

**Search URLs.** Open Craigslist, pick the city and category, type your search and set the filters,
then copy the address bar. Every city site works (`sfbay`, `newyork`, `toronto`, `london`...), as
does the `www.craigslist.org/search/area/<city>?cat=<category>` form Craigslist redirects to.
**Include listing details** is on by default; with it off, each row has the fields a search page
shows (title, price, neighbourhood, and coordinates, bedrooms and photos where Craigslist lists them).
**Maximum listings per search** applies to each search URL separately. Leave the
**Proxy configuration** off unless runs start failing.

### 📤 Output

Each listing is one dataset row, in the order the search shows them. Fields the listing does not
have are `null` (or empty), so every row has the same shape.

#### Fields

| Field             | Type   | Description                                                                                                                           |
| ----------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| `id`              | string | The listing's id, as in its URL.                                                                                                      |
| `postId`          | string | Craigslist's numeric post id, shown on the listing page. `null` with details off.                                                     |
| `url`             | string | The listing on Craigslist.                                                                                                            |
| `title`           | string | Listing title.                                                                                                                        |
| `price`           | number | Price as a number; `null` when none is given (most jobs and services).                                                                |
| `currency`        | string | Currency of the price, e.g. `USD`, `CAD`, `GBP`.                                                                                      |
| `location`        | string | The neighbourhood or place the poster gave, e.g. `san jose west`.                                                                     |
| `address`         | string | Street address, when the poster published one.                                                                                        |
| `site`            | string | The Craigslist city site, as in its URL: `sfbay`, `newyork`.                                                                          |
| `siteName`        | string | The city site's name: `SF bay area`.                                                                                                  |
| `subarea`         | string | The sub-area the listing is filed under, e.g. `south bay`.                                                                            |
| `category`        | string | Category code, e.g. `apa`, `cto`, `sss`.                                                                                              |
| `categoryName`    | string | Category name, e.g. `apartments / housing for rent`.                                                                                  |
| `latitude`        | number | Map latitude of the listing.                                                                                                          |
| `longitude`       | number | Map longitude of the listing.                                                                                                         |
| `postedAt`        | string | When the listing was posted (ISO 8601, UTC).                                                                                          |
| `updatedAt`       | string | When the listing was last edited (ISO 8601, UTC); `null` if never.                                                                    |
| `description`     | string | The listing text as plain text, line breaks kept.                                                                                     |
| `descriptionHtml` | string | The listing text as HTML.                                                                                                             |
| `attributes`      | object | The listing's attribute table as key/value pairs: `condition`, `odometer`, `laundry`, `parking`, `compensation`, `employment_type`... |
| `housing`         | object | For housing: `bedrooms`, `bathrooms`, `sqft` and `available`. `null` for other listings.                                              |
| `images`          | array  | Photo URLs, in gallery order.                                                                                                         |
| `searchUrl`       | string | The search URL the listing was found on; `null` for a listing URL given directly.                                                     |

<details><summary>Example output</summary>

```json
[
  {
    "id": "3k6CijqYZ3pix5Lzs2xN2o",
    "postId": "7982515218",
    "url": "https://www.craigslist.org/view/d/los-alamitos-2017-toyota-rav4-le/3k6CijqYZ3pix5Lzs2xN2o",
    "title": "2017 Toyota RAV4 LE",
    "price": 16995,
    "currency": "USD",
    "location": "Los Alamitos",
    "address": "3251 Oak Knoll Dr",
    "site": "losangeles",
    "siteName": "los angeles",
    "subarea": "long beach",
    "category": "cto",
    "categoryName": "cars+trucks",
    "latitude": 33.789614,
    "longitude": -118.076721,
    "postedAt": "2026-10-12T22:34:16.000Z",
    "updatedAt": "2026-10-12T22:34:17.000Z",
    "description": "2 owner with great service records and super clean. Looks and drives amazing, needs nothing! Tags are current, smog and title in hand. Call today!",
    "descriptionHtml": "2 owner with great service records and super clean. Looks and drives amazing, needs nothing! Tags are current, smog and title in hand. Call today!",
    "attributes": {
      "year": "2017",
      "makemodel": "toyota rav4 le",
      "condition": "excellent",
      "cylinders": "4 cylinders",
      "drive": "rwd",
      "fuel": "gas",
      "odometer": "98,562",
      "paint_color": "grey",
      "title_status": "clean",
      "transmission": "automatic",
      "type": "SUV"
    },
    "housing": null,
    "images": [
      "https://images.craigslist.org/00I0I_8AOL2hPvUnz_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00Q0Q_9ZvpQgyIOVW_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00q0q_aZw4cUJQwrj_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/01616_cZYqARY6Qtz_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00b0b_dvfqERf9zjN_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00L0L_ARQNffoThZ_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00W0W_bFGOpaHEmTf_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00m0m_2KKTujDSEuR_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00I0I_5UMH0Xs7cqe_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00F0F_hvwceLWno03_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00y0y_4mcNKmlnpGv_0CI0t2_1200x900.jpg",
      "https://images.craigslist.org/00Y0Y_4cKhHjtX7RI_0t20CI_1200x900.jpg"
    ],
    "searchUrl": "https://losangeles.craigslist.org/search/cta?auto_make_model=toyota"
  },
  {
    "id": "iWcbiF4s8YsQ9Tq6HMt2p5",
    "postId": "7982575347",
    "url": "https://www.craigslist.org/view/d/san-jose-beautifully-renovated-bedroom/iWcbiF4s8YsQ9Tq6HMt2p5",
    "title": "Beautifully Renovated 2 Bedroom",
    "price": 3369,
    "currency": "USD",
    "location": "san jose west",
    "address": "1611 Parkmoor Avenue, San Jose, CA 95128",
    "site": "sfbay",
    "siteName": "SF bay area",
    "subarea": "south bay",
    "category": "apa",
    "categoryName": "apartments / housing for rent",
    "latitude": 37.317745,
    "longitude": -121.919622,
    "postedAt": "2026-10-13T00:39:56.000Z",
    "updatedAt": null,
    "description": "Vista, managed by Sack Properties\n1611 Parkmoor Avenue\nSan Jose, CA 95128\nshow contact info\n\nRenovated Studio with Spacious Yard\n\nThis two bedroom two bathroom apartment features a fully equipped kitchen, walk-in storage closet, master suite, and a patio/balcony!\n\n*all prices are subject to change This apartment requires a $500 deposit.\n\nVIEW OUR WEBSITE:\n\nhttps://www.liveatvista.com/?utm_knock=cl",
    "descriptionHtml": "Vista, managed by Sack Properties<br>\n1611 Parkmoor Avenue<br>\nSan Jose, CA 95128<br>\n <a href=\"#\" class=\"show-contact\" title=\"click to show contact info\" data-href=\"https://sfbay.craigslist.org/reply/sfo/apa/7982575347/__SERVICE_ID__\" rel=\"nofollow\">show contact info</a>\n<br>\n<br>\nRenovated Studio with Spacious Yard<br>\n<br>\nThis two bedroom two bathroom apartment features a fully equipped kitchen, walk-in storage closet, master suite, and a patio/balcony!<br>\n<br>\n*all prices are subject to change This apartment requires a $500 deposit.<br>\n<br>\nVIEW OUR WEBSITE:<br>\n<br>\nhttps://www.liveatvista.com/?utm_knock=cl",
    "attributes": {
      "rent_period": "daily",
      "pets_cat": "cats are OK - purrr",
      "housing_type": "apartment",
      "pets_dog": "dogs are OK - wooof",
      "laundry": "w/d in unit",
      "parking": "carport",
      "no_smoking": "no smoking"
    },
    "housing": {
      "bedrooms": 2,
      "bathrooms": 2,
      "sqft": 850,
      "available": "available now"
    },
    "images": [
      "https://images.craigslist.org/00404_c1AjfsUNgtV_0gJ0aS_1200x900.jpg",
      "https://images.craigslist.org/01313_6F7GLSDV0vp_0jm0cV_1200x900.jpg",
      "https://images.craigslist.org/00g0g_kgd07AP7A7b_0fS0au_1200x900.jpg",
      "https://images.craigslist.org/01111_5509G7sKCTi_0jm0cT_1200x900.jpg",
      "https://images.craigslist.org/00q0q_4vfy8FGY4Pl_0eT0a3_1200x900.jpg",
      "https://images.craigslist.org/00F0F_lc7FdjhKPxb_0ew0ew_1200x900.jpg",
      "https://images.craigslist.org/00N0N_1Gf4O9tYeYJ_0g80aJ_1200x900.jpg",
      "https://images.craigslist.org/01616_ietIGUoBGlY_0ew0ew_1200x900.jpg",
      "https://images.craigslist.org/00A0A_1zexHiAtrx7_0i80a2_1200x900.jpg",
      "https://images.craigslist.org/00A0A_gOZegSpbwNq_0jm0cU_1200x900.jpg",
      "https://images.craigslist.org/00I0I_34eY9BxxUAq_0jm0cU_1200x900.jpg",
      "https://images.craigslist.org/00r0r_aCdXCYKPNKc_09G0ew_1200x900.jpg",
      "https://images.craigslist.org/00z0z_iAGdnlYBvmz_0jm0cU_1200x900.jpg",
      "https://images.craigslist.org/01010_7AS8yYWQFmM_09S06A_1200x900.jpg",
      "https://images.craigslist.org/01313_9mo5FvNt5VE_0jm0cU_1200x900.jpg",
      "https://images.craigslist.org/00j0j_bXe9iLZXZOp_0jm0cU_1200x900.jpg"
    ],
    "searchUrl": "https://sfbay.craigslist.org/search/apa"
  }
]
```

</details>

### 💡 Use cases

- **Rental market research** — track asking rents by neighbourhood, bedroom count and square footage, with coordinates for mapping.
- **Used-car sourcing and pricing** — pull every listing for a make and model with year, odometer, title status and price.
- **Price monitoring** — schedule a search and compare runs to see new listings, price drops and listings that come down.
- **Lead generation** — find local businesses advertising services, or landlords and dealers posting at volume.
- **Local job-market data** — collect job posts with compensation and employment type by city.

### ❓ FAQ

- **Which cities and categories work?** All of them: every Craigslist city site, and every category from housing and cars to for sale, jobs, services and gigs.
- **Do I need an account or an API key?** No. The Actor reads the same public pages anyone can open.
- **How many listings can I get per search?** A Craigslist search page shows up to about 360 listings. For more, split the search: by price range, by sub-area (for example `sfc`, `sby`), or by search words, and add each as its own URL.
- **Why is a field `null`?** Craigslist only shows what the poster filled in. Jobs and services rarely have a price, many listings have no street address, and `updatedAt` is `null` until a listing is edited.
- **Is there contact information?** No. Craigslist hides phone numbers and email addresses behind a reply form, and the Actor does not collect them.
- **What does turning off listing details change?** The run is much faster (one request per search instead of one per listing), but rows only carry the search-page fields: title, price, neighbourhood, and coordinates, bedrooms and photos where the search page lists them.
- **Do I need a proxy?** Usually not. Craigslist can block busy shared IP ranges; if a run starts failing, set the proxy to Apify's residential group with a US country.

### 🔗 More scrapers by Anyx

- [Kleinanzeigen Scraper](https://apify.com/anyxsolutions/kleinanzeigen-scraper)
- [AutoScout24 Scraper](https://apify.com/anyxsolutions/autoscout24-scraper)
- [Yellow Pages Scraper](https://apify.com/anyxsolutions/yellowpages-scraper)
- [Shopify Scraper](https://apify.com/anyxsolutions/shopify-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [craigslist.org](https://www.craigslist.org/)

# Actor input Schema

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

Craigslist search pages, for any city and category, such as https://sfbay.craigslist.org/search/apa or https://newyork.craigslist.org/search/sss?query=bike. Your search words and filters are kept. Single listing pages work too.

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

Open every listing for its description, attributes, posting dates, street address, housing details and all photos, for example to read a car's odometer. Turn off for a faster run with the search-page fields only.

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

Maximum number of listings to return per search URL. A Craigslist search page shows up to about 360 listings; leave empty to get them all.

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

Proxy settings. Craigslist works without a proxy for most runs; switch to a residential proxy if requests start getting blocked.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://sfbay.craigslist.org/search/apa"
    }
  ],
  "includeDetails": true,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://sfbay.craigslist.org/search/apa"
        }
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/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 = {
    "startUrls": [{ "url": "https://sfbay.craigslist.org/search/apa" }],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/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 '{
  "startUrls": [
    {
      "url": "https://sfbay.craigslist.org/search/apa"
    }
  ],
  "maxItems": 5
}' |
apify call anyxsolutions/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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