# Craigslist Cars and Trucks Scraper (`digital_user/craigslist-cars-scraper`) Actor

Scrapes Craigslist cars and trucks from any city - by owner, by dealer, or both. Returns only what was posted since your last check, so you can run it on a schedule instead of re-downloading the whole market. Price, mileage, photo and link, ready as JSON or CSV.

- **URL**: https://apify.com/digital\_user/craigslist-cars-scraper.md
- **Developed by:** [Digital User](https://apify.com/digital_user) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 new 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?

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

Scrape used cars and trucks posted on [Craigslist](https://www.craigslist.org)
in about two seconds — for sale by owner, by dealer, or both. Catch a vehicle
while the listing is still fresh, not hours later.

***

### What is Craigslist Cars and Trucks Scraper?

This tool is designed to **extract used car and truck listings from
Craigslist**. Use it to catch vehicles minutes after they post, track prices,
and watch a market instead of downloading it — cars, trucks, SUVs and vans, for
sale by owner or by dealer.

With Craigslist Cars and Trucks Scraper, you can:

⚡ Scrape a full page of listings **in about two seconds**

⏱️ Get **only what was posted in the last N minutes** — the age filter

🏙️ Search **one city exactly**, or a **ZIP code and radius** across many

👤 Filter by seller: **for sale by owner**, **by dealer**, or **both**

🎯 Narrow by **price**, **mileage**, **model year**, **keyword**, **clean title**

🔗 Get a **permanent link** and photo for every listing

🔓 Run it with **no login and no proxy** — nothing to configure

📄 Export as **JSON**, **JSONL**, **CSV**, **XML**, **HTML table**, or **Excel**

🔌 Send results to **Make**, **Zapier**, **Google Sheets**, **Slack**, or a webhook

🕒 Put it on a **schedule** and let it watch the market for you

***

### What Craigslist car data can I extract?

| | |
| --- | --- |
| 🚗 Title, year, make and model | 💵 Asking price, as a number |
| 🛣️ Odometer reading | 📍 Neighbourhood and city |
| 🖼️ Photo | 🔗 Permanent listing link |
| 🕒 Exact posting time | ⏱️ Age in minutes when you pulled it |
| 🆔 Posting id, stable for de-duplication | |

***

### How do I scrape Craigslist cars and trucks?

1. **Click Save & Start.** The optional URL field is already filled in, so this works
   before you change anything.
2. **Swap in your own city.** Search on Craigslist as usual, copy the address
   bar url, paste it over the example.
3. **Narrow it down.** Set price, mileage, year, keyword or seller type. Leave
   the rest alone.
4. **Only want what is new?** Set the age filter to 15 minutes. Every run then
   brings just the fresh listings.

Which URL you paste decides how wide the search goes:

| the URL you paste | what you get |
| --- | --- |
| a plain city page, e.g. `craigslist.org/search/area/sfbay?cat=cta` | that city exactly |
| the same page after you set a ZIP and distance | that range, neighbouring cities included |

***

### Does Craigslist have an API?

No public one. There is no Craigslist API key to request and no official
Craigslist API documentation. That is why people look for a Craigslist scraper.

This Actor is the practical answer: one endpoint, clean JSON, nothing for you to
maintain.

***

### Input

```json
{
  "startUrl": "https://www.craigslist.org/search/area/sfbay?cat=cta",
  "newerThanMinutes": 15,
  "minPrice": 5000,
  "maxPrice": 25000,
  "maxMiles": 120000,
  "minYear": 2015,
  "purveyor": "owner",
  "cleanTitleOnly": true,
  "maxItems": 25
}
```

***

### Output sample

```json
{
  "id": 7972408404,
  "title": "2020 Toyota Prius L eco LOW MILES",
  "price": 21500,
  "miles": 44800,
  "city": "belmont, sfbay",
  "url": "https://www.craigslist.org/view/d/belmont-2020-toyota-prius-eco-low-miles/jkfU797Jj1wGhpzSDDMJkg",
  "image": "https://images.craigslist.org/00G0G_h5PsYXKiMLJ_0t20CI_300x300.jpg",
  "postedAt": "2026-09-24T23:29:46.000Z",
  "ageMinutes": 785
}
```

Price and mileage are numbers, not strings. Links are permanent. Timestamps are
real.

***

### Why scrape Craigslist cars and trucks?

🔧 **Flipping and dealing** — spot a mispriced car while it is still for sale

🔎 **Hunting one model** — keyword, year range, mileage cap, checked every 15 minutes

📊 **Price tracking** — a steady feed of what is listed, where, and for how much

🔔 **Alerts** — push new listings to Slack, email or your own app. You can ask for help via email.

🗂️ **Building inventory** — used car data from as many cities as you want to
watch, anywhere Craigslist runs

***

### How fast is this Craigslist scraper?

About **two seconds** per run. No browser to boot, nothing to warm up, no pages
crawled one after another.

***

### How much does scraping Craigslist cost?

**$2.00 per 1,000 listings, plus $0.01 per check.**

You pay for the check, then only for what the check found. That is what makes a
tight schedule affordable — the usual way to price a scraper bills every row of
every run, so you pay again for the same listings each time.

| watching one city | here | if every row were billed each run |
| --- | --- | --- |
| once an hour | **~$12 / month** | ~$1,000 / month |
| every 15 minutes | **~$33 / month** | ~$4,100 / month |
| once a day | ~$5 / month | ~$43 / month, data up to 24h old |

About **$33 a month** for listings minutes old, against about **$43**
for a once-a-day snapshot. Less money, fresher data.

**A quiet market costs almost nothing.** Nothing new, nothing to pay for — this
is a real run on a real city:

```
360 listings fetched, 0 passed the filters
charged: 1 check ($0.01), 0 listings ($0.00)  ->  $0.01 for that run
```

**Maximum results** caps the rest. Listings come back newest first, so setting
it to 25 means "the 25 freshest and no more". One search matched 50 cars; capped
at 25 it cost $0.06 instead of $0.11.

Apify also lets you set a hard spending cap on any run or schedule. Use it.

***

### Integrations

Results land in a standard Apify dataset, so they go wherever you already work —
**Make**, **Zapier**, **Google Sheets**, **Slack**, or any webhook.

Fire a webhook on run completion and a fresh listing can reach your phone before
the seller has answered anyone.

***

### Using this Craigslist scraper with the Apify API

```bash
curl -X POST "https://api.apify.com/v2/acts/digital_user~craigslist-cars-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "startUrl": "https://www.craigslist.org/search/area/sfbay?cat=cta",
    "newerThanMinutes": 15
  }'
```

Official clients exist for JavaScript and Python. The Apify CLI works too.

***

### Ready-made setups

Each of these is this scraper already configured for one job. Open one, press
**Save & Start**, and change the city afterwards if you want a different market.

| setup | what it pulls |
| --- | --- |
| [Cars and trucks for sale by owner](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-cars-and-trucks-for-sale-by-owner) | private sellers only, Los Angeles |
| [Cars and trucks under $10,000](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-cars-under-10000) | the affordable end, San Francisco Bay Area |
| [New car listing alerts](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-new-car-listing-alerts) | only the last hour, New York |
| [Trucks for sale](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-trucks-for-sale) | pickups, Dallas |
| [Low-mileage used cars](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-low-mileage-used-cars) | 2018 or newer, under 80,000 miles, Chicago |
| [Cheap cars under $5,000](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-cheap-cars-under-5000) | the budget end, Atlanta |
| [Toyota cars for sale](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-toyota-cars-for-sale) | one brand, San Francisco Bay Area |
| [Honda cars for sale](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-honda-cars-for-sale) | one brand, Seattle |
| [Cars for sale in Houston](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-cars-for-sale-houston) | one city, nothing from next door |
| [Cars for sale in Phoenix](https://apify.com/digital_user/craigslist-cars-scraper/examples/craigslist-cars-for-sale-phoenix) | one city, nothing from next door |

***

### Is it legal to scrape Craigslist?

Web scraping is legal when you are collecting publicly available data, and a
Craigslist listing is public by design — it is posted so that people can read
it. What you should respect are the boundaries around it: personal data and
intellectual property.

This scraper stays well inside both. It returns only what the listing shows on
its own card — title, price, mileage, location, photo and a link — and **no
personal data at all**: no seller names, no phone numbers, no email addresses.
Descriptions and photos are never republished; every row points back to the
original post on Craigslist.

If your own plans go further than that, check the rules that apply where you
are before you start.

***

### Craigslist Cars and Trucks Scraper not working?

I keep improving this scraper. If something breaks, a city misbehaves, or you
want a field it does not return yet, create an issue on the Actor's
[Issues tab](https://apify.com/digital_user/craigslist-cars-scraper/issues).

You can also write to **goto.nature.mood@gmail.com**. I read everything.

# Actor input Schema

## `startUrl` (type: `string`):

Paste a Craigslist search page URL and everything you set there - filters, category, location - comes with it. A plain site page like craigslist.org/search/area/sfbay?cat=cta searches that site on its own. Set a ZIP and distance on the page instead and the search covers that radius, which reaches neighbouring sites too. Anything the URL specifies overrides the fields below.

## `postal` (type: `string`):

Search centre for a radius search. Only needed when the URL above names no location at all - a Craigslist site page already does. Leave everything empty and the run stops rather than guess a city for you.

## `radius` (type: `integer`):

How far from the search centre to look. Ignored when a single site is named - a site search has no radius.

## `purveyor` (type: `string`):

Who is selling: owners, dealers, or both. Leave empty for both.

## `newerThanMinutes` (type: `integer`):

Leave empty for everything. Set it to run this on a schedule and get only what appeared since the last run - the reason this Actor exists.

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

Lowest price to include. Handy for skipping the $1 placeholder posts that crowd the newest end of the feed.

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

Highest price to include. Leave empty for no ceiling.

## `maxMiles` (type: `integer`):

Highest odometer reading to include. Listings that show no odometer are kept.

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

Upper bound on how many listings one run returns.

## `minYear` (type: `integer`):

Oldest model year to include. Leave empty for no lower bound.

## `maxYear` (type: `integer`):

Newest model year to include. Leave empty for no upper bound.

## `keyword` (type: `string`):

Free-text search, e.g. “tacoma” or “diesel”.

## `cleanTitleOnly` (type: `boolean`):

Exclude salvage, rebuilt and parts-only titles.

## Actor input object example

```json
{
  "startUrl": "https://www.craigslist.org/search/area/sfbay?cat=cta",
  "radius": 250,
  "maxItems": 360,
  "cleanTitleOnly": false
}
```

# Actor output Schema

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

The listings from this run, as JSON. The same data is available as CSV, XML or Excel from the Output tab.

# 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 = {
    "startUrl": "https://www.craigslist.org/search/area/sfbay?cat=cta"
};

// Run the Actor and wait for it to finish
const run = await client.actor("digital_user/craigslist-cars-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 = { "startUrl": "https://www.craigslist.org/search/area/sfbay?cat=cta" }

# Run the Actor and wait for it to finish
run = client.actor("digital_user/craigslist-cars-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 '{
  "startUrl": "https://www.craigslist.org/search/area/sfbay?cat=cta"
}' |
apify call digital_user/craigslist-cars-scraper --silent --output-dataset

```

## MCP server setup

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