Craigslist Listings Scraper - Search, Prices & Details avatar

Craigslist Listings Scraper - Search, Prices & Details

Pricing

from $1.06 / 1,000 listing searches

Go to Apify Store
Craigslist Listings Scraper - Search, Prices & Details

Craigslist Listings Scraper - Search, Prices & Details

Search Craigslist across many cities in one run. Every listing as a clean row: title, price, photos, neighbourhood, GPS and post date, plus the full description on demand.

Pricing

from $1.06 / 1,000 listing searches

Rating

0.0

(0)

Developer

SIÁN OÜ

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Craigslist Listings Scraper — Search, Prices, Photos & GPS 📋

SIÁN Agency Store eBay Data Scraper Apartments.com Property Scraper ZipRecruiter Jobs Scraper

🏙️ Search TEN cities in one run — the thing craigslist.org cannot do

For sale, housing, jobs and gigs from any Craigslist city on earth, as clean rows

Craigslist has no national search. One search on craigslist.org covers one city and stops at about 2,880 results, which is why buyers, agents and resellers end up opening twenty tabs. This Craigslist scraper takes a list of cities and returns every matching listing as structured data: title, price, photos, neighbourhood, GPS coordinates and post date, plus the full description and the seller's attribute table when you ask for it.

Built for lead generation, price research, dealer monitoring and resale sourcing. Test it with 25 listings free. No credit card, no API key, no login.

🔎 What is the Craigslist Listings Scraper — and when should you use it?

The Craigslist Listings Scraper turns public Craigslist listings from any city in the world into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

Use it when you need: listings from one or many Craigslist cities at once: title, asking price, photos, neighbourhood, GPS coordinates, post date and the direct posting URL. Section-specific columns come with them — bedrooms and square footage on housing, the odometer reading on vehicles, the pay line on jobs and gigs. Switch on full descriptions and each row also carries the complete posting body and the seller's attribute table.

Use something else when: the listing is not on Craigslist. Use eBay Data Scraper for national resale listings with sold prices and shipping, where Craigslist is local and cash-in-hand. Use Apartments.com Property Scraper for managed rentals with floor plans and amenity data, where Craigslist carries private landlords. Use ZipRecruiter Jobs Scraper for job postings with salary and company across a whole metro, where Craigslist carries the small local hiring the big boards never index. This actor covers the public listing sections. Craigslist forums, personals and anything behind a login are out of scope, and reply addresses are anonymised relays rather than real seller contacts.

🤖 Use with AI agents

Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/craigslist-scraper

Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want listings and prices from Craigslist using the Apify Actor `sian.agency/craigslist-scraper`.
Use it when I need: listings from one or many Craigslist cities at once: title, asking price, photos, neighbourhood, GPS coordinates, post date and the direct posting URL. Section-specific columns come with them — bedrooms and square footage on housing, the odometer reading on vehicles, the pay line on jobs and gigs. Switch on full descriptions and each row also carries the complete posting body and the seller's attribute table.
Don't use it when: the listing is not on Craigslist — use ebay-data-scraper or apartments-com-property-scraper or ziprecruiter-jobs-scraper instead.
How to call it: give `cities` a list of Craigslist subdomains (`newyork`, `losangeles`, `sfbay`) plus a `category` and an optional `query`. Narrow with `minPrice`, `maxPrice`, `sellerType` (`owner` or `dealer`), `hasImage`, `postedToday` or a `postalCode` and `searchDistance`. `includeDetails` adds the full posting body and attribute table for an extra charge per listing. To expand postings you already have, set `operation` to `detail` and pass `listingUrls`; to reuse a search you built on craigslist.org, paste it into `searchUrls`.
Start with this input:
{
"cities": [
"newyork"
],
"category": "apa",
"sellerType": "owner",
"maxResults": 100
}
Ask me which Craigslist cities and which section to search, and whether they want private sellers, dealers or both, then run the Actor and summarise the results as a table.

Things you can ask your agent for:

  • Pull every owner-listed apartment posted today in New York, Chicago and Austin and rank them by price per bedroom.
  • Find used Tacomas under $20,000 across five West Coast cities and show me the odometer against the asking price.
  • Give me today's free-stuff listings with photos within 10 miles of ZIP 78704.

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/craigslist-scraper.md.

📋 Overview

Paste a city, pick a section, press Run. This Craigslist listings scraper turns any Craigslist search into a spreadsheet, in about ten seconds.

Why professionals choose this Craigslist scraper:

  • Every city worldwide: newyork, losangeles, sfbay, toronto, london, berlin. Pass the subdomain and it works
  • 🏙️ Multi-city in one run: the ~2,880-result ceiling is per city, so more cities is how you get more data
  • 360 listings per request: a 100-row run finishes in about 10 seconds
  • 🎯 Section-aware rows: cars carry the odometer, apartments carry bedrooms and square footage, jobs carry the pay line
  • 💰 From $1.20 per 1,000 listings: pay per row delivered, never for a failed one
  • 📸 Photos and GPS on every row: 600x450 photo URLs and exact coordinates, where a listing normally gives you an address string
  • 🆕 Posted-today filter: schedule it daily and pay only for listings that are new since yesterday

✨ Features

  • 🔍 Keyword search: the same words you would type into Craigslist's own search box, across one city or twenty
  • 🗂️ 13 sections: for sale, cars and trucks, apartments, real estate, housing, jobs, gigs, services, community, furniture, electronics, computers, free stuff
  • 🧑 Owner or dealer filter: private sellers for lead generation, dealers for competitive intelligence
  • 💵 Price bands: min and max price, applied at the source so you are not billed for rows you filtered out
  • 📮 Postal-code radius: centre a metro search on the neighbourhood you actually work in
  • 📄 Full descriptions on demand: complete posting body, attribute table and every photo
  • 🔗 Paste-a-URL mode: drop in any Craigslist search URL and every filter in it is honoured
  • ♻️ Duplicate collapsing: reposts of the same car or apartment folded into one row
  • 🆕 Posted-today mode: the cheap way to run this on a schedule
  • 📊 Export anywhere: JSON, CSV, Excel, or straight into your own code via the API

🎬 Quick Start

Give it a city, a section and a keyword. No account, no API key, no proxy configuration. Press Run and the rows arrive.

curl -X POST https://api.apify.com/v2/acts/sian.agency~craigslist-scraper/runs?token=[YOUR_TOKEN] \
-d '{"cities": ["newyork"], "category": "sss", "query": "bike"}'

🚀 Getting Started (3 Simple Steps)

Step 1: Name your cities

Type the Craigslist subdomains you want, one per line: newyork, losangeles, sfbay. It is the part before .craigslist.org in the address bar.

Step 2: Pick a section and a keyword

Choose the category (for sale, cars, apartments, jobs…), type a keyword or leave it empty to take the whole section, then set your price band or filters.

Step 3: Press Run

The first rows land in seconds. Download as CSV or JSON, or pull them straight from the API.

That's it! In about ten seconds, you'll have:

  • Every matching listing with price, photos, neighbourhood and GPS
  • Direct posting URLs that still work tomorrow
  • A run report telling you what you got and exactly what it cost

📥 Input Configuration

FieldTypeRequiredDescription
operationstringNosearch (listings by city) or detail (full data for posting URLs)
citiesarrayNoCraigslist site subdomains, e.g. newyork, losangeles
categorystringNoSection to search: sss, cta, apa, rea, hhh, jjj, ggg, bbb, ccc, fua, ela, sya, zip
querystringNoSearch keyword. Empty takes the whole section
maxResultsintegerNoStop after this many listings across all cities (default 100)
includeDetailsbooleanNoFetch each posting page for the full description and attributes (extra charge per listing)
listingUrlsarrayNoPosting URLs to expand, for Listing Detail mode
searchUrlsarrayNoCraigslist search URLs; every filter in the URL is honoured
minPriceintegerNoCheapest listing to include. 0 means no lower bound
maxPriceintegerNoMost expensive listing to include. 0 means no upper bound
sellerTypestringNoall, owner or dealer
hasImagebooleanNoSkip listings with no photo
postedTodaybooleanNoOnly listings posted today
hideDuplicatesbooleanNoCollapse reposts of the same item
postalCodestringNoCentre the search on a postal code (needs a radius)
searchDistanceintegerNoRadius around the postal code, in miles. 0 searches the whole city
sortstringNodate, dateoldest, rel, priceasc or pricedsc

Example:

{
"cities": ["newyork"],
"category": "sss",
"query": "bike",
"maxResults": 100
}

Multi-city sweep:

{
"cities": ["newyork", "losangeles", "chicago", "sfbay", "seattle"],
"category": "cta",
"query": "tacoma",
"minPrice": 5000,
"sellerType": "owner",
"maxResults": 1000
}

Owner-only rentals with full descriptions:

{
"cities": ["austin"],
"category": "apa",
"sellerType": "owner",
"postedToday": true,
"includeDetails": true
}

Paste a Craigslist search URL:

{
"searchUrls": ["https://newyork.craigslist.org/search/apa?query=loft&min_price=2000&max_bedrooms=2"]
}

Expand specific postings:

{
"operation": "detail",
"listingUrls": ["https://www.craigslist.org/view/d/brooklyn-great-road-bike/jmHKs1noTrL3hjZfwNX7WA"]
}

📤 Output

Every listing is one flat row, ready for Excel, a database or an AI agent. Results are saved to the Apify dataset with 28 fields including:

FieldTypeDescription
postingIdnumberCraigslist posting ID
listingTitlestringListing title
pricenumberAsking price as a number
priceTextstringPrice as Craigslist displays it
urlstringDirect posting URL
postedAtstringWhen it was posted (ISO 8601)
citystringCraigslist site the listing belongs to
locationstringNeighbourhood or town the seller typed
latitudenumberLatitude
longitudenumberLongitude
imageUrlstringFirst photo
imageUrlsarrayEvery photo on the posting (600x450)
imageCountnumberNumber of photos
bedroomsnumberBedrooms (housing sections)
areaSqftnumberSquare footage (housing sections)
odometernumberOdometer reading (vehicle sections)
compensationTextstringPay line (jobs and gigs)
secondaryTitlestringRole or employer line (jobs and gigs)
postingBodystringFull description (with Fetch full descriptions on)
attributesobjectThe seller's attribute table (with Fetch full descriptions on)
updatedAtstringLast time the seller updated it (with Fetch full descriptions on)
categoryIdnumberCraigslist's numeric sub-category id
countryCodestringTwo-letter country code of the site
sourceCategorystringThe category this run searched
sourceQuerystringThe keyword this run searched
statusstringsuccess, or error for an input that could not be read

Example:

{
"postingId": 7955962521,
"listingTitle": "Bubble Gum Beach Cruiser Bike",
"price": 75,
"priceText": "$75",
"url": "https://www.craigslist.org/view/d/staten-island-bubble-gum-beach-cruiser/pZ7djFRXKej7WC6m5AKwG6",
"postedAt": "2026-08-28T15:36:27.000Z",
"city": "newyork",
"location": "Staten Island",
"latitude": 40.5682,
"longitude": -74.1184,
"categoryId": 68,
"imageUrl": "https://images.craigslist.org/01515_2m3i8u6zIkI_0CI0t2_600x450.jpg",
"imageUrls": [
"https://images.craigslist.org/01515_2m3i8u6zIkI_0CI0t2_600x450.jpg",
"https://images.craigslist.org/00k0k_1R3qROZiIrS_0CI0t2_600x450.jpg",
"... 5 more"
],
"imageCount": 7,
"countryCode": "US",
"sourceCategory": "sss",
"sourceQuery": "bike",
"status": "success"
}

💼 Use Cases & Examples

1. FSBO and Rental Lead Generation

Real-estate agents and investors find owners who are selling or renting without an agent.

Input: housing or real-estate section, sellerType: owner, postedToday: true, your metro's cities Output: rent or asking price, bedrooms, square footage, neighbourhood, GPS and the full posting body Use: work the list the morning it goes up, weeks before those owners appear on the portals

2. Local Price Research

Resellers and analysts see what things actually sell for, city by city.

Input: a keyword plus a list of cities, sorted by newest Output: every asking price with photo count, post date and location Use: price your own listing against the local market, or spot the city where the same item is $300 cheaper

3. Dealer and Inventory Monitoring

Dealers watch competitor stock without opening a single browser tab.

Input: cars and trucks, sellerType: dealer, postedToday: true, on a daily schedule Output: new inventory with price, odometer, photos and posting URL Use: track how fast rivals reprice and what is moving, paying only for the rows that are new

4. Resale Sourcing

Flippers find underpriced stock before anyone else does.

Input: furniture, electronics or free stuff, hasImage: true, sorted cheapest first Output: price, photos, location and the seller's description Use: a daily feed of buyable items inside a radius you set, ranked by price

5. Jobs and Gigs Aggregation

Recruiters and job boards capture local hiring the big boards never index.

Input: jobs or gigs across a metro cluster Output: title, pay line, location and post date Use: build a local jobs feed, or measure hiring demand in a market before you enter it

6. Market and Academic Research

Researchers measure supply, pricing and language across regions.

Input: the whole section for a set of cities, no keyword Output: thousands of rows with prices, coordinates and timestamps Use: study rent dispersion, used-car depreciation or informal labour markets with real, current data

🔗 Integration Examples

