The Better Craigslist Scraper
Pricing
from $10.00 / 1,000 results
The Better Craigslist Scraper
Affordable, efficient Craigslist scraper. Export listings, prices, locations and post dates from any Craigslist city and category via the public RSS feed. HTTP-only, low compute units per run.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
Better Scrapers
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
The Better Craigslist Scraper — Fast, Affordable Craigslist Listings & Price Scraper
Scrape Craigslist search results — titles, prices and locations — from any Craigslist city and category, without a browser. This Craigslist scraper reads the server-rendered (no-JavaScript) result list on the normal search page, so it is fast, lightweight and an affordable way to export Craigslist listings and Craigslist prices into JSON, CSV or Excel. A single request typically returns a few hundred listings.
Whether you are tracking local for-sale deals, monitoring cars & trucks prices, building a used-goods price dataset, or feeding listings into your own app, this actor gives you clean, structured Craigslist data at a low cost — typically fewer compute units per run than browser-based scrapers because it never launches a headless browser.
Built for the Better Scrapers brand: do more with less compute.
What it extracts
For every listing in the search feed, you get a normalized record with:
- title — the full listing title (HTML entities decoded, CDATA stripped)
- url — the absolute link to the Craigslist listing page
- price — the numeric price parsed out of the title (e.g.
8500), ornullfor free/no-price listings - postedAt — the exact post time as ISO-8601 UTC. Requires
getListingDetails(the search page has no dates); otherwisenull. - location — the neighborhood/city Craigslist shows in trailing parentheses (e.g.
santa cruz) - image / images — the primary photo plus every photo on the posting. Requires
getListingDetails; otherwisenull. - description — the posting body as plain text. Requires
getListingDetails; otherwise absent.
Features
- HTTP-only, no browser — uses
CheerioCrawleragainst the search page, so runs are quick and cheap. - Any city, any category — point it at
sfbay,newyork,losangeles,chicago, or any Craigslist subdomain, with categories likesss(all for sale) orcta(cars & trucks). - Keyword search — pass a
queryto filter listings server-side before they are ever downloaded. - Automatic pagination — advances through the feed until your
maxItemslimit is reached or the results run out, with built-in de-duplication. - Price parsing built in — the price is pulled straight out of the title and returned as a real number, ready for sorting and filtering.
- Resilient parsing — the core parser is pure, regex-based and dependency-free, so it keeps working even when markup shifts.
- Cheap by design — one small request per search, asset-free, and low memory needs.
Input
| Field | Type | Default | Description |
|---|---|---|---|
site | string | (required) | Craigslist city subdomain, e.g. sfbay, newyork, losangeles, chicago. The part before .craigslist.org. |
category | string | "sss" | Craigslist category code. Examples: sss (all for sale), cta (cars & trucks), apa (apartments/housing), jjj (jobs), ggg (gigs). |
query | string | "" | Optional keyword to search for, e.g. mountain bike. Leave blank for the whole category feed. |
maxItems | integer | 100 | Maximum number of listings to collect. The scraper paginates until this limit or the feed is exhausted. |
getListingDetails | boolean | false | Visit each posting for its post date, all photos and description. Costs one extra request per listing — leave off for the fastest, cheapest runs. |
proxyConfiguration | object | { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] } | Craigslist rate-limits by IP reputation. Residential is the most reliable; datacenter may work but can return HTTP 403. |
Example input
{"site": "sfbay","category": "sss","query": "mountain bike","maxItems": 100,"proxyConfiguration": { "useApifyProxy": true }}
Output
Each listing is pushed to the dataset as one record. Example:
{"title": "$8,500 2015 Honda Civic LX (santa cruz)","url": "https://sfbay.craigslist.org/scz/cto/d/santa-cruz-2015-honda-civic/7712345678.html","price": 8500,"postedAt": "2026-05-23T00:02:12.000Z","location": "santa cruz","image": "https://images.craigslist.org/00v0v_dAZwjpiARO8_0CI0t2_600x450.jpg","images": ["https://images.craigslist.org/00v0v_dAZwjpiARO8_0CI0t2_600x450.jpg", "https://images.craigslist.org/00z0z_eX4PYBAOhnS_0CI0t2_600x450.jpg"],"description": "Diamondback Mountain Bike. Kids outgrew. Stored inside."}
Export the full dataset as JSON, CSV, Excel, XML or HTML from the Apify console or API.
Example use cases
- Local deal hunting — monitor
for salelistings and get notified about under-priced items. - Used car price tracking — scrape the
cta(cars & trucks) category to build a Craigslist car price dataset. - Market & resale research — analyze Craigslist prices by category and city over time.
- Real-estate / apartment monitoring — pull the
apahousing feed for a city. - Lead generation & gigs — collect
gigsorjobspostings by keyword. - Price comparison apps — feed structured Craigslist data into your own pricing or arbitrage tool.
How it works
- It builds the search URL for your city and category, e.g.
https://sfbay.craigslist.org/search/sss?query=mountain+bike(Craigslist 301-redirects this to its canonicalwww.craigslist.org/search/area/...form, which the client follows). CheerioCrawlerfetches the feed over plain HTTP (no browser).- The pure
parseSearchHtml()parser (insrc/parse.mjs) extracts each<li class="cl-static-search-result">, decodes the title, and pulls out the price and location. - With
getListingDetailson, each posting page is then fetched andparseListingPage()adds the post date (<time datetime>), every photo URL, and the description. - Records are de-duplicated by URL and pushed to the dataset.
- The crawler follows the feed's pagination (
s=offset) untilmaxItemsis met or no new listings remain.
Why it's efficient and affordable
- No headless browser. Browser scrapers spend most of their compute rendering pages. This actor only makes small HTTP requests to a text feed, so it uses fewer compute units per run.
- One request per search. The static result list returns hundreds of listings in a single response — no browser, no images, no scripts executed — so each run uses very few compute units. Detail fetching is opt-in, so you only pay the extra requests when you actually want dates and photos.
- No rendering. Only the raw HTML is fetched and parsed with plain string matching; no browser, CSS, JS or image bytes, which keeps memory and bandwidth low.
- Server-side filtering. Passing a
querynarrows results before download, so you pay only for the listings you actually want.
FAQ
Why are postedAt and image null?
Craigslist's search page lists only title, price, location and link — it carries no dates or photos, and the RSS feed that used to provide them now returns HTTP 403. Turn on Get listing details to visit each posting and fill in the post date, all photos and the description.
Is scraping Craigslist with this actor reliable?
It reads the server-rendered result list Craigslist ships for non-JavaScript clients, matching on its stable cl-static-search-result structure rather than on styling-dependent selectors.
Which cities and categories are supported?
Any Craigslist city subdomain (e.g. sfbay, newyork, sandiego) and any category code (e.g. sss, cta, apa, jjj, ggg).
Why are some prices null?
Not every listing has a price in its title (free items, jobs, gigs, service ads). When no price is present, price is null rather than a guess.
How many listings can I get per run?
Set maxItems to whatever you need. One search page returns roughly 300-360 listings, so requests above that will return fewer items than asked — narrow the query or use another category/city for more coverage.
Do I need a proxy? Craigslist rate-limits aggressively by IP reputation. The residential proxy group is the most reliable choice; datacenter IPs often receive HTTP 403. Keep volumes modest either way.
Legal & ethics
This actor reads publicly visible Craigslist search results. Note that Craigslist's Terms of Use prohibit automated access, and Craigslist has actively enforced this against commercial data collection. Use it responsibly and at your own risk: keep request volumes low, do not redistribute or republish the data, do not collect personal data, and comply with all applicable laws in your jurisdiction. You are responsible for how you use the data you collect.