Craigslist Housing MCP Server — Rental Search for AI
Pricing
from $1.00 / 1,000 results
Craigslist Housing MCP Server — Rental Search for AI
MCP Server for Craigslist housing. Search rental listings across US cities. AI-agent ready — returns price, bedrooms, location, and contact info.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
petteri mähönen
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
12 days ago
Last modified
Categories
Share
Craigslist Housing Scraper
Scrape Craigslist housing listings across US cities — apartments, houses, rooms & shared. Plain HTTP, no browser, no proxy needed (Craigslist's 2026 search and detail pages are fully server-rendered).
Features
- Price filters —
minPrice/maxPriceapplied server-side (Craigslist filters before you pay for results) - Keyword filter —
titleKeywordmatches listing titles client-side (Craigslist's search page ignores keyword params) and filters before detail fetches, so targeted runs use less compute - Multi-category —
apartments(cat=apa), the fullhousingfeed (houses + rooms + shared, cat=hhh), orall - New-listings monitoring —
dedupeAgainstDatasetIdskips listings already in a previous run's dataset and tags everythingis_new=true. Combine with an Apify Schedule for a daily "new listings only" feed - Multi-city search — scrape several areas in one run
- Detail page extraction — per listing: address, neighborhood, beds, baths, sqft, full description, all photos, amenities, reply URL, post ID, posted date
- Derived fields —
price_num(numeric rent) andprice_per_sqftfor analysis - Fast & cheap — CheerioCrawler, 256MB, no browser; a typical 100-listing detail run finishes in ~1–2 minutes
Input
| Field | Type | Default | Description |
|---|---|---|---|
locations | string[] | ["San Francisco, CA"] | Cities/areas to scrape |
category | string | apartments | apartments | housing | all |
minPrice | number | 0 | Minimum rent, server-side (0 = no minimum) |
maxPrice | number | 0 | Maximum rent, server-side (0 = no maximum) |
maxResults | number | 100 | Stop after this many listings (0 = no limit) |
titleKeyword | string | — | Only listings whose title contains this keyword (client-side; filters before detail fetches) |
fetchDetails | boolean | true | Visit detail pages for enriched data |
detailDelaySecs | number | 1 | Delay between detail page visits |
dedupeAgainstDatasetId | string | — | Dataset ID(s) of previous runs (comma-separated or array); matched post_ids are skipped |
apiToken | string | — | Optional Apify API token for reading cross-actor datasets (needed when deduping against a dataset created by a different actor/task) |
Example: filtered search
{"locations": ["San Francisco, CA"],"category": "apartments","minPrice": 1000,"maxPrice": 4000,"titleKeyword": "pool","maxResults": 50}
Example: daily new-listings monitor (set as an Apify Schedule)
{"locations": ["New York, NY", "Los Angeles, CA"],"category": "housing","minPrice": 1500,"dedupeAgainstDatasetId": "<yesterday-run-dataset-id>","apiToken": "apif..."}
Each day you get only listings that weren't in the previous run's dataset, all tagged is_new: true. (Cloud-verified: a 100-listing baseline run followed by a deduped run returned 20 new listings with zero overlap.)
Output
Each listing includes:
| Field | Source | Example |
|---|---|---|
title | Search | "Bright 2 Bedroom Apartment" |
price | Search / Detail | "$2,455" |
price_num | Derived | 2455 |
beds / baths / sqft | Detail | "2" / "1" / "729" |
price_per_sqft | Derived | 3.37 |
neighborhood | Search / Detail | "Mission District" |
link | Search | "https://www.craigslist.org/view/d/..." |
thumbnail | Detail | image URL |
address | Detail | "123 Main St, San Francisco" |
latitude / longitude | Detail | 37.76 / -122.42 |
post_id | Detail | "7947327024" |
posted | Detail | "2026-07-15T..." (ISO) |
photos | Detail | ["url1", "url2", ...] |
attributes | Detail | ["hardwood", "laundry", ...] |
description | Detail | "Full description text..." |
listing_type | Detail | "apartment" |
rent_period | Detail | "monthly" |
reply_url | Detail | "https://.../reply/..." |
contact_info / contact_websites | Detail | phone/email/URL mentions from description |
has_contact | Detail | true |
is_new | Dedupe | true (only set when dedupeAgainstDatasetId produced matches) |
location / area | Input | "San Francisco, CA" / "sfbay" |
platform | System | "craigslist" |
scraped_at | System | ISO timestamp |
Use Cases
- New-listing alerts — daily schedule +
dedupeAgainstDatasetId= "new listings only" feed - Filtered market research —
minPrice/maxPrice+categoryfor a specific rental segment - Price tracking — run weekly, store
price_num+price_per_sqftover time - Competitive analysis — monitor rental supply in target neighborhoods
- Data pipeline — feed structured housing data into analytics or ML models
Performance & Limitations
- No browser (CheerioCrawler, 256MB) — Craigslist's 2026 pages are fully server-rendered
- One search page per area+category contains all results (no pagination/scroll needed)
- Actual phone/email behind Craigslist's JS-gated "show contact" — we extract the reply URL plus any phone/email/URL mentions from the description text
- Craigslist's 2026 UI collapsed the old category codes: only
cat=apa(apartments) andcat=hhh(housing superset) are housing feeds. The oldfsbo/romcodes now point to general for-sale or jobs — do not expect them to return housing. - Some listings lack specs (no sqft, no address) — those fields will be
null
💬 Quick Start for AI Assistants
Copy and paste this into ChatGPT, Claude, or another AI assistant:
You are helping me use the "Craigslist Housing Scraper" on Apify (actor ID: udJ1lSFPz264RxA17). It extracts housing listings (apartments, houses, rooms, shared) from craigslist.org across US cities.
Input fields:
- locations: string array, e.g. ["San Francisco, CA", "New York, NY"]
- category: "apartments" (default) | "housing" (houses+rooms+shared) | "all"
- minPrice / maxPrice: numbers, server-side rent filter (0 = no filter)
- titleKeyword: string, only listings whose title contains it (client-side)
- maxResults: number, max listings to return (0 = no limit)
- fetchDetails: boolean, visit detail pages for photos, descriptions, amenities
- detailDelaySecs: number, seconds between detail page visits (default 1)
- dedupeAgainstDatasetId: string dataset ID(s), skip already-seen listings, tag is_new
- apiToken: optional Apify API token to read cross-actor datasets
Output fields per listing: title, price, price_num, beds, baths, sqft, price_per_sqft, neighborhood, link, thumbnail, address, latitude, longitude, post_id, posted, photos[], attributes[], description, listing_type, rent_period, reply_url, contact_info[], contact_websites[], has_contact, is_new, location, area, platform, scraped_at.
Help me with the right input, output processing, or troubleshooting.
📋 Changelog
| Version | Date | Changes |
|---|---|---|
| 0.6 | 2026-09-12 | Added titleKeyword client-side filter (Craigslist ignores search_title; filtered before detail fetches to save compute). Live daily schedule demo (NYC + LA, housing, $1,500+) with verified new-listings dedupe |
| 0.5 | 2026-09-12 | Filters + monitoring: minPrice/maxPrice (server-side), category (apartments/housing/all), dedupeAgainstDatasetId + apiToken (new-listings dedupe, is_new flag), price_num + price_per_sqft fields |
| 0.4 | 2026-08-31 | Rewrote for Craigslist 2026 DOM; switched PlaywrightCrawler → CheerioCrawler (no browser, 256MB) — cut compute ~16× |
| 0.3 | 2026-07-15 | Fixed reply_url extraction — button.reply-button with data-href attribute |
| 0.2 | 2026-07-15 | Added contact extraction — reply_url, contact_info, contact_websites, has_contact |
| 0.1 | 2026-07-15 | AI assistant prompt block, enriched README, actor title keywords |
| 0.0.11 | 2026-07-15 | Fixed beds/baths extraction from spec line; studio (0BR) + decimal baths (2.5BA) support |
| 0.0.7 | 2026-07-14 | Detail page extraction — photos, descriptions, amenities, address, listing type, rent period |
| 0.0.1 | 2026-07-13 | Initial release — search result extraction, multi-city support |
Pricing
Pay per event — $1.00 per 1,000 results ($0.001 per listing in the dataset).
Support & Feedback
Enjoying this Actor? Leave a review on Apify Store — it helps others discover the tool.
Found a bug or have a feature request? Open an issue on the Actor page.