Craigslist Scraper - Housing, Jobs and Cars avatar

Craigslist Scraper - Housing, Jobs and Cars

Pricing

from $1.32 / 1,000 results

Go to Apify Store
Craigslist Scraper - Housing, Jobs and Cars

Craigslist Scraper - Housing, Jobs and Cars

Collect public Craigslist housing, jobs, cars, and other classifieds across US and international areas. Get prices, photos, listing details, and available contacts. Pay per delivered listing row plus a start fee.

Pricing

from $1.32 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

14

Total users

3

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Craigslist Scraper

Collect public Craigslist housing, jobs, cars, and other classifieds as listing rows you can export and compare.

  • Search by area, Craigslist URL, or coordinates.
  • Get titles, prices, photos, posting dates, and listing links.
  • Include housing details and publicly available contact information when shown.
  • Search multiple areas or URLs in one run.
  • Pay $1.80 per 1,000 delivered rows on the Free plan, plus a start fee.

What does Craigslist Scraper do?

Craigslist Scraper returns one row per listing across housing, for sale, jobs, gigs, services, community, events, and resumes. Its area catalog contains 707 entries, including US and international markets such as phoenix, toronto, london, and sydney; this is not a guarantee of active listings in every area.

  • Area search: supply locations, a category, and optional filters.
  • URL search: supply search or listing links in startUrls.
  • Coordinate search: supply lat and lon to find a Craigslist area.
  • Sitemap discovery: select discoveryMode: "sitemap" for date-based listing discovery.
  • Detail enrichment: scrapeDetails defaults to true. Body text, housing attributes, addresses, phones, and emails stay in the listing row; they are not separate billed rows.

What data can you extract from Craigslist?

All rows have rowType: "listing". Available fields depend on the listing category and what the poster makes public.

FieldDescriptionExample
rowTypeRow typelisting
idListing identity1234567890
postingIdCraigslist posting number, when available1234567890
titleListing titleTwo-bedroom apartment
priceNumeric asking price or rent1800
priceTextDisplayed price text$1,800
categoryCraigslist category codeapa
categorySectionClassified sectionhousing
locationCraigslist area slugphoenix
cityCity or area namePhoenix
countryCountry nameUnited States
ccCountry codeus
urlPublic listing linkhttps://www.craigslist.org/view/d/phoenix/example-listing-id
postedAtPosting date and time, when supplied2026-10-24T10:00:00Z
scrapedAtRow preparation time in UTC2026-10-24T10:05:00Z
bedroomsBedroom count2
bathroomsBathroom count1
sqftFloor area in square feet900
bodyListing descriptionTwo-bedroom apartment with parking.
imagesPhoto URLs[]
attributesAdditional listing attributes{"laundry":"on site"}
addressStreet, unit, locality, region, and postal details{"street":null,"locality":"Phoenix"}
geoMap coordinates, when available{"lat":33.45,"lng":-112.07}
phonesPublic phone entries; not posting numbers[]
emailsPublic or relay email entries[]
personPoster name and role, when shown{"name":"Jane Doe","role":"poster"}
leadAbsencesReasons contact or address fields are empty{"emails":{"reason":"未验证","surface":"search"}}

Absence reasons include 本站无 (not found on the inspected page), 闸门锁 (access restricted), and 未验证 (not verified). Empty contact fields do not prove that the poster has no contact details.

How to scrape Craigslist

  1. Open Craigslist Scraper in Apify Console.
  2. Fill one target: locations, startUrls, or both lat and lon.
  3. Choose a category and set maxItems to 3 for a first run.
  4. Click Start and check the run status.
  5. Download the dataset or read its rows through the API.

Empty input starts the form's example: phoenix, category apa, and at most 3 rows. It is billed like any other run. Filling a target selects the matching input mode automatically. If conflicting targets are filled, startUrls takes precedence over locations, and locations takes precedence over coordinates.

Use official area slugs, not arbitrary city names. locations accepts an array or a comma-separated string. apa selects apartment rentals, roo rooms, cta cars, and sof software jobs. Section codes such as sss and jjj search for-sale and jobs respectively. category: "all" expands housing categories, not the entire site.

Search or listing URLs

Put links in startUrls. Search links supply their own area, category, and URL filters. Both city-host URLs and /search/area/<slug> links are accepted, including recognized international Craigslist domains. A direct listing URL selects that listing rather than a search result set.

Coordinates

Fill both lat and lon, leaving locations and startUrls empty. The coordinates select a Craigslist area; they do not promise an exact-radius search. Supplying only one coordinate is invalid.

Sitemap discovery

Set discoveryMode to sitemap, use one area, and select a category. sitemapDate defaults to the current UTC date. This option discovers dated listing links rather than applying normal keyword, price, and amenity search filters. Direct listing links and sitemap entries still need listing content before they can become delivered rows, even with scrapeDetails: false.

What to fill in

FieldWhat to enterDefault
locationsOfficial area slugsEmpty; example phoenix
startUrlsCraigslist search or listing URLsEmpty
lat, lonBoth coordinates, without another targetEmpty
categoryCategory code; all means housing categoriesapa
querySearch words, sent without translationEmpty
country, langOptional country/language overridesArea catalog
purveyorEmpty, owner, or dealerEmpty
minPrice, maxPricePrice or rent boundsUnset
minBedrooms, maxBedroomsBedroom boundsUnset
minBathrooms, maxBathroomsBathroom boundsUnset
minSqft, maxSqftFloor-area boundsUnset
housingType, laundry, parkingNumeric choices described in the formUnset
catsOk, dogsOk, furnished, noSmokingRequired housing amenitiesfalse
wheelchairAccessible, evCharging, airConditioningRequired accessibility or amenitiesfalse
privateRoom, privateBathRoom requirementsfalse
hasPic, postedTodayRequire photos or today's postingsfalse
searchNearbyInclude nearby areasfalse
postal, searchDistancePostal code and Craigslist distance settingUnset
bundleDuplicatesAsk Craigslist to group duplicatesfalse
saleDateEvent date, YYYY-MM-DDUnset
sortdate, dateoldest, priceasc, pricedscdate
maxItemsRows per area or URL, from 1 to 2,00070; example 3
scrapeDetailsInclude listing detailstrue
imageSize300x300, 600x450, or 1200x900600x450
maxDetailConcurrencySimultaneous detail requests, 1–155
requestDelayMillisRequest spacing in milliseconds, 0–10,000250
discoveryModesearch or sitemapsearch
sitemapDateSitemap date, YYYY-MM-DDToday in UTC
sitemapIndexesOptional sitemap index identifiers, 00–29Unset

Area search:

{
"locations": ["phoenix"],
"category": "apa",
"maxPrice": 2000,
"maxItems": 3
}

URL search:

{
"startUrls": [{"url": "https://sfbay.craigslist.org/search/cta"}],
"maxItems": 3
}

Coordinate search:

{
"lat": 33.45,
"lon": -112.07,
"category": "apa",
"maxItems": 3
}

Sitemap discovery:

{
"locations": ["phoenix"],
"category": "apa",
"discoveryMode": "sitemap",
"maxItems": 3
}

maxResults and limit are accepted aliases for maxItems. Close field-name misspellings are corrected when possible; other unknown fields are ignored with a note. Unsupported filter values may also be ignored, so check what was understood rather than assuming every filter applied.

Every run that reads its input writes an INPUT_REPORT record in its default key-value store, listing corrections, inferred choices, ignored fields, and errors. Unusable target combinations, such as lat without lon, fail before row charges with INVALID_INPUT: <field> — <how to fix>. The start fee is separate.

Output example

Illustrative housing row; the listing identifier and URL are placeholders:

{
"rowType": "listing",
"id": "1234567890",
"postingId": "1234567890",
"source": "craigslist",
"title": "Two-bedroom apartment with parking",
"category": "apa",
"categorySection": "housing",
"location": "phoenix",
"cc": "us",
"price": 1800,
"priceText": "$1,800",
"bedrooms": 2,
"bathrooms": 1,
"sqft": 900,
"url": "https://www.craigslist.org/view/d/phoenix/example-listing-id",
"phones": [],
"emails": [],
"person": {"name": null, "role": null},
"scrapedAt": "2026-10-24T10:05:00Z"
}

Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. The key-value store also provides INPUT_ECHO for interpreted input, RUN_SUMMARY for counts and warnings, and ERROR_SUMMARY when a failure is recorded.

Why use this Craigslist scraper?

  • Pay per delivered row. Details belong to the same listing row, with no separate enrichment charge.
  • Keep delivered data. Rows already written to the dataset remain available after a stop. Do not assume unfinished collection has been delivered.
  • Understand missing data. Unavailable values stay empty, with contact absence reasons where available.
  • Use several inputs. Search multiple areas or URLs while keeping a per-input row limit.
  • Avoid manual copying. Export comparable rows for housing research, price monitoring, or job tracking.
  • No proxy setup. You do not need to set up proxies or sign in to Craigslist.

How much does it cost to scrape Craigslist?

Pricing is pay per event. Platform usage is included in these prices. The start event costs $0.005 per GB of allocated memory, with a minimum of one event. At the default 512 MB, the start fee is $0.005.

Apify planStart fee at 512 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.0018$1.80
Starter$0.005$0.0018$1.80
Scale$0.005$0.00156$1.56
Business$0.005$0.00132$1.32
Platinum$0.005$0.0012$1.20
Diamond$0.005$0.00096$0.96

maxItems applies to each area or start URL, not the whole run. It defaults to 70 and supports up to 2,000 per input. The whole run stops at the Maximum cost per run you set (maxTotalChargeUsd in the API), which can reduce delivery below your requested count.

Free-plan runs are capped at 200 rows across all inputs, with up to 10 runs of this Actor. These are publisher-set limits, not a promise of free data. An empty result has no row charges; the start fee still applies.

Example: three areas delivering five rows each produce 15 rows. On the Free plan at 512 MB, the cost is 15 × $0.0018 + $0.005 = $0.032.

Use with AI agents and the API

Apify MCP server

Add this tool to a remote MCP client such as Claude, ChatGPT, Cursor, or VS Code:

https://mcp.apify.com?tools=lentic_clockss/craigslist-housing-scraper

Sign in with Apify using OAuth, or supply Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent can read rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/craigslist-housing-scraper, with APIFY_TOKEN configured privately.

Example prompt: “Find three Craigslist apartment listings in Phoenix under $2,000. Return their titles, prices, and URLs.” Normal run pricing applies.

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/craigslist-housing-scraper").call(
run_input={"locations": ["phoenix"], "category": "apa", "maxItems": 3}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/craigslist-housing-scraper').call({
locations: ['phoenix'], category: 'apa', maxItems: 3,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Over HTTP, send input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~craigslist-housing-scraper/runs with your bearer token. After the run finishes, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json using its defaultDatasetId.

Integrations

Connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or a webhook through Apify integrations. Use Apify Schedules for repeated runs, with small row limits and suitable filters.

FAQ

The Actor collects public listing data. You are responsible for Craigslist's terms and applicable data protection law. Public availability does not remove the need for a lawful basis when processing personal data.

Why did my run end as ABORTED?

Check the run's status message and log for the reason. Cancellation can end a run before collection or delivery finishes. Inspect the dataset for rows already saved; do not treat the status alone as proof of completion or automatic restart.

How many results can I get?

Up to maxItems per area or URL, within the 2,000-per-input maximum, available inventory, and run charge limit. Free-plan runs have a separate 200-row total cap. A requested count is a ceiling, not a guarantee.

Why are some fields empty?

Posters may omit prices, floor area, addresses, or contact details. Categories differ, and restricted contact information may remain unavailable. Search-only rows contain fewer details. Check leadAbsences for contact-specific explanations.

Can I get phones and reply emails?

Only when public listing content or an accessible reply page supplies them. Reply contact details are not guaranteed. The Actor does not send messages, and a posting number is never treated as a phone number.

Does category all mean every Craigslist section?

No. all expands housing categories. Use sss for for-sale listings, jjj for jobs, or another supported section or category code for other classifieds.

Why did a run succeed with zero rows?

A search with no matching listings can succeed with NO_MATCH. An unresolved area can return LOCATION_UNRESOLVED. Check the slug and loosen filters. Collection errors are not automatically treated as valid empty results.

Do I need a Craigslist account or API key?

No Craigslist account or key is required for public listing searches. Apify API calls require your Apify token. Use area slugs from the supported catalog; country and language normally follow that area.

Limitations

  • Public listings only; no private account data or guaranteed reply contacts.
  • The catalog's 707 entries do not guarantee current inventory or coverage of every category.
  • Prices are not currency-converted. Compare markets and price text carefully.
  • Sitemap discovery is date-based and does not apply normal search filters.
  • Structured organization and website fields are not populated with agency identities.
  • Attribute and photo lists are capped at 50 entries; oversized body text can be shortened.
  • Larger requests and detail enrichment take longer. Start with a small sample.

More real estate and property data scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.