JavaScript/Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('sian.agency/craigslist-scraper').call({
cities: ['newyork', 'losangeles'],
category: 'apa',
sellerType: 'owner',
maxResults: 500
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].listingTitle, items[0].price);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('sian.agency/craigslist-scraper').call(
run_input={
'cities': ['newyork', 'losangeles'],
'category': 'cta',
'query': 'tacoma',
'minPrice': 5000
}
)
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item['listingTitle'], item['price'], item['url'])

cURL

curl -X POST 'https://api.apify.com/v2/acts/sian.agency~craigslist-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"cities": ["newyork"], "category": "sss", "query": "bike", "maxResults": 100}'

Automation Workflows (N8N / Zapier / Make)

  1. Trigger: Schedule it daily with postedToday: true
  2. HTTP Request: Call the actor API
  3. Process: Handle the JSON rows
  4. Action: Push new listings to your CRM, a Google Sheet or a Slack alert

📊 Performance & Pricing

FREE Tier (Try It Now)

  • 25 listings per run: every field, every filter, same quality
  • No credit card required
  • Enough to check the data before you commit
  • Unlimited listings per run, across as many cities as you list
  • 360 listings per request, so a 1,000-row sweep takes about a minute
  • Pay per result: $0.0012 per listing delivered, never for a failed row
  • One Actor Start event per run ($0.005), whatever the run returns
MetricValue
Speed360 listings per request, ~10 s for 100 rows
CoverageEvery Craigslist site worldwide
Ceiling~2,880 listings per city per search (Craigslist's own limit)
Free tier25 listings per run
Paid tierUnlimited

💰 From $1.20 per 1,000 listings, with volume tiers down to $0.94 per 1,000. You pay per listing delivered.

🔗 View current pricing

❓ Frequently Asked Questions

Q: Which cities are supported? A: Every Craigslist site in the world. Pass the subdomain: newyork, sfbay, toronto, london, berlin. Nothing is hard-coded, so a site Craigslist adds tomorrow works tomorrow.

Q: How many listings can I get from one search? A: About 2,880 per city per search. That is Craigslist's own ceiling, not ours. To go wider, add cities, split by section, or sweep one price band at a time.

Q: Does it return seller emails or phone numbers? A: Only when the seller typed one into the posting body, which the full-description option captures. Craigslist's reply button is an anonymised relay address, so a "seller email" column would be a relay, not a contact. We do not pretend otherwise.

Q: What does the full-description option cost? A: It fetches each posting page, so it bills one Listing Detail event ($0.0025 per listing, $2.50 per 1,000) on top of the search row. Leave it off and you pay for search rows only.

Q: Can I paste a Craigslist search URL instead of filling the form? A: Yes. Put it in Search URLs and every filter in that URL is honoured: keyword, price band, radius, sort, plus section-specific ones like bedrooms, make and model or employment type.

Q: What output formats are available? A: JSON, CSV and Excel, straight from the Apify dataset, or over the API in your own code.

Q: How do I only get new listings? A: Switch on Posted today and schedule the run daily. You are billed for the new rows only, instead of re-buying the whole market every morning.

Q: What does a run cost? A: One Actor Start event ($0.005) plus $0.0012 per listing delivered, about $1.21 for a 1,000-listing run. Failed rows are never charged. No API key and no proxy to configure.

Q: Is this legal? A: It only reads listings that are already public on Craigslist. See the legal note below before you collect anything that could count as personal data.

🐛 Troubleshooting

"…is not a Craigslist site"

  • Use the subdomain only: newyork, not "New York City" and not a full URL
  • Check it in your browser: the part before .craigslist.org

Fewer listings than expected

  • Craigslist caps a single city search at ~2,880 results; add cities or split by price band
  • A narrow keyword plus a price band can genuinely match very little; try the section with no keyword
  • Free accounts are capped at 25 rows per run

A posting URL returns "expired or removed"

  • Craigslist deletes postings after 30-45 days
  • Re-run the search to get live ones

Empty descriptions

  • The full description only comes back with Fetch full descriptions switched on, or in Listing Detail mode

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the legality of web scraping.

🤝 Support

Telegram Support

Join our active support community

  • 🐛 Found a bug? File an issue in the Apify Console Issues tab
  • ⭐ Loving the tool? Leave a 5-star review — it helps us build more
  • 🛠️ More automation tools in the SIÁN Agency Store
  • 📧 apify@sian-agency.online

Built by SIÁN Agency | More Tools

Craigslist is a trademark of Craigslist, Inc. This actor is not affiliated with, endorsed by, or sponsored by Craigslist.