# Craigslist Market Report: Prices, Deals & New Listings (`precious_bathmat/craigslist-market-report`) Actor

The going price for anything on Craigslist in any US city: median and price range, prices by area, model year or bedrooms, below-market listings, owner vs dealer and new listings per day, plus every listing as CSV. No login, no proxy.

- **URL**: https://apify.com/precious\_bathmat/craigslist-market-report.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** E-commerce, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 market reports

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 Market Report: Prices, Deals & New Listings

Find the **going price for anything on Craigslist** in any US city: used cars, apartments, furniture, phones, tools. Each search gets one **market report**: the **median price and typical range**, prices **by area**, **owner vs dealer**, **by model year and mileage** for cars and **by bedrooms and price per square foot** for rentals, the **listings priced below market**, and **how many new listings appeared** in the last day and week. Every listing also comes as a CSV with a link and its price against similar listings.

No login, no API key, no proxy.

### What does this Craigslist scraper do?

```
SF bay area · "honda civic" · 377 Civics for sale

 median        $19,985      typical range  $10,966 - $22,985
 dealers       $21,992 (288 listings)     owners  $6,950 (85)
 new           124 in 7 days, 6 in the last 24 hours
 below market  10 listings, e.g. 2023 Civic Hatchback EX-L $17,985
```

1. Enter **areas** ("houston", "SF bay area", "Portland, OR", or any US town) and **search terms** ("honda civic", "sofa").
2. Pick a **category** (all for sale, cars & trucks, apartments, furniture, electronics...) or paste your own **Craigslist search links** with their filters.
3. The Actor reads every listing of each search (splitting big searches by price, so it is not limited to the first page) and returns **one report per search**, plus the listings.

### Who is it for?

- **Car dealers and flippers**: what a model really sells for in each city, owner vs dealer, and the underpriced ones
- **Landlords and property managers**: the going rent by bedrooms and area, and how fast new rentals appear
- **Resellers**: what furniture, phones, tools or collectibles fetch before you buy or list
- **Buyers and renters**: know the fair price and spot the deals
- **Analysts and journalists**: compare local second-hand and rental markets across cities

### What data do you get?

**One report per search** (the dataset):

| Field | What it tells you |
|---|---|
| `medianPrice`, `lowPrice25`, `highPrice75`, `averagePrice`, `lowestPrice`, `highestPrice` | The going price and the typical range |
| `belowMarket`, `belowMarketCount` | Cars and rentals priced under 75% of comparable listings, with how far under |
| `lowestPriced` | The ten cheapest listings |
| `bySellerType` | Owner vs dealer: count and median price |
| `byArea`, `byNeighborhood` | Prices by part of the metro (e.g. peninsula, east bay) and by neighbourhood where Craigslist gives one |
| `byYear`, `medianOdometer` | Cars: count and median price per model year, and typical mileage |
| `byBedrooms`, `medianPricePerSqft` | Rentals: median rent per bedroom count, and rent per square foot |
| `postedLast24h`, `postedLast7Days`, `newestListings` | New supply |
| `totalListings`, `listingsAnalysed`, `offTopicListingsSkipped`, `repostsRemoved`, `priceLooksWrongCount` | How many listings Craigslist has, how many the report uses, and what was left out |

**Every listing** (`LISTINGS_CSV`): title, price, posting date, area, neighbourhood, coordinates, owner or dealer, model year and mileage (cars), bedrooms and square feet (housing), number of photos, link, and **its price against the median of similar listings**. Below-market listings come first, then the newest.

### Example: five cities, 29 September 2026

One run, **8 reports from 6,612 listings in 22 seconds**:

| Search | Listings | Median | Typical range | Owner vs dealer |
|---|---|---|---|---|
| SF bay area · Honda Civic | 377 | **$19,985** | $10,966 - $22,985 | $6,950 vs $21,992 |
| Houston · Honda Civic | 42 | $14,995 | $7,898 - $18,396 | $7,998 vs $16,495 |
| Boise · Honda Civic | 11 | $12,995 | $8,748 - $15,998 | $4,000 vs $13,995 |
| Denver · 2-bedroom rentals | 2,515 | **$1,799** | $1,500 - $2,037 | |
| Chicago · all rentals | 2,173 | $1,900 | $1,596 - $2,495 | |
| SF bay area · sofa | 1,172 | $393 | $150 - $800 | $350 vs $1,369 |
| Boise · sofa | 52 | $400 | $200 - $600 | $400 vs $899 |
| Houston · sofa | 270 | $380 | $171 - $683 | $363 vs $2,951 |

Owners asked about a third of what dealers did for a Civic in the Bay Area. Denver added **1,225 new 2-bedroom rentals in a week**.

### Pricing

**$0.02 per market report** and **$0.001 per listing** saved.

A report with 200 listings costs **$0.22**; set "Listings to save per search" to 0 and it is **$0.02 per search**, however many listings the report reads. The run above cost **$0.77** with 605 listings saved.

### How "below market" works

- **Cars** are compared with the **same model year** in the same search; **rentals** with the **same number of bedrooms**. A listing is below market under **75%** of that median, with at least 5 comparable listings.
- A car whose **mileage is 30% above** its year's typical mileage is not flagged: the mileage explains the price. Each listing shows its mileage next to the typical one.
- Prices far below the median (**under 30%** for cars, **45%** for rentals) are usually a deposit, a monthly payment, a placeholder or a fake listing. They are flagged as `priceLooksWrong` and left out of the statistics, and so are **$1 "make an offer"** prices.
- **Other items** (sofas, phones, tools...) vary too much within one search for a fair "below market" call, so they get the **lowest-priced listings** and each listing's gap to the median instead.
- **Trims and conditions are not known.** A 2023 Civic Type R and a 2023 Civic LX share a model year. Narrow searches ("civic type r") give sharper comparisons.
- **Check before you pay.** Rentals well below the going rent are a common Craigslist scam.

### Good to know

- **Titles must match the search.** Craigslist also matches words in descriptions ("fits Honda Civic"), so listings whose title is not about the search are skipped and counted in `offTopicListingsSkipped`. Car reports also skip parts and accessories.
- **Reposts count once.** Dealers and property managers post the same ad many times; listings with the same title, price, mileage or bedrooms and place are counted once (the newest), in `repostsRemoved`.
- **Only the area searched.** Craigslist adds listings from neighbouring areas; they are skipped unless you turn on "Include nearby areas".
- **Big searches**: up to 10,000 listings are read per search. Whole-city "all for sale" searches are bigger; the report then says so. Add search terms or a price range.
- **No personal data.** Listing pages are not opened, so there are no poster names, emails or phone numbers. Any phone number or email typed into a title or location is removed.
- **US areas.** Town names without their own Craigslist site use the nearest one (looked up on OpenStreetMap).

### Input

| Field | Meaning |
|---|---|
| **Areas** | Craigslist areas or US towns |
| **Search terms** | One report per area and term; empty for the whole category |
| **Category** | All for sale, cars & trucks (all, owner, dealer), motorcycles, RVs, boats, auto parts, furniture, electronics, cell phones, computers, video gaming, appliances, bicycles, tools, heavy equipment, tickets, jewelry, musical instruments, apartments, rooms, real estate for sale, sublets |
| **Craigslist search links** | Your own searches with any Craigslist filter |
| **Minimum / maximum price**, **Posted within (days)** | Optional filters |
| **Listings to save per search** | 0 to 5,000; the report always uses every listing |
| **Include nearby areas** | Off by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** with "Posted within 1 day" to get each day's new below-market cars or rentals.

# Actor input Schema

## `areas` (type: `array`):

Craigslist areas or US towns: "houston", "SF bay area", "Portland, OR", "Boise". A town without its own Craigslist site uses the nearest one.

## `queries` (type: `array`):

What to search for, e.g. "honda civic", "sofa", "iphone 15". One report per area and search term. Leave empty for the whole category.

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

Where to search. Car searches also get prices by model year and mileage, housing searches by bedrooms and price per square foot. An "all for sale" search that is mostly cars or flats is treated the same way.

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

Optional. Paste searches from craigslist.org with your own filters; each one gets a report.

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

Optional.

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

Optional.

## `postedWithinDays` (type: `integer`):

Optional. Only listings posted in the last N days.

## `maxListingsPerSearch` (type: `integer`):

How many listings to save for each search, below-market ones first, then the newest. The report always uses every listing found. 0 saves only the reports.

## `includeNearbyAreas` (type: `boolean`):

Craigslist sometimes adds listings from neighbouring areas. Off: only the area searched.

## Actor input object example

```json
{
  "areas": [
    "houston",
    "sfbay"
  ],
  "queries": [
    "honda civic"
  ],
  "category": "sss",
  "maxListingsPerSearch": 200,
  "includeNearbyAreas": false
}
```

# Actor output Schema

## `reports` (type: `string`):

Median and price range, breakdowns, below-market listings and new supply, per search.

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

Each listing with price, its comparison with similar listings, area, date and link.

## `summary` (type: `string`):

Source, problems and the limits of the data.

# 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 = {
    "areas": [
        "houston",
        "sfbay"
    ],
    "queries": [
        "honda civic"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/craigslist-market-report").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 = {
    "areas": [
        "houston",
        "sfbay",
    ],
    "queries": ["honda civic"],
}

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/craigslist-market-report").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 '{
  "areas": [
    "houston",
    "sfbay"
  ],
  "queries": [
    "honda civic"
  ]
}' |
apify call precious_bathmat/craigslist-market-report --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/craigslist-market-report"
        }
    }
}
```

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/xGFEhFMlPU3G3kkOr/builds/5v02RWiMYARpubcuG/openapi.json
