# Craigslist Search Scraper (`cirkit/craigslist-search-scraper`) Actor

Fast craigslist search scraper. Search any of 666 craigslist cities by category, keyword, price range, or map radius. Extracts title, price, posting timestamp, latitude and longitude, location, neighborhood, image urls, and post url. Reads craigslist's own JSON search API, no headless browser.

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

## Pricing

from $1.00 / 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.

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 Search Scraper

**Scrape Craigslist listings** across all 666 Craigslist cities. This **Craigslist scraper** searches by category, keyword, price range, or map radius, and returns title, price, posting timestamp, latitude and longitude, location name, neighborhood, image URLs, and the post URL.

No Craigslist API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Craigslist Search Scraper?

Craigslist Search Scraper is an [Apify Actor](https://apify.com/actors) that extracts classified listings across 666 cities from [Craigslist](https://www.craigslist.org) and returns them as clean, structured records. It reads Craigslist's own search API instead of parsing HTML, which means precise coordinates and exact posting timestamps on every row rather than the vague relative dates the web pages show.

### What data can this Craigslist scraper extract?

Every run writes one row per posting. The full schema carries **26 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `warning` | string | Present only on a diagnostic row emitted when a search returned no posts. Absent on every real post record. |
| `message` | string | Human readable explanation accompanying a warning row. |
| `query` | string | Search keyword used, echoed back on a warning row. |
| `scrapedAt` | string | UTC timestamp the warning row was written. |
| `postingId` | string | Craigslist's canonical base58 posting identifier. Stable across the life of the post and used to build the post url. |
| `url` | string | Direct link to the craigslist post. |
| `title` | string | Post title as written by the seller. |
| `price` | number | Numeric price. Null on posts with no price, such as free items and many job or community posts. |
| `priceLabel` | string | Price as craigslist formats it for display, for example $1,200. |
| `currency` | string | Currency the price is quoted in, taken from the craigslist area. USD for US cities, EUR for berlin, and so on. |
| `bedrooms` | integer | Bedroom count on housing categories. 0 means a studio. Null outside housing. |
| `areaSqft` | integer | Floor area in square feet on housing categories. Null when the poster did not state one. |
| `postedAt` | string | UTC timestamp when the post was published, ISO 8601. |
| `latitude` | number | Post latitude as supplied by the poster. |
| `longitude` | number | Post longitude as supplied by the poster. |
| `locationName` | string | Place name craigslist assigns to the post, for example Brooklyn. |
| `neighborhood` | string | Neighborhood name when craigslist has one for the post. |
| `citySubdomain` | string | Craigslist city the post belongs to, for example newyork. |
| `subareaAbbr` | string | Craigslist subarea code within the city, for example mnh for Manhattan. |
| `citySearched` | string | The city subdomain from the input that produced this record. |
| `categoryId` | integer | Numeric craigslist subcategory identifier for the post. |
| `searchCategory` | string | Category abbreviation used for the search, for example sss. |

See the **Output** tab in Apify Console for all 26 fields.

### How to scrape Craigslist classified listings

1. Open [Craigslist Search Scraper](https://apify.com/cirkit/craigslist-search-scraper) and click **Try for free**.
2. Add one or more `cities` — any of Craigslist's 666 city subdomains.
3. Pick a `category` and optionally a keyword `query`.
4. Filter with `minPrice`, `maxPrice`, `postedToday`, and `hasImage`.
5. For radius search, set `latitude`, `longitude`, and `searchDistance`.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Craigslist Search Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `cities` | array | Craigslist city subdomains to search, one per line. Use the subdomain from the site url: newyork.craigslist.org is... | **yes** |
| `category` | string | Craigslist category abbreviation. Top-level: sss (for sale), jjj (jobs), hhh (housing), bbb (services), ggg (gigs),... | `"sss"` |
| `query` | string | Optional free-text keyword, for example 'mountain bike'. Leave empty to return everything in the category. |  |
| `maxItems` | integer | Hard cap on records written to the dataset across all cities. Craigslist exposes roughly 2000 results per city and... | `100` |
| `minPrice` | integer | Only return posts at or above this price. |  |
| `maxPrice` | integer | Only return posts at or below this price. |  |
| `postedToday` | boolean | Restrict to posts made today. | `false` |
| `hasImage` | boolean | Restrict to posts that include at least one photo. | `false` |
| `latitude` | string | Optional centre point latitude. Set together with longitude and search radius to search around a specific location... |  |
| `longitude` | string | Optional centre point longitude. |  |
| `searchDistance` | integer | Radius around the latitude and longitude, in miles for US cities. |  |
| `imageSize` | string | Resolution of the returned image urls. | `"medium"` |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "cities": ["newyork", "phoenix"],
  "category": "sss",
  "query": "mountain bike",
  "maxPrice": 500,
  "maxItems": 1000
}
```

### How much does it cost to scrape Craigslist?

This Actor runs on **pay per result** pricing: **$0.001 per posting** ($1 per 1,000). A one-time start fee of $0.00005 applies per run.

| Results | Approximate cost |
| --- | --- |
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Craigslist Search Scraper at no cost.

### What can you build with Craigslist data?

#### Source inventory for resale

Filter by category and price ceiling across several cities at once to find underpriced items faster than a human refreshing the page ever could.

#### Track rental market supply and asking rents

Housing categories carry bedroom counts and square footage, so you can build a live picture of a rental market that no portal publishes.

#### Monitor used-vehicle pricing

The `odometer` field on vehicle listings lets you model price against mileage across a whole region.

#### Research local labour and gig demand

Job and gig categories reveal what employers in a market are actually paying for, in near real time.

#### Detect arbitrage between nearby cities

The same item often clears at very different prices two cities apart. Running both in one job surfaces the spread.

### Craigslist scraping tips and limits

- Craigslist is aggressive about automated traffic. Keep the default proxy configuration and avoid pushing concurrency up hard.
- `postedToday` is the cheapest way to run this incrementally — you only pay for new postings rather than re-downloading the board.
- Radius search via `latitude`, `longitude`, and `searchDistance` beats city lists when your market straddles several Craigslist regions.
- Postings are removed quickly. Capture the fields you need on first pull rather than planning to re-fetch.

### Integrations and automation

Run Craigslist Search Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Craigslist dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [Zumper Rental Search Scraper](https://apify.com/cirkit/zumper-rental-search-scraper) | Structured rental listings with verified addresses. |
| [Apartments.com Listings Scraper](https://apify.com/cirkit/apartments-listings-scraper) | Apartments.com inventory with floorplans and amenities. |
| [eBay Product & Sold Scraper](https://apify.com/cirkit/ebay-product-scraper) | Sold-price comps to value what you find. |
| [Poshmark Listings & Sold Comps Scraper](https://apify.com/cirkit/poshmark-search-scraper) | Fashion resale comps and sold prices. |

### Frequently asked questions

#### How many Craigslist cities are supported?

All 666 Craigslist city subdomains. Put as many as you like in `cities` and the Actor searches each one.

#### Can I search by map radius instead of by city?

Yes. Set `latitude`, `longitude`, and `searchDistance` to search a circle, which is the better approach when a metro spans several Craigslist regions.

#### Do I need a Craigslist API key?

No. Craigslist Search Scraper reads publicly available Craigslist pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Craigslist data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Craigslist Search Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Craigslist?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public classified listing information Craigslist publishes publicly — note that personal listings can contain personal data. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Craigslist page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

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

Craigslist city subdomains to search, one per line. Use the subdomain from the site url: newyork.craigslist.org is 'newyork'. 666 cities worldwide are supported, including london, toronto, berlin and sydney.

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

Craigslist category abbreviation. Top-level: sss (for sale), jjj (jobs), hhh (housing), bbb (services), ggg (gigs), ccc (community). Subcategories also work, for example cta (cars and trucks), apa (apartments for rent), ele (electronics), sof (software jobs).

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

Optional free-text keyword, for example 'mountain bike'. Leave empty to return everything in the category.

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

Hard cap on records written to the dataset across all cities. Craigslist exposes roughly 2000 results per city and category, so raise this by adding more cities rather than by expecting deeper paging.

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

Only return posts at or above this price.

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

Only return posts at or below this price.

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

Restrict to posts made today.

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

Restrict to posts that include at least one photo.

## `latitude` (type: `string`):

Optional centre point latitude. Set together with longitude and search radius to search around a specific location instead of the whole city.

## `longitude` (type: `string`):

Optional centre point longitude.

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

Radius around the latitude and longitude, in miles for US cities.

## `imageSize` (type: `string`):

Resolution of the returned image urls.

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

Proxy settings. Craigslist's search API does not block datacenter traffic, so the default Apify proxy is sufficient and residential proxies are not needed.

## Actor input object example

```json
{
  "cities": [
    "newyork"
  ],
  "category": "sss",
  "maxItems": 100,
  "postedToday": false,
  "hasImage": false,
  "imageSize": "medium",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset of craigslist post records.

## `datasetCsv` (type: `string`):

Same dataset rendered as CSV.

# 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": [
        "newyork"
    ],
    "category": "sss",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/craigslist-search-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": ["newyork"],
    "category": "sss",
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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