How it will work: 3 steps
- 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.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
sfbayin Cities. Each start is one run. - 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_manufacturerorodometerwith 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.
queryis a full-text search, like the Craigslist search box:bikealso 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
- Open the Input tab.
- Keep the prefilled example: Cities
sfbay, CategoryFor sale — all, Search keywordsbike, Max listings per city10. - Click Start.
- Open the Output tab. The Listings view shows title, price, location and posting time.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Compare used prices | cities, category, query | listing row | price, currency, title, location | Export CSV or Excel |
| Watch new listings | onlyNew on a schedule | only new rows | postId, postedAt, url | Webhook or integration on run finish |
| Rental research | category: "apa", includeDetails | detailed row | price, bedrooms, sqft, attributes, postalCode | Spreadsheet or BI tool |
| Car listings | category: "cta", sellerType | listing row | price, mileage, attributes.odometer | Dataset 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.
{
"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)
| Field | Type | Meaning |
|---|---|---|
postId | string | Craigslist post id (the number shown as "post id" on the listing page). |
url | string | Public listing page on craigslist.org; null in the rare case the source gives no link. |
title | string | Listing title as written by the poster. Phone numbers and e-mails are masked. |
price | number | Asking price as a number in the local currency; null when the listing has no price (never 0 for a missing price). |
priceText | string | Price as Craigslist shows it, e.g. "$1,250" or "£300". |
currency | string | ISO currency of the price (USD, CAD, GBP, EUR…); null without a price. |
city | string | Craigslist site of the listing, e.g. "sfbay". |
cityName | string | Readable site name, e.g. "SF bay area". |
subarea | string | Sub-area code within the site, e.g. "pen" (peninsula), "sfc" (San Francisco). |
location | string | Place the poster typed, e.g. "san mateo". |
neighborhood | string | Neighborhood Craigslist assigned, when known. |
latitude | number | Approximate latitude of the listing. |
longitude | number | Approximate longitude of the listing. |
category | string | Craigslist category code of the listing, e.g. "bik" (bicycles - by owner). |
categoryName | string | Readable category, e.g. "bicycles - by owner". |
sellerType | string | "owner" or "dealer" when the category says so; null otherwise. |
postedAt | string | When the listing was posted or last renewed, UTC ISO 8601. |
images | array | Photo links (600×450 JPEG). With details: every photo of the listing. |
imageCount | integer | Number of photo links in images. |
bedrooms | integer | Bedrooms (housing). |
sqft | integer | Floor area in square feet (housing). |
mileage | integer | Odometer (vehicles), as listed in search results. |
description | string | Full listing text (only with includeDetails). Phone numbers and e-mails are masked. |
attributes | object | Listing attributes from the page, e.g. condition, make_manufacturer, odometer, housing_type, laundry (only with includeDetails). |
postalCode | string | ZIP / postal code from the listing page (only with includeDetails). |
firstPostedAt | string | First posting time, UTC ISO 8601 (only with includeDetails). |
updatedAt | string | Last update time, UTC ISO 8601; null when never updated (only with includeDetails). |
detailsStatus | string | ok = page read; gone = listing removed before it could be read; failed = page unreadable (search fields only); not_requested = includeDetails off. |
searchCity | string | City from your input that found this listing. |
searchCategory | string | Category from your input. |
searchQuery | string | Keywords from your input. |
source | string | Always "craigslist.org". |
fetchedAt | string | When 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.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Cities required | cities | array | ["sfbay"] |
| Category | category | string | "sss" |
| Search keywords | query | string | "bike" |
| Max listings per city | maxItems | integer | 10 |
| Include full listing details | includeDetails | boolean | false |
| Only new listings since last run | onlyNew | boolean | false |
| Min price | minPrice | integer | |
| Max price | maxPrice | integer | |
| Seller type | sellerType | string | "all" |
| Only listings with photos | hasImages | boolean | false |
| Only posted today | postedToday | boolean | false |
