Craigslist Scraper — Listings, Prices, Deal Alerts avatar

Craigslist Scraper — Listings, Prices, Deal Alerts

Pricing

from $0.80 / 1,000 listings

Go to Apify Store
Craigslist Scraper — Listings, Prices, Deal Alerts

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

Dottti

Maintained by Community

Actor 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/sby for 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.

typeOne row isCharged
listingOne Craigslist listingYes
searchOne search (site x category x search words) and its statusNo
{
"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

FieldMeaning
id, url, uuidCraigslist post id, the public link, and the key used in the link
title, price, priceTextprice is a number in the site's currency. null when the listing shows no price.
currencyUSD, CAD, GBP, EUR and so on, from the site
site, siteName, subarea, subareaName, region, countryWhere the listing is posted
location, neighborhoodThe place text the poster typed, and the neighborhood when Craigslist has one
lat, lonMap point. Posters choose how exact it is.
listedAtLast posted or renewed time (UTC). Craigslist sorts and filters by this date.
postedAt, updatedAtFirst posted and last edited time. Details only.
category, categoryName, section, sellerTypeLeaf category, its name, the section (for sale, housing, jobs...) and owner or dealer when the category says so
odometer, year, makeModelCars and other vehicles
bedrooms, bathrooms, sqftHousing
attributesEverything 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, imageUrlsPhoto links at 600x450. Change _600x450 to _1200x900 in a link for the large size.
bodyFull listing text with line breaks. Details only. Phone numbers and email addresses are replaced with [phone removed] and [email removed].
detailStatusok, not_requested, deleted (the post was removed between search and opening), or blocked
searchSite, searchCategory, searchQueryThe search that found the row
isNewtrue 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. The error field 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

  1. Turn on onlyNew and give the list a stateName.
  2. The first run returns the newest listings as a baseline. It remembers their ids and the newest listing time per search.
  3. 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 has alert: "new_listings".
  4. If more than maxListingsPerSearch new listings arrived between two runs, you get the newest that many.
  5. 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:

RunListingsRequestsTimeDownloaded
Empty input (sfbay, for sale)2014 s47 KB
4 cities x 3 categories, 400 each, search data4,3681233 s2.3 MB
One category, 2,500 listings2,500515 s780 KB
All 27 Texas sites, gigs, last 2 days76279 s292 KB
4 cities x 3 categories, 25 each, with details30031295 s1.6 MB
4 cities x 3 categories, 100 each, with details1,1961,212367 s3.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.
  • postedWithinDays uses listedAt, 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

FieldDefaultWhat it does
sitesempty (sfbay when nothing else is set)Sites, parts of sites (sfbay/sby) or site links
regionsemptyEvery site in a state or province: US-TX, TX, CA-ON
countriesemptyEvery site in a country: US, CA, GB
categories["sss"]Category codes or words
searchQueriesemptyOne search per entry
titlesOnlyfalseMatch search words in titles only
minPrice, maxPriceemptyPrice range in the site's currency
postedTodayfalsePosted today only
postedWithinDaysemptyPosted or renewed in the last N days
hasImagesfalseOnly listings with photos
sellerTypeanyany, owner or dealer
postalCode, searchDistanceMilesemptyDistance from a ZIP or postal code
searchUrlsemptyCraigslist search links
sortnewestnewest, relevance, priceAsc, priceDesc, oldest
maxListingsPerSearch20Cap per search
maxListings0Cap for the whole run, 0 = none
includeDetailsfalseOpen each listing for text and all attributes
skipDuplicatestrueKeep the newest post of each repeated group
includeNearbyfalseKeep listings from nearby sites
onlyNewfalseDeal alert mode
stateNamedefaultSeparate memory per alert list
proxyConfigurationoffYour own proxy; turns the fallback off
autoProxyFallbacktrueNo proxy, then datacenter, then residential
allowResidentialFallbacktrueAllow the residential step
maxConcurrency2Searches run in parallel