How to Scrape Craigslist Listings and Prices in 2026
Learn how to scrape Craigslist listings, prices, images and GPS coordinates across any city and category — no login, no API key — and build market-wide datasets at scale.
If you want to track resale prices, monitor a local market, or build a labelled dataset of real-world classifieds, the fastest way to scrape Craigslist is to point a structured scraper at any search-results URL and let it paginate. Craigslist has no public API worth using, its UI is built for one-listing-at-a-time browsing, and it blocks datacenter IPs outright — so bulk collection means knowing exactly which URLs to feed and which fields come back. This guide covers what Craigslist data is worth across categories and cities, the two input modes, how pagination works, the exact output fields, and the real use cases that justify the run.
Why Craigslist data is valuable
Craigslist is one of the largest pools of unstructured, hyper-local commerce data on the open web. Unlike a polished marketplace with a clean API, it is messy, regional, and constantly churning — which is exactly what makes it valuable. The prices are what real people in a real city are actually asking, today, with no algorithmic repricing in between.
The value changes by category:
- For-sale (
sss,ele,fua,mob) — resale and arbitrage signal. What does a used iPhone, a couch, or a power tool actually fetch in Phoenix versus Seattle? Craigslist answers in raw asking prices, not list-price fiction. - Cars & trucks (
cta) — private-party vehicle pricing by make, model and city, often below dealer book value. Auto analysts use it to track depreciation curves and regional spreads. - Apartments & housing (
apa) — rental supply and asking rents at neighborhood granularity, complete with approximate GPS coordinates. A leading indicator for local rent trends before the aggregators catch up. - Jobs, gigs & services (
jjj,ggg,bbb) — lead generation. Every services post is a small business or contractor advertising that they want work, with a contact path attached.
Because the data is regional, the real product is rarely one city. It is the same query run across ten cities, stitched into a market-wide picture. That is where structured scraping beats manual browsing by orders of magnitude.
How scraping Craigslist actually works
A few engineering realities shape how you scrape Craigslist:
- No login, no cookies, no API key. Craigslist search results are public. You read them as an anonymous visitor, so there is no account to risk and nothing to expire.
- Datacenter IPs are blocked. This is the one hard requirement. Craigslist returns blocks or empty pages to datacenter ranges, so requests must go through US residential proxies. The actor defaults to Apify Proxy’s US RESIDENTIAL group — leave it as-is and it just works.
- No headless browser needed. Search-results listings are in the server-rendered HTML. That keeps runs fast and cheap because there is no Chromium to spin up per page.
The combination matters: residential proxy for access, plain HTTP for speed. You get high throughput without paying for a browser on every request.
▶ Run the Craigslist Scraper — paste any city + category search URL and pull every listing with price, location, images and GPS coordinates. No login, no API key. $5 per 1,000 listings.
Input mode 1: paste search URLs
The simplest way to drive the scraper is to do exactly what you’d do as a human — go to Craigslist, pick a city subdomain, choose a category, apply any filters or a search query, and copy the URL out of the address bar. Paste one or many into searchUrls.
{
"searchUrls": [
"https://newyork.craigslist.org/search/sss?query=iphone",
"https://losangeles.craigslist.org/search/cta?query=toyota&max_price=15000"
],
"maxResults": 2000,
"includeDetails": false
}
Each URL can target a different city, a different category, or a different query — mix them freely. Filters you apply in the browser (price ceiling, search term, condition) are carried in the URL, so the scraper respects them automatically. This is the mode to use when you already know exactly what slices of the market you want.
Input mode 2: the builder object
If you’d rather not hand-craft URLs, the builder input assembles one for you from named fields:
{
"builder": { "city": "chicago", "category": "apa", "query": "loft", "maxPrice": 2500 },
"maxResults": 500
}
The builder accepts { city, category, query, minPrice, maxPrice, filters }. The category field takes Craigslist’s short codes. The most common ones:
| Code | Category |
|---|---|
sss | for-sale (all) |
cta | cars & trucks |
apa | apartments / housing |
jjj | jobs |
bbb | services |
ggg | gigs |
mob | cell phones |
ele | electronics |
fua | furniture |
The builder is ideal when you’re generating queries programmatically — loop over a list of cities for a fixed category and you’ve templated a national sweep without ever opening a browser.
Pagination and result limits
A single Craigslist search page shows only a slice of the inventory. The scraper handles deep pagination — it walks the result pages rather than stopping at the first one, so a busy query yields hundreds to thousands of listings.
Two controls govern depth:
maxResultscaps the total listings collected across all your search URLs. The default is1000; set it to0for unlimited. This is your primary cost and time lever.- Splitting across URLs is how you maximize coverage. Rather than relying on one query to surface everything, feed several narrower searches (by city, by price band, by sub-category) and let the scraper dedupe. Results are tagged with their
sourcecity domain and de-duplicated across the run, so overlapping queries won’t pollute your dataset.
For most projects, a focused set of search URLs with a sensible maxResults beats one giant unbounded run — you get the coverage you need without scraping the long tail of stale posts.
Output fields
Every listing becomes one clean, structured record. Here is a real example of what comes back per listing:
{
"id": "35724329",
"title": "iPhone 17 pro Max (Never used) 512gb Unlocked",
"price": "$1,360",
"priceValue": 1360,
"category": "sss",
"location": "bronx",
"latitude": 40.8737,
"longitude": -73.8712,
"postedDate": "2026-06-04T11:51:55.000Z",
"slug": "bronx-iphone-17-pro-max-never-used",
"images": [
"https://images.craigslist.org/00M0M_4RlzwaQw03v_0t20CI_600x450.jpg",
"https://images.craigslist.org/00H0H_kF1asOcIYBa_0t20CI_600x450.jpg"
],
"imageCount": 8,
"url": "https://newyork.craigslist.org/brx/mob/d/bronx-iphone-17-pro-max-never-used/7938688572.html",
"source": "newyork.craigslist.org",
"scrapedAt": "2026-06-04T13:14:45.288Z"
}
The fields, and why each one earns its place:
| Field | Description |
|---|---|
id | Craigslist listing identifier — your stable join key across runs |
title | Listing title |
price / priceValue | Formatted price string ("$1,360") and numeric value (1360) |
location | Neighborhood / sub-area |
latitude / longitude | Approximate GPS coordinates |
postedDate | When the listing was posted (ISO 8601) |
images / imageCount | Photo gallery URLs and the total count |
url | Direct, working link to the Craigslist post |
category / source | Category code and the source city domain |
scrapedAt | Capture timestamp — essential because listings expire |
The most useful design decision Craigslist data forces on you is the two price fields. price keeps the human-formatted string for display; priceValue gives you a clean integer to run averages, medians and filters on without parsing currency symbols. Build your analytics on priceValue and your reports on price.
Pulling descriptions and attributes
By default the scraper reads the search-results pages only — fast and cheap. Flip includeDetails to true and it also opens each listing’s detail page, adding description, attributes (the key-value spec table), detailLatitude, detailLongitude and fullImages (full-size photos) to every record.
This is slower because it’s an extra request per listing, so leave it off for bulk price sweeps and turn it on only when the listing body actually matters — for example, when you need vehicle attributes (mileage, title status) or the full apartment description for NLP.
Use cases
Resale and arbitrage
Run the same for-sale query across multiple cities, compare priceValue distributions, and the deals surface themselves. A console worth $400 in San Francisco listed at $200 in a cheaper metro is an arbitrage opportunity — and with postedDate you can prioritize fresh posts before someone else grabs them. Resellers and flippers use this to track prices and spot deals across cities and categories continuously.
Market and price research
Aggregate priceValue, location and postedDate and you have a live read on supply, asking prices and demand for any product. Because Craigslist prices are raw asking prices with no marketplace repricing layer, they’re a cleaner signal of local sentiment than algorithm-driven platforms. Run it weekly and you build a time series no aggregator sells.
Real-estate and auto analysis
The apa and cta categories carry GPS coordinates, so you can map rental supply by neighborhood or plot vehicle prices by metro. Analysts pull apartment or vehicle listings at scale to model regional spreads and depreciation curves directly from primary-source asking prices.
Lead generation
The services, gigs and jobs categories are full of small businesses and contractors actively advertising for work. Each post is a warm signal — someone who wants business right now — with a contact path attached. Scrape your target city + service category and you’ve got a prospect list of motivated local sellers.
Data science and ML
Title + price + category + images + coordinates is an excellent feature set for pricing models and trend forecasting. Build labelled marketplace datasets for training, with image URLs ready to ingest into a vision pipeline and priceValue as a clean regression target.
▶ Run the Craigslist Scraper — build a market-wide Craigslist dataset across cities and categories in a single run, deduped and export-ready. JSON, CSV, Excel or API. $5 per 1,000 listings.
FAQ
Do I need a Craigslist login or API key to scrape it?
No. The scraper reads only public Craigslist search data over US residential proxies. There are no cookies, no developer API key and no account involved — so there is zero account-ban risk.
How many listings can I collect per search?
Hundreds to thousands. The scraper paginates through the result pages rather than stopping at page one. Control the volume with maxResults (default 1000, 0 for unlimited), and split a market across several search URLs for maximum coverage.
Why are residential proxies required?
Craigslist blocks datacenter IP ranges, returning blocks or empty results. The actor defaults to Apify Proxy’s US RESIDENTIAL group, which Craigslist serves reliably — just leave the default in place and it works.
Can I scrape several cities at once?
Yes. Add multiple URLs to searchUrls — any mix of cities, categories and search queries. Each record is tagged with its source city domain and the whole run is de-duplicated, so overlapping queries won’t create duplicate rows.
How do I get descriptions, attributes and full-size images?
Set includeDetails to true. The scraper then opens each listing’s detail page and adds description, attributes, detailLatitude, detailLongitude and fullImages to every record. It’s slower because of the extra request per listing, so leave it off for fast bulk price scraping.
What’s the difference between price and priceValue?
price is the human-readable formatted string (for example "$1,360"), while priceValue is the numeric value (1360). Use priceValue for math — averages, medians, filtering — and price for display.
Wrapping up
Craigslist is a deep, hyper-local, no-API dataset that rewards anyone willing to feed it the right search URLs. With no login and no ban risk, the only real requirement is residential-proxy access — which the actor handles by default. Paste a few city + category searches, set maxResults, and you can scrape Craigslist listings and prices into a clean, deduped, export-ready dataset across an entire market in a single run.
▶ Open the Craigslist Scraper on Apify — title, price, location, images, GPS coordinates and post date from any city and category. $5 per 1,000 listings.
Guide: how-to-scrape-craigslist-listings-prices.mdx — your complete reference to scrape Craigslist listings and prices at scale.
Related guides
How to Scrape Avito: Russia's Largest Classifieds (avito.ru)
Scrape Avito.ru listings at scale — title, current and old price, location, category, images and URL. Search by keyword or browse by category and location.
How to Scrape Blocket.se Swedish Classifieds in 2026
Extract used cars, electronics and marketplace items from Blocket.se — Sweden's largest classifieds. Pull prices, images, location, coordinates and seller type via its internal APIs.
How to Scrape Lazada Product Data Across Southeast Asia
Learn how to scrape Lazada product data — price, discount, rating, reviews, sold count and seller — across all six SEA marketplaces with no login or API key.