Craigslist Scraper
Pricing
from $1.00 / 1,000 results
Craigslist Scraper
Scrape Craigslist search results and individual posts across any city subdomain (sfbay, newyork, chicago, etc.). Extracts titles, prices, descriptions, attributes, coordinates, images, and posted/updated timestamps. HTTP-only, no login, no proxy required.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(16)
Developer
Crawler Bros
Actor stats
16
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape Craigslist search results and individual posts across any city subdomain — sfbay, newyork, chicago, losangeles, london, and hundreds more. Returns titles, prices, descriptions, attributes, coordinates, images, and posted/updated timestamps. HTTP-only; no login, no cookies, no proxy required for normal volume.
Output (per post)
type=craigslist_listingurl,id(numeric post id parsed from<id>.html)title,category,subcategory,location,regionpostingType— category slug from the URL path (cto,apa,lab,fud, ...)price,priceQualifier— e.g./ 2br - 1083ft²,OBO,/ monthpostedAt,updatedAtdescription— plain-text#postingbodyimages— large image URLs (_600x450.jpg) from the gallerylatitude,longitude— from the embedded mapmapAddress— street address displayed next to the mapattributes— raw dict parsed from.attrgroup(full key → value set)phoneNumbers,notices,replyUrl- Jobs:
compensation,employmentType,jobTitle - For-sale (generic):
condition,size - Autos:
yearManufactured,makeManufacturer,modelName,odometer,transmission,fuelType,titleStatus,cylinders,paintColor,drive,vehicleType,vin - Housing:
bedroomCount,bathroomCount,sqft,availableDate,housingType,laundry,parking,rentPeriod,listedBy,applicationFee,brokerFee,openHouseDates,catsOk,dogsOk,furnished,smoking scrapedAt
Fields that are absent on the source page are simply omitted (no nulls). If zero posts are scrapeable, a single craigslist_blocked sentinel is emitted so the run exits with data.
Input
| Field | Type | Description |
|---|---|---|
startUrls | object[] | Craigslist search URLs or direct post URLs. Prefill: https://sfbay.craigslist.org/search/jjj. |
searchTerm | string | Optional keyword. Appended to each search URL as ?query=<term>. Ignored for direct post URLs. |
maxItems | integer | Maximum posts per run. Default 3. Max 1000. |
scrapeDetails | boolean | Fetch each post's page for full description + attributes. Default true. |
minPrice | integer | Minimum price filter (USD). |
maxPrice | integer | Maximum price filter (USD). |
hasImage | boolean | When true, only include posts with at least one image. |
proxyConfiguration | object | Apify proxy config. Default off — Craigslist accepts datacenter IPs. |
How it works
- For each
startUrlsentry, the scraper classifies the URL as either a search page (/search/<cat>) or a direct post (.../<id>.html). - Search pages are paginated by incrementing the
s=Nquery offset; post URLs are extracted from<li class="cl-static-search-result">cards. - For each post URL (deduplicated by numeric id), the detail page is fetched and parsed:
- Title from
#titletextonly - Price from
.price - Description from
#postingbody - Attributes from
.attrgroup(label → value pairs) - Coordinates from
.mapbox[data-latitude] - Images from
#thumbs a[data-imgid](large_600x450URLs) - Posted / updated timestamps from
.postinginfos time[datetime]
- Title from
- Phone numbers and warning notices are extracted via regex / DOM.
FAQ
Do I need a proxy? No. Craigslist responds fine from Apify's datacenter IPs. If you hit a 403 wall, toggle on Apify proxy.
Does this bypass login walls? Craigslist has no login wall for public listings — this actor works out of the box.
Can I scrape just one specific post? Yes. Put the direct post URL (ending in <id>.html) into startUrls and set maxItems: 1.
What cities are supported? Every Craigslist subdomain — the scraper detects the region automatically from the URL.