# Craigslist Deal Scraper — Under-$X Multi-City (`intelscrape/craigslist-deal-scraper`) Actor

Craigslist under-$X multi-city deals: maxPrice/minPrice packs, dealScore, alerts. Pay per listing. Lawful use only.

- **URL**: https://apify.com/intelscrape/craigslist-deal-scraper.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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?

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 Deal Scraper — Score, Alerts & Multi-City

![Actor Banner](https://api.apify.com/v2/key-value-stores/PyvJzfQg02FD3RYhd/records/craigslist-deal-scraper-banner.png)

> 🇨🇳 **中文简介 (Chinese — China & Singapore):**
> 跨城扫 Craigslist 找低估价？支持多城市关键词抓取与交易打分/提醒，加快二手采购与套利。按结果计费，无需复杂代理配置即可开跑——适合中新买家研究美国本地供应。马上试跑，把高分帖子导出到工作流。

> 🇸🇬 **Ringkasan Melayu (Singapore):**
> Imbas Craigslist merentas bandar untuk deal murah? Sokongan multi-bandar, skor dan amaran. Bayar per hasil. Sesuai untuk pembeli/reseller di Singapura yang pantau bekalan AS. Cuba di Apify hari ini.

#### 🤖 NEW: Connect This To Your AI!

Nice — you've scored Craigslist deals. **Continue your journey →** monitor and triage in Claude / Cursor via **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)**.

**Next step path:** CL deals ↔ Marketplace / OfferUp / eBay comps.

- When you're ready for more metros: **[Facebook Marketplace Deal Radar](https://apify.com/intelscrape/facebook-marketplace-deal-radar)** · **[OfferUp Deal Radar](https://apify.com/intelscrape/offerup-deal-radar)**.
- Need sold-price anchors? Soft-cross to **[eBay Sold Comps](https://apify.com/intelscrape/ebay-sold-comps-scraper)**.

#### 🏆 Featured Bots by IntelScrape

*Path: Leads → Emails → Skip Trace → Enrich (pick the next step when you’re ready).*

1. **[Craigslist Deal Scraper](https://apify.com/intelscrape/craigslist-deal-scraper)** — Score, Alerts & Multi-City
2. **[Facebook Marketplace Deal Radar](https://apify.com/intelscrape/facebook-marketplace-deal-radar)** — Next: FB Marketplace Deals
3. **[OfferUp Deal Radar](https://apify.com/intelscrape/offerup-deal-radar)** — Next: Local OfferUp Deals
4. **[eBay Sold Comps](https://apify.com/intelscrape/ebay-sold-comps-scraper)** — Next: Sold Price Anchors
5. **[Amazon Product Scanner](https://apify.com/intelscrape/amazon-product)** — Sibling: Opportunity Score
6. **[Amazon Product Review Scraper](https://apify.com/intelscrape/amazon-product-review-scraper)** — Sibling: Review VOC
7. **[TikTok Scraper](https://apify.com/intelscrape/tiktok-scraper)** — Sibling: Influencer Leads
8. **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — Continue in Claude / Cursor / ChatGPT

> **Nice — next step:** Cross-check the same SKU on **[Facebook Marketplace Deal Radar](https://apify.com/intelscrape/facebook-marketplace-deal-radar)** · **[OfferUp Deal Radar](https://apify.com/intelscrape/offerup-deal-radar)** · **[eBay Sold Comps](https://apify.com/intelscrape/ebay-sold-comps-scraper)**. Continue your journey →.

**Craigslist deal hunting for flippers** — multi-city fanout, **dealScore**, **newOnly**, Discord alerts. Not another raw CL dump.

[![Apify](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/intelscrape/craigslist-deal-scraper)

> **Nice — paid upsell:** Wire `discordWebhook` / `webhookUrl` + optional `minDealScore` to get `deal-alert` notifies on high-score Craigslist finds. Pair with **[OfferUp Deal Radar](https://apify.com/intelscrape/offerup-deal-radar)** and **[Facebook Marketplace Deal Radar](https://apify.com/intelscrape/facebook-marketplace-deal-radar)**.

### Why this Actor

| You get | Most Craigslist scrapers |
| --- | --- |
| **dealScore 0–100** + **reasons\[]** | Title/price only |
| **Multi-city** `cities[]` / `sites[]` fanout | One city per run |
| **newOnly** + **postedTodayOnly** (schedule-ready) | Full re-dumps |
| **Discord / webhook** alerts | Manual CSV export |
| Honest **demoMode** fixtures | Silent empty / blocked runs |

Gap: no Store competitor ships this Deal Radar feature set on Craigslist (score + multi-city + newOnly + Discord).

### Pricing (PPE)

| Event | What |
| --- | --- |
| `apify-default-dataset-item` | One listing via `pushData` |
| `apify-actor-start` | Run start |
| `deal-alert` | Discord and/or CRM webhook notify succeeds (high-score deals when `minDealScore` set) |

`deal-alert` bills only when a webhook/Discord notify actually succeeds — real delivered alert value (including `demoMode` if you wire a real webhook). One charge per listing even if both Discord + CRM fire.

### Quick start

1. Set `query` (e.g. `iPhone`) and `cities` (`austin`, `houston`, `dallas`, `sfbay`, …).
2. Optional: `minDealScore`, `postedTodayOnly`, `newOnly`, `discordWebhook`.
3. For Store try-outs or when CL blocks: `demoMode: true`.
4. Schedule the Task so fresh deals keep flowing.

#### Input

- `query` · `startUrls[]` · `cities[]` / `sites[]` · `category` (default `sss`)
- `maxItems` · `minPrice` · `maxPrice` · `freeOnly` · `minDealScore`
- `condition` (any|new|like-new|excellent|good|fair|salvage) · `sort` (date|rel|priceasc|pricedsc)
- `soldBy` (owner|dealer) · `deliveryAvailable`
- `postedTodayOnly` · `newOnly` · `onlyWithPhotos` · `hideDuplicates` · `includeDetails`
- `postalCode` · `searchDistance` · `discordWebhook` · `webhookUrl` · `demoMode`

#### Output

`title`, `price`, `location`, `url`, `postedAt`, `dealScore`, `reasons`, plus `site` / `source`.

### Support

IntelScrape on Apify.

### License

Apache-2.0

# Actor input Schema

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

Craigslist search keywords (e.g. iPhone, sofa, mountain bike). Optional when startUrls are provided.

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

Paste Craigslist search, category, or listing URLs. Search/category URLs are scraped as result pages (site parsed from hostname). Listing URLs (/d/ or …/NNNN.html) go straight to detail. When provided with empty cities\[], skips cities fan-out.

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

Craigslist site slugs to fan out across (e.g. austin, sfbay, chicago). Alias of sites\[]. Merged with startUrls search pages when both set.

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

Optional alias for cities\[]. Same Craigslist site slugs.

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

Craigslist search path segment (sss = all for sale, aaa = all, cta = cars+trucks, etc.).

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

Maximum listings to push across all cities.

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

Filter out listings cheaper than this (0 = no min). Ignored when freeOnly.

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

Filter out listings more expensive than this (0 = no max). Ignored when freeOnly.

## `freeOnly` (type: `boolean`):

Only free Craigslist posts (max\_price=0 on search + client filter price==0 / title contains free).

## `condition` (type: `string`):

Craigslist condition filter (for-sale). Maps to CL condition=10..60. Skip when any/empty.

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

Craigslist sort: date (newest), rel (relevance), priceasc, pricedsc.

## `soldBy` (type: `string`):

Craigslist purveyor filter: owner or dealer. Empty = any.

## `deliveryAvailable` (type: `boolean`):

Craigslist delivery\_available=1 — only posts that offer delivery.

## `minDealScore` (type: `integer`):

Only push listings with dealScore >= this (0–100).

## `postedTodayOnly` (type: `boolean`):

Keep only listings marked as posted today (best-effort from CL date labels).

## `newOnly` (type: `boolean`):

Skip IDs already stored in KeyValueStore (craigslist-deal-seen-ids). Schedule-friendly.

## `onlyWithPhotos` (type: `boolean`):

Craigslist hasPic=1 — skip text-only posts (memo23 onlyWithPhotos).

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

Craigslist bundleDuplicates=1 — collapse reposts of the same item.

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

Open each post for description, emails\[], phoneNumbers\[], imageUrls\[], lat/lon. No captcha unlock. Slower; leave OFF for fast search-grid runs.

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

Search around this ZIP (pair with searchDistance miles).

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

Radius around postalCode. 0 = Craigslist default.

## `maxAgeDays` (type: `integer`):

Drop listings older than this many days when daysSinceListed is known (0 = no age cap).

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

Optional Apify proxy (useApifyProxy). Improves reliability; never a captcha bypass.

## `maxNavigationRetries` (type: `integer`):

Bounded retries per page load (1–5).

## `discordWebhook` (type: `string`):

Optional Discord incoming webhook for new deal alerts.

## `webhookUrl` (type: `string`):

Optional HTTP POST of each new listing JSON.

## `demoMode` (type: `boolean`):

Load bundled demo listings (no live scrape). Use when Craigslist blocks or for Store try-outs.

## Actor input object example

```json
{
  "query": "iPhone",
  "cities": [
    "austin",
    "houston",
    "dallas"
  ],
  "category": "sss",
  "maxItems": 50,
  "minPrice": 0,
  "maxPrice": 0,
  "freeOnly": false,
  "condition": "any",
  "sort": "date",
  "soldBy": "",
  "deliveryAvailable": false,
  "minDealScore": 0,
  "postedTodayOnly": false,
  "newOnly": false,
  "onlyWithPhotos": false,
  "hideDuplicates": false,
  "includeDetails": false,
  "searchDistance": 0,
  "maxAgeDays": 0,
  "maxNavigationRetries": 3,
  "demoMode": false
}
```

# Actor output Schema

## `listings` (type: `string`):

Craigslist listings pushed to the default dataset (dealScore, price, URL, reasons).

# 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 = {
    "query": "iPhone",
    "cities": [
        "austin",
        "houston",
        "dallas"
    ],
    "category": "sss"
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/craigslist-deal-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 = {
    "query": "iPhone",
    "cities": [
        "austin",
        "houston",
        "dallas",
    ],
    "category": "sss",
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/craigslist-deal-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 '{
  "query": "iPhone",
  "cities": [
    "austin",
    "houston",
    "dallas"
  ],
  "category": "sss"
}' |
apify call intelscrape/craigslist-deal-scraper --silent --output-dataset

```

## MCP server setup

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