Craigslist Scraper - (Jobs & Listings etc.) avatar

Craigslist Scraper - (Jobs & Listings etc.)

Pricing

Pay per event + usage

Go to Apify Store
Craigslist Scraper - (Jobs & Listings etc.)

Craigslist Scraper - (Jobs & Listings etc.)

Scrape Craigslist classifieds across 700+ cities and all 8 categories (jobs, housing, for-sale, services, gigs, community, resumes, events). Typed outputs, multi-city fanout, repost dedup, optional contact extraction. MCP-ready. Pay-per-event.

Pricing

Pay per event + usage

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

6 days ago

Last modified

Share

Craigslist Scraper — Jobs, Housing, For-Sale, Services, Gigs (700+ cities)

Scrape Craigslist classifieds across 700+ city subdomains and all 8 categories — jobs, housing, for-sale, services, gigs, community, resumes, events — with typed per-category outputs (parsed salary, bed/bath/sqft, car make/model/year), multi-city auto-fanout, cross-city repost deduplication, and optional public contact extraction. Designed for AI agents (MCP-ready descriptions) and traditional pipelines alike. Pay-per-event, residential proxies included.

Try it: pick a city subdomain (e.g. newyork), choose a category (forsale, jobs, housing, …), and run.

What does this Craigslist scraper do?

This Actor extracts public Craigslist classified listings and returns them as a clean, typed JSON dataset:

  • One row per listing with stable keys (postId, title, url, city, priceText, priceNumeric, currency, postedAt, updatedAt, primaryImage, attributes, geo, contact).
  • Typed per-category attributes parsed out of Craigslist's HTML for you — no regex required:
    • Jobs → compensation, employment type, role, telecommute.
    • Housing → bedrooms, bathrooms, sqft, housing type, laundry, parking, available, pets-OK flags, furnished, smoking, wheelchair-accessible.
    • Cars + trucks → year, make, model, odometer, fuel type, transmission, title status, condition, drive type, cylinders, paint colour, VIN.
    • General for-sale → condition, seller type.
  • Multi-city auto-fanout — pass city: "topUSMetros" to scrape the top 25 US metros in one run, topGlobalMetros for the top 50 worldwide, or supply your own cities list.
  • Cross-city repost deduplication — when dealers and agencies repost the same listing in five cities, you get one row, not five.
  • Optional full post detail (includeDetails: true) — fetches the full description, complete image gallery, parsed attribute groups, and reply URL.
  • Optional public contact extraction (extractContacts: true) — pulls emails and phones that the poster placed in the public body. Never bypasses Craigslist's anonymized reply flow; never logs in.

The Actor is MCP-ready: every input field has a precise four-sentence description, the tool description names the use case and disambiguator, and the output schema is flat and ≤500 tokens per row — built for Claude, GPT, and other AI agents to call directly through the Apify MCP integration.

Why use this Craigslist scraper?

  • Resellers and arbitrageurs — track low-priced electronics, cars, tools, and tickets across multiple metros, deduplicated.
  • Recruiters — pull fresh gigs and full-time postings in jobs and gigs with parsed compensation.
  • Real-estate teams — aggregate apartments, rooms, sublets, and real-estate-for-sale postings with parsed bed/bath/sqft.
  • Service-business operators — monitor competitor activity across services.
  • Market researchers — observe supply-side trends in goods, jobs, and rentals across cities.
  • AI agents — call this Actor as a tool over MCP for ad-hoc classifieds research, comp pricing, lead generation.

Apify advantages: scheduled runs, dataset export (JSON/CSV/Excel/HTML/RSS), webhook integrations, residential proxy rotation, run history, retry logic, and a managed cloud runtime.

How to use the Craigslist scraper

  1. Pick your city. Use a single Craigslist subdomain such as newyork, sfbay, losangeles, london, or toronto. Or use a preset: topUSMetros (top 25 US metros) or topGlobalMetros (top 50 worldwide). Or pass a cities array of subdomains.
  2. Choose a category. forsale (default), jobs, housing, services, community, gigs, resumes, events, or all.
  3. (Optional) narrow with a subcategory code. cta for cars+trucks, apa for apartments, sof for software jobs, etc. — full list below.
  4. (Optional) add a search query. Free text — for example macbook pro, studio apartment, remote python.
  5. (Optional) set price/age/picture filters. minPrice, maxPrice, maxAgeDays, hasPic, ownerOnly.
  6. Choose detail depth. Leave includeDetails: false (default) for the cheap search-card path ($0.005/listing). Set includeDetails: true to also fetch full descriptions, complete galleries, and reply URLs ($0.008/listing).
  7. Save and run. Apify spins up the Actor, rotates residential proxies, paginates Craigslist, deduplicates reposts, and writes a clean dataset.

Input

FieldTypeDescription
citystringCraigslist city subdomain (e.g. newyork, sfbay). Or preset topUSMetros / topGlobalMetros.
citiesarray of stringsMultiple city subdomains. Overrides city when set.
categoryenumforsale, jobs, housing, services, community, gigs, resumes, events, all.
subcategorystring3-letter Craigslist subcategory code (e.g. cta, apa, sof).
searchQuerystringFree-text search inside the chosen category.
startUrlsarrayDirect Craigslist URLs. Overrides city/category/searchQuery.
maxResultsintMax listings per city. Default 50. Hard ceiling 3000 per city.
includeDetailsboolFetch full post details. Default false.
extractContactsboolExtract public emails/phones from post body. Requires includeDetails. Default false.
minPrice / maxPriceintPrice filters in the listing's local currency.
hasPicboolOnly listings with at least one image.
ownerOnlyboolExclude dealer/agency/recruiter posts.
maxAgeDaysintSkip listings older than this many days.
dedupAcrossCitiesboolDrop second occurrence of the same repost across cities. Default true.
proxyConfigurationobjectApify Proxy settings. Residential strongly recommended.

Example input (top 5 US metros, used MacBooks, with pictures, under $1500):

{
"city": "topUSMetros",
"category": "forsale",
"subcategory": "ela",
"searchQuery": "macbook pro",
"maxPrice": 1500,
"hasPic": true,
"ownerOnly": true,
"maxResults": 100,
"includeDetails": true,
"dedupAcrossCities": true
}

Output

The Actor pushes one row per listing into the default dataset. Sample (truncated):

{
"postId": "7708131934",
"title": "MacBook Pro 14\" M2 Pro 16GB 512GB Space Gray",
"url": "https://newyork.craigslist.org/mnh/sys/d/new-york-macbook-pro-14-m2-pro-16gb/7708131934.html",
"city": "newyork",
"cityLabel": "New York",
"category": "forsale",
"subcategory": "sys",
"neighborhood": "Upper East Side",
"priceText": "$1,450",
"priceNumeric": 1450,
"currency": "USD",
"postedAt": "2026-05-13T09:14:00.000Z",
"updatedAt": "2026-05-13T09:14:00.000Z",
"primaryImage": "https://images.craigslist.org/00808_xxxxx_600x450.jpg",
"images": ["https://images.craigslist.org/...", "..."],
"description": "Selling my 14-inch MacBook Pro M2 Pro, 16GB unified memory, 512GB SSD…",
"attributes": {
"condition": "excellent",
"make_/_manufacturer": "Apple",
"model_name_/_number": "MacBook Pro M2 Pro"
},
"geo": { "lat": 40.7736, "lng": -73.9566 },
"address": null,
"contact": {
"replyUrl": "https://newyork.craigslist.org/reply/nyc/sys/7708131934"
},
"isOwnerPost": true,
"fingerprint": "9c7a…",
"scrapedAt": "2026-05-13T09:18:42.103Z"
}

You can download the dataset in JSON, CSV, Excel, HTML, or RSS from the Apify Console Storage → Dataset tab.

Data fields

FieldTypeDescription
postIdstringCraigslist post ID (stable across edits).
titlestringPost title.
urlstringCanonical URL on the city subdomain.
city / cityLabelstringCraigslist subdomain and human label.
category / subcategorystringTop-level category + 3-letter subcategory code.
neighborhoodstringSub-area shown on the post.
priceText / priceNumeric / currencymixedRaw price + parsed numeric + ISO 4217 code.
postedAt / updatedAtISO 8601UTC timestamps.
primaryImagestringURL of the search-card thumbnail.
imagesarrayAll gallery images (detailed mode).
descriptionstringFull post body (detailed mode).
attributesobjectTyped per-category attributes — see below.
geoobject{ lat, lng } when the post has a map.
addressstringApproximate address when shown.
contactobject{ replyUrl, email?, phone? }. Public-only.
isOwnerPostboolTrue/false when the post explicitly states; otherwise null.
fingerprintstringSHA-256 dedup hash.
scrapedAtISO 8601When this row was scraped.

Typed attributes by category

  • Jobs: compensation, employment_type, job_title, telecommute_ok.
  • Housing: bedrooms, bathrooms, sqft, housing_type (apartment/house/condo/loft/townhouse), laundry, parking, available, cats_are_ok, dogs_are_ok, furnished, no_smoking, wheelchair_accessible.
  • Cars + trucks: year, make, model, odometer, fuel, transmission, title_status, condition, drive, cylinders, paint_color, vin.
  • General for-sale: condition, make_/_manufacturer, model_name_/_number, size_/_dimensions.

Subcategory codes (quick reference)

CategoryCodes
For-salesss (all), cta/cto/ctd (cars+trucks), mca (motorcycles), ela/sys/cmp/pho/vid (electronics + computers + phones + photo + video), fua/hsh/app (furniture + household + appliances), bia/tla/spo/toy (bikes + tools + sport + toys), clo/jwl/bab (clothing + jewelry + baby), art/boo/col/mus (arts/books/collectibles/music), gar (garage sale), mat (materials), tic (tickets), wan (wanted)
Jobssof (software), web (web/info-design), acc (accounting), med (medical), wri (writing), sad (sales), mar (marketing), csr (customer service), egr (engineering), tch (tech support), lgl (legal), mnu (manufacturing), npo (nonprofit), sci (science), bus (business), edu (education), fbh (food/bev), gov (government), hum (HR), prk (trades)
Housingapa (apartments), roo (rooms), sub (sublets), rea (real-estate-for-sale), pak (parking/storage), off (office), vac (vacation), swp (housing-swap)
Servicesaos (auto), bts (beauty), cps (computer), crs (creative), cys (cycle), evs (event), fns (financial), hss (household), lbs (labor), lgs (legal), lss (lessons), mas (marine), pas (pet), pes (real-estate-svc), sks (skilled trades), wet (writing), wrs (write/edit)
Gigscpg, crg, dmg, evg, lbg, tlg, wrg

Pricing — How much does it cost to scrape Craigslist?

Pay-per-event. Two billable events plus a small actor-start charge:

EventPriceWhen charged
actor-start$0.00005Once per run, per GB of memory.
listing-scraped$0.005 / listingSearch-card mode (default). Returns title, price, location, primary image, posted date, URL.
listing-detailed$0.008 / listingFull post mode (includeDetails: true). Returns description, full gallery, typed attributes, reply URL.

Typical run costs (excluding the negligible start fee):

  • 50 listings, search-card → $0.25
  • 50 listings, detailed → $0.40
  • 500 listings across top 5 US metros, search-card → $2.50
  • 500 listings across top 5 US metros, detailed → $4.00

Pay-Per-Usage (compute + proxy passthrough) is also available — pick whichever model your run profile prefers in Apify Console.

Tips and advanced options

  • Start narrow, then widen. Set maxResults: 25 for your first run to validate selectors, then scale up.
  • Use search-card mode for monitoring, detailed mode for enrichment. Card mode is 1.6× cheaper and 4× faster.
  • Multi-metro dedup pays for itself. Resellers reposting the same item across 10 metros routinely cut output volume by 60% with dedupAcrossCities: true.
  • Respect the age filter. maxAgeDays: 7 stops pagination once a page becomes mostly stale — saves money on long-running monitoring schedules.
  • Residential proxies are recommended. Craigslist rate-limits datacenter IPs aggressively; the actor defaults to Apify residential proxies.
  • Schedule it. Apify Scheduler can run the actor every N minutes/hours with the same input — ideal for "watch this search" use cases.

FAQ, disclaimers, and support

Is scraping Craigslist legal? Public-data scraping is generally lawful in the US (see hiQ Labs v. LinkedIn), but Craigslist has aggressively pursued bulk scrapers and aggregators in past litigation (craigslist v. 3Taps, RadPad, Instamotor). This Actor only retrieves publicly visible classifieds, never logs in, never bypasses Craigslist's anonymized reply form, and respects standard rate limits. You are responsible for ensuring your use complies with Craigslist's Terms of Service and any applicable local law. Do not use this Actor to repost Craigslist content elsewhere, build a Craigslist-clone aggregator, or contact posters at scale.

Why are some posts missing? Craigslist sometimes serves a CAPTCHA when it suspects automation. The actor rotates residential proxies and a session pool, and retries with backoff, but a small percentage of posts may still be skipped. The RUN_SUMMARY key in the Key-Value Store lists all warnings.

Why is priceNumeric null sometimes? When the post says "please contact" or has no price column for that category. The raw priceText is preserved.

Why didn't extractContacts find an email? Craigslist hides contact info behind its anonymized reply form by default. The actor only extracts emails and phones that the poster placed in the public body. The anonymized replyUrl is always available.

Can it scrape behind Craigslist accounts? No. This actor never logs in.

Where do I report bugs or feature requests? Use the Issues tab on the Actor's Apify Store page. We respond to every issue. Custom-output, scheduled-monitor, and Webhook-on-new-post variants are available — contact the publisher.

If you're scraping classifieds at scale, you may also want: