Craigslist Scraper - Listings, Prices & Photos, No Login avatar

Craigslist Scraper - Listings, Prices & Photos, No Login

Pricing

from $0.45 / 1,000 listings

Go to Apify Store
Craigslist Scraper - Listings, Prices & Photos, No Login

Craigslist Scraper - Listings, Prices & Photos, No Login

Scrape Craigslist listings from any of 700+ cities by category, keyword and price: title, price, location, coordinates, photos and post date, plus full description and attributes on request. Only-new mode for monitoring. No login, proxy or seller contacts.

Pricing

from $0.45 / 1,000 listings

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Craigslist Scraper searches Craigslist by city, category and keyword and returns one clean row per listing: title, price, location, posting time and photo links. Turn on Include full listing details to also get the description, attributes and ZIP code.

Use it to collect or monitor Craigslist listings without a login, cookies, an API key or a proxy. The smallest run is one city and one keyword, and it finishes in a few seconds.

Craigslist Listings Scraper: price, location, photos and posting time from Craigslist search, with an Only new mode for monitoring

Table of contents

What it does

The Actor runs the same search you would run on a Craigslist site, for example sfbay.craigslist.org, and saves the results newest first. Each row is one listing. With details on, the Actor also opens each listing page.

Good fit

  • Price research: collect asking prices for bikes, cars, furniture or rentals in one or more cities.
  • Monitoring: run on a schedule with Only new listings since last run and get only listings posted after the previous run.
  • Housing and car data: bedrooms, square feet and odometer from search, plus attributes like housing_type, laundry, make_manufacturer or odometer with details.

Not a fit / limits

  • No seller contacts. The Actor does not collect phone numbers or e-mails, and masks the ones it recognises in titles and descriptions (best effort, not a guarantee).
  • Craigslist shows at most 10,000 listings per search. To get more, split the search by city, category or price.
  • Up to 50 cities per run. Listings that Craigslist adds from nearby sites are left out; add those sites as their own cities.
  • query is a full-text search, like the Craigslist search box: bike also finds listings that only mention a bike in the text.

Quick start

  1. Open the Input tab.
  2. Keep the prefilled example: Cities sfbay, Category For sale — all, Search keywords bike, Max listings per city 10.
  3. Click Start.
  4. Open the Output tab. The Listings view shows title, price, location and posting time.

Expected result: 10 listings matching "bike" from the SF bay area, newest first, in a few seconds.

Use cases

Buyer jobInputOutputKey fieldsNext step
Compare used pricescities, category, querylisting rowprice, currency, title, locationExport CSV or Excel
Watch new listingsonlyNew on a scheduleonly new rowspostId, postedAt, urlWebhook or integration on run finish
Rental researchcategory: "apa", includeDetailsdetailed rowprice, bedrooms, sqft, attributes, postalCodeSpreadsheet or BI tool
Car listingscategory: "cta", sellerTypelisting rowprice, mileage, attributes.odometerDataset API

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffect
citiesCitiesarray of stringsyesprefill ["sfbay"]1–50 Craigslist sites, e.g. sfbay, newyork, london, toronto; full addresses work tooWhich sites to search
categoryCategorystringnodefault and prefill sss61 Craigslist sections, e.g. sss (for sale — all), apa (apartments), cta (cars & trucks), bikWhich section to search
querySearch keywordsstringnoprefill bikeup to 200 charactersFull-text search; empty lists the whole category
maxItemsMax listings per cityintegernodefault 100, prefill 101–10,000Limit for each city, newest first
includeDetailsInclude full listing detailsbooleannofalseOpens each listing page: description, attributes, all photos, ZIP code. Slower and charged as a detailed listing
onlyNewOnly new listings since last runbooleannofalseSaves only listings posted or renewed after the previous run of the same search
minPrice, maxPriceMin / max priceintegernonone0 and up, local currencyPrice range
sellerTypeSeller typestringnoallall, owner, dealerFor-sale categories only
hasImagesOnly listings with photosbooleannofalseSkips listings without photos
postedTodayOnly posted todaybooleannofalseOnly listings posted today

The same city entered twice (for example sfbay and SFBay) is searched once. An unknown city or category stops the run before any request with a clear INVALID_INPUT message.

Interacting settings

WhenSettingsBehavior
Several citiescities + maxItemsmaxItems applies to each city: 3 cities × 100 = up to 300 rows
MonitoringonlyNew + any filtersEach city, category, keyword and filter set is remembered on its own. The first run saves the newest listings up to maxItems and sets the starting point
More new listings than the limitonlyNew + maxItemsThe newest maxItems are saved; older new ones are skipped. Use a limit above what you expect between runs
Stopped runonlyNew + charge or time limitThe starting point stays, so the next run returns the new listings this run did not reach

Input examples

Bikes in the SF bay area (prefill)

{
"cities": ["sfbay"],
"category": "sss",
"query": "bike",
"maxItems": 10
}

Expected behavior: one search, 10 newest listings that match bike. Expected output: rows with title, price, location, postedAt, images.

New apartments with details, for a schedule

{
"cities": ["sfbay", "losangeles"],
"category": "apa",
"maxItems": 200,
"includeDetails": true,
"onlyNew": true
}

Expected behavior: the first run saves up to 200 newest rentals per city. Later runs save only rentals posted after the previous run. Limit note: details take about 0.5 s per listing.

Output

Output fields

FieldMeaningTypeCan be empty?Example
postIdCraigslist post idstringno7954661391
urlListing pagestringrarelyhttps://www.craigslist.org/view/d/...
titleListing title, contacts maskedstringrarelyB-TWIN, 6 SPEED CRUISER BIKE
price, priceText, currencyAsking price, as shown, ISO currencynumber, string, stringyes, when there is no price (never 0 for a missing price)20, $20, USD
city, cityName, subareaCraigslist site and sub-areastringsubarea yessfbay, SF bay area, pen
location, neighborhoodPlace the poster typed, neighborhoodstringyesmillbrae
latitude, longitudeApproximate positionnumberyes37.6004, -122.402
category, categoryNameListing categorystringrarelybik, bicycles - by owner
sellerTypeowner or dealerstringyesowner
postedAtPosted or last renewed, UTCstringrarely2026-10-15T05:43:10.000Z
images, imageCountPhoto links (600×450 JPEG) and their countarray, integerempty array when no photos
bedrooms, sqft, mileageHousing and vehicle numbers from searchintegeryes; bedrooms: 0 is a studio1, null, null
descriptionFull text, contacts maskedstringdetails only
attributesListing attributes, e.g. condition, odometer, housing_type, laundryobjectdetails only{"laundry": "w/d in unit"}
postalCodeZIP / postal codestringdetails only94978
firstPostedAt, updatedAtFirst posting time and last edit, UTCstringdetails only; updatedAt is null when never edited
detailsStatusok, gone (removed before it was read), failed (page unreadable, search fields only), not_requestedstringnonot_requested
searchCity, searchCategory, searchQueryYour input that found the rowstringsearchQuery yessfbay, sss, bike
sourceAlways craigslist.orgstringno
fetchedAtWhen the Actor read the listing, UTCstringno

postedAt changes when a poster renews a listing. firstPostedAt (details only) keeps the first posting time.

Output example

Trimmed row from the prefill run:

{
"postId": "7954661391",
"url": "https://www.craigslist.org/view/d/millbrae-twin-speed-cruiser-bike-too/2WS4Z9LeXGU7iV32nC6RR5",
"title": "B-TWIN , 6 SPEED CRUISER BIKE , TOO CHEAP !!! .",
"price": 20,
"priceText": "$20",
"currency": "USD",
"city": "sfbay",
"location": "millbrae",
"latitude": 37.6004,
"longitude": -122.402,
"category": "bik",
"categoryName": "bicycles - by owner",
"sellerType": "owner",
"postedAt": "2026-10-15T05:43:10.000Z",
"images": ["https://images.craigslist.org/01616_c3M0s56xj4e_0CI0t2_600x450.jpg"],
"imageCount": 4,
"description": null,
"attributes": null,
"detailsStatus": "not_requested",
"searchQuery": "bike",
"fetchedAt": "2026-10-15T05:50:11.109Z"
}

null means Craigslist does not give that value for this listing, or details were off.

Output views and run summary

SituationWhere to lookWhat you see
Normal runDataset, views Listings and With detailsOne row per listing
No listings foundDataset is empty; RUN_SUMMARY status NO_RESULTSThe run succeeds; check city, category and filters
Charge or time limit reachedRUN_SUMMARY status PARTIAL, reason CHARGE_LIMIT or TIME_LIMITRows saved before the stop are kept
Craigslist errorRUN_SUMMARY status PARTIAL or ERROR, reason SOURCE_ERRORThe run fails only when nothing was saved

RUN_SUMMARY in the run's key-value store also has per-city counts: listings available, saved, already seen, details read.

Pricing and limits

Pricing unit

You pay per run start and per saved listing:

EventPrice (free plan)
Actor start$0.004 per run
Listing (search fields)$0.0006 ($0.60 per 1,000)
Listing with details$0.0011 ($1.10 per 1,000)

Higher Apify plans get lower per-listing prices. Platform usage (compute, storage, proxy) is included; you do not pay it separately.

  • A run with no matching listings, or an Only new run with nothing new, costs only the start.
  • Listings that were already delivered (Only new) or left out as nearby sites are not charged.
  • A listing removed before its page could be read is charged as a plain listing, not as a detailed one.
  • Set Max total charge in run options to cap a run. The Actor stops before the cap and keeps what it saved.

Cost examples

ScenarioInputRowsCost on the free plan
Quick test (prefill)1 city, bike, 10 listings10$0.010
Small batch1 city, 100 listings100$0.064
Market snapshot1 city, 1,000 listings1,000$0.604
With details1 city, 100 listings, details on100$0.114
Monitor, nothing new50 cities, Only new0$0.004

Limits

LimitValue
Cities per run50
Listings per city10,000 (the Craigslist cap for one search)
Speed, search onlyabout 50,000 listings in 4 minutes (5 cities × 10,000, measured)
Speed, with detailsabout 2 listings per second; 1,163 detailed listings in 10 minutes (measured)
Memory256 MB (fixed; enough for 50 cities and for details)

For a big run with details, set a run timeout of at least 1 second per listing.

API, export and integrations

  • Export: download the dataset as JSON, CSV, Excel, XML or HTML from the Output tab, or with the dataset items API.
  • API: start the Actor with the Apify API or the Apify client for JavaScript or Python; send the same JSON as in the Input examples.
  • Scheduling: create a schedule for the Actor or for a saved task with onlyNew: true. Each run then returns only new listings.
  • Webhooks and no-code: start a webhook, Zapier, Make or n8n flow when the run finishes, and read new rows from the dataset.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/craigslist-scraper
  • Smallest useful input: {"cities": ["sfbay"], "category": "sss", "query": "bike", "maxItems": 10}
  • Key output fields: title (what is offered), price + currency (asking price), location (place), postedAt (posted or renewed), url (listing page).
  • Typical run: a few seconds for 10 listings, about $0.01 on the free plan. maxItems is per city; details are about 2 listings per second.

Troubleshooting

The run finished with 0 rows

Symptom: the dataset is empty and RUN_SUMMARY status is NO_RESULTS. Likely reason: no listing matches the keywords and filters on that site, or, with Only new, nothing new was posted since the last run. Check: open the same search on the Craigslist site. Action: remove a filter, try a broader category such as sss, or check the city code.

The run stopped with INVALID_INPUT

Symptom: the run fails at once with a message about a city or category. Likely reason: the city is not a Craigslist site (for example a typo), or the category code is unknown. Action: use the subdomain from the city address, for example sfbay from sfbay.craigslist.org.

Fewer rows than Max listings per city

Symptom: RUN_SUMMARY reason is CHARGE_LIMIT or TIME_LIMIT, or the city had fewer listings. Check: totalAvailable per city in RUN_SUMMARY. Action: raise Max total charge or the run timeout and run again.

Some rows have no description

Symptom: detailsStatus is gone or failed. Likely reason: the poster removed the listing before it was read (gone), or the page could not be read (failed). Search fields are still there.

FAQ

Do I need a Craigslist account, cookies or a proxy?

No. The Actor reads public Craigslist search and listing pages. No login, cookies or proxy are needed.

Does it collect seller phone numbers or e-mails?

No. It does not collect seller contacts, and it masks the phone numbers and e-mails it recognises in titles and descriptions as [phone removed] and [email removed]. Masking is best effort: an unusual format can slip through, and a long number can sometimes be masked by mistake.

How fresh is the data?

Each row is read during the run; fetchedAt shows when. Craigslist lists renewed listings again as new, so postedAt is the latest posting or renewal time.

Which cities and countries work?

Any Craigslist site: the US, Canada, the UK, Europe, Asia, Australia and more. Prices keep the local currency in currency.

Is scraping Craigslist allowed?

The Actor reads only public pages at a gentle pace. You are responsible for using the data in line with the Craigslist terms of use and the laws that apply to you, including privacy laws.

Support

For a bug, a question or a feature request, open an issue in the Issues tab of this Actor. Include the run ID and the input you used. Do not post API tokens or other private data.