Craigslist Scraper – Listings, Prices & Seller Contacts
Pricing
from $1.35 / 1,000 listing records
Craigslist Scraper – Listings, Prices & Seller Contacts
Scrape Craigslist listings from any city and category. Returns title, price, images, location, post_id, URL, and optionally description, posted date, and structured attributes. No proxy required. Parses server-side JSON-LD — stable against layout changes.
Pricing
from $1.35 / 1,000 listing records
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Craigslist Scraper — Listings, Prices & Locations
Scrape Craigslist listings from any US city, category, and search query. Get title, price, images, location, post ID, and listing URL — plus optional description, posted datetime, and structured attributes (car specs, condition, odometer, etc.) from detail pages. This Craigslist scraper targets the JSON-LD ItemList block embedded by Craigslist itself — structural schema.org data, not CSS class names — making it immune to layout redesigns. No proxy required. Pay per result at $1.39 per 1,000 listings.
Not affiliated with or endorsed by Craigslist.
What you get
| Field | Source | Notes |
|---|---|---|
post_id | DOM link | 10-digit Craigslist post ID |
title | JSON-LD | Listing title |
price | JSON-LD | Numeric float; null for free/contact items |
price_currency | JSON-LD | "USD" |
city | JSON-LD | City name (e.g. "San Francisco") |
state | JSON-LD | State abbreviation (e.g. "CA") |
neighborhood | Detail page | Sub-city neighborhood; null if not set |
latitude / longitude | JSON-LD + detail | Precise coords from detail page when fetchDetails=true |
url | DOM link | Full listing URL |
category | URL | Category abbreviation (e.g. "bik", "cto") |
area_abbrev | URL | Metro sub-area (e.g. "sby", "sfc") |
posted_datetime | Detail page | ISO-8601 UTC; requires fetchDetails=true |
image_urls | JSON-LD | Array of full-size CDN image URLs |
description | Detail page | Plain-text body; requires fetchDetails=true |
attributes | Detail page | Dict of label→value (condition, make, cylinders, etc.) |
parse_confidence | Computed | 0.0–1.0 data quality score |
warnings | Computed | List of parse-issue codes |
scraped_at | Computed | ISO-8601 UTC timestamp |
Common city slugs
| City | Slug |
|---|---|
| San Francisco Bay Area | sfbay |
| New York | newyork |
| Los Angeles | losangeles |
| Chicago | chicago |
| Seattle | seattle |
| Austin | austin |
| Boston | boston |
| Denver | denver |
Full list: https://www.craigslist.org/about/sites
Common category codes
| Category | Code |
|---|---|
| For sale — all | sss |
| Bicycles | bik |
| Cars & trucks by owner | cto |
| Electronics | ele |
| Furniture | fua |
| Apartments | apa |
| Jobs | jjj |
| Clothing | clt |
Full list: https://www.craigslist.org/about/help/abbreviations
Example input
{"city": "sfbay","query": "honda civic","category": "cto","maxResults": 50,"fetchDetails": true}
Example output record
{"post_id": "7938685561","title": "2018 Honda Civic EX","price": 18500.0,"price_currency": "USD","city": "San Jose","state": "CA","neighborhood": "South Bay","latitude": 37.3403,"longitude": -121.9701,"url": "https://sfbay.craigslist.org/sby/cto/d/san-jose-2018-honda-civic-ex/7938685561.html","category": "cto","area_abbrev": "sby","posted_datetime": "2026-06-04T10:51:23+00:00","image_urls": ["https://images.craigslist.org/00h0h_ABC_600x450.jpg"],"description": "Clean title, low miles, well maintained...","attributes": {"condition": "excellent","cylinders": "4 cylinders","drive": "fwd","fuel": "gas","odometer": "45,000","title status": "clean","transmission": "automatic"},"parse_confidence": 1.0,"warnings": [],"scraped_at": "2026-06-04T12:00:00+00:00"}
How it works
- One HTTP request fetches the Craigslist search page for your city/category/query.
- JSON-LD parsing (structural, not CSS): Craigslist embeds all results as a
schema.org ItemListin the page<head>. Up to ~350 results per query. - DOM link extraction: listing URLs (with post_id, category, area_abbrev) are
extracted from
<a>tags in the body and matched to JSON-LD items by title slug. - Detail page (optional): each listing's page is fetched for
posted_datetime, description, and structured attributes.
Pricing
Pay-per-result: $0.00139 per listing ($1.39 / 1,000 listings).
With fetchDetails=false (default): ~1 request/run → very fast, very cheap.
With fetchDetails=true: 1 + N requests (one per listing) → richer data, proportionally more compute.
Use cases for Craigslist data
- Price research — benchmark used car, electronics, or furniture prices across cities
- Real estate leads — monitor for-rent and for-sale listings in target neighborhoods
- Resale arbitrage — find underpriced items listed by private sellers
- Job market intelligence — pull job listings from the
jjjcategory across metros - Academic research — analyze classifieds data for economics or sociology studies
- Competitor monitoring — track similar items listed by other sellers in your category
Frequently asked questions
Do I need a proxy? No. Craigslist search pages are server-side rendered and respond 200 from datacenter IPs. No proxy configuration is needed.
How many results per search? Craigslist includes all matching results in one JSON-LD block — typically up to ~350 items per query. For more coverage, run multiple narrowed queries.
How do I get descriptions and car specs? Set fetchDetails: true. This fetches each listing's detail page to extract description, posted_datetime, neighborhood, precise latitude/longitude, and structured attributes (condition, make, cylinders, etc.). This multiplies request count by N listings.
What is fetchDetails=false good for? Fast, cheap bulk listing collection — title, price, images, location, and URL from a single search-page request. Good for price monitoring and deduplication.
What does parse_confidence mean? 0.0–1.0 data quality score. 1.0 = all critical fields extracted. Below 0.7 = Craigslist may have changed its JSON-LD structure; check warnings for affected fields.
Can I scrape multiple cities? Yes — run the actor multiple times with different city slugs, or use Apify's batch run API to fan out across cities in parallel.
Limitations
- Results per search: up to ~350 (Craigslist's JSON-LD includes all results in one page).
posted_datetime,description,attributesrequirefetchDetails=true.neighborhoodis only available on listings where the poster set it.- Craigslist does not expose full
posted_datetimeon search pages.
Integrations
Built for market researchers and resellers tracking US local listings, pricing trends, and inventory by city and category — the JSON/dataset output drops into the tools you already run, no glue code:
- n8n / Make / Zapier — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: n8n, Make, Zapier.
- Webhooks — fire your own endpoint the moment a run finishes, to push results straight into your pipeline (docs).
- MCP server — expose this actor as a tool to Claude, Cursor, or any MCP client so an AI agent can pull this data mid-conversation (guide).
- API & SDKs — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.
See all Apify integrations.
More scrapers from our toolkit
Building a data pipeline? These actors pair well with this one — each runs on your own Apify account with the same pay-per-result pricing, no subscription:
- Doordash Scraper
- Ebay Scraper
- Etsy Listings
- Facebook Marketplace Scraper
- Grailed Listings
- Kleinanzeigen Listings Scraper
Chain any of them together from the Integrations tab (the Run succeeded trigger) to build a multi-step workflow — one actor's output feeds the next.
Use it from your existing tools
Use with Claude Desktop / Cursor / Cline (MCP)
Load this actor as a tool in your AI assistant. Call it directly from your AI assistant via the Apify MCP server — no Store browsing needed. Paste this into your MCP client config (e.g. claude_desktop_config.json) and restart the client:
{"mcpServers": {"apify-craigslist-scraper": {"command": "npx","args": ["-y","@apify/actors-mcp-server","--tools","bovi/craigslist-scraper"],"env": {"APIFY_TOKEN": "YOUR_APIFY_TOKEN"}}}}
Replace YOUR_APIFY_TOKEN with your own Apify API token (free at apify.com → Settings → Integrations). Curated to a handful of tools so the agent selects reliably.
Works with Clay
Run this actor as an HTTP enrichment step inside a Clay table:
- Method:
POST - URL:
https://api.apify.com/v2/acts/bovi~craigslist-scraper/run-sync-get-dataset-items?token={{apify_token}} - Body (JSON): map your Clay columns to the actor input (see the Input section above), e.g.
{"city": "{{clay_column}}"}
The run finishes synchronously and returns the dataset rows straight into your Clay table. It runs on Apify's cloud under your own token and usage. Synchronous runs must complete within 300 seconds.