Craigslist Scraper - Housing, Jobs and Cars
Pricing
from $1.32 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
14
Total users
3
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
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, acategory, and optional filters. - URL search: supply search or listing links in
startUrls. - Coordinate search: supply
latandlonto find a Craigslist area. - Sitemap discovery: select
discoveryMode: "sitemap"for date-based listing discovery. - Detail enrichment:
scrapeDetailsdefaults totrue. 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.
| Field | Description | Example |
|---|---|---|
rowType | Row type | listing |
id | Listing identity | 1234567890 |
postingId | Craigslist posting number, when available | 1234567890 |
title | Listing title | Two-bedroom apartment |
price | Numeric asking price or rent | 1800 |
priceText | Displayed price text | $1,800 |
category | Craigslist category code | apa |
categorySection | Classified section | housing |
location | Craigslist area slug | phoenix |
city | City or area name | Phoenix |
country | Country name | United States |
cc | Country code | us |
url | Public listing link | https://www.craigslist.org/view/d/phoenix/example-listing-id |
postedAt | Posting date and time, when supplied | 2026-10-24T10:00:00Z |
scrapedAt | Row preparation time in UTC | 2026-10-24T10:05:00Z |
bedrooms | Bedroom count | 2 |
bathrooms | Bathroom count | 1 |
sqft | Floor area in square feet | 900 |
body | Listing description | Two-bedroom apartment with parking. |
images | Photo URLs | [] |
attributes | Additional listing attributes | {"laundry":"on site"} |
address | Street, unit, locality, region, and postal details | {"street":null,"locality":"Phoenix"} |
geo | Map coordinates, when available | {"lat":33.45,"lng":-112.07} |
phones | Public phone entries; not posting numbers | [] |
emails | Public or relay email entries | [] |
person | Poster name and role, when shown | {"name":"Jane Doe","role":"poster"} |
leadAbsences | Reasons 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
- Open Craigslist Scraper in Apify Console.
- Fill one target:
locations,startUrls, or bothlatandlon. - Choose a category and set
maxItemsto3for a first run. - Click Start and check the run status.
- 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.
Area search
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
| Field | What to enter | Default |
|---|---|---|
locations | Official area slugs | Empty; example phoenix |
startUrls | Craigslist search or listing URLs | Empty |
lat, lon | Both coordinates, without another target | Empty |
category | Category code; all means housing categories | apa |
query | Search words, sent without translation | Empty |
country, lang | Optional country/language overrides | Area catalog |
purveyor | Empty, owner, or dealer | Empty |
minPrice, maxPrice | Price or rent bounds | Unset |
minBedrooms, maxBedrooms | Bedroom bounds | Unset |
minBathrooms, maxBathrooms | Bathroom bounds | Unset |
minSqft, maxSqft | Floor-area bounds | Unset |
housingType, laundry, parking | Numeric choices described in the form | Unset |
catsOk, dogsOk, furnished, noSmoking | Required housing amenities | false |
wheelchairAccessible, evCharging, airConditioning | Required accessibility or amenities | false |
privateRoom, privateBath | Room requirements | false |
hasPic, postedToday | Require photos or today's postings | false |
searchNearby | Include nearby areas | false |
postal, searchDistance | Postal code and Craigslist distance setting | Unset |
bundleDuplicates | Ask Craigslist to group duplicates | false |
saleDate | Event date, YYYY-MM-DD | Unset |
sort | date, dateoldest, priceasc, pricedsc | date |
maxItems | Rows per area or URL, from 1 to 2,000 | 70; example 3 |
scrapeDetails | Include listing details | true |
imageSize | 300x300, 600x450, or 1200x900 | 600x450 |
maxDetailConcurrency | Simultaneous detail requests, 1–15 | 5 |
requestDelayMillis | Request spacing in milliseconds, 0–10,000 | 250 |
discoveryMode | search or sitemap | search |
sitemapDate | Sitemap date, YYYY-MM-DD | Today in UTC |
sitemapIndexes | Optional sitemap index identifiers, 00–29 | Unset |
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 plan | Start fee at 512 MB | Price per row | Price 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 ApifyClientclient = 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
Is it legal to scrape Craigslist?
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.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Rental Scraper
- Dot Property Scraper
- FINN.no Scraper
- Immobiliare.it Scraper
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.