Craigslist Scraper — Listings, Prices, Deal Alerts
Pricing
from $0.80 / 1,000 listings
Craigslist Scraper — Listings, Prices, Deal Alerts
Craigslist listings from any city, state or country: price, location, map point, dates, car and housing details, images and full text. Search any category with price, date and owner filters. New-listings alert mode. Free status row per search. No login.
Pricing
from $0.80 / 1,000 listings
Rating
0.0
(0)
Developer
Dottti
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Craigslist Scraper: Listings, Prices, Deal Alerts
Get Craigslist listings from any city, any state or province, or a whole country. Each listing comes with its title, price and currency, area, map point, dates, category, owner or dealer, photos, and the numbers Craigslist shows in search: odometer for cars, bedrooms and square feet for housing, pay and employer for jobs. Turn on one switch to also get the full listing text and every attribute (make and model, year, title status, laundry, pets and more).
The actor reads the same public data the Craigslist website loads in your browser. You need no account and no API key.
Who uses it
- Car dealers and flippers who watch owner listings for one make and price range in many cities.
- Resellers and deal hunters who want an alert when a new listing matches their search.
- Property managers and housing researchers who compare rents, bedrooms and square feet across areas.
- Recruiters and labor analysts who track job and gig posts with pay and employer.
- Market researchers who need clean price data across hundreds of local markets.
What you can do
- Search one site (
sfbay), part of a site (sfbay/sbyfor the South Bay), every site in a state (US-TX) or province (CA-ON), or every site in a country (GB). - Pick any categories: for sale, cars & trucks, housing, apartments, jobs, gigs, services, community, events and all their sub-categories. Codes (
cta) and plain words (cars) both work. - Filter by search words, price range, posted today, posted or renewed within N days, has images, owner or dealer, and distance from a ZIP code.
- Paste Craigslist search links from your browser. Every filter in the link is kept.
- Get up to tens of thousands of listings per search.
- Open each listing for the full text, all attributes, first-posted date and exact map point.
- Turn on deal alert mode. Later runs return only listings you have not seen.
Input examples
Owner-sold Toyotas between $3,000 and $9,000 with photos, in four cities:
{"sites": ["chicago", "losangeles", "seattle", "denver"],"categories": ["cars"],"searchQueries": ["toyota"],"sellerType": "owner","minPrice": 3000,"maxPrice": 9000,"hasImages": true,"maxListingsPerSearch": 100}
Every gig posted in Texas in the last 2 days:
{"regions": ["US-TX"],"categories": ["ggg"],"postedWithinDays": 2,"maxListingsPerSearch": 200}
Apartments in the city of Chicago with full text and attributes:
{"sites": ["chicago/chc"],"categories": ["apa"],"maxPrice": 2500,"includeDetails": true,"maxListingsPerSearch": 50}
A search link copied from the browser:
{"searchUrls": ["https://www.craigslist.org/search/area/sfbay?cat=bik&query=trek&min_price=200"]}
Deal alert for two bikes in two places (run it on a schedule):
{"sites": ["sfbay/sby", "portland"],"categories": ["bia"],"searchQueries": ["trek", "specialized"],"onlyNew": true,"stateName": "bike-deals","maxListingsPerSearch": 30}
Output
Every row has a type field.
| type | One row is | Charged |
|---|---|---|
listing | One Craigslist listing | Yes |
search | One search (site x category x search words) and its status | No |
Listing row with details (real output, 2026-10-26, 9 image links left out)
{"type": "listing","id": 7989992169,"url": "https://www.craigslist.org/view/d/daly-city-2009-audi-a5-line-61k/tPnFxHnsCVGL5rt7fEE4aN","title": "2009 Audi A5 S Line, 61k original miles, V6","price": 8900,"priceText": "$8,900","currency": "USD","site": "sfbay","siteName": "SF bay area","subarea": "pen","subareaName": "peninsula","region": "CA","country": "US","neighborhood": null,"location": "Daly City","lat": 37.6735,"lon": -122.4822,"listedAt": "2026-10-26T11:39:37.000Z","postedAt": "2026-10-26T11:39:37.000Z","updatedAt": "2026-10-26T11:42:27.000Z","category": "cto","categoryName": "cars & trucks - by owner","section": "for sale","sellerType": "owner","odometer": 61000,"bedrooms": null,"bathrooms": null,"sqft": null,"year": 2009,"makeModel": "Audi A5","attributes": {"auto_make_model": "Audi A5","auto_year": "2009","auto_fuel_type": "gas","auto_miles": "61,000","auto_title_status": "clean","auto_transmission": "automatic"},"imageCount": 11,"imageUrls": ["https://images.craigslist.org/00606_7sc4PAKnGfC_0CI0t2_600x450.jpg","https://images.craigslist.org/00606_bdXmmCkm2g9_0CI0t2_600x450.jpg"],"body": "2009 Audi A5 S line Premium Plus Prestige, 61k original miles. V6, automatic with optional paddle shift, navigation, sunroof and Audi door illumination. Clean title, never been in any type of accident. ...","detailStatus": "ok","searchSite": "sfbay","searchCategory": "cto","searchQuery": null,"uuid": "tPnFxHnsCVGL5rt7fEE4aN"}
Without includeDetails, the same row has everything above except body, postedAt, updatedAt, year, makeModel and the posting-page attributes. detailStatus is then not_requested.
A job row from search alone (real output, some fields left out):
{"type": "listing","title": "Dedicated CDL-A Lane: Midwest-East - $0.75 CPM - Home Weekends","price": null,"site": "chicago","subareaName": "south chicagoland","location": "Downers Grove, IL","categoryName": "transportation","section": "jobs","attributes": {"compensation": "75 cents per mile","jobTitle": "Hiring CDL-A OTR Drivers: Midwest-East Lane"}}
Search row (real output, free)
{"type": "search","input": "sfbay","site": "sfbay","subarea": null,"category": "apa","query": null,"status": "ok","totalAvailable": 21042,"listingsDelivered": 3,"listingsScanned": 3,"requests": 1,"detailRequests": 3,"stopReason": "max_listings","error": null,"charged": false}
Listing fields
| Field | Meaning |
|---|---|
id, url, uuid | Craigslist post id, the public link, and the key used in the link |
title, price, priceText | price is a number in the site's currency. null when the listing shows no price. |
currency | USD, CAD, GBP, EUR and so on, from the site |
site, siteName, subarea, subareaName, region, country | Where the listing is posted |
location, neighborhood | The place text the poster typed, and the neighborhood when Craigslist has one |
lat, lon | Map point. Posters choose how exact it is. |
listedAt | Last posted or renewed time (UTC). Craigslist sorts and filters by this date. |
postedAt, updatedAt | First posted and last edited time. Details only. |
category, categoryName, section, sellerType | Leaf category, its name, the section (for sale, housing, jobs...) and owner or dealer when the category says so |
odometer, year, makeModel | Cars and other vehicles |
bedrooms, bathrooms, sqft | Housing |
attributes | Everything else Craigslist shows. With details, keys are Craigslist's own names, like auto_title_status, laundry, pets_dog, employment_type. A tick mark becomes true. |
imageCount, imageUrls | Photo links at 600x450. Change _600x450 to _1200x900 in a link for the large size. |
body | Full listing text with line breaks. Details only. Phone numbers and email addresses are replaced with [phone removed] and [email removed]. |
detailStatus | ok, not_requested, deleted (the post was removed between search and opening), or blocked |
searchSite, searchCategory, searchQuery | The search that found the row |
isNew | true in alert mode |
Search status values
A bad input never stops the run. Every search gets one free search row:
ok: listings were delivered.no_results: Craigslist has no listings for this search.no_matching: listings exist, but none passed your date, part-of-site or duplicate filters.no_new: alert mode found nothing that earlier runs had not returned.invalid_input: unknown site, region, category or link. Theerrorfield says what to fix.blocked: Craigslist refused every retry and every proxy tier.cut_by_cost_limit,skipped_cost_limit,skipped_max_listings: your cost limit or total listing limit was reached.
stopReason says why a search ended: max_listings, end_of_results, date_limit, reached_last_run, max_total_listings or cost_limit.
The RUN_SUMMARY record in the key-value store lists every search with its status and requests. It also lists status codes, retries, the proxy tier used and the bytes downloaded per 1,000 listings.
How searches add up
One search is one site (or part of a site) x one category x one search word list entry. Four sites, three categories and two search words make 24 searches. maxListingsPerSearch caps each search. maxListings caps the whole run.
A listing that two of your searches find is delivered and charged once per run.
Craigslist marks repeated posts of the same item. With skipDuplicates on (the default), only the newest post of each group is kept.
Small sites fill their search page with listings from nearby sites. These are left out unless you turn on includeNearby, so each listing appears under its own site.
Deal alerts on a schedule
- Turn on
onlyNewand give the list astateName. - The first run returns the newest listings as a baseline. It remembers their ids and the newest listing time per search.
- Each later run returns only listings posted or renewed since the last run that it has not returned before. Renewed listings keep their id, so they do not come back. These rows have
isNew: true. Their search row hasalert: "new_listings". - If more than
maxListingsPerSearchnew listings arrived between two runs, you get the newest that many. - If a cost limit cuts a run, the next run still returns what was cut.
State lives in the named key-value store craigslist-listings-state, under STATE-<stateName>. Use different names for different lists.
To schedule it, open the actor in Apify Console, save your input as a task, then add a schedule to the task. Every 15 minutes to every hour works well for deals. When nothing is new, the run outputs only the free search rows and you pay nothing for listings. Connect the task to email, Slack or a webhook in Apify integrations to get the alert.
Pricing
You pay per listing row: $0.80 per 1,000 listings ($0.0008 per listing). Opening each listing for full text costs nothing extra.
- Search status rows are free.
- Listings removed by your filters are free.
- A listing found by two of your searches is charged once.
- Set a maximum cost per run in Apify. The actor stops cleanly at that limit and marks the searches it could not finish.
Platform usage is included in the price.
Speed and limits
Measured on 2026-10-26 from a home connection, no proxy, 256 MB memory:
| Run | Listings | Requests | Time | Downloaded |
|---|---|---|---|---|
| Empty input (sfbay, for sale) | 20 | 1 | 4 s | 47 KB |
| 4 cities x 3 categories, 400 each, search data | 4,368 | 12 | 33 s | 2.3 MB |
| One category, 2,500 listings | 2,500 | 5 | 15 s | 780 KB |
| All 27 Texas sites, gigs, last 2 days | 76 | 27 | 9 s | 292 KB |
| 4 cities x 3 categories, 25 each, with details | 300 | 312 | 95 s | 1.6 MB |
| 4 cities x 3 categories, 100 each, with details | 1,196 | 1,212 | 367 s | 3.7 MB |
- Search data comes in pages of 360 or 1,080 listings, so search-only runs are fast: about 7 seconds per 1,000 listings.
- Details need one request per listing. The actor waits 0.3 seconds between requests to stay polite, so expect about 5 minutes per 1,000 listings with details.
- Craigslist removes a listing after 30 to 45 days, or when the poster deletes it. A removed listing shows
detailStatus: "deleted". - Photo links point to Craigslist's image server and stop working when the listing is removed.
postedWithinDaysuseslistedAt, the date Craigslist sorts by. A renewed listing counts as recent.- Proxy: requests start with no proxy. If Craigslist keeps refusing, the actor moves to Apify datacenter proxy, then US residential. No proxy was needed in our tests.
Privacy
The actor reads only public listing data. It never logs in, never replies to posts, and never collects the hidden phone or email behind Craigslist's reply button. Phone numbers and email addresses that posters type into the listing text are removed before output. The street address of housing listings is not output; the map point and neighborhood are. You are responsible for using the data in line with the laws that apply to you, such as CCPA, GDPR or Saudi PDPL.
Input reference
| Field | Default | What it does |
|---|---|---|
sites | empty (sfbay when nothing else is set) | Sites, parts of sites (sfbay/sby) or site links |
regions | empty | Every site in a state or province: US-TX, TX, CA-ON |
countries | empty | Every site in a country: US, CA, GB |
categories | ["sss"] | Category codes or words |
searchQueries | empty | One search per entry |
titlesOnly | false | Match search words in titles only |
minPrice, maxPrice | empty | Price range in the site's currency |
postedToday | false | Posted today only |
postedWithinDays | empty | Posted or renewed in the last N days |
hasImages | false | Only listings with photos |
sellerType | any | any, owner or dealer |
postalCode, searchDistanceMiles | empty | Distance from a ZIP or postal code |
searchUrls | empty | Craigslist search links |
sort | newest | newest, relevance, priceAsc, priceDesc, oldest |
maxListingsPerSearch | 20 | Cap per search |
maxListings | 0 | Cap for the whole run, 0 = none |
includeDetails | false | Open each listing for text and all attributes |
skipDuplicates | true | Keep the newest post of each repeated group |
includeNearby | false | Keep listings from nearby sites |
onlyNew | false | Deal alert mode |
stateName | default | Separate memory per alert list |
proxyConfiguration | off | Your own proxy; turns the fallback off |
autoProxyFallback | true | No proxy, then datacenter, then residential |
allowResidentialFallback | true | Allow the residential step |
maxConcurrency | 2 | Searches run in parallel |