Craigslist logo

Marketplaces · Coming soon

Craigslist scraper for listings, prices and photos

Pick Craigslist cities, a category and a keyword. You get one row per listing with price, place, time and photos. Turn on details for the full text and attributes.

Built and tested. Prices will be shown after release.

Coming soon to the Apify StoreFollow us on Apify

What you get, for example

postId7954661391
urlhttps://www.craigslist.org/view/d/millbrae-twin-speed-cruiser-bike-too…
titleB-TWIN , 6 SPEED CRUISER BIKE , TOO CHEAP !!! .

How it will work: 3 steps

  1. Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: sfbay in Cities. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

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.

Good for

  • 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 good fit

  • 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.

Who uses it

Resellers

Compare used prices for bikes, phones or furniture.

Housing researchers

Collect rent prices and bedrooms in several cities.

Deal hunters

Get only new listings on a schedule.

Price

Prices will be shown after release.

Questions

Do I need a Craigslist account or proxy?

No. The tool reads public search and listing pages.

Does it collect seller phone numbers?

No. It masks phones and emails it finds in the text.

Which countries work?

Any Craigslist site: US, Canada, UK, Europe, Asia, Australia and more.

Why does an old listing look new?

Craigslist lists renewed posts again. postedAt shows the latest renewal.

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.

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.

Details

Step by step on Apify
  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.
Use cases
TaskInputYou getKey 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
Tips for better results
  • Use the city subdomain, like sfbay or newyork. Up to 50 per run.
  • Split big searches by city or price. Craigslist shows up to 10,000 per search.
  • Keep details off for fast price lists. Turn it on for attributes.
Limits and good to know
  • 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

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "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"
}
Data fields (33)
FieldTypeMeaning
postIdstringCraigslist post id (the number shown as "post id" on the listing page).
urlstringPublic listing page on craigslist.org; null in the rare case the source gives no link.
titlestringListing title as written by the poster. Phone numbers and e-mails are masked.
pricenumberAsking price as a number in the local currency; null when the listing has no price (never 0 for a missing price).
priceTextstringPrice as Craigslist shows it, e.g. "$1,250" or "£300".
currencystringISO currency of the price (USD, CAD, GBP, EUR…); null without a price.
citystringCraigslist site of the listing, e.g. "sfbay".
cityNamestringReadable site name, e.g. "SF bay area".
subareastringSub-area code within the site, e.g. "pen" (peninsula), "sfc" (San Francisco).
locationstringPlace the poster typed, e.g. "san mateo".
neighborhoodstringNeighborhood Craigslist assigned, when known.
latitudenumberApproximate latitude of the listing.
longitudenumberApproximate longitude of the listing.
categorystringCraigslist category code of the listing, e.g. "bik" (bicycles - by owner).
categoryNamestringReadable category, e.g. "bicycles - by owner".
sellerTypestring"owner" or "dealer" when the category says so; null otherwise.
postedAtstringWhen the listing was posted or last renewed, UTC ISO 8601.
imagesarrayPhoto links (600×450 JPEG). With details: every photo of the listing.
imageCountintegerNumber of photo links in images.
bedroomsintegerBedrooms (housing).
sqftintegerFloor area in square feet (housing).
mileageintegerOdometer (vehicles), as listed in search results.
descriptionstringFull listing text (only with includeDetails). Phone numbers and e-mails are masked.
attributesobjectListing attributes from the page, e.g. condition, make_manufacturer, odometer, housing_type, laundry (only with includeDetails).
postalCodestringZIP / postal code from the listing page (only with includeDetails).
firstPostedAtstringFirst posting time, UTC ISO 8601 (only with includeDetails).
updatedAtstringLast update time, UTC ISO 8601; null when never updated (only with includeDetails).
detailsStatusstringok = page read; gone = listing removed before it could be read; failed = page unreadable (search fields only); not_requested = includeDetails off.
searchCitystringCity from your input that found this listing.
searchCategorystringCategory from your input.
searchQuerystringKeywords from your input.
sourcestringAlways "craigslist.org".
fetchedAtstringWhen the Actor read the listing, UTC ISO 8601.
Input settings (11)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Cities requiredcitiesarray["sfbay"]
Categorycategorystring"sss"
Search keywordsquerystring"bike"
Max listings per citymaxItemsinteger10
Include full listing detailsincludeDetailsbooleanfalse
Only new listings since last runonlyNewbooleanfalse
Min priceminPriceinteger
Max pricemaxPriceinteger
Seller typesellerTypestring"all"
Only listings with photoshasImagesbooleanfalse
Only posted todaypostedTodaybooleanfalse

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure