Craigslist Scraper — Jobs, Housing & For-Sale Listings
Pricing
from $2.50 / 1,000 craigslist listing scraped (search card)s
Craigslist Scraper — Jobs, Housing & For-Sale Listings
Scrape Craigslist classifieds across 700+ cities and all 8 categories: jobs, housing, for-sale, services, gigs, community, resumes and events. Multi-city fanout, repost dedup and optional contact extraction are built in.
Pricing
from $2.50 / 1,000 craigslist listing scraped (search card)s
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
1
Bookmarked
29
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
What is Craigslist Scraper — Jobs, Housing & For-Sale Listings?
This Apify Actor is for users who need public Craigslist classifieds data from one city, a list of cities, or a metro preset. It accepts a Craigslist city subdomain, category, optional subcategory, search query, or direct Craigslist start URLs. Each dataset record represents one listing. The returned fields are centered on title, price text, city, neighborhood, posting time, URL, and, in detailed mode, parsed attributes, price numeric value, currency, images, updated time, and attributes. The outcome is a clean dataset of classifieds listings ready for analysis, monitoring, or downstream automation.
Best fit and connected workflows
This Actor fits workflows that need structured Craigslist listings across many cities and categories in one Apify run:
- City-level monitoring with a single subdomain such as
newyork,sfbay, orlondon - Multi-city fanout using
citiesfor independent searches in each marketplace - Search-driven collection with
searchQueryinside a chosen category - Saved-search replays using
startUrls - Enrichment runs with
includeDetails: truefor full listing detail, gallery images, and typed attributes - Public contact extraction with
extractContacts: truewhen the post body or visible reply URL contains contact data - Deduped multi-metro runs with
dedupAcrossCities: true
Practical scenario
A rental analyst, Maya, starts with the sfbay city subdomain, the housing category, subcategory: apa, and searchQuery: studio. She receives records with title, priceText, city, neighborhood, postedAt, and url, and in detailed mode also sees priceNumeric, currency, attributes, and primaryImage. Maya uses those fields to shortlist listings that match a budget and neighborhood target, then opens the source URLs to review the live postings and decide which ones to track in a follow-up run.
Input fields
| Field | Type | Purpose |
|---|---|---|
city | string | Single Craigslist city subdomain, such as newyork or sfbay. |
cities | array of strings | Multiple city subdomains for multi-city fanout. |
category | string | Top-level category: forsale, jobs, housing, services, gigs, community, resumes, events, or all. |
subcategory | string | Craigslist subcategory code such as cta, apa, sof, or mis (see the code table below). |
searchQuery | string | Free-text query run inside the chosen category. |
startUrls | array | Direct Craigslist search-result or post URLs. |
maxResults | integer | Maximum listings to return per city. |
includeDetails | boolean | Fetch full post details, gallery images, attributes, and reply URL. |
extractContacts | boolean | Extract public emails and phone numbers from the post body or visible reply URL. |
minPrice | integer | Minimum listing price in the local marketplace currency. |
maxPrice | integer | Maximum listing price in the local marketplace currency. |
hasPic | boolean | Return only listings with at least one image. |
ownerOnly | boolean | Return owner posts and skip dealer, agency, or recruiter posts. |
maxAgeDays | integer | Skip listings older than the specified age in days. |
dedupAcrossCities | boolean | Deduplicate reposts across cities within a run. |
proxyConfiguration | object | Apify Proxy settings, with residential proxy defaults provided in the contract. |
Common subcategory codes
| Category | Code | Meaning |
|---|---|---|
forsale | cta / cto / ctd | Cars and trucks: all / by owner / by dealer |
forsale | ela, sys, pho | Electronics, computers, cell phones |
forsale | fua, app, hsh | Furniture, appliances, household items |
forsale | bik, mca, rva, boa | Bicycles, motorcycles, RVs, boats |
forsale | mis, wan | General for sale, wanted |
housing | apa, roo, sub | Apartments for rent, rooms and shares, sublets |
housing | rea, off, pak, vac | Real estate for sale, office/commercial, parking, vacation rentals |
jobs | sof, web, egr, tch | Software, web/design, engineering, tech support |
jobs | acc, mar, sad, med | Accounting, marketing, admin/office, healthcare |
jobs | fbh, mnu, tfr, lgl | Food/hospitality, manufacturing, transportation, legal |
services | cps, hss, lbs, aos | Computer, household, labor/moving, automotive services |
gigs | cpg, crg, lbg, evg | Computer, creative, labor, event gigs |
Leave subcategory empty to search the whole category.
Focused input example
{"city": "sfbay","category": "housing","subcategory": "apa","searchQuery": "studio","maxResults": 25,"includeDetails": true,"hasPic": true,"ownerOnly": true,"dedupAcrossCities": true}
Output fields
| Field | Type | Purpose |
|---|---|---|
title | string | Listing title. |
priceText | string | Raw price text as shown on Craigslist. |
priceNumeric | number | Parsed numeric price in detailed output. |
currency | string | Currency code for the listing marketplace. |
city | string | Craigslist city subdomain. |
neighborhood | string | Neighborhood or area label when present. |
category | string | Top-level category. |
subcategory | string | Subcategory code. |
postedAt | string or null | Posting time when Craigslist exposes it (often null on search cards). |
updatedAt | string | Update time in detailed mode. |
primaryImage | string | Main listing image in detailed mode. |
attributes | object | Parsed typed attributes for the category. |
url | string | Canonical listing URL. |
cityLabel | string | Readable city name. |
images | array | Image URLs from the card or full gallery. |
description | string | Post body in detailed mode (empty on search cards). |
geo | object | Latitude and longitude when the listing shows a map pin. |
address | string | Location text shown on the listing. |
contact | object | Public emails/phones when extractContacts is on. |
isOwnerPost | boolean or null | Owner vs dealer/agency flag when known. |
fingerprint | string | Repost fingerprint used for cross-city de-duplication. |
scrapedAt | string | Collection time. |
Example search-card row
A subset of a real search-card row (newyork, forsale, search-card mode):
{"title": "Dell Desktop Microsoft Windows 11 Professional Office Word PC Computer","url": "https://www.craigslist.org/view/d/brooklyn-dell-desktop-microsoft-windows/4YiY7Nk5uagtwL6XwB9R7N","city": "newyork","cityLabel": "New York","category": "forsale","subcategory": null,"neighborhood": "Brooklyn","priceText": "$200","priceNumeric": 200,"currency": "USD","postedAt": null,"primaryImage": "https://images.craigslist.org/01313_lUvOIOQqOmq_0t20CI_600x450.jpg","attributes": {},"geo": { "lat": 40.6257294520014, "lng": -73.9563935260711 },"address": "Brooklyn, NY","contact": {},"isOwnerPost": null}
How it works
The Actor accepts either a single city, multiple cities, a preset such as topUSMetros or topGlobalMetros, or direct Craigslist URLs. It pages through Craigslist search results in 120-item pages until it reaches maxResults or the search runs out. In search-card mode it returns the listing card fields covered by the charging contract. In detailed mode it opens each listing and returns the richer record fields described in the dataset schema. When dedupAcrossCities is enabled, the run keeps one row per matched repost fingerprint across the selected cities.
Outcome codes
The RUN_SUMMARY record has an outcome field:
COMPLETE: every search page was fetched.VALID_EMPTY: the searches worked but no listing matched; no listing events are charged.PARTIAL: listings were saved, but some requests failed or an unknown city was skipped.INVALID_INPUT: no valid city or Craigslist URL was given (city subdomains are checked before scraping); nothing is charged for listings.UPSTREAM_FAILED: every request failed after retries and nothing was saved; the run is marked failed.
Pricing
Craigslist Scraper — Jobs, Housing & For-Sale Listings uses Pay per event, with Apify platform usage included. It bills listing events: listing-scraped for each search-card row and listing-detailed for each row opened in full-detail mode. See the Pricing tab for current event prices.
For example, a run that returns fifty search-card listings charges fifty listing-scraped events. A detailed run with the same number of listings charges fifty listing-detailed events instead. Duplicate reposts dropped by dedupAcrossCities are not charged.
Use with AI agents (MCP)
This Actor is an Apify Actor usable through Apify MCP. It is suited for agent workflows that need structured Craigslist listings as tool output rather than manual browsing.
Tool identity: khadinakbar/craigslist-all-in-one-scraper
Tool behavior: collect Craigslist classifieds by city, category, query, or saved search URL, then return dataset rows that can be interpreted by downstream agents.
Find current housing listings in sfbay for studios under 2000, return detailed records with images and parsed attributes, and summarize the city, neighborhood, price, and posting time for each row.
Output interpretation:
datasetpoints to the full scraped listings datasetrunSummarypoints to the run summary record with counts and warnings- Detailed records include typed attributes, images, and the canonical listing URL
- Search-card records are lighter and align with the cheaper
listing-scrapedevent
Provenance and scope:
- Listings come from public Craigslist pages
- The actor uses Craigslist city subdomains and categories defined in the input schema
extractContactsonly applies to public contact information present in the body or visible reply URLstartUrlscan replay exact Craigslist search-result or post URLs
Pagination and cost guidance:
- Craigslist pagination is 120 items per page
maxResultsbounds collection per city- Detailed mode uses the higher per-listing event
- Multi-city fanout can increase output volume, so
dedupAcrossCitieshelps keep reposts from repeating across cities
Apify API example
const { ApifyClient } = require("apify-client");const client = new ApifyClient({token: process.env.APIFY_TOKEN,});async function main() {const run = await client.actor("khadinakbar/craigslist-all-in-one-scraper").call({city: "sfbay",category: "jobs",searchQuery: "remote python",maxResults: 10,includeDetails: true,});const dataset = client.dataset(run.defaultDatasetId);const { items } = await dataset.listItems();console.log("First items:", items);}main().catch(console.error);
Best results and outcome guidance
Start with one city and a small maxResults value, then widen the run once the query shape is confirmed. Use subcategory to narrow broad categories such as forsale, jobs, or housing. Use includeDetails: true when you need parsed attributes, image galleries, or reply URLs, and use search-card mode when title, price, city, neighborhood, and URL are enough. Use dedupAcrossCities: true for metro fanout when the same listing can appear in more than one city. For price-filtered work, combine minPrice, maxPrice, and hasPic for a cleaner shortlist.
Continue the workflow
- For resale research beyond classifieds, then use Depop Scraper to compare second-hand fashion listings and prices.
Design note
I designed the cross-city de-duplication around a fingerprint of the normalised title, price and first image host, because the same post is often re-listed in neighbouring Craigslist metros with a new URL. With dedupAcrossCities on, only the first copy is saved and charged; the fingerprint field lets you de-duplicate across separate runs too.
FAQ
Can I run one search across many cities?
Yes. Use cities for an explicit list, or use the city preset values described in the input schema for metro fanout.
When should I use includeDetails?
Use it when you need the full listing body, typed attributes, full gallery images, or reply URL. Use search-card mode when the listing card fields are enough.
How does deduplication work across cities?
When dedupAcrossCities is enabled, the Actor keeps a per-execution fingerprint and drops repeated reposts across the selected cities.
Can I replay a saved Craigslist search?
Yes. Put the Craigslist search-result URL or listing URL into startUrls.
How do I get public contact details?
Set extractContacts: true together with includeDetails: true. The Actor extracts contact data that appears publicly in the post body or visible reply URL.
What if I misspell a city?
Each city subdomain is checked before scraping. Unknown cities are skipped with a warning, and if no valid city remains the run ends with INVALID_INPUT and no listing charges.
Which categories are available?
The input schema supports forsale, jobs, housing, services, gigs, community, resumes, events, and all.
Responsible use
This Actor retrieves public Craigslist classifieds and respects the source pages described in the contract. Use it in ways that align with Craigslist's terms and applicable law. Use the returned URLs, prices, and attributes as source-linked records for review, analysis, or automation, and verify any sensitive decision directly on the Craigslist listing before acting on it.