← Catalog · Zumper rental data · Managed feeds · Actor
How to Get Craigslist Real Estate Listings as Structured Data (FSBO, Rentals, Rooms)
29 Oct 2026 · benthepythondev
Craigslist carries a lot of housing listings that never show up on the big portals: homes sold by their owners, rentals posted by landlords and property managers, rooms and sublets. Reading them one at a time in a browser is slow, and the pages aren't built for export. The Craigslist Real Estate Scraper turns a Craigslist housing search into one structured row per listing. You can download the results as JSON, CSV or Excel, or call it as an API.
Looking for rentals from a portal instead? See the Zumper rental data guide.
What you get
Each listing comes back as one record with these fields:
- url and post_id: the listing link and Craigslist's own ID for the post
- title and body: the headline and the full description text
- price, bedrooms, bathrooms, sqft: the numbers you'd filter on
- location, latitude, longitude: the street location plus map coordinates
- posting_date: when the listing went up, so you can spot fresh posts
- photos: image URLs (up to 20 per listing)
- attributes: Craigslist's tag list, such as "w/d in unit", "cats are OK", "carport", "wheelchair accessible"
- by_owner: true for by-owner listings, false for agents or dealers
- contact_available and reply_link: whether the post has contact options, and the Craigslist reply URL
- housing_type: the raw housing summary line from the page
- lead_score: a 0 to 100 score from a fixed, published formula
- source and scraped_at: where and when the row was collected
Real example output
This is a trimmed excerpt from a real run on the SF Bay Area apartments category (the body text and photo list are shortened):
{
"url": "https://www.craigslist.org/view/d/walnut-creek-inviting-br-wood-style/kpMrJkDZ319i1rCzAVaZFG",
"source": "craigslist",
"scraped_at": "2026-10-24T22:57:25.323130",
"post_id": "7989377496",
"title": "Inviting 2 BR-Wood-Style Floors, Laundry, Walk Everywhere",
"price": 2425,
"body": "North Main Apartments\n2971 N Main St , Walnut Creek, CA, 94597\n...",
"bedrooms": 2,
"bathrooms": 1,
"sqft": 925,
"location": "2971 N Main St",
"latitude": 37.927894,
"longitude": -122.062031,
"posting_date": "2026-10-24T15:44:22-0700",
"photos": ["https://images.craigslist.org/00000_amiLdLysa5q_0jm0dP_600x450.jpg"],
"attributes": ["2BR / 1Ba", "925ft2", "rent period:", "monthly", "cats are OK - purrr", "apartment", "laundry in bldg", "carport", "wheelchair accessible"],
"reply_link": "https://sfbay.craigslist.org/reply/sfo/apa/7989377496",
"by_owner": false,
"housing_type": "/ 2br - 925ft2 -",
"contact_available": true,
"lead_score": 58
}
You can check that score by hand. It's an agent listing (10 points), it has 6 photos (10) and contact is available (10), the price is under $100k (5), it's under 1,000 sq ft (3), and price, bedrooms, size and photos are all present (20). That adds up to 58.
Use cases
From the actor's README:
- FSBO lead generation for agents. Set
listingTypetoownerandcategorytoreato list owners selling without an agent. Sort bylead_scoreso the listings with photos and a reply option come first. - Off-market deals for investors. The same by-owner filter, combined with price limits and
postalCodeplussearchDistance, gives you a short list of direct sellers in one area. - Rental benchmarking for property managers and landlords. Pull the
apacategory for a city and compareprice,sqft,bedroomsand theattributestags (laundry, parking, pets) across neighborhoods. - Market research over time. Run the same search on a schedule and track how pricing and supply change across cities.
How to run it on Apify
Open the actor at apify.com/benthepythondev/craigslist-real-estate-scraper and fill in the input. There are two modes. search takes a city code (sfbay, newyork, losangeles, chicago and so on) and a category: apa for rentals, rea for sale, roo for rooms, sub for sublets or vac for vacation. direct_urls takes exact listing URLs instead.
A for-sale-by-owner search looks like this:
{
"mode": "search",
"city": "sfbay",
"category": "rea",
"listingType": "owner",
"minPrice": 200000,
"maxPrice": 900000,
"minBedrooms": 2,
"maxListings": 100,
"includeLeadScore": true
}
Once a run finishes, you can view the dataset as a table or export it. Runs can also go on a schedule or feed Make, Zapier or n8n.
Pricing: $0.02 per returned listing, plus a $0.00005 actor-start event per GB of run memory. At the standard 512 MB setting, 10 listings cost about $0.20005 before account discounts.
How to call it as an API on RapidAPI
If you'd rather make HTTP requests than use the Apify console, the same scraper is listed on RapidAPI: rapidapi.com/benthepythondev0/api/craigslist-real-estate-scraper. Use the endpoint docs and plans on that page.
Honest limits
- Contact details are not extracted. Craigslist hides phone numbers behind "show contact info", and you'll see that placeholder in the
bodytext. What you get iscontact_availableand thereply_link. - The lead score is tuned for homes for sale. Its price bands start at $100k, so monthly rents always land in the lowest band. That's why rental listings in the example score in the 50s. For rentals, use the score to compare rentals with each other, not with sale listings.
- Some fields are raw.
housing_typeis the page's summary string as written (for example "/ 2br - 925ft2 -"), andlocationis often only a street address. A studio comes back withbedroomsset to 0. - Many rental posts come from managed buildings. In the example rows,
by_owneris false and the body text is a property manager's marketing copy. If you only want individual owners, filter withlistingType: owner. - Run size is capped.
maxListingsaccepts 1 to 500 per run, and each listing returns at most 20 photos. - Coverage is only what's on Craigslist for the city and category you pick. Listings that get deleted or expire won't come back in later runs.