Craigslist Scraper — Jobs, Housing & For-Sale Listings avatar

Craigslist Scraper — Jobs, Housing & For-Sale Listings

Pricing

from $2.50 / 1,000 craigslist listing scraped (search card)s

Go to Apify Store
Craigslist Scraper — Jobs, Housing & For-Sale Listings

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

Khadin Akbar

Maintained by Community

Actor stats

1

Bookmarked

29

Total users

2

Monthly active users

4 days ago

Last modified

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, or london
  • Multi-city fanout using cities for independent searches in each marketplace
  • Search-driven collection with searchQuery inside a chosen category
  • Saved-search replays using startUrls
  • Enrichment runs with includeDetails: true for full listing detail, gallery images, and typed attributes
  • Public contact extraction with extractContacts: true when 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

FieldTypePurpose
citystringSingle Craigslist city subdomain, such as newyork or sfbay.
citiesarray of stringsMultiple city subdomains for multi-city fanout.
categorystringTop-level category: forsale, jobs, housing, services, gigs, community, resumes, events, or all.
subcategorystringCraigslist subcategory code such as cta, apa, sof, or mis (see the code table below).
searchQuerystringFree-text query run inside the chosen category.
startUrlsarrayDirect Craigslist search-result or post URLs.
maxResultsintegerMaximum listings to return per city.
includeDetailsbooleanFetch full post details, gallery images, attributes, and reply URL.
extractContactsbooleanExtract public emails and phone numbers from the post body or visible reply URL.
minPriceintegerMinimum listing price in the local marketplace currency.
maxPriceintegerMaximum listing price in the local marketplace currency.
hasPicbooleanReturn only listings with at least one image.
ownerOnlybooleanReturn owner posts and skip dealer, agency, or recruiter posts.
maxAgeDaysintegerSkip listings older than the specified age in days.
dedupAcrossCitiesbooleanDeduplicate reposts across cities within a run.
proxyConfigurationobjectApify Proxy settings, with residential proxy defaults provided in the contract.

Common subcategory codes

CategoryCodeMeaning
forsalecta / cto / ctdCars and trucks: all / by owner / by dealer
forsaleela, sys, phoElectronics, computers, cell phones
forsalefua, app, hshFurniture, appliances, household items
forsalebik, mca, rva, boaBicycles, motorcycles, RVs, boats
forsalemis, wanGeneral for sale, wanted
housingapa, roo, subApartments for rent, rooms and shares, sublets
housingrea, off, pak, vacReal estate for sale, office/commercial, parking, vacation rentals
jobssof, web, egr, tchSoftware, web/design, engineering, tech support
jobsacc, mar, sad, medAccounting, marketing, admin/office, healthcare
jobsfbh, mnu, tfr, lglFood/hospitality, manufacturing, transportation, legal
servicescps, hss, lbs, aosComputer, household, labor/moving, automotive services
gigscpg, crg, lbg, evgComputer, 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

FieldTypePurpose
titlestringListing title.
priceTextstringRaw price text as shown on Craigslist.
priceNumericnumberParsed numeric price in detailed output.
currencystringCurrency code for the listing marketplace.
citystringCraigslist city subdomain.
neighborhoodstringNeighborhood or area label when present.
categorystringTop-level category.
subcategorystringSubcategory code.
postedAtstring or nullPosting time when Craigslist exposes it (often null on search cards).
updatedAtstringUpdate time in detailed mode.
primaryImagestringMain listing image in detailed mode.
attributesobjectParsed typed attributes for the category.
urlstringCanonical listing URL.
cityLabelstringReadable city name.
imagesarrayImage URLs from the card or full gallery.
descriptionstringPost body in detailed mode (empty on search cards).
geoobjectLatitude and longitude when the listing shows a map pin.
addressstringLocation text shown on the listing.
contactobjectPublic emails/phones when extractContacts is on.
isOwnerPostboolean or nullOwner vs dealer/agency flag when known.
fingerprintstringRepost fingerprint used for cross-city de-duplication.
scrapedAtstringCollection 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:

  • dataset points to the full scraped listings dataset
  • runSummary points 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-scraped event

Provenance and scope:

  • Listings come from public Craigslist pages
  • The actor uses Craigslist city subdomains and categories defined in the input schema
  • extractContacts only applies to public contact information present in the body or visible reply URL
  • startUrls can replay exact Craigslist search-result or post URLs

Pagination and cost guidance:

  • Craigslist pagination is 120 items per page
  • maxResults bounds collection per city
  • Detailed mode uses the higher per-listing event
  • Multi-city fanout can increase output volume, so dedupAcrossCities helps 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.

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.