Craigslist Scraper: Contacts & Change Monitoring avatar

Craigslist Scraper: Contacts & Change Monitoring

Pricing

from $0.90 / 1,000 search listings

Go to Apify Store
Craigslist Scraper: Contacts & Change Monitoring

Craigslist Scraper: Contacts & Change Monitoring

Search Craigslist across cities and categories, extract full listing details and public contacts, monitor new or changed posts, and generate price and inventory analytics.

Pricing

from $0.90 / 1,000 search listings

Rating

0.0

(0)

Developer

ScrapingMonkey

ScrapingMonkey

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Craigslist Scraper - Listings, Full Details, Monitoring and Market Analytics

Search public Craigslist listings across regions and categories, extract complete posting details and visible contacts, monitor changes, and turn the results into structured market data.

  • Search with keywords, Craigslist URLs, regions, categories, price ranges, seller type, location radius, and native category-specific filters
  • Decode exact posting IDs, timestamps, prices, locations, coordinates, images, and deep paginated results
  • Enrich listings with the full description, category attributes, public phones and emails, vehicle, housing, job, and event fields
  • Monitor new listings and meaningful changes through scheduled runs with persistent state
  • Produce price, inventory, region, category, contact, and status analytics
  • Process multiple searches and detail pages concurrently with retries and proxy rotation
  • No Craigslist account, cookie, API key, or user-supplied proxy is required; production traffic always uses the built-in Apify Residential Proxy
  • Export to JSON, CSV, Excel, XML, or consume results through the Apify API

What can you do with this Actor?

Mode / actionInputOutputBest for
searchFriendly search fields or Craigslist search URLsFast normalized listing summariesDiscovery, lead lists, inventory collection, price tracking
searchAndDetailsThe same search inputsSearch records enriched from every public posting pageComplete descriptions, visible contacts, specifications, amenities
detailsDirect Craigslist posting URLsFull normalized posting recordsEnriching a known URL list or checking listing availability
monitorSearch inputs plus a stable monitor keyOnly new listings or new and changed listingsScheduled alerts, price drops, inventory and status monitoring
analyticsSearch inputs and filtersListing rows plus one aggregate analytics rowMarket research and regional/category comparisons

Search URLs and posting URLs may be mixed in one run outside details mode. Search enrichment replaces each summary with one complete detail record; it does not create duplicate summary and detail rows.

Quick start

  1. Open the Actor and click Try for free.
  2. Keep Search summaries selected.
  3. Use the default mountain bike, sfbay, and sss values or enter your own search.
  4. Set Results per search and click Start.
  5. Open the single Results table or download the dataset.

The default input is deliberately small and returns useful public listings without requiring any account or proxy configuration.

Input examples

Search listing summaries

{
"mode": "search",
"searchTerms": ["mountain bike", "road bike"],
"regions": ["sfbay"],
"categories": ["bia"],
"maxResults": 25,
"sort": "date",
"hasImage": true
}

maxResults applies to every independent term × region × category combination or supplied search URL. maxItems can add one global cap after merging and deduplication.

Search and extract full details

{
"mode": "searchAndDetails",
"searchTerms": ["toyota rav4"],
"regions": ["sfbay", "sacramento"],
"categories": ["cta"],
"maxResults": 20,
"minPrice": 5000,
"maxPrice": 30000,
"condition": ["20", "30", "40"],
"sellerType": "owner",
"includePublicContacts": true
}

Extract direct posting details

{
"mode": "details",
"listingUrls": [
"https://www.craigslist.org/view/d/example-listing/AbCdEf123456",
"https://sfbay.craigslist.org/sfc/apa/d/example-apartment/7952817881.html"
],
"includeImages": true,
"includePublicContacts": true
}

Monitor new listings and changes

{
"mode": "monitor",
"searchTerms": ["macbook pro"],
"regions": ["sfbay"],
"categories": ["ela"],
"maxResults": 250,
"monitorMode": "changes",
"monitorKey": "bay-area-macbooks",
"monitorIncludeDetails": true
}

