Craigslist Scraper: Listings, Phones, Leads and Prices
Pricing
from $1.17 / 1,000 listings
Craigslist Scraper: Listings, Phones, Leads and Prices
Search Craigslist services, gigs, jobs, housing, for sale and community by city, category, keyword, price and posted today, or paste links: one row per listing with price, neighbourhood, coordinates, dates, full text, attributes, images and any phone or email it shows. No login.
Pricing
from $1.17 / 1,000 listings
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
From The Mine Works, makers of Thomasnet Supplier Scraper and B2B Leads Finder, with over 245,000 runs across 280+ public actors.
Updated 27 Oct 2026: first release. Services, gigs, jobs, housing, for sale, community, resumes and events on all 707 Craigslist sites in the US, Canada and abroad; keyword, price, posted today, image, postal code and any Craigslist filter; search links and listing links; monitor mode for new listings only; one flat row per listing with price, neighbourhood, coordinates, posted and updated dates, full text, attributes, images and the phones, emails and websites the listing writes. Bookmark this Actor on its Store page so it is one click away next time.
Why choose this actor?
- Leads you can call. Every row carries
phoneandphones(as+1XXXXXXXXXXfor US and Canadian numbers),emailsandwebsites, read from the title, the location line and the full text of the listing. In our services test, 423 of 450 plumber listings across San Francisco, Los Angeles and Chicago had a phone (94%). When Craigslist hides a number behind its "show contact info" button,contact_hidden_in_textsays so; that button and the reply email sit behind a CAPTCHA, which this actor does not open (see the FAQ). - Every listing in full, at one price. Full description, all attributes as a clean object (
bedrooms,bathrooms,condition,sale_manufacturer,odometer,remuneration,employment_typeand the rest), up to 24 images, street address when the poster gave one, coordinates, and three dates: first posted, last edited and last renewed. No extra fee for the details. - Built for market tracking.
listing_id,repost_of,renewed_atandpriceare columns, so a scheduled run shows new stock, price cuts and reposts. Monitor mode skips listings an earlier run already delivered, before they are read, and does not charge for them. - Pay per listing, nothing for errors. Links that are not Craigslist links, deleted listings, a listing that two of your searches find, listings skipped by monitor mode and the summary row are never charged. No Craigslist account, no browser.
Part of The Mine Works E-commerce and marketplaces family: Ozon.ru Scraper, ⭐ Amazon Reviews Scraper, Amazon Product Scraper, Etsy Listings Scraper, AliExpress Scraper, Kleinanzeigen.de Scraper.
Guide and FAQs: Craigslist Scraper on themineworks.com.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns the 20 newest plumber listings in the San Francisco Bay Area services section, each with its full text and the phone it shows. It took 12 seconds in our test run:
{"sites": ["sfbay"],"categories": ["services"],"searchQueries": ["plumber"],"maxItems": 20}
Put several sites, categories or keywords on separate lines to run every combination at once, or paste a Craigslist search or listing link into startUrls. A listing that two of your searches find is delivered once.
Apify's free plan includes $5 of credit every month, which covers about 3,000 listings at this actor's price.
Copy to your AI assistant
themineworks/craigslist-scraper on Apify. Reads Craigslist (craigslist.org) by site, category and keyword, or by search and listing links, and returns one flat row per listing with title, price, neighbourhood, coordinates, posted and updated dates, full description, attributes, images and any phone, email or website the listing writes, with no login. Call ApifyClient("TOKEN").actor("themineworks/craigslist-scraper").call(run_input={"sites": ["sfbay"], "categories": ["services"], "searchQueries": ["plumber"], "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give sites (list: sfbay, newyork, toronto, london, or newyork/brk with a sub area), categories (list: services, gigs, jobs, housing, for sale, community, resumes, events, or a code such as apa, cto, sks), searchQueries (list of keywords) and/or startUrls (list of Craigslist search links and listing links). Optional: countries (list of country codes, every site of the country), maxItems (default 100, 1 to 10,000 per search), sort (newest, relevance, price_low, price_high, oldest, distance; default newest), minPrice, maxPrice, postedToday, hasImage, titlesOnly, hideDuplicates, postalCode with searchDistance (miles), searchParams (object of any other Craigslist filter, e.g. {"min_bedrooms": 2}), includeDetails (default true), monitorMode (default false) with monitorName, includeNearbyAreas (default false). Listing rows have no _type field and carry listing_id, posting_uuid, title, url, price, price_text, currency, section, category, category_code, site, site_name, country, region, subarea, subarea_code, neighbourhood, location_text, street_address, latitude, longitude, location_precision, posted_at, updated_at, renewed_at, description, attributes, bedrooms, bathrooms, area_sqft, compensation, employment_type, job_title, company_name, images, image_count, thumbnail_url, phone, phones, emails, websites, has_contact_in_text, contact_hidden_in_text, reply_contact_behind_captcha, repost_of, notices, is_nearby_area, details_scraped, found_by, search_label, search_site, search_category, search_keyword, search_url, results_in_search, position, input_url, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when listings were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~craigslist-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- Any site, any section. All 707 Craigslist sites: 413 in the US, 55 in Canada, 27 in the UK and the rest abroad, by the first part of the address (
sfbay,newyork,london) or the name Craigslist gives the site. A sub area after a slash (newyork/brk,sfbay/sfc) narrows the search.countriessearches every site of a country. - Sections and categories.
services,gigs,jobs,housing,for sale,community,resumesandevents, or any category by its code from Craigslist links (apaapartments,ctocars by owner,sksskilled trade services,cpgcomputer gigs) or by its name. - Craigslist's own filters. Keyword, titles only, min and max price, posted today, with images, hide duplicates, ZIP or postal code with a distance in miles, and any other filter from a Craigslist search link through
searchParams(bedrooms, pets, make and model, odometer, employment type). The sort is Craigslist's own: newest, relevance, price either way, oldest or distance. - Search links and listing links. Paste a search link and it runs with every filter in it. Paste listing links and each returns its row: built for one record per run from Clay, n8n or an AI agent.
- Monitor mode. With
monitorModeon, listings an earlier run with the samemonitorNamedelivered are skipped before they are read and never charged. Schedule it hourly or daily and each run returns only new listings. - Up to 10,000 per search. Craigslist serves at most 10,000 results per search; the actor reads them in its own order, 1,080 at a time, and stops at your
maxItems. - Stops cleanly. Eight failed or blocked requests in a row end the run; the run stops before its time limit and keeps every row it read. The summary row says what was read, what was skipped and why.
How to use it
Lead list: tradespeople who post their phone
{"sites": ["sfbay", "losangeles", "sandiego"],"categories": ["services"],"searchQueries": ["roofing", "hvac"],"maxItems": 300}
Six searches, newest first. Filter the dataset on has_contact_in_text to keep the listings that write a phone or email, and use the "Contacts" view for a ready table.
Rentals for a market report
{"sites": ["austin"],"categories": ["apa"],"minPrice": 800,"maxPrice": 4000,"searchParams": { "min_bedrooms": 2 },"maxItems": 2000}
Each row has price, bedrooms, bathrooms, area_sqft, neighbourhood, latitude and longitude, and the full attributes (laundry, parking, pets, housing type) in attributes.
Monitor: only new listings, every hour
{"sites": ["newyork"],"categories": ["cpg"],"monitorMode": true,"monitorName": "nyc-computer-gigs","maxItems": 100}
Save it as a task and schedule it. The first run returns up to 100 listings; each later run returns only the listings posted since. Listings skipped as seen are not charged.
Search links and listing links
{"startUrls": ["https://chicago.craigslist.org/search/cto?auto_make_model=toyota&max_price=15000","https://sfbay.craigslist.org/eby/apa/d/walnut-creek-make-yourself-at-home/7988118918.html"]}
The search link runs with its filters; the listing link returns that listing. A listing that was deleted or expired gets an error row and is not charged.
Every site in a country
{"countries": ["CA"],"categories": ["ggg"],"postedToday": true,"maxItems": 50}
All 55 Canadian sites, gigs posted today. Up to 200 searches per run: with countries, keep to one category and one keyword.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
sites | array of strings | sfbay when only keywords are given | City sites by address part, address or name; site/subarea narrows to a sub area. |
categories | array of strings | for sale | Sections (services, gigs, jobs, housing, for sale, community, resumes, events) or category codes and names. |
searchQueries | array of strings | empty | Keywords; each runs in every site and category. Empty reads the whole category. |
startUrls | array of strings | empty | Craigslist search links and listing links. |
countries | array of strings | empty | Two letter country codes; every site of each country. |
maxItems | integer | 100 | Most listings per search, 1 to 10,000. Listing links are not limited by it. |
sort | string | newest | newest, relevance, price_low, price_high, oldest, distance. |
minPrice, maxPrice | integer | none | Price range in the site's currency. |
postedToday | boolean | false | Only listings posted or renewed in the last 24 hours. |
hasImage | boolean | false | Only listings with images. |
titlesOnly | boolean | false | Match keywords in titles only. |
hideDuplicates | boolean | false | Craigslist's hide duplicates filter. |
postalCode, searchDistance | string, integer | none, 25 | Listings within this many miles of a US ZIP or Canadian postal code. |
searchParams | object | none | Any other filter from a Craigslist search link, e.g. {"min_bedrooms": 2}. |
includeDetails | boolean | true | Read each listing in full. Off returns the result list fields only. |
monitorMode, monitorName | boolean, string | false, default | Skip listings an earlier run with the same name delivered. |
includeNearbyAreas | boolean | false | Keep the nearby site listings Craigslist adds under small result lists. |
Give sites with categories or searchQueries, startUrls, or both. Up to 200 searches and 5,000 listing links per run.
What data do you get?
One row per listing. Listing rows have no _type field; the summary, info and error rows do, so a filter on _type separates them.
| Field | What it is |
|---|---|
listing_id | Craigslist posting ID, e.g. 7990580793 |
posting_uuid | The posting key Craigslist's own pages use |
title | Listing title |
url | Listing link on the city site |
price, price_text, currency | Price as a number, as shown ($2,539) and the site's currency |
section, category, category_code | housing, apartments / housing for rent, apa |
site, site_name, country, region | sfbay, SF bay area, US, CA |
subarea, subarea_code, neighbourhood | east bay, eby, walnut creek |
location_text, street_address | The location line the poster wrote, and the street address when given |
latitude, longitude, location_precision | Coordinates; exact_pin when the poster placed a map pin, area otherwise |
posted_at, updated_at, renewed_at | First posted, last edited, last renewed (Craigslist sorts by renewed) |
description | Full listing text |
attributes | Every attribute by key: bedrooms, laundry, parking, condition, make, odometer, compensation, employment type and so on |
bedrooms, bathrooms, area_sqft | Housing basics as numbers |
compensation, employment_type, job_title, company_name | Jobs and gigs basics |
images, image_count, thumbnail_url | Image links (1200x900) and a 300x300 thumbnail |
phone, phones | Phone numbers written in the listing, +1XXXXXXXXXX for US and Canada |
emails, websites | Emails and website links written in the listing |
has_contact_in_text | True when the listing writes a phone or email itself |
contact_hidden_in_text | True when Craigslist replaced a phone in the text with its "show contact info" button (not read) |
reply_contact_behind_captcha | True when the reply button holds contact details (not read) |
repost_of | The posting ID this listing reposts, when Craigslist links them |
notices | Notices Craigslist shows on the listing |
is_nearby_area | True for nearby site listings (only with includeNearbyAreas) |
details_scraped | True when the listing was read in full |
found_by, search_label, search_site, search_category, search_keyword, search_url, results_in_search, position | How it was found |
input_url | The listing link you gave |
scraped_at | When the row was read |
Stable fields for automations
These were present in every listing row of our test runs (1,470 rows), and their names will not change:
| Field | What it is |
|---|---|
listing_id | The key to store and join on |
title, url | Title and link |
category, category_code, section | What kind of listing |
site, country | Where |
latitude, longitude | Coordinates |
posted_at, renewed_at | When |
description | Full text |
found_by, position | How it was found |
Optional, present only when the listing has a value: price (100% of apartment rows, rare on services), phone (94% of services rows, few housing rows), websites (84% of apartment rows, 23% of services rows), images (87% to 98%), street_address (35% to 95%), neighbourhood, attributes, emails, repost_of.
Output examples
A services listing (text shortened):
{"listing_id": "7990820508","title": "SL Plumbing AND Remodeling Services","url": "https://sfbay.craigslist.org/eby/sks/d/pittsburg-sl-plumbing-and-remodeling/7990820508.html","section": "services","category": "skilled trade services","category_code": "sks","site": "sfbay","country": "US","subarea": "east bay","neighbourhood": "hercules, pinole, san pablo, el sob","latitude": 38.0031,"longitude": -121.9172,"location_precision": "area","posted_at": "2026-10-27T18:05:09.000Z","description": "INSTALLATION OF:\n\nWATER, GAS, SEWER LINES, ROOTERS\n\nFAUCETS*DISPOSALS*DISHWASHERS ...","attributes": { "license_info": "Lic.833075 - B C- 36 Bonded and insured" },"image_count": 24,"phone": "+19255655839","phones": ["+19255655839"],"has_contact_in_text": true,"reply_contact_behind_captcha": true,"repost_of": "6894407958","found_by": "search","search_keyword": "plumber","position": 2}
An apartment listing (attributes shortened):
{"listing_id": "7988118918","title": "Make Yourself at Home!","url": "https://sfbay.craigslist.org/eby/apa/d/walnut-creek-make-yourself-at-home/7988118918.html","price": 2539,"price_text": "$2,539","currency": "USD","category_code": "apa","neighbourhood": "walnut creek","street_address": "1755 Trinity Ave","latitude": 37.90102,"longitude": -122.065346,"location_precision": "exact_pin","posted_at": "2026-10-22T20:05:10.000Z","renewed_at": "2026-10-27T14:06:46.000Z","bedrooms": 1,"bathrooms": 1,"area_sqft": 625,"attributes": { "bedrooms": "1", "bathrooms": "1", "area": "625 ft²", "movein_date": "2026-11-12", "laundry": "laundry on site", "parking": "carport", "pets_cat": true, "pets_dog": true, "ev_charging": true },"image_count": 8}
An error row for a listing that is gone (nothing charged):
{ "_type": "error", "error_type": "not_found", "identifier": "https://sfbay.craigslist.org/sfc/apa/d/old-listing/7900000000.html", "reason": "Craigslist has no live listing with this id on that site: it was deleted, expired or flagged." }
Pricing
Pay per event: you pay for the listings you receive, plus a flat $0.002 per run, whatever memory you choose. The full text, attributes, images and contact fields cost nothing extra.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
listing-scraped | Once per listing row stored in your dataset | $1.62 per 1,000 | $1.35 per 1,000 | $1.26 per 1,000 | $1.17 per 1,000 |
run-start | Once per run, after the first listing row is stored | $0.002 | $0.002 | $0.002 | $0.002 |
The price of one listing is the price per 1,000 divided by 1,000.
Never charged:
- inputs that are not Craigslist sites, categories or links (each gets an error row);
- listings that were deleted, expired or flagged;
- a listing that a second search of the same run finds again;
- listings monitor mode skips because an earlier run delivered them;
- listings past your
maxItems; - the summary, info and error rows;
- a run that delivers no listing: the start fee is charged only after the first listing row is stored;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.
Run it on a schedule
- Open the actor in Apify Console, set your input, turn on
monitorModewith amonitorName, and click Save as a new task. - In the task, open Schedules, click Add schedule and pick how often (every hour, every morning at 08:00 and so on).
- Each run then returns only listings posted since the run before. Without monitor mode, compare runs on
listing_idandpriceto see price cuts, and onrepost_ofto see reposts. - Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.
FAQ
What does this actor read?
The same data craigslist.org shows to any visitor, read from the JSON service its own search and listing pages call: the result list of each search, then each listing in full. Nothing is rendered in a browser and nothing is posted, flagged or replied to.
Does it get the hidden reply email or phone?
No. Craigslist keeps the reply email, and any phone it replaces with a "show contact info" button, on its /reply page, which it shows only after a CAPTCHA. This actor does not solve CAPTCHAs or open that page (Craigslist's robots.txt also asks crawlers to keep away from /reply). contact_hidden_in_text is true when a number in the text was replaced that way, so you can open those listings yourself. What you do get is every phone, email and website the poster wrote in the title, the location line or the text. That is most services listings (423 of 450 plumber listings in our test had a phone) and few housing listings: property managers mostly use the hidden button, and the row then carries their website instead (84% of 1,000 Bay Area apartment rows).
How many listings can I get?
Up to maxItems per search, and at most 10,000, which is the most Craigslist serves for one search. A big site's housing or for sale section holds more than that: split it by sub area (sfbay/sfc, sfbay/eby), by category code (apa, roo, sub) or by price range.
How long does a run take?
About 12 seconds for 20 listings read in full, 133 seconds for 450 services listings from three cities, and 276 seconds for 1,000 apartment listings, in our test runs (1,455 requests, none retried or refused). With includeDetails off a search of 1,000 takes a few seconds.
Why do some rows have no price, phone or coordinates?
Craigslist shows a price only where the poster gave one (housing and for sale mostly; services rarely). A phone or email is in the row only when the poster wrote it in the listing. Coordinates are an exact pin when the poster placed one, otherwise the centre of the area or neighbourhood they chose. Empty fields are left out of the row rather than sent as blanks.
Do I need a Craigslist account, cookies or a proxy?
No. The actor reads public listings over Apify Proxy, which is included. Nothing to set up.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/craigslist-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http craigslist-scraper "https://mcp.apify.com/?tools=themineworks/craigslist-scraper"
Which formats can I download?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has four ready views: Listings, Contacts (lead generation), Market tracking, and Full text and attributes. In CSV and Excel, attributes is flattened into columns such as attributes/bedrooms and lists into phones/0, images/0.
How fresh is the data?
Every run reads Craigslist live, at the time of the run. Rows carry Craigslist's own posted_at and updated_at where Craigslist gives them, and scraped_at, the moment the actor read the listing. Turn on postedToday to keep only listings posted or renewed in the last 24 hours.
Can I get only new listings each day?
Yes. Turn on monitorMode, give the monitor a monitorName such as rentals-austin, and schedule the run. Listings delivered by an earlier run with the same monitor name are skipped before they are read and are not charged, so each run returns only the listings that are new since the one before. Use a separate monitor name for each search you track.
Is it legal to scrape Craigslist?
The actor reads only listings that Craigslist shows to any visitor without logging in. It does not log in, post, reply, flag or solve CAPTCHAs, and it does not request any path that Craigslist's robots.txt disallows (/reply, /flag and the like). Craigslist's terms of use restrict automated access and the commercial use of its content, and listings can hold personal data such as a poster's phone number. You are responsible for how you use the data, including Craigslist's terms, data protection law such as the GDPR and the CCPA, and the rules on calling, texting and emailing people in your country (for example the TCPA and CAN-SPAM in the US). This is general information, not legal advice. Craigslist is a trademark of craigslist, Inc.; this actor is independent and not affiliated with it.
Integrations
- Google Sheets: send each run's listings to a sheet with Apify's Google Sheets integration; one row per listing fits a sheet as is.
- Clay, Make, Zapier and n8n: call the actor once per record with a listing link, or run a monitor search and read its dataset, for example "new roofing listings with a phone every morning to the CRM".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
E-commerce and marketplaces
- Ozon.ru Scraper
- ⭐ Amazon Reviews Scraper
- Amazon Product Scraper
- Etsy Listings Scraper
- AliExpress Scraper
- Kleinanzeigen.de Scraper
- Carsales.com.au Scraper
- eBay Product Listings Scraper
- Shopify Store Scraper
- 🛒 TikTok Shop Scraper
- Walmart Product & Price Scraper
- Vinted Scraper
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
Food and local services
Developer and AI tools
More tools
Support
Found a search that returns fewer listings than the site, or a field that comes back empty when the listing has it? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.
Search Craigslist by city, category and keyword and get every listing back as one row, with price, neighbourhood, coordinates, dates, full text, attributes, images and the phone or email it shows, no login.

