# Craigslist Scraper: Listings, Phones, Leads and Prices (`themineworks/craigslist-scraper`) Actor

Search Craigslist services, gigs, jobs, housing, for sale and community by city, category, keyword, price and posted today, or paste links: one row per listing with price, neighbourhood, coordinates, dates, full text, attributes, images and any phone or email it shows. No login.

- **URL**: https://apify.com/themineworks/craigslist-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Lead generation, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.17 / 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/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 Scraper: Listings, Phones, Leads and Prices

[![20 Craigslist plumber listings with phone, neighbourhood and full text in 12 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/craigslist-scraper-hero.png)](https://console.apify.com/actors/jdN5DcHvsAmNNCYO4/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Thomasnet Supplier Scraper](https://apify.com/themineworks/thomasnet-supplier-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 245,000 runs across 280+ public actors.

Updated 27 Oct 2026: first release. Services, gigs, jobs, housing, for sale, community, resumes and events on all 707 Craigslist sites in the US, Canada and abroad; keyword, price, posted today, image, postal code and any Craigslist filter; search links and listing links; monitor mode for new listings only; one flat row per listing with price, neighbourhood, coordinates, posted and updated dates, full text, attributes, images and the phones, emails and websites the listing writes. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **Leads you can call.** Every row carries `phone` and `phones` (as `+1XXXXXXXXXX` for US and Canadian numbers), `emails` and `websites`, read from the title, the location line and the full text of the listing. In our services test, 423 of 450 plumber listings across San Francisco, Los Angeles and Chicago had a phone (94%). When Craigslist hides a number behind its "show contact info" button, `contact_hidden_in_text` says so; that button and the reply email sit behind a CAPTCHA, which this actor does not open (see the FAQ).
- **Every listing in full, at one price.** Full description, all attributes as a clean object (`bedrooms`, `bathrooms`, `condition`, `sale_manufacturer`, `odometer`, `remuneration`, `employment_type` and the rest), up to 24 images, street address when the poster gave one, coordinates, and three dates: first posted, last edited and last renewed. No extra fee for the details.
- **Built for market tracking.** `listing_id`, `repost_of`, `renewed_at` and `price` are columns, so a scheduled run shows new stock, price cuts and reposts. Monitor mode skips listings an earlier run already delivered, before they are read, and does not charge for them.
- **Pay per listing, nothing for errors.** Links that are not Craigslist links, deleted listings, a listing that two of your searches find, listings skipped by monitor mode and the summary row are never charged. No Craigslist account, no browser.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/jdN5DcHvsAmNNCYO4/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works E-commerce and marketplaces family:** [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

Guide and FAQs: [Craigslist Scraper on themineworks.com](https://themineworks.com/actors/craigslist-scraper/).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns the 20 newest plumber listings in the San Francisco Bay Area services section, each with its full text and the phone it shows. It took 12 seconds in our test run:

```json
{
  "sites": ["sfbay"],
  "categories": ["services"],
  "searchQueries": ["plumber"],
  "maxItems": 20
}
```

Put several sites, categories or keywords on separate lines to run every combination at once, or paste a Craigslist search or listing link into `startUrls`. A listing that two of your searches find is delivered once.

Apify's free plan includes $5 of credit every month, which covers about 3,000 listings at this actor's price.

#### Copy to your AI assistant

```text
themineworks/craigslist-scraper on Apify. Reads Craigslist (craigslist.org) by site, category and keyword, or by search and listing links, and returns one flat row per listing with title, price, neighbourhood, coordinates, posted and updated dates, full description, attributes, images and any phone, email or website the listing writes, with no login. Call ApifyClient("TOKEN").actor("themineworks/craigslist-scraper").call(run_input={"sites": ["sfbay"], "categories": ["services"], "searchQueries": ["plumber"], "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give sites (list: sfbay, newyork, toronto, london, or newyork/brk with a sub area), categories (list: services, gigs, jobs, housing, for sale, community, resumes, events, or a code such as apa, cto, sks), searchQueries (list of keywords) and/or startUrls (list of Craigslist search links and listing links). Optional: countries (list of country codes, every site of the country), maxItems (default 100, 1 to 10,000 per search), sort (newest, relevance, price_low, price_high, oldest, distance; default newest), minPrice, maxPrice, postedToday, hasImage, titlesOnly, hideDuplicates, postalCode with searchDistance (miles), searchParams (object of any other Craigslist filter, e.g. {"min_bedrooms": 2}), includeDetails (default true), monitorMode (default false) with monitorName, includeNearbyAreas (default false). Listing rows have no _type field and carry listing_id, posting_uuid, title, url, price, price_text, currency, section, category, category_code, site, site_name, country, region, subarea, subarea_code, neighbourhood, location_text, street_address, latitude, longitude, location_precision, posted_at, updated_at, renewed_at, description, attributes, bedrooms, bathrooms, area_sqft, compensation, employment_type, job_title, company_name, images, image_count, thumbnail_url, phone, phones, emails, websites, has_contact_in_text, contact_hidden_in_text, reply_contact_behind_captcha, repost_of, notices, is_nearby_area, details_scraped, found_by, search_label, search_site, search_category, search_keyword, search_url, results_in_search, position, input_url, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when listings were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~craigslist-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Any site, any section.** All 707 Craigslist sites: 413 in the US, 55 in Canada, 27 in the UK and the rest abroad, by the first part of the address (`sfbay`, `newyork`, `london`) or the name Craigslist gives the site. A sub area after a slash (`newyork/brk`, `sfbay/sfc`) narrows the search. `countries` searches every site of a country.
- **Sections and categories.** `services`, `gigs`, `jobs`, `housing`, `for sale`, `community`, `resumes` and `events`, or any category by its code from Craigslist links (`apa` apartments, `cto` cars by owner, `sks` skilled trade services, `cpg` computer gigs) or by its name.
- **Craigslist's own filters.** Keyword, titles only, min and max price, posted today, with images, hide duplicates, ZIP or postal code with a distance in miles, and any other filter from a Craigslist search link through `searchParams` (bedrooms, pets, make and model, odometer, employment type). The sort is Craigslist's own: newest, relevance, price either way, oldest or distance.
- **Search links and listing links.** Paste a search link and it runs with every filter in it. Paste listing links and each returns its row: built for one record per run from Clay, n8n or an AI agent.
- **Monitor mode.** With `monitorMode` on, listings an earlier run with the same `monitorName` delivered are skipped before they are read and never charged. Schedule it hourly or daily and each run returns only new listings.
- **Up to 10,000 per search.** Craigslist serves at most 10,000 results per search; the actor reads them in its own order, 1,080 at a time, and stops at your `maxItems`.
- **Stops cleanly.** Eight failed or blocked requests in a row end the run; the run stops before its time limit and keeps every row it read. The summary row says what was read, what was skipped and why.

### How to use it

#### Lead list: tradespeople who post their phone

```json
{
  "sites": ["sfbay", "losangeles", "sandiego"],
  "categories": ["services"],
  "searchQueries": ["roofing", "hvac"],
  "maxItems": 300
}
```

Six searches, newest first. Filter the dataset on `has_contact_in_text` to keep the listings that write a phone or email, and use the "Contacts" view for a ready table.

#### Rentals for a market report

```json
{
  "sites": ["austin"],
  "categories": ["apa"],
  "minPrice": 800,
  "maxPrice": 4000,
  "searchParams": { "min_bedrooms": 2 },
  "maxItems": 2000
}
```

Each row has `price`, `bedrooms`, `bathrooms`, `area_sqft`, `neighbourhood`, `latitude` and `longitude`, and the full attributes (laundry, parking, pets, housing type) in `attributes`.

#### Monitor: only new listings, every hour

```json
{
  "sites": ["newyork"],
  "categories": ["cpg"],
  "monitorMode": true,
  "monitorName": "nyc-computer-gigs",
  "maxItems": 100
}
```

Save it as a task and schedule it. The first run returns up to 100 listings; each later run returns only the listings posted since. Listings skipped as seen are not charged.

#### Search links and listing links

```json
{
  "startUrls": [
    "https://chicago.craigslist.org/search/cto?auto_make_model=toyota&max_price=15000",
    "https://sfbay.craigslist.org/eby/apa/d/walnut-creek-make-yourself-at-home/7988118918.html"
  ]
}
```

The search link runs with its filters; the listing link returns that listing. A listing that was deleted or expired gets an error row and is not charged.

#### Every site in a country

```json
{
  "countries": ["CA"],
  "categories": ["ggg"],
  "postedToday": true,
  "maxItems": 50
}
```

All 55 Canadian sites, gigs posted today. Up to 200 searches per run: with `countries`, keep to one category and one keyword.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `sites` | array of strings | `sfbay` when only keywords are given | City sites by address part, address or name; `site/subarea` narrows to a sub area. |
| `categories` | array of strings | `for sale` | Sections (`services`, `gigs`, `jobs`, `housing`, `for sale`, `community`, `resumes`, `events`) or category codes and names. |
| `searchQueries` | array of strings | empty | Keywords; each runs in every site and category. Empty reads the whole category. |
| `startUrls` | array of strings | empty | Craigslist search links and listing links. |
| `countries` | array of strings | empty | Two letter country codes; every site of each country. |
| `maxItems` | integer | `100` | Most listings per search, 1 to 10,000. Listing links are not limited by it. |
| `sort` | string | `newest` | `newest`, `relevance`, `price_low`, `price_high`, `oldest`, `distance`. |
| `minPrice`, `maxPrice` | integer | none | Price range in the site's currency. |
| `postedToday` | boolean | `false` | Only listings posted or renewed in the last 24 hours. |
| `hasImage` | boolean | `false` | Only listings with images. |
| `titlesOnly` | boolean | `false` | Match keywords in titles only. |
| `hideDuplicates` | boolean | `false` | Craigslist's hide duplicates filter. |
| `postalCode`, `searchDistance` | string, integer | none, `25` | Listings within this many miles of a US ZIP or Canadian postal code. |
| `searchParams` | object | none | Any other filter from a Craigslist search link, e.g. `{"min_bedrooms": 2}`. |
| `includeDetails` | boolean | `true` | Read each listing in full. Off returns the result list fields only. |
| `monitorMode`, `monitorName` | boolean, string | `false`, `default` | Skip listings an earlier run with the same name delivered. |
| `includeNearbyAreas` | boolean | `false` | Keep the nearby site listings Craigslist adds under small result lists. |

Give `sites` with `categories` or `searchQueries`, `startUrls`, or both. Up to 200 searches and 5,000 listing links per run.

### What data do you get?

One row per listing. Listing rows have no `_type` field; the summary, info and error rows do, so a filter on `_type` separates them.

| Field | What it is |
|---|---|
| `listing_id` | Craigslist posting ID, e.g. `7990580793` |
| `posting_uuid` | The posting key Craigslist's own pages use |
| `title` | Listing title |
| `url` | Listing link on the city site |
| `price`, `price_text`, `currency` | Price as a number, as shown (`$2,539`) and the site's currency |
| `section`, `category`, `category_code` | `housing`, `apartments / housing for rent`, `apa` |
| `site`, `site_name`, `country`, `region` | `sfbay`, `SF bay area`, `US`, `CA` |
| `subarea`, `subarea_code`, `neighbourhood` | `east bay`, `eby`, `walnut creek` |
| `location_text`, `street_address` | The location line the poster wrote, and the street address when given |
| `latitude`, `longitude`, `location_precision` | Coordinates; `exact_pin` when the poster placed a map pin, `area` otherwise |
| `posted_at`, `updated_at`, `renewed_at` | First posted, last edited, last renewed (Craigslist sorts by renewed) |
| `description` | Full listing text |
| `attributes` | Every attribute by key: bedrooms, laundry, parking, condition, make, odometer, compensation, employment type and so on |
| `bedrooms`, `bathrooms`, `area_sqft` | Housing basics as numbers |
| `compensation`, `employment_type`, `job_title`, `company_name` | Jobs and gigs basics |
| `images`, `image_count`, `thumbnail_url` | Image links (1200x900) and a 300x300 thumbnail |
| `phone`, `phones` | Phone numbers written in the listing, `+1XXXXXXXXXX` for US and Canada |
| `emails`, `websites` | Emails and website links written in the listing |
| `has_contact_in_text` | True when the listing writes a phone or email itself |
| `contact_hidden_in_text` | True when Craigslist replaced a phone in the text with its "show contact info" button (not read) |
| `reply_contact_behind_captcha` | True when the reply button holds contact details (not read) |
| `repost_of` | The posting ID this listing reposts, when Craigslist links them |
| `notices` | Notices Craigslist shows on the listing |
| `is_nearby_area` | True for nearby site listings (only with `includeNearbyAreas`) |
| `details_scraped` | True when the listing was read in full |
| `found_by`, `search_label`, `search_site`, `search_category`, `search_keyword`, `search_url`, `results_in_search`, `position` | How it was found |
| `input_url` | The listing link you gave |
| `scraped_at` | When the row was read |

#### Stable fields for automations

These were present in every listing row of our test runs (1,470 rows), and their names will not change:

| Field | What it is |
|---|---|
| `listing_id` | The key to store and join on |
| `title`, `url` | Title and link |
| `category`, `category_code`, `section` | What kind of listing |
| `site`, `country` | Where |
| `latitude`, `longitude` | Coordinates |
| `posted_at`, `renewed_at` | When |
| `description` | Full text |
| `found_by`, `position` | How it was found |

Optional, present only when the listing has a value: `price` (100% of apartment rows, rare on services), `phone` (94% of services rows, few housing rows), `websites` (84% of apartment rows, 23% of services rows), `images` (87% to 98%), `street_address` (35% to 95%), `neighbourhood`, `attributes`, `emails`, `repost_of`.

#### Output examples

A services listing (text shortened):

```json
{
  "listing_id": "7990820508",
  "title": "SL Plumbing AND Remodeling Services",
  "url": "https://sfbay.craigslist.org/eby/sks/d/pittsburg-sl-plumbing-and-remodeling/7990820508.html",
  "section": "services",
  "category": "skilled trade services",
  "category_code": "sks",
  "site": "sfbay",
  "country": "US",
  "subarea": "east bay",
  "neighbourhood": "hercules, pinole, san pablo, el sob",
  "latitude": 38.0031,
  "longitude": -121.9172,
  "location_precision": "area",
  "posted_at": "2026-10-27T18:05:09.000Z",
  "description": "INSTALLATION OF:\n\nWATER, GAS, SEWER LINES, ROOTERS\n\nFAUCETS*DISPOSALS*DISHWASHERS ...",
  "attributes": { "license_info": "Lic.833075 - B   C- 36  Bonded and insured" },
  "image_count": 24,
  "phone": "+19255655839",
  "phones": ["+19255655839"],
  "has_contact_in_text": true,
  "reply_contact_behind_captcha": true,
  "repost_of": "6894407958",
  "found_by": "search",
  "search_keyword": "plumber",
  "position": 2
}
```

An apartment listing (attributes shortened):

```json
{
  "listing_id": "7988118918",
  "title": "Make Yourself at Home!",
  "url": "https://sfbay.craigslist.org/eby/apa/d/walnut-creek-make-yourself-at-home/7988118918.html",
  "price": 2539,
  "price_text": "$2,539",
  "currency": "USD",
  "category_code": "apa",
  "neighbourhood": "walnut creek",
  "street_address": "1755 Trinity Ave",
  "latitude": 37.90102,
  "longitude": -122.065346,
  "location_precision": "exact_pin",
  "posted_at": "2026-10-22T20:05:10.000Z",
  "renewed_at": "2026-10-27T14:06:46.000Z",
  "bedrooms": 1,
  "bathrooms": 1,
  "area_sqft": 625,
  "attributes": { "bedrooms": "1", "bathrooms": "1", "area": "625 ft²", "movein_date": "2026-11-12", "laundry": "laundry on site", "parking": "carport", "pets_cat": true, "pets_dog": true, "ev_charging": true },
  "image_count": 8
}
```

An error row for a listing that is gone (nothing charged):

```json
{ "_type": "error", "error_type": "not_found", "identifier": "https://sfbay.craigslist.org/sfc/apa/d/old-listing/7900000000.html", "reason": "Craigslist has no live listing with this id on that site: it was deleted, expired or flagged." }
```

### Pricing

Pay per event: you pay for the listings you receive, plus a flat $0.002 per run, whatever memory you choose. The full text, attributes, images and contact fields cost nothing extra.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `listing-scraped` | Once per listing row stored in your dataset | $1.62 per 1,000 | $1.35 per 1,000 | $1.26 per 1,000 | $1.17 per 1,000 |
| `run-start` | Once per run, after the first listing row is stored | $0.002 | $0.002 | $0.002 | $0.002 |

The price of one listing is the price per 1,000 divided by 1,000.

Never charged:

- inputs that are not Craigslist sites, categories or links (each gets an error row);
- listings that were deleted, expired or flagged;
- a listing that a second search of the same run finds again;
- listings monitor mode skips because an earlier run delivered them;
- listings past your `maxItems`;
- the summary, info and error rows;
- a run that delivers no listing: the start fee is charged only after the first listing row is stored;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input, turn on `monitorMode` with a `monitorName`, and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every hour, every morning at 08:00 and so on).
3. Each run then returns only listings posted since the run before. Without monitor mode, compare runs on `listing_id` and `price` to see price cuts, and on `repost_of` to see reposts.
4. Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.

### FAQ

#### What does this actor read?

The same data craigslist.org shows to any visitor, read from the JSON service its own search and listing pages call: the result list of each search, then each listing in full. Nothing is rendered in a browser and nothing is posted, flagged or replied to.

#### Does it get the hidden reply email or phone?

No. Craigslist keeps the reply email, and any phone it replaces with a "show contact info" button, on its `/reply` page, which it shows only after a CAPTCHA. This actor does not solve CAPTCHAs or open that page (Craigslist's robots.txt also asks crawlers to keep away from `/reply`). `contact_hidden_in_text` is true when a number in the text was replaced that way, so you can open those listings yourself. What you do get is every phone, email and website the poster wrote in the title, the location line or the text. That is most services listings (423 of 450 plumber listings in our test had a phone) and few housing listings: property managers mostly use the hidden button, and the row then carries their website instead (84% of 1,000 Bay Area apartment rows).

#### How many listings can I get?

Up to `maxItems` per search, and at most 10,000, which is the most Craigslist serves for one search. A big site's housing or for sale section holds more than that: split it by sub area (`sfbay/sfc`, `sfbay/eby`), by category code (`apa`, `roo`, `sub`) or by price range.

#### How long does a run take?

About 12 seconds for 20 listings read in full, 133 seconds for 450 services listings from three cities, and 276 seconds for 1,000 apartment listings, in our test runs (1,455 requests, none retried or refused). With `includeDetails` off a search of 1,000 takes a few seconds.

#### Why do some rows have no price, phone or coordinates?

Craigslist shows a price only where the poster gave one (housing and for sale mostly; services rarely). A phone or email is in the row only when the poster wrote it in the listing. Coordinates are an exact pin when the poster placed one, otherwise the centre of the area or neighbourhood they chose. Empty fields are left out of the row rather than sent as blanks.

#### Do I need a Craigslist account, cookies or a proxy?

No. The actor reads public listings over Apify Proxy, which is included. Nothing to set up.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/craigslist-scraper

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http craigslist-scraper "https://mcp.apify.com/?tools=themineworks/craigslist-scraper"`

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has four ready views: Listings, Contacts (lead generation), Market tracking, and Full text and attributes. In CSV and Excel, `attributes` is flattened into columns such as `attributes/bedrooms` and lists into `phones/0`, `images/0`.

#### How fresh is the data?

Every run reads Craigslist live, at the time of the run. Rows carry Craigslist's own `posted_at` and `updated_at` where Craigslist gives them, and `scraped_at`, the moment the actor read the listing. Turn on `postedToday` to keep only listings posted or renewed in the last 24 hours.

#### Can I get only new listings each day?

Yes. Turn on `monitorMode`, give the monitor a `monitorName` such as `rentals-austin`, and schedule the run. Listings delivered by an earlier run with the same monitor name are skipped before they are read and are not charged, so each run returns only the listings that are new since the one before. Use a separate monitor name for each search you track.

#### Is it legal to scrape Craigslist?

The actor reads only listings that Craigslist shows to any visitor without logging in. It does not log in, post, reply, flag or solve CAPTCHAs, and it does not request any path that Craigslist's robots.txt disallows (`/reply`, `/flag` and the like). Craigslist's terms of use restrict automated access and the commercial use of its content, and listings can hold personal data such as a poster's phone number. You are responsible for how you use the data, including Craigslist's terms, data protection law such as the GDPR and the CCPA, and the rules on calling, texting and emailing people in your country (for example the TCPA and CAN-SPAM in the US). This is general information, not legal advice. Craigslist is a trademark of craigslist, Inc.; this actor is independent and not affiliated with it.

### Integrations

- **Google Sheets**: send each run's listings to a sheet with Apify's Google Sheets integration; one row per listing fits a sheet as is.
- **Clay, Make, Zapier and n8n**: call the actor once per record with a listing link, or run a monitor search and read its dataset, for example "new roofing listings with a phone every morning to the CRM".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [eBay Product Listings Scraper](https://apify.com/themineworks/ebay-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Shopify Store Scraper](https://apify.com/themineworks/shopify-store-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [🛒 TikTok Shop Scraper](https://apify.com/themineworks/tiktok-shop-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Walmart Product & Price Scraper](https://apify.com/themineworks/walmart-product-price-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Vinted Scraper](https://apify.com/themineworks/vinted-listings-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a search that returns fewer listings than the site, or a field that comes back empty when the listing has it? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

*Search Craigslist by city, category and keyword and get every listing back as one row, with price, neighbourhood, coordinates, dates, full text, attributes, images and the phone or email it shows, no login.*

# Actor input Schema

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

City sites, one per line, by the first part of the address (sfbay, newyork, chicago, toronto, london), the full address (https://chicago.craigslist.org) or the name Craigslist gives it (SF bay area). Add a sub area after a slash to narrow it: newyork/brk, sfbay/sfc. Every site in the US, Canada and abroad works (707 sites). Empty with keywords: sfbay.

## `categories` (type: `array`):

Sections or categories, one per line: services, gigs, jobs, housing, for sale, community, resumes, events, or a category code from Craigslist links (apa apartments, cto cars by owner, sks skilled trade services, cpg computer gigs) or its name (cars & trucks). Empty: for sale.

## `searchQueries` (type: `array`):

Words to search for, one per line, as you would type them in the Craigslist search box: plumber, roofing, web design, 2 bedroom. Each keyword runs in every site and category above. Empty: every listing in the category.

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

Search links (https://sfbay.craigslist.org/search/apa?query=loft\&max_price=3000) run as they are, with every filter in the link. Listing links (https://sfbay.craigslist.org/eby/apa/d/walnut-creek-home/7988118918.html) return that listing. Built for one record at a time from Clay, n8n or an AI agent. Up to 5,000 listing links per run.

## `countries` (type: `array`):

Two letter country codes: every Craigslist site of the country is searched with the categories and keywords above (US has 413 sites, CA 55, GB 27). Up to 200 searches per run, so combine it with one category and one keyword.

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

The most listings to return for each site, category and keyword, 1 to 10,000 (Craigslist serves 10,000 at most per search). Listing links are not limited by this.

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

Craigslist's own order. Newest suits monitoring and lead lists.

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

Only listings priced at or above this, in the site's currency.

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

Only listings priced at or below this, in the site's currency.

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

Only listings posted or renewed in the last 24 hours (Craigslist's posted today filter).

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

Only listings that have at least one image.

## `titlesOnly` (type: `boolean`):

Match keywords in titles only, not in the listing text.

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

Craigslist's own hide duplicates filter: groups listings with the same text.

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

A US ZIP or Canadian postal code. Searches then return listings within the distance below. Use it with the site that covers the code.

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

How far from the postal code, 1 to 2,000 miles. Only used with a postal code.

## `searchParams` (type: `object`):

Any other filter from a Craigslist search link, as JSON: {"min_bedrooms": 2, "pets_dog": 1} for housing, {"auto_make_model": "toyota", "max_auto_miles": 80000} for cars, {"employment_type": 1} for jobs. Easiest: set the filters on craigslist.org and paste the link into Craigslist links instead.

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

On: every listing is read for its full text, attributes, all images, posted and updated dates, and the phones, emails and websites written in it. Off: only what the result list shows (title, price, location, coordinates, images, date), faster for big price sweeps. Same price per listing.

## `monitorMode` (type: `boolean`):

On: listings delivered by an earlier run with the same monitor name are skipped before they are read and are not charged. Schedule the run (every hour, every morning) to get only fresh listings each time.

## `monitorName` (type: `string`):

Keeps separate memories for separate monitors, for example plumbers-sf or rentals-austin. Letters, digits and hyphens.

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

When a search has few results, Craigslist adds listings from nearby sites below them. Off: only listings of the site you chose.

## Actor input object example

```json
{
  "sites": [
    "sfbay"
  ],
  "categories": [
    "services"
  ],
  "searchQueries": [
    "plumber"
  ],
  "maxItems": 20,
  "sort": "newest",
  "postedToday": false,
  "hasImage": false,
  "titlesOnly": false,
  "hideDuplicates": false,
  "searchDistance": 25,
  "includeDetails": true,
  "monitorMode": false,
  "monitorName": "default",
  "includeNearbyAreas": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "sites": [
        "sfbay"
    ],
    "categories": [
        "services"
    ],
    "searchQueries": [
        "plumber"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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 = {
    "sites": ["sfbay"],
    "categories": ["services"],
    "searchQueries": ["plumber"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/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 '{
  "sites": [
    "sfbay"
  ],
  "categories": [
    "services"
  ],
  "searchQueries": [
    "plumber"
  ],
  "maxItems": 20
}' |
apify call themineworks/craigslist-scraper --silent --output-dataset

```

## MCP server setup

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