Use the same monitorKey on every scheduled run. The first run treats discovered listings as new; later runs emit only newly discovered or meaningfully changed records.

Build market analytics

{
"mode": "analytics",
"searchTerms": ["apartment"],
"regions": ["sfbay"],
"categories": ["apa"],
"maxResults": 1000,
"minPrice": 1000,
"maxPrice": 5000,
"onlyWithPrice": true,
"analyticsOnly": true
}

Use a Craigslist search URL and advanced native filters

{
"mode": "searchAndDetails",
"startUrls": [
"https://www.craigslist.org/search/area/sfbay?cat=cta&query=toyota&sort=date"
],
"maxResults": 100,
"filters": {
"min_auto_year": 2018,
"auto_transmission": [1, 2],
"auto_fuel_type": 1
}
}

Complete output examples

The Actor emits three stable top-level row shapes. A summary, full detail, removed listing, and monitored change all use the same 113-field listing shape; unavailable values remain explicit as null, false, {}, or [].

Complete listing output - 113 top-level fields

{
"recordType": "listing",
"resultType": "detail",
"id": "7952817881",
"serviceId": "mGsExampleService",
"url": "https://www.craigslist.org/view/d/macbook-pro-14-inch/mGsExampleService",
"canonicalUrl": "https://www.craigslist.org/view/d/macbook-pro-14-inch/mGsExampleService",
"sourceSearchUrl": "https://sfbay.craigslist.org/search/ela?query=macbook&sort=date",
"sourceType": "search",
"sourceRank": 1,
"searchTerm": "macbook",
"requestedRegion": "sfbay",
"requestedCategory": "ela",
"region": "sfbay",
"regionName": "SF bay area",
"regionCountry": "US",
"regionState": "CA",
"subarea": "sby",
"category": "ela",
"categoryId": 96,
"categoryGroup": "for sale",
"categoryName": "electronics",
"subcategory": "electronics",
"title": "MacBook Pro 14-inch",
"description": "Well-maintained laptop. Public contact: +1 415 555 2671.",
"descriptionHtml": "Well-maintained laptop.<br>Public contact: +1 415 555 2671.",
"price": 750.0,
"currency": "USD",
"priceText": "$750",
"priceDetailText": "cash only",
"locationText": "Cupertino",
"neighborhood": "Apple Park",
"address": "1 Infinite Loop",
"city": "Cupertino",
"state": "CA",
"postalCode": "95014",
"country": "US",
"latitude": 37.3318,
"longitude": -122.0312,
"postedAt": "2026-08-10T19:00:00Z",
"updatedAt": "2026-08-11T01:00:00Z",
"availableFrom": null,
"validThrough": null,
"eventDates": [],
"images": [
"https://images.craigslist.org/example_600x450.jpg"
],
"imageCount": 1,
"primaryImage": "https://images.craigslist.org/example_600x450.jpg",
"hasImages": true,
"imageDimensionCode": "0t20CI",
"condition": "excellent",
"sellerType": "owner",
"year": null,
"make": null,
"model": null,
"makeModel": null,
"vin": null,
"odometer": null,
"cylinders": null,
"drivetrain": null,
"fuel": null,
"transmission": null,
"titleStatus": null,
"bodyType": null,
"bedrooms": null,
"bathrooms": null,
"squareFeet": null,
"housingType": null,
"rentPeriod": null,
"availability": null,
"laundry": null,
"parking": null,
"petsAllowed": [],
"furnished": null,
"smokingAllowed": null,
"wheelchairAccessible": null,
"airConditioning": null,
"evCharging": null,
"compensation": null,
"employmentType": null,
"employer": null,
"telecommuting": null,
"internship": null,
"nonprofit": null,
"education": null,
"attributes": {
"condition": "excellent",
"delivery_available": "delivery available"
},
"attributeList": [
{
"key": "condition",
"label": "condition",
"value": "excellent"
},
{
"key": "delivery_available",
"label": "delivery available",
"value": "delivery available"
}
],
"searchMetadataCodes": {
"4": ["3:exampleImageId"],
"6": ["macbook-pro-14-inch"],
"10": ["$750"],
"13": ["mGsExampleService"]
},
"phones": [
"+14155552671"
],
"phoneDetails": [
{
"e164": "+14155552671",
"display": "+1 415 555 2671",
"countryCode": 1,
"nationalNumber": "4155552671"
}
],
"emails": [
"seller@example.com"
],
"externalLinks": [
"https://example.com/specifications"
],
"hasPublicPhone": true,
"hasPublicEmail": true,
"hasReplyControl": true,
"replyUrl": "/reply/sfo/ela/7952817881/mGsExampleService",
"listingStatus": "active",
"isActive": true,
"isDeleted": false,
"isExpired": false,
"isUnavailable": false,
"statusReason": null,
"monitorStatus": "changed",
"monitorKey": "bay-area-laptops",
"previousPrice": 800.0,
"previousScrapedAt": "2026-08-10T01:00:00Z",
"changedFields": [
"price",
"description"
],
"previousSnapshot": {
"title": "MacBook Pro 14-inch",
"description": "Earlier description",
"price": 800.0,
"currency": "USD",
"locationText": "Cupertino",
"postedAt": "2026-08-10T19:00:00Z",
"updatedAt": null,
"images": ["https://images.craigslist.org/example_600x450.jpg"],
"attributes": {"condition": "excellent"},
"phones": ["+14155552671"],
"emails": ["seller@example.com"],
"listingStatus": "active",
"isDeleted": false,
"isExpired": false,
"isUnavailable": false
},
"detailEnriched": true,
"detailHttpStatus": 200,
"detailError": null,
"parseConfidence": 100,
"warnings": [],
"scrapedAt": "2026-08-11T02:00:00Z",
"schemaVersion": 1
}

Complete analytics output - 27 top-level fields

{
"recordType": "analytics",
"resultType": "analytics",
"totalListings": 250,
"newListings": 18,
"changedListings": 7,
"activeListings": 248,
"deletedListings": 1,
"expiredListings": 1,
"unavailableListings": 2,
"withPrice": 231,
"withImages": 219,
"withPhone": 36,
"withEmail": 12,
"minimumPrice": 10.0,
"maximumPrice": 5500.0,
"averagePrice": 742.68,
"medianPrice": 425.0,
"currencyCounts": {
"USD": 250
},
"regionCounts": {
"sfbay": 250
},
"categoryCounts": {
"ela": 250
},
"statusCounts": {
"active": 248,
"removed": 2
},
"topAttributes": [
{
"name": "condition",
"count": 214
}
],
"postedAtMinimum": "2026-08-01T10:00:00Z",
"postedAtMaximum": "2026-08-11T01:55:00Z",
"generatedAt": "2026-08-11T02:00:00Z",
"scrapedAt": "2026-08-11T02:00:00Z",
"schemaVersion": 1
}

Complete diagnostic output - 12 top-level fields

{
"recordType": "diagnostic",
"resultType": "diagnostic",
"severity": "info",
"diagnosticType": "zeroResults",
"message": "Craigslist returned no matching listings for this search.",
"input": "rare vintage workstation",
"sourceSearchUrl": "https://sfbay.craigslist.org/search/sss?query=rare+vintage+workstation",
"url": null,
"httpStatus": null,
"retryable": false,
"scrapedAt": "2026-08-11T02:00:00Z",
"schemaVersion": 1
}

Diagnostics describe an empty or failed input clearly and are not billing events. They appear in the same neutral Results table so a successful run is not presented as a wall of errors.

What data can you extract?

Every top-level output key is listed below. Category-specific values that Craigslist introduces are preserved in attributes and repeated in the readable attributeList.

CategoryFields
Row identityrecordType, resultType, id, serviceId, url, canonicalUrl
Search contextsourceSearchUrl, sourceType, sourceRank, searchTerm, requestedRegion, requestedCategory
Region and categoryregion, regionName, regionCountry, regionState, subarea, category, categoryId, categoryGroup, categoryName, subcategory
Content and pricetitle, description, descriptionHtml, price, currency, priceText, priceDetailText
LocationlocationText, neighborhood, address, city, state, postalCode, country, latitude, longitude
Dates and mediapostedAt, updatedAt, availableFrom, validThrough, eventDates, images, imageCount, primaryImage, hasImages, imageDimensionCode
General listing datacondition, sellerType
Vehicle datayear, make, model, makeModel, vin, odometer, cylinders, drivetrain, fuel, transmission, titleStatus, bodyType
Housing databedrooms, bathrooms, squareFeet, housingType, rentPeriod, availability, laundry, parking, petsAllowed, furnished, smokingAllowed, wheelchairAccessible, airConditioning, evCharging
Job datacompensation, employmentType, employer, telecommuting, internship, nonprofit, education
Flexible attributesattributes, attributeList, searchMetadataCodes
Public contact dataphones, phoneDetails, emails, externalLinks, hasPublicPhone, hasPublicEmail, hasReplyControl, replyUrl
AvailabilitylistingStatus, isActive, isDeleted, isExpired, isUnavailable, statusReason
MonitoringmonitorStatus, monitorKey, previousPrice, previousScrapedAt, changedFields, previousSnapshot
Parsing and provenancedetailEnriched, detailHttpStatus, detailError, parseConfidence, warnings, scrapedAt, schemaVersion
Analytics countstotalListings, newListings, changedListings, activeListings, deletedListings, expiredListings, unavailableListings, withPrice, withImages, withPhone, withEmail
Analytics prices and groupsminimumPrice, maximumPrice, averagePrice, medianPrice, currencyCounts, regionCounts, categoryCounts, statusCounts, topAttributes
Analytics datespostedAtMinimum, postedAtMaximum, generatedAt
Diagnosticsseverity, diagnosticType, message, input, httpStatus, retryable

Input parameters

ParameterTypeRequiredDefaultDescription
modestringYessearchsearch, searchAndDetails, details, monitor, or analytics
searchTermsstring[]Search workflows["mountain bike"]Keywords; combined with every friendly region and category
regionsstring[]Search workflows["sfbay"]Craigslist host/region names such as sfbay, newyork, london, tokyo
categoriesstring[]Search workflows["sss"]Three-character category codes such as sss, cta, apa, jjj, ggg, bbb
startUrlsstring[]No-Current or legacy Craigslist search URLs and/or posting URLs
listingUrlsstring[]Details mode-Direct public Craigslist posting URLs
maxResultsintegerNo50Results per independent friendly search or search URL; 1-5,000
maxItemsintegerNo0Global listing limit after merge and deduplication; 0 means unlimited, maximum 100,000
maxConcurrencyintegerNo5Parallel searches/detail requests; 1-20
maxRequestRetriesintegerNo4Retry attempts with backoff and proxy-session rotation; 1-10
countrystringNoUSTwo-letter request locale country; the Craigslist region controls listing currency
languagestringNoenInterface language/locale such as en, de, fr, ja, or en-GB
sortstringNodatedate, rel, priceasc, pricedsc, dateoldest, or dist
minPricenumberNo-Minimum non-negative listing price
maxPricenumberNo-Maximum non-negative listing price
conditionstring[]No-Craigslist condition codes: 10, 20, 30, 40, 50, 60
sellerTypestringNoallall, owner, or dealer
hasImagebooleanNofalseAsk Craigslist for listings containing an image
postedTodaybooleanNofalseAsk Craigslist for listings posted today
hideDuplicatesbooleanNotrueAsk Craigslist to hide bundled duplicates
deliveryAvailablebooleanNofalseRequire delivery where supported by the category
titlesOnlybooleanNofalseMatch the search term against titles only
postalCodestringWith distance-Center of a radius search
searchDistancenumberWith postal code-Non-negative radius in the region's native distance units
filtersobjectNo{}Native Craigslist parameters; scalar and array values are supported
maxAgeDaysnumberNo-Locally discard records older than this many days
includeImagesbooleanNotrueInclude full image URLs and media counts
includePublicContactsbooleanNotrueExtract only phones/emails written publicly in the posting body
onlyWithPricebooleanNofalseDiscard records without a numeric price before storage and billing
onlyWithImagesbooleanNofalseDiscard records without images before storage and billing
deduplicatebooleanNotrueKeep one record per posting across overlapping inputs
includeAnalyticsbooleanNofalseAdd one analytics row in a search, detail, or monitor run
analyticsOnlybooleanNofalseCalculate and store analytics without individual listing rows
monitorModestringNochangeschanges emits new and changed records; newListings emits only new records
monitorKeystringMonitor modecraigslist-monitorStable 1-80 character identity for persistent monitor state
monitorIncludeDetailsbooleanNofalseOpen details during monitoring to detect content/contact/attribute changes

There is intentionally no proxy field. Apify Residential Proxy is created internally for every production run, and direct Craigslist traffic is rejected by the runtime.

Use cases

Classified lead discovery

Collect fresh owner, dealer, service, gig, or job postings across multiple cities. Use full-detail mode when the workflow needs public contact details written in the listing body.

Price and inventory intelligence

Track vehicles, electronics, furniture, rentals, or other categories by region. Filter comparable listings and use the analytics row for median, average, minimum, and maximum pricing.

Housing and vehicle datasets

Extract promoted fields such as bedrooms, bathrooms, square feet, amenities, VIN, mileage, drivetrain, transmission, and title status while keeping every other Craigslist attribute in a flexible object.

Scheduled change alerts

Run monitor on an Apify schedule. Send a webhook to Slack, Make, Zapier, n8n, a CRM, or a database only when a listing appears or changes.

Regional market research

Combine terms, regions, and categories into one run, deduplicate overlaps, and compare availability, image coverage, visible-contact coverage, attributes, and price distributions.

Performance and cost

This Actor is designed for pay-per-event pricing. Exact prices are displayed in the Actor's Pricing tab and depend on the published plan.

EventEmitted forRelative request work
listing-summaryOne saved search-only listingLowest: search API requests are shared across many results
listing-detailOne successfully enriched detail recordHigher: opens one public detail page per listing
listing-changeOne new or changed monitor resultDepends on monitorIncludeDetails
analytics-summaryOne aggregate analytics rowOne event after the source listings are processed

Diagnostic rows and unavailable direct-detail rows that could not be enriched do not call a custom charge event. Filtering happens before storage and billing. searchAndDetails, monitorIncludeDetails, high maxResults, many search combinations, and high retry counts increase runtime and proxy usage.

Measured Apify timing and price examples should be added after repeatable runs on the published Actor; this README does not invent fixed throughput or cost claims.

API usage

Replace YOUR_USERNAME with the published Actor owner name.

curl -X POST \
"https://api.apify.com/v2/acts/YOUR_USERNAME~craigslist-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "searchAndDetails",
"searchTerms": ["mountain bike"],
"regions": ["sfbay"],
"categories": ["bia"],
"maxResults": 10
}'

Use the dataset API directly or connect Apify to Google Sheets, Make, Zapier, n8n, Airbyte, webhooks, Slack, a CRM, or a data warehouse.

Best for / not for

Best for: public Craigslist search, category browsing, known posting enrichment, public contact extraction, multi-region datasets, market analytics, and scheduled listing/change monitoring.

Not for: account-only data, posting or messaging sellers, anonymized Craigslist relay-email extraction, captcha solving, private contact discovery, account automation, or real-time streaming.

Limits and good to know

  • One workflow mode is selected per run, but search and posting URLs can coexist outside details mode.
  • maxResults is per independent search; maxItems is the optional global listing cap.
  • The Actor reproduces Craigslist's cache-based batch pagination for results beyond the first response and stops at the requested/source limit.
  • Craigslist category support is broad: umbrella codes and category-specific filters can be passed through filters without a code update.
  • Search rows contain the fields exposed by search. Full descriptions, public contacts, JSON-LD data, and detailed attributes require searchAndDetails, details, or detail-enabled monitoring.
  • Currency follows the selected Craigslist area. country and language influence request localization but do not convert prices.
  • Missing source values remain explicit. Listing rows always keep the same 113 top-level fields.
  • A removed or redirected posting is returned as an unavailable listing when it can be identified; failed/empty inputs produce clear diagnostic rows.
  • Requests retry with exponential backoff, honor Retry-After, and rotate the proxy session on retryable failures. Other inputs continue after a partial failure.
  • Public contact extraction never opens the reply challenge. replyUrl only records the public reply-control path already present in the HTML.
  • Source websites and internal public-web endpoints can change. Pin production automations to tested Actor builds and report reproducible parser regressions.

Frequently asked questions

What input should I provide?

For a normal search, provide a keyword, region, and three-character category code, for example mountain bike, sfbay, and bia. You may instead paste a current/legacy Craigslist search URL or a direct posting URL.

Which category codes are supported?

The Actor accepts Craigslist's three-character codes instead of a short hardcoded list. Common umbrella codes are bbb services, ccc community, eee events, ggg gigs, hhh housing, jjj jobs, rrr resumes, and sss for sale. Examples of high-value subcategories are cta, ela, fua, bia, apa, roo, and sub.

How many results can I extract?

Set 1-5,000 results per independent search and optionally 0-100,000 listings globally. The actual count still depends on Craigslist availability, filters, duplicates, removed postings, and the selected category/region.

Why is description empty in search mode?

Fast search summaries do not open every detail page. Select searchAndDetails to retrieve the complete body, HTML, public contacts, and detailed attributes.

Why are vehicle or housing fields null?

The 113-field listing shape is shared across categories. A laptop does not have bedrooms and an apartment does not have a VIN. Category-specific values also remain available in attributes.

Can I process multiple inputs?

Yes. Friendly values form a term × region × category matrix, and startUrls can add search or posting URLs. Actor-level deduplication keeps one listing per posting identity by default.

Can I schedule recurring runs?

Yes. Use monitor with a stable monitorKey, an Apify schedule, and optional webhooks. State is committed only after successful output so a billing limit does not silently advance the monitor.

Do I need an account, API key, cookies, or proxy?

No Craigslist account, cookie, or API key is needed. The Actor automatically uses Apify Residential Proxy for every production request; users do not configure or see a proxy input.

Does it extract Craigslist relay email addresses?

No. The anonymized reply flow may require a challenge. This Actor intentionally avoids captcha/reply-email automation and extracts only phones and email addresses visibly written in the public listing body.

Responsible use

This Actor extracts publicly available information. Users are responsible for complying with applicable laws, privacy regulations, contractual obligations, and Craigslist's terms. Avoid unwanted contact, sensitive-data profiling, and excessive collection.

Craigslist is a trademark of craigslist, Inc. This Actor is an independent product and is not affiliated with, endorsed by, or sponsored by craigslist, Inc.

Support

If a public listing or search stops parsing, create an issue in the Actor's Issues tab. Include the Apify run ID, mode, non-sensitive input, expected result, and one reproducible public URL. Never include proxy credentials, cookies, tokens, or private contact information.

Local verification

Run the unit and fixture regression suite:

$python -m unittest discover -s tests -v

The optional scripts/live_smoke.py accepts a private local proxy file for development verification. It is excluded from the production image. The release runtime has no path to that file and always creates Apify Residential Proxy internally.