Craigslist Housing MCP Server — Rental Search for AI avatar

Craigslist Housing MCP Server — Rental Search for AI

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Craigslist Housing MCP Server — Rental Search for AI

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

petteri mähönen

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

12 days ago

Last modified

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 / maxPrice applied server-side (Craigslist filters before you pay for results)
  • Keyword filter — titleKeyword matches 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 full housing feed (houses + rooms + shared, cat=hhh), or all
  • New-listings monitoring — dedupeAgainstDatasetId skips listings already in a previous run's dataset and tags everything is_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) and price_per_sqft for analysis
  • Fast & cheap — CheerioCrawler, 256MB, no browser; a typical 100-listing detail run finishes in ~1–2 minutes

Input

FieldTypeDefaultDescription
locationsstring[]["San Francisco, CA"]Cities/areas to scrape
categorystringapartmentsapartments | housing | all
minPricenumber0Minimum rent, server-side (0 = no minimum)
maxPricenumber0Maximum rent, server-side (0 = no maximum)
maxResultsnumber100Stop after this many listings (0 = no limit)
titleKeywordstring—Only listings whose title contains this keyword (client-side; filters before detail fetches)
fetchDetailsbooleantrueVisit detail pages for enriched data
detailDelaySecsnumber1Delay between detail page visits
dedupeAgainstDatasetIdstring—Dataset ID(s) of previous runs (comma-separated or array); matched post_ids are skipped
apiTokenstring—Optional Apify API token for reading cross-actor datasets (needed when deduping against a dataset created by a different actor/task)
{
"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:

FieldSourceExample
titleSearch"Bright 2 Bedroom Apartment"
priceSearch / Detail"$2,455"
price_numDerived2455
beds / baths / sqftDetail"2" / "1" / "729"
price_per_sqftDerived3.37
neighborhoodSearch / Detail"Mission District"
linkSearch"https://www.craigslist.org/view/d/..."
thumbnailDetailimage URL
addressDetail"123 Main St, San Francisco"
latitude / longitudeDetail37.76 / -122.42
post_idDetail"7947327024"
postedDetail"2026-07-15T..." (ISO)
photosDetail["url1", "url2", ...]
attributesDetail["hardwood", "laundry", ...]
descriptionDetail"Full description text..."
listing_typeDetail"apartment"
rent_periodDetail"monthly"
reply_urlDetail"https://.../reply/..."
contact_info / contact_websitesDetailphone/email/URL mentions from description
has_contactDetailtrue
is_newDedupetrue (only set when dedupeAgainstDatasetId produced matches)
location / areaInput"San Francisco, CA" / "sfbay"
platformSystem"craigslist"
scraped_atSystemISO timestamp

Use Cases

  • New-listing alerts — daily schedule + dedupeAgainstDatasetId = "new listings only" feed
  • Filtered market research — minPrice/maxPrice + category for a specific rental segment
  • Price tracking — run weekly, store price_num + price_per_sqft over 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) and cat=hhh (housing superset) are housing feeds. The old fsbo/rom codes 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

VersionDateChanges
0.62026-09-12Added 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.52026-09-12Filters + monitoring: minPrice/maxPrice (server-side), category (apartments/housing/all), dedupeAgainstDatasetId + apiToken (new-listings dedupe, is_new flag), price_num + price_per_sqft fields
0.42026-08-31Rewrote for Craigslist 2026 DOM; switched PlaywrightCrawler → CheerioCrawler (no browser, 256MB) — cut compute ~16×
0.32026-07-15Fixed reply_url extraction — button.reply-button with data-href attribute
0.22026-07-15Added contact extraction — reply_url, contact_info, contact_websites, has_contact
0.12026-07-15AI assistant prompt block, enriched README, actor title keywords
0.0.112026-07-15Fixed beds/baths extraction from spec line; studio (0BR) + decimal baths (2.5BA) support
0.0.72026-07-14Detail page extraction — photos, descriptions, amenities, address, listing type, rent period
0.0.12026-07-13Initial 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.