# Craigslist Listings Scraper - Search, Prices & Details (`sian.agency/craigslist-scraper`) Actor

Search Craigslist across many cities in one run. Every listing as a clean row: title, price, photos, neighbourhood, GPS and post date, plus the full description on demand.

- **URL**: https://apify.com/sian.agency/craigslist-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce, Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.06 / 1,000 listing searches

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Craigslist Listings Scraper — Search, Prices, Photos & GPS 📋

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![eBay Data Scraper](https://img.shields.io/badge/Store-eBay%20Data%20Scraper-E53238)](https://apify.com/sian.agency/ebay-data-scraper?fpr=sian) [![Apartments.com Property Scraper](https://img.shields.io/badge/Store-Apartments.com%20Property%20Scraper-1AE392)](https://apify.com/sian.agency/apartments-com-property-scraper?fpr=sian) [![ZipRecruiter Jobs Scraper](https://img.shields.io/badge/Store-ZipRecruiter%20Jobs%20Scraper-16A34A)](https://apify.com/sian.agency/ziprecruiter-jobs-scraper?fpr=sian)

#### 🏙️ Search TEN cities in one run — the thing craigslist.org cannot do

##### For sale, housing, jobs and gigs from any Craigslist city on earth, as clean rows

Craigslist has no national search. One search on craigslist.org covers one city and stops at about 2,880 results, which is why buyers, agents and resellers end up opening twenty tabs. This Craigslist scraper takes a list of cities and returns every matching listing as structured data: title, price, photos, neighbourhood, GPS coordinates and post date, plus the full description and the seller's attribute table when you ask for it.

Built for lead generation, price research, dealer monitoring and resale sourcing. Test it with 25 listings free. No credit card, no API key, no login.

### 🔎 What is the Craigslist Listings Scraper — and when should you use it?

The **Craigslist Listings Scraper** turns public Craigslist listings from any city in the world into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** listings from one or many Craigslist cities at once: title, asking price, photos, neighbourhood, GPS coordinates, post date and the direct posting URL. Section-specific columns come with them — bedrooms and square footage on housing, the odometer reading on vehicles, the pay line on jobs and gigs. Switch on full descriptions and each row also carries the complete posting body and the seller's attribute table.

**Use something else when:** the listing is not on Craigslist. Use [eBay Data Scraper](https://apify.com/sian.agency/ebay-data-scraper?fpr=sian) for national resale listings with sold prices and shipping, where Craigslist is local and cash-in-hand. Use [Apartments.com Property Scraper](https://apify.com/sian.agency/apartments-com-property-scraper?fpr=sian) for managed rentals with floor plans and amenity data, where Craigslist carries private landlords. Use [ZipRecruiter Jobs Scraper](https://apify.com/sian.agency/ziprecruiter-jobs-scraper?fpr=sian) for job postings with salary and company across a whole metro, where Craigslist carries the small local hiring the big boards never index. This actor covers the public listing sections. Craigslist forums, personals and anything behind a login are out of scope, and reply addresses are anonymised relays rather than real seller contacts.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/craigslist-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want listings and prices from Craigslist using the Apify Actor `sian.agency/craigslist-scraper`.

Use it when I need: listings from one or many Craigslist cities at once: title, asking price, photos, neighbourhood, GPS coordinates, post date and the direct posting URL. Section-specific columns come with them — bedrooms and square footage on housing, the odometer reading on vehicles, the pay line on jobs and gigs. Switch on full descriptions and each row also carries the complete posting body and the seller's attribute table.

Don't use it when: the listing is not on Craigslist — use ebay-data-scraper or apartments-com-property-scraper or ziprecruiter-jobs-scraper instead.

How to call it: give `cities` a list of Craigslist subdomains (`newyork`, `losangeles`, `sfbay`) plus a `category` and an optional `query`. Narrow with `minPrice`, `maxPrice`, `sellerType` (`owner` or `dealer`), `hasImage`, `postedToday` or a `postalCode` and `searchDistance`. `includeDetails` adds the full posting body and attribute table for an extra charge per listing. To expand postings you already have, set `operation` to `detail` and pass `listingUrls`; to reuse a search you built on craigslist.org, paste it into `searchUrls`.

Start with this input:
{
  "cities": [
    "newyork"
  ],
  "category": "apa",
  "sellerType": "owner",
  "maxResults": 100
}

Ask me which Craigslist cities and which section to search, and whether they want private sellers, dealers or both, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every owner-listed apartment posted today in New York, Chicago and Austin and rank them by price per bedroom.*
- *Find used Tacomas under $20,000 across five West Coast cities and show me the odometer against the asking price.*
- *Give me today's free-stuff listings with photos within 10 miles of ZIP 78704.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/craigslist-scraper.md](https://apify.com/sian.agency/craigslist-scraper.md).

### 📋 Overview

**Paste a city, pick a section, press Run.** This Craigslist listings scraper turns any Craigslist search into a spreadsheet, in about ten seconds.

**Why professionals choose this Craigslist scraper:**

- ✅ **Every city worldwide**: newyork, losangeles, sfbay, toronto, london, berlin. Pass the subdomain and it works
- 🏙️ **Multi-city in one run**: the ~2,880-result ceiling is per city, so more cities is how you get more data
- ⚡ **360 listings per request**: a 100-row run finishes in about 10 seconds
- 🎯 **Section-aware rows**: cars carry the odometer, apartments carry bedrooms and square footage, jobs carry the pay line
- 💰 **From $1.20 per 1,000 listings**: pay per row delivered, never for a failed one
- 📸 **Photos and GPS on every row**: 600x450 photo URLs and exact coordinates, where a listing normally gives you an address string
- 🆕 **Posted-today filter**: schedule it daily and pay only for listings that are new since yesterday

### ✨ Features

- 🔍 **Keyword search**: the same words you would type into Craigslist's own search box, across one city or twenty
- 🗂️ **13 sections**: for sale, cars and trucks, apartments, real estate, housing, jobs, gigs, services, community, furniture, electronics, computers, free stuff
- 🧑 **Owner or dealer filter**: private sellers for lead generation, dealers for competitive intelligence
- 💵 **Price bands**: min and max price, applied at the source so you are not billed for rows you filtered out
- 📮 **Postal-code radius**: centre a metro search on the neighbourhood you actually work in
- 📄 **Full descriptions on demand**: complete posting body, attribute table and every photo
- 🔗 **Paste-a-URL mode**: drop in any Craigslist search URL and every filter in it is honoured
- ♻️ **Duplicate collapsing**: reposts of the same car or apartment folded into one row
- 🆕 **Posted-today mode**: the cheap way to run this on a schedule
- 📊 **Export anywhere**: JSON, CSV, Excel, or straight into your own code via the API

### 🎬 Quick Start

Give it a city, a section and a keyword. No account, no API key, no proxy configuration. Press Run and the rows arrive.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~craigslist-scraper/runs?token=[YOUR_TOKEN] \
-d '{"cities": ["newyork"], "category": "sss", "query": "bike"}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Name your cities

Type the Craigslist subdomains you want, one per line: `newyork`, `losangeles`, `sfbay`. It is the part before `.craigslist.org` in the address bar.

#### Step 2: Pick a section and a keyword

Choose the category (for sale, cars, apartments, jobs…), type a keyword or leave it empty to take the whole section, then set your price band or filters.

#### Step 3: Press Run

The first rows land in seconds. Download as CSV or JSON, or pull them straight from the API.

**That's it! In about ten seconds, you'll have:**

- Every matching listing with price, photos, neighbourhood and GPS
- Direct posting URLs that still work tomorrow
- A run report telling you what you got and exactly what it cost

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| operation | string | No | `search` (listings by city) or `detail` (full data for posting URLs) |
| cities | array | No | Craigslist site subdomains, e.g. `newyork`, `losangeles` |
| category | string | No | Section to search: `sss`, `cta`, `apa`, `rea`, `hhh`, `jjj`, `ggg`, `bbb`, `ccc`, `fua`, `ela`, `sya`, `zip` |
| query | string | No | Search keyword. Empty takes the whole section |
| maxResults | integer | No | Stop after this many listings across all cities (default 100) |
| includeDetails | boolean | No | Fetch each posting page for the full description and attributes (extra charge per listing) |
| listingUrls | array | No | Posting URLs to expand, for Listing Detail mode |
| searchUrls | array | No | Craigslist search URLs; every filter in the URL is honoured |
| minPrice | integer | No | Cheapest listing to include. 0 means no lower bound |
| maxPrice | integer | No | Most expensive listing to include. 0 means no upper bound |
| sellerType | string | No | `all`, `owner` or `dealer` |
| hasImage | boolean | No | Skip listings with no photo |
| postedToday | boolean | No | Only listings posted today |
| hideDuplicates | boolean | No | Collapse reposts of the same item |
| postalCode | string | No | Centre the search on a postal code (needs a radius) |
| searchDistance | integer | No | Radius around the postal code, in miles. 0 searches the whole city |
| sort | string | No | `date`, `dateoldest`, `rel`, `priceasc` or `pricedsc` |

**Example:**

```json
{
  "cities": ["newyork"],
  "category": "sss",
  "query": "bike",
  "maxResults": 100
}
```

**Multi-city sweep:**

```json
{
  "cities": ["newyork", "losangeles", "chicago", "sfbay", "seattle"],
  "category": "cta",
  "query": "tacoma",
  "minPrice": 5000,
  "sellerType": "owner",
  "maxResults": 1000
}
```

**Owner-only rentals with full descriptions:**

```json
{
  "cities": ["austin"],
  "category": "apa",
  "sellerType": "owner",
  "postedToday": true,
  "includeDetails": true
}
```

**Paste a Craigslist search URL:**

```json
{
  "searchUrls": ["https://newyork.craigslist.org/search/apa?query=loft&min_price=2000&max_bedrooms=2"]
}
```

**Expand specific postings:**

```json
{
  "operation": "detail",
  "listingUrls": ["https://www.craigslist.org/view/d/brooklyn-great-road-bike/jmHKs1noTrL3hjZfwNX7WA"]
}
```

### 📤 Output

Every listing is one flat row, ready for Excel, a database or an AI agent. Results are saved to the Apify dataset with **28 fields** including:

| Field | Type | Description |
|-------|------|-------------|
| postingId | number | Craigslist posting ID |
| listingTitle | string | Listing title |
| price | number | Asking price as a number |
| priceText | string | Price as Craigslist displays it |
| url | string | Direct posting URL |
| postedAt | string | When it was posted (ISO 8601) |
| city | string | Craigslist site the listing belongs to |
| location | string | Neighbourhood or town the seller typed |
| latitude | number | Latitude |
| longitude | number | Longitude |
| imageUrl | string | First photo |
| imageUrls | array | Every photo on the posting (600x450) |
| imageCount | number | Number of photos |
| bedrooms | number | Bedrooms (housing sections) |
| areaSqft | number | Square footage (housing sections) |
| odometer | number | Odometer reading (vehicle sections) |
| compensationText | string | Pay line (jobs and gigs) |
| secondaryTitle | string | Role or employer line (jobs and gigs) |
| postingBody | string | Full description (with Fetch full descriptions on) |
| attributes | object | The seller's attribute table (with Fetch full descriptions on) |
| updatedAt | string | Last time the seller updated it (with Fetch full descriptions on) |
| categoryId | number | Craigslist's numeric sub-category id |
| countryCode | string | Two-letter country code of the site |
| sourceCategory | string | The category this run searched |
| sourceQuery | string | The keyword this run searched |
| status | string | success, or error for an input that could not be read |

**Example:**

```json
{
  "postingId": 7955962521,
  "listingTitle": "Bubble Gum Beach Cruiser Bike",
  "price": 75,
  "priceText": "$75",
  "url": "https://www.craigslist.org/view/d/staten-island-bubble-gum-beach-cruiser/pZ7djFRXKej7WC6m5AKwG6",
  "postedAt": "2026-08-28T15:36:27.000Z",
  "city": "newyork",
  "location": "Staten Island",
  "latitude": 40.5682,
  "longitude": -74.1184,
  "categoryId": 68,
  "imageUrl": "https://images.craigslist.org/01515_2m3i8u6zIkI_0CI0t2_600x450.jpg",
  "imageUrls": [
    "https://images.craigslist.org/01515_2m3i8u6zIkI_0CI0t2_600x450.jpg",
    "https://images.craigslist.org/00k0k_1R3qROZiIrS_0CI0t2_600x450.jpg",
    "... 5 more"
  ],
  "imageCount": 7,
  "countryCode": "US",
  "sourceCategory": "sss",
  "sourceQuery": "bike",
  "status": "success"
}
```

### 💼 Use Cases & Examples

#### 1. FSBO and Rental Lead Generation

**Real-estate agents and investors find owners who are selling or renting without an agent.**

**Input:** housing or real-estate section, `sellerType: owner`, `postedToday: true`, your metro's cities
**Output:** rent or asking price, bedrooms, square footage, neighbourhood, GPS and the full posting body
**Use:** work the list the morning it goes up, weeks before those owners appear on the portals

#### 2. Local Price Research

**Resellers and analysts see what things actually sell for, city by city.**

**Input:** a keyword plus a list of cities, sorted by newest
**Output:** every asking price with photo count, post date and location
**Use:** price your own listing against the local market, or spot the city where the same item is $300 cheaper

#### 3. Dealer and Inventory Monitoring

**Dealers watch competitor stock without opening a single browser tab.**

**Input:** cars and trucks, `sellerType: dealer`, `postedToday: true`, on a daily schedule
**Output:** new inventory with price, odometer, photos and posting URL
**Use:** track how fast rivals reprice and what is moving, paying only for the rows that are new

#### 4. Resale Sourcing

**Flippers find underpriced stock before anyone else does.**

**Input:** furniture, electronics or free stuff, `hasImage: true`, sorted cheapest first
**Output:** price, photos, location and the seller's description
**Use:** a daily feed of buyable items inside a radius you set, ranked by price

#### 5. Jobs and Gigs Aggregation

**Recruiters and job boards capture local hiring the big boards never index.**

**Input:** jobs or gigs across a metro cluster
**Output:** title, pay line, location and post date
**Use:** build a local jobs feed, or measure hiring demand in a market before you enter it

#### 6. Market and Academic Research

**Researchers measure supply, pricing and language across regions.**

**Input:** the whole section for a set of cities, no keyword
**Output:** thousands of rows with prices, coordinates and timestamps
**Use:** study rent dispersion, used-car depreciation or informal labour markets with real, current data

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/craigslist-scraper').call({
  cities: ['newyork', 'losangeles'],
  category: 'apa',
  sellerType: 'owner',
  maxResults: 500
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].listingTitle, items[0].price);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/craigslist-scraper').call(
    run_input={
        'cities': ['newyork', 'losangeles'],
        'category': 'cta',
        'query': 'tacoma',
        'minPrice': 5000
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['listingTitle'], item['price'], item['url'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~craigslist-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"cities": ["newyork"], "category": "sss", "query": "bike", "maxResults": 100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule it daily with `postedToday: true`
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON rows
4. **Action**: Push new listings to your CRM, a Google Sheet or a Slack alert

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run: every field, every filter, same quality
- No credit card required
- Enough to check the data before you commit

#### PAID Tier (Production Ready)

- **Unlimited** listings per run, across as many cities as you list
- 360 listings per request, so a 1,000-row sweep takes about a minute
- Pay per result: $0.0012 per listing delivered, never for a failed row
- One Actor Start event per run ($0.005), whatever the run returns

| Metric | Value |
|--------|-------|
| Speed | 360 listings per request, ~10 s for 100 rows |
| Coverage | Every Craigslist site worldwide |
| Ceiling | ~2,880 listings per city per search (Craigslist's own limit) |
| Free tier | 25 listings per run |
| Paid tier | Unlimited |

💰 **From $1.20 per 1,000 listings**, with volume tiers down to $0.94 per 1,000. You pay per listing delivered.

🔗 [View current pricing](https://apify.com/sian.agency/craigslist-scraper?fpr=sian)

### ❓ Frequently Asked Questions

**Q: Which cities are supported?**
A: Every Craigslist site in the world. Pass the subdomain: `newyork`, `sfbay`, `toronto`, `london`, `berlin`. Nothing is hard-coded, so a site Craigslist adds tomorrow works tomorrow.

**Q: How many listings can I get from one search?**
A: About 2,880 per city per search. That is Craigslist's own ceiling, not ours. To go wider, add cities, split by section, or sweep one price band at a time.

**Q: Does it return seller emails or phone numbers?**
A: Only when the seller typed one into the posting body, which the full-description option captures. Craigslist's reply button is an anonymised relay address, so a "seller email" column would be a relay, not a contact. We do not pretend otherwise.

**Q: What does the full-description option cost?**
A: It fetches each posting page, so it bills one Listing Detail event ($0.0025 per listing, $2.50 per 1,000) on top of the search row. Leave it off and you pay for search rows only.

**Q: Can I paste a Craigslist search URL instead of filling the form?**
A: Yes. Put it in Search URLs and every filter in that URL is honoured: keyword, price band, radius, sort, plus section-specific ones like bedrooms, make and model or employment type.

**Q: What output formats are available?**
A: JSON, CSV and Excel, straight from the Apify dataset, or over the API in your own code.

**Q: How do I only get new listings?**
A: Switch on Posted today and schedule the run daily. You are billed for the new rows only, instead of re-buying the whole market every morning.

**Q: What does a run cost?**
A: One Actor Start event ($0.005) plus $0.0012 per listing delivered, about $1.21 for a 1,000-listing run. Failed rows are never charged. No API key and no proxy to configure.

**Q: Is this legal?**
A: It only reads listings that are already public on Craigslist. See the legal note below before you collect anything that could count as personal data.

### 🐛 Troubleshooting

**"…is not a Craigslist site"**

- Use the subdomain only: `newyork`, not "New York City" and not a full URL
- Check it in your browser: the part before `.craigslist.org`

**Fewer listings than expected**

- Craigslist caps a single city search at ~2,880 results; add cities or split by price band
- A narrow keyword plus a price band can genuinely match very little; try the section with no keyword
- Free accounts are capped at 25 rows per run

**A posting URL returns "expired or removed"**

- Craigslist deletes postings after 30-45 days
- Re-run the search to get live ones

**Empty descriptions**

- The full description only comes back with Fetch full descriptions switched on, or in Listing Detail mode

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- 🐛 Found a bug? File an issue in the Apify Console Issues tab
- ⭐ Loving the tool? Leave a 5-star review — it helps us build more
- 🛠️ More automation tools in the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian)
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

Craigslist is a trademark of Craigslist, Inc. This actor is not affiliated with, endorsed by, or sponsored by Craigslist.

# Actor input Schema

## `operation` (type: `string`):

🎯 **PICK ONE PER RUN.**

🔍 **Listing Search** — every listing in a city and section that matches your filters. This is the one you want 95% of the time.

📄 **Listing Detail** — you already have posting URLs and want the full description, the attribute table and every photo for each one.

💡 Want descriptions on a SEARCH run instead? Leave this on Listing Search and switch on **Fetch full descriptions** below.

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

🏙️ **WHERE TO SEARCH.** Use the site subdomain, one per line: `newyork`, `losangeles`, `sfbay`, `chicago`, `toronto`, `london`, `berlin`.

🌍 **Every Craigslist site on earth works** — the area is resolved from the site itself.

🚀 **This is the feature Craigslist does not have.** One search on craigslist.org covers ONE city and stops at ~2,880 results. List ten cities here and you get all ten in one run.

💡 The subdomain is in the address bar: `newyork`.craigslist.org.

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

🗂️ **WHICH SECTION** of Craigslist to search.

🛍️ **For sale (all)** covers every for-sale sub-category at once — the widest net.

🎯 Narrow sections return richer rows: **Cars & trucks** adds the odometer reading, **Apartments** adds bedrooms and square footage, **Jobs** and **Gigs** add the pay line.

💡 Searching a keyword across everything? Leave it on For sale (all).

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

🔑 **WHAT TO LOOK FOR** — the same words you would type into Craigslist's own search box.

⬜ **Leave it empty to take the whole section** for each city. That is the fastest way to build a full local dataset.

🎯 Craigslist matches the title and the body, so `bike` also finds "mountain bike frame".

💡 One keyword per run. To sweep several, schedule one run per keyword — each is billed only for the rows it returns.

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

🔢 **STOP AFTER THIS MANY LISTINGS**, counted across every city in the run.

📦 Listings arrive 360 at a time, so the run finishes the batch it is on and then stops. You may receive a few more than you asked for, and you are only charged for rows delivered.

💰 **Free accounts are capped at 25 rows per run** whatever you type here. Paid accounts are not.

⚠️ Craigslist itself serves at most ~2,880 rows per city per search. One page is 360 listings, so budgets under 360 only read the first city.

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

📄 **THE WHOLE POSTING, NOT ONLY THE CARD.** Adds the complete description, the seller's attribute table (condition, make, model, bedrooms, laundry — whatever the section uses) and the full photo set.

💰 **Charged per enriched listing** on top of the search row. Leave it off and you pay search rows only.

🎯 **Worth it for:** lead generation and resale sourcing.
❌ **Skip it for:** price tracking, since the card already carries the price.

## `listingUrls` (type: `array`):

🔗 **FOR LISTING DETAIL MODE:** the Craigslist postings you want expanded.

📱 Open the posting → copy the address bar. Both forms work: `craigslist.org/view/d/<slug>/<token>` and the older `city.craigslist.org/.../123456789.html`.

📝 **Bulk edit** — one URL per line. 📁 **Upload a .txt file**. 🔗 **+ Add** — one at a time.

⚠️ A bare posting ID is not enough: the link carries a token the ID does not.

💰 **Free accounts: 25 postings per run. Paid: unlimited.**

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

🌐 **PASTE A CRAIGSLIST SEARCH INSTEAD OF FILLING THE FORM.** Set the filters on craigslist.org, copy the address bar, drop it here.

🎛️ **Every filter in that URL is honoured** — keyword, price band, radius, sort, and the section-specific ones the form above does not expose (bedrooms, make and model, wheel size, employment type).

➕ Search URLs are searched **in addition to** the cities above.

💡 This is the power-user path: anything Craigslist's own search can express, this can run.

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

💵 **CHEAPEST LISTING TO INCLUDE**, in the city's own currency.

⬜ **0 means no lower bound** — that is the default.

🎯 Filtering happens at Craigslist, so a price band makes the run faster and cheaper: you are not billed for rows you filtered out.

⚠️ Sections without prices (jobs, gigs, community) ignore this.

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

💰 **MOST EXPENSIVE LISTING TO INCLUDE**, in the city's own currency.

⬜ **0 means no upper bound** — that is the default.

🎯 Pair it with Min price to sweep one price band at a time. That is also how you get past the ~2,880-row ceiling on a big city: run $0-500, then $500-1000, and so on.

## `sellerType` (type: `string`):

🧑‍💼 **PRIVATE SELLERS OR DEALERS.**

🧑 **Owner only** is the lead-generation filter: private sellers and landlords with no agent between you and them.

🏪 **Dealer only** is the competitive-intelligence filter: professional inventory, priced daily.

⚠️ Applies to for-sale, vehicle and housing sections. Jobs and gigs ignore it.

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

🖼️ **SKIP LISTINGS WITH NO PHOTO.**

🎯 On Craigslist a missing photo usually means a low-effort or stale post, so this is the cheapest quality filter there is.

📸 Rows carry every photo URL at 600x450, ready to display or download.

💡 Essential for resale sourcing and property leads; leave it off when counting the whole market.

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

🆕 **ONLY WHAT WENT UP TODAY.**

⏰ **This is the scheduling switch.** Run the actor daily with this on and you pay for the new listings only, instead of re-buying the whole market every morning.

🎯 Gets you to FSBO, rentals and underpriced resale stock first: the good ones are gone within hours.

💡 Pair it with Sort by newest first.

## `hideDuplicates` (type: `boolean`):

♻️ **COLLAPSE REPOSTS OF THE SAME ITEM.**

🚗 Dealers and landlords repost the same unit every few days to stay at the top of the list, so vehicle and housing searches are full of near-identical rows.

🎯 On for a clean count of what is actually for sale. Off if you are studying reposting behaviour itself.

## `postalCode` (type: `string`):

📮 **CENTRE THE SEARCH ON A POSTAL CODE** instead of the whole city.

📏 **Needs Search radius below** to do anything: a postal code with no radius is ignored.

🎯 A metro like New York or Los Angeles covers a huge area; this is how you keep the results inside the neighbourhood you actually work in.

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

📏 **HOW FAR FROM THE POSTAL CODE** to look, in miles.

⬜ **0 searches the whole city** — the default.

🎯 5-10 miles for one neighbourhood, 25 for a metro, 100+ to pull in the surrounding towns a single city site does not cover.

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

↕️ **WHICH LISTINGS COME FIRST** — and, when you cap the run, which ones you actually get.

🕒 **Newest first** for monitoring and lead generation.
🎯 **Most relevant** for a one-off keyword sweep.
⬆️ **Cheapest first** for bargain hunting and resale sourcing.

💡 With Max listings set, sorting decides the sample you take.

## Actor input object example

```json
{
  "operation": "search",
  "cities": [
    "newyork",
    "losangeles",
    "chicago"
  ],
  "category": "sss",
  "query": "bike",
  "maxResults": 500,
  "includeDetails": false,
  "listingUrls": [],
  "searchUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "sellerType": "all",
  "hasImage": false,
  "postedToday": false,
  "hideDuplicates": false,
  "postalCode": "10001",
  "searchDistance": 0,
  "sort": "date"
}
```

# Actor output Schema

## `craigslistListings` (type: `string`):

Listings with asking price, photos, neighbourhood, GPS coordinates and post date, plus the full posting body when full descriptions are on

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "cities": [
        "newyork",
        "losangeles",
        "chicago"
    ],
    "category": "sss",
    "query": "bike",
    "maxResults": 500,
    "includeDetails": false,
    "listingUrls": [],
    "searchUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "sellerType": "all",
    "hasImage": false,
    "postedToday": false,
    "hideDuplicates": false,
    "postalCode": "",
    "searchDistance": 0,
    "sort": "date"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/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 = {
    "operation": "search",
    "cities": [
        "newyork",
        "losangeles",
        "chicago",
    ],
    "category": "sss",
    "query": "bike",
    "maxResults": 500,
    "includeDetails": False,
    "listingUrls": [],
    "searchUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "sellerType": "all",
    "hasImage": False,
    "postedToday": False,
    "hideDuplicates": False,
    "postalCode": "",
    "searchDistance": 0,
    "sort": "date",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/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 '{
  "operation": "search",
  "cities": [
    "newyork",
    "losangeles",
    "chicago"
  ],
  "category": "sss",
  "query": "bike",
  "maxResults": 500,
  "includeDetails": false,
  "listingUrls": [],
  "searchUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "sellerType": "all",
  "hasImage": false,
  "postedToday": false,
  "hideDuplicates": false,
  "postalCode": "",
  "searchDistance": 0,
  "sort": "date"
}' |
apify call sian.agency/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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