# Craigslist Scraper - Listings, Prices & Photos (No Key) (`flash_scraper/craigslist-marketplace-scraper`) Actor

Scrape Craigslist for-sale classifieds in any city: title, price, location, listing URL, and optionally the full description, posting date, seller attributes and photo URLs. Filter by city, category and price range. No API key, no login. Export to CSV, JSON or Excel.

- **URL**: https://apify.com/flash\_scraper/craigslist-marketplace-scraper.md
- **Developed by:** [Flash Scrape](https://apify.com/flash_scraper) (community)
- **Categories:** E-commerce, Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Scraper — Listings, Prices & Photos (No API Key)

Search **Craigslist** for-sale classifieds in any city and export **one clean row per listing**:
title, price, location, and listing URL — plus, optionally, the **full description, posting date,
seller attributes** (condition, make, size) and **photo URLs** from each listing page.

**No API key, no login.** Craigslist serves a no-JavaScript static result list, which is what this
actor reads — so no browser is needed and it stays on public data.

A practical alternative to Facebook Marketplace for local-classifieds data.

### What you can do with it

- ♻️ **Reseller sourcing** — find underpriced items across several cities at once.
- 💵 **Local price research** — see what a category actually sells for in each market.
- 📉 **Inventory & deal monitoring** — re-run on a schedule and diff the results.
- 🚗 **Dealer / seller lead-gen** — surface high-volume sellers in a category.

### Input

| Field | Type | Description |
|---|---|---|
| `searchTerms` | array | What to look for, e.g. `mountain bike`, `iphone 15`. |
| `cities` | array | Craigslist city subdomains: `newyork`, `losangeles`, `chicago`, `austin`, `london`… |
| `category` | string | Search category code. `sss` = all for-sale (default). Also `cta` cars+trucks, `ela` electronics, `fua` furniture, `mob` motorcycles, `sya` computers, `zip` free stuff. |
| `minPrice` / `maxPrice` | integer | Price range filter (USD). |
| `includeDetails` | boolean | Open each listing for description, date, attributes and photos. |
| `maxItems` | integer | Max listings in total (1–1000). |

#### Example

```json
{
  "searchTerms": ["road bike"],
  "cities": ["losangeles", "newyork"],
  "minPrice": 100,
  "maxPrice": 1500,
  "includeDetails": true,
  "maxItems": 100
}
```

### Output (one row per listing)

`listing_id`, `title`, `price`, `currency`, `location`, `url`, `city`, `category`, `search_query`.

With `includeDetails`: `posted_at`, `description`, `attributes`, `image`, `images_count`.

#### Sample row

```json
{
  "listing_id": "gqoeNoMYUv3xuMmTgAGXZd",
  "title": "Scott CR1 Limited Carbon Road Bike 54cm",
  "price": 1099,
  "currency": "USD",
  "location": "Woodland Hills",
  "city": "losangeles",
  "posted_at": "2026-06-20T16:21:10-0700",
  "attributes": {
    "bicycle type": "road",
    "frame size": "54CM",
    "make / manufacturer": "Scott",
    "model name / number": "CR1"
  },
  "images_count": 9
}
```

### Honest notes

- **`maxItems` is split across every city × term pair**, so 100 items over 2 cities and 1 term is
  \~50 per city. That keeps one busy city from consuming the whole run.
- **`attributes` is null when a listing has no attribute block** — many sellers don't fill it in.
  It is left null rather than padded with placeholders.
- **`price` is null for listings posted without one** (common on free/wanted ads).
- Descriptions have Craigslist's `QR Code Link to This Post` boilerplate stripped.
- `includeDetails` costs one extra request per listing, so runs take noticeably longer.
- Requests are paced and retried automatically. For large runs, enable **Apify Proxy**.

# Actor input Schema

## `searchTerms` (type: `array`):

What to look for, e.g. 'mountain bike', 'iphone 15', 'dining table'. maxItems is split across every city x term pair.

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

Craigslist city subdomains, e.g. newyork, losangeles, chicago, austin, london. Find yours in the URL: <city>.craigslist.org.

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

Craigslist search category code. 'sss' = all for-sale. Others: cta (cars+trucks), ela (electronics), fua (furniture), mob (motorcycles), sya (computers), zip (free stuff).

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

Only listings at or above this price. Leave empty for no minimum.

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

Only listings at or below this price. Leave empty for no maximum.

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

Also open each listing page for the full description, posting date, seller attributes (condition, make, size) and photo URLs. Slower but much richer.

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

Maximum number of listings to return in total.

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

Optional. Route requests through Apify Proxy. Recommended for larger runs: this site throttles or blocks datacenter IPs, and residential proxies avoid that.

## Actor input object example

```json
{
  "searchTerms": [
    "mountain bike"
  ],
  "cities": [
    "newyork"
  ],
  "category": "sss",
  "includeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "mountain bike"
    ],
    "cities": [
        "newyork"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_scraper/craigslist-marketplace-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 = {
    "searchTerms": ["mountain bike"],
    "cities": ["newyork"],
}

# Run the Actor and wait for it to finish
run = client.actor("flash_scraper/craigslist-marketplace-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "mountain bike"
  ],
  "cities": [
    "newyork"
  ]
}' |
apify call flash_scraper/craigslist-marketplace-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=flash_scraper/craigslist-marketplace-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VCNzPTMsO8dgWkSjD/builds/JPpMwrbJkhUIKsxYW/openapi.json
