Craigslist For Sale Scraper | Classifieds, Autos, Free Stuff
Pricing
from $1.00 / 1,000 results
Craigslist For Sale Scraper | Classifieds, Autos, Free Stuff
Scrape Craigslist For Sale (non-housing) listings by city - autos, bikes, boats, furniture, electronics, tools, pets, free stuff. Subcategory filter, free-only, price filters, new-listings monitoring. Plain HTTP, no browser. Works via Apify MCP.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
petteri mähönen
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Craigslist For Sale Scraper
Scrape Craigslist For Sale (non-housing classifieds) listings across US cities — autos, bikes, boats, furniture, electronics, tools, pets, free stuff & more. Plain HTTP, no browser, no proxy needed (Craigslist's 2026 search and detail pages are fully server-rendered).
2026 reality: Craigslist's 2026 UI collapsed the old categories. The only non-housing feed is
cat=sss— one "For Sale" mega feed containing all subcategories (autos, motorcycles, bicycles, boats, furniture, appliances, electronics, tools, sports, music, toys, antiques, pets, farm, free). Jobs, services and events no longer exist as separate feeds. Because the 2026 UI has no per-listing category tags, this actor assigns asubcategoryby keyword classification on the title (first-match wins, best-effort — a few listings may be mis-tagged).
Features
- Subcategory filter — 16 keyword categories (
auto,motorcycle,bikes,boats,furniture,appliances,electronics,tools,sports,music,toys,antiques,pets,farm,free,other), matched client-side and filtered before detail fetches so targeted runs use less compute - Free items only —
freeOnlyreturns just the "free" listings (keyword-first detection; the$0price box alone is unreliable, so a $0 price is only a fallback signal) - Price filters —
minPrice/maxPriceapplied server-side (Craigslist filters before you pay for results) - Keyword filter —
titleKeywordmatches listing titles client-side (Craigslist's search page ignores keyword params) - New-listings monitoring —
dedupeAgainstDatasetIdskips listings already in a previous run's dataset and tags everythingis_new=true. Combine with an Apify Schedule for a daily "new listings only" or "free stuff in my city" feed - Multi-city search — scrape several areas in one run
- Detail page extraction — per listing: neighborhood, full description, all photos, reply URL, post ID, posted date, lat/lng
- Fast & cheap — CheerioCrawler, 256MB, no browser; one search page per area contains all results (no pagination/scroll)
Input
| Field | Type | Default | Description |
|---|---|---|---|
locations | string[] | ["San Francisco, CA"] | Cities/areas to scrape |
subcategory | string | all | all | auto | motorcycle | bikes | boats | furniture | appliances | electronics | tools | sports | music | toys | antiques | pets | farm | free | other |
freeOnly | boolean | false | Only free items only (title says free, or $0) |
minPrice | number | 0 | Minimum price, server-side (0 = no minimum) |
maxPrice | number | 0 | Maximum price, server-side (0 = no maximum) |
maxResults | number | 100 | Stop after this many listings (0 = no limit) |
titleKeyword | string | — | Only listings whose title contains this keyword (client-side; filters before detail fetches) |
fetchDetails | boolean | true | Visit detail pages for enriched data |
dedupeAgainstDatasetId | string | — | Dataset ID(s) of previous runs (comma-separated or array); matched post_ids are skipped |
apiToken | string | — | Optional Apify API token for reading cross-actor datasets (needed when deduping against a dataset created by a different actor/task) |
Example: filtered search
{"locations": ["San Francisco, CA"],"subcategory": "auto","minPrice": 5000,"maxPrice": 25000,"maxResults": 50}
Example: daily new-listings monitor (set as an Apify Schedule)
{"locations": ["New York, NY", "Los Angeles, CA"],"freeOnly": true,"dedupeAgainstDatasetId": "<yesterday-run-dataset-id>","apiToken": "apif...k"}
Each day you get only listings that weren't in the previous run's dataset, all tagged is_new: true. (Cloud-verified: a baseline run followed by a deduped run returned 7 new listings with zero overlap.)
Output
Each listing includes:
| Field | Source | Example |
|---|---|---|
title | Search / Detail | "1987 VW Westfalia (4-spd, rotating seats)" |
price | Search / Detail | "$19,500" |
price_num | Derived | 19500 |
subcategory | Derived (keyword classifier) | "auto" |
neighborhood | Search / Detail | "potrero hill" |
link | Search | "https://www.craigslist.org/view/d/..." |
thumbnail | Detail | image URL |
latitude / longitude | Detail | 37.71 / -122.41 |
post_id | Detail | "7965488586" |
posted | Detail | "2026-09-12T23:02:18Z" (ISO) |
photos | Detail | ["url1", "url2", ...] |
description | Detail | "Full description text..." |
reply_url | Detail | "https://.../reply/..." |
contact_info / contact_websites | Detail | phone/email/URL mentions from description |
has_contact | Detail | true |
h1_text | Detail | raw detail-page title line |
is_new | Dedupe | true (only set when dedupeAgainstDatasetId produced matches) |
location / area | Input | "San Francisco, CA" / "sfbay" |
platform | System | "craigslist" |
scraped_at | System | ISO timestamp |
Use Cases
- Free stuff in your city — daily schedule +
freeOnly= "free near me" feed - New-listing alerts — daily schedule +
dedupeAgainstDatasetId= "new listings only" - Car shopping / market tracking —
subcategory: auto+minPrice/maxPricefor a specific make-of-market segment - Deal monitoring —
titleKeyword: "peloton", re-run daily, track prices over time - Classifieds data pipeline — feed structured marketplace data into analytics, price tracking, or ML models
Performance & Limitations
- No browser (CheerioCrawler, 256MB) — Craigslist's 2026 pages are fully server-rendered
- One search page per area contains all results (no pagination/scroll needed) — e.g. 344 for-sale listings in the SF Bay area on a single page
- Subcategory is keyword classification on the title — best-effort, first-match wins; a few listings will be
otheror slightly mis-tagged. For precise matches, combinesubcategorywithtitleKeyword - The
$0price field is unreliable (sellers often leave the price box blank) — free-item detection is keyword-first with$0as fallback - Actual phone/email is behind Craigslist's JS-gated "show contact" — we extract the reply URL plus any phone/email/URL mentions from the description text
- For-sale detail pages have no address or spec fields (those are housing-only in the 2026 UI); some listings also lack a map pin, in which case
latitude/longitudearenull
💬 Quick Start for AI Assistants
Copy and paste this into ChatGPT, Claude, or another AI assistant:
You are helping me use the "Craigslist For Sale Scraper" on Apify (actor ID: ACqoWMdMJhw6sHAkO). It extracts Craigslist For Sale (non-housing) listings — autos, bikes, boats, furniture, electronics, tools, pets, free stuff — from craigslist.org across US cities.
Input fields:
- locations: string array, e.g. ["San Francisco, CA", "New York, NY"]
- subcategory: "all" (default) | "auto" | "motorcycle" | "bikes" | "boats" | "furniture" | "appliances" | "electronics" | "tools" | "sports" | "music" | "toys" | "antiques" | "pets" | "farm" | "free" | "other"
- freeOnly: boolean, only free items (default false)
- minPrice / maxPrice: numbers, server-side price filter (0 = no filter)
- titleKeyword: string, only listings whose title contains it (client-side)
- maxResults: number, max listings to return (default 100, 0 = no limit)
- fetchDetails: boolean, visit detail pages for photos, descriptions, reply URL (default true)
- dedupeAgainstDatasetId: string dataset ID(s), skip already-seen listings, tag is_new
- apiToken: optional Apify API token to read cross-actor datasets
Output fields per listing: title, price, price_num, subcategory, neighborhood, link, thumbnail, latitude, longitude, post_id, posted, photos[], description, reply_url, has_contact, contact_info[], contact_websites[], h1_text, is_new, location, area, platform, scraped_at.
Help me with the right input, output processing, or troubleshooting.
📋 Changelog
| Version | Date | Changes |
|---|---|---|
| 0.2 | 2026-09-13 | Rebuilt with output schema (publish-gate fix), Dockerfile cleanup, README pricing/actor-ID corrections |
| 0.1 | 2026-09-12 | Initial release — 2026 sss feed, 16-category keyword classifier, freeOnly (keyword-first free detection), minPrice/maxPrice server-side, titleKeyword, dedupeAgainstDatasetId + apiToken new-listings monitoring (cloud-verified: 0 overlap, all is_new) |
Pricing
Pay per event — $1.00 per 1,000 results ($0.001 per listing in the dataset), plus $0.05 per run.
Support & Feedback
Enjoying this Actor? Leave a review on Apify Store — it helps others discover the tool.
Found a bug or have a feature request? Open an issue on the Actor page.