Craigslist Scraper: Public Craigslist Listings via API
ProxyField's Web Scraping API is designed to fetch public Craigslist search and listing pages, in any city and category, for $0.50 per 1,000 successful results over plain HTTP, or $0.20 from 10,000 results in one purchase ($2.00 per 1,000 with JS rendering, rarely needed here); it is in development, so access is through Contact sales. To run your own Craigslist scraper today, use ProxyField residential proxies, 61.2M+ IPs in all 50 US states, starting with the Easy Trial: 1 GB for $2.95. There is no nationwide Craigslist search, so a scraper loops over the city sites (newyork.craigslist.org, sfbay.craigslist.org and the rest), reads the first search page of each, keeps the post IDs it has not seen and merges by post ID: 50 cities × 2 categories every hour is 72,000 pages a month, $36 at $0.50 per 1,000 or $14.40 at $0.20. Read Craigslist's terms before you start: they forbid collecting its content with scrapers and charge $0.25 a page beyond 1,000 pages in 24 hours.
Through the sales team on our 24/7 live chat
| Fetch | Entry | Volume, from |
|---|---|---|
| HTTP | $0.50 | $0.20 |
| JS rendering | $2.00 | $1.00 |
Billed on successful results only.
| You need | ProxyField |
|---|---|
| API price (design) | Plain HTTP $0.50 per 1,000 successful results, $0.20 from 10,000 in one purchase; JS rendering $2.00, $1.00 from 10,000 |
| Proxy price | $2.95/GB for 1 GB, $2.79 from 10 GB, $2.65 from 50 GB, $2.49 from 100 GB, $2.29 from 250 GB, $2.09 from 500 GB, $1.95 from 1,000 GB |
| US coverage | 61.2M+ residential IPs, 2,800+ cities, all 50 states; city targeting such as city-new_york |
| Sessions | a new IP on every request, or sticky from 30 s to 36 h (20 min by default) |
| Payment | one crypto balance for the API and proxies, never expires, no subscription |
Scrape new Craigslist listings in every city
Craigslist is a set of local sites, one per city or region, each at its own subdomain, and none of them searches the others. To follow new listings everywhere, run the same search on every city site you need and merge the results:
-
Take the city list from Craigslist's sites page (
https://www.craigslist.org/about/sites): one subdomain per area, in the US, Canada, the United Kingdom, Europe and beyond. -
Build one search URL per city and category, sorted newest first:
https://<city>.craigslist.org/search/cta?sort=date. -
Fetch the first search page of each, a few seconds apart per IP, through rotating residential IPs or the Web Scraping API.
-
Keep only post IDs you have not seen
The post ID is the number before
.htmlin each listing link. Stop reading a page at the first ID you already have: everything below it is older. -
Fetch the new listing pages for price, attributes, description and dates, then store each listing with its post ID, city and the time of the check.
Read moreShow less
Nearby areas overlap (a post can show on more than one site's search), so expect duplicates and merge by post ID.
import re, json, time, requests
from bs4 import BeautifulSoup
PROXY = "http://<login>-country-us:<password>@gate.proxyfield.io:7000"
CITIES = ["newyork", "sfbay", "chicago", "losangeles", "seattle"] # from craigslist.org/about/sites
CATEGORIES = ["cta", "apa"] # cars and trucks, apartments
SEEN_FILE = "seen.json"
try:
seen = set(json.load(open(SEEN_FILE)))
except FileNotFoundError:
seen = set()
new = []
for city in CITIES:
for cat in CATEGORIES:
url = f"https://{city}.craigslist.org/search/{cat}?sort=date"
r = requests.get(url, proxies={"http": PROXY, "https": PROXY},
headers={"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US"},
timeout=30)
soup = BeautifulSoup(r.text, "html.parser")
# Craigslist changes its markup: check this selector on a live page first
for li in soup.select("li.cl-static-search-result"):
a = li.find("a")
m = re.search(r"/(\d+)\.html", a["href"]) if a else None
if not m:
continue
if m.group(1) in seen:
break # older listings from here on
seen.add(m.group(1))
price = li.select_one(".price")
new.append({"id": m.group(1), "city": city, "category": cat,
"title": li.get("title"), "price": price.text if price else None,
"url": a["href"]})
time.sleep(4)
json.dump(sorted(seen), open(SEEN_FILE, "w"))
print(len(new), "new listings")Run it on a schedule (hourly for cars or rentals in big cities, daily for research). Each run is one request per city and category, so the cost is easy to predict:
| Workload (30-day month) | Pages a month | Plain HTTP at $0.50 | At $0.20 (from 10,000 in one purchase) |
|---|---|---|---|
| 50 cities × 2 categories, first search page, every hour | 72,000 | $36 | $14.40 |
| 3,000 new listing pages a day | 90,000 | $45 | $18 |
| Both | 162,000 | $81 | $32.40 |
What Craigslist's terms say about this. Craigslist's terms of use (last updated August 16, 2019) forbid copying or collecting its content "via robots, spiders, scripts, scrapers, crawlers", and set a charge of $0.25 per page for anyone who requests more than 1,000 pages in any 24-hour period (craigslist terms of use). Every workload in the table is above that line, so get Craigslist's written permission before you collect at this scale. ProxyField's rule for every site: public pages only, and follow the site's terms.
Craigslist's own route: saved searches and alerts
If you only need to be told about new posts, Craigslist does it itself: save a search in your account and turn on its alert. The alert email shows up to 20 results, newest first, and includes renewed, reposted and edited posts that now match (craigslist search alerts). It covers the areas the saved search covers, so a nationwide watch means one saved search per region. Craigslist no longer publishes RSS feeds; third-party feed services such as Open RSS rebuild them from the public pages.
| Route | Cities at once | Output | Cost |
|---|---|---|---|
| Saved search with an email alert | the search's area | an email with up to 20 results | $0, needs a Craigslist account |
| Your own scraper on residential proxies | every city site you loop over | your own JSON or database | from $2.95 for 1 GB of traffic |
| Web Scraping API (in development) | every city site you send | the page, parsed by your code | $0.50 per 1,000 pages, $0.20 from 10,000 |
Craigslist data on public pages
A Craigslist scraper reads the listings anyone can browse without an account. The Web Scraping API fetches a Craigslist URL and returns the page; your code takes the fields out. ProxyField sells no separate Craigslist API with pre-parsed fields.
| Craigslist page | Example URL | What the public page shows |
|---|---|---|
| Search results | sfbay.craigslist.org/search/apa?query=studio | Listing title, price, neighborhood, date, link to the post |
| Listing (post) | sfbay.craigslist.org/sfc/apa/d/<title>/<post-id>.html | Title, price, location, map position when the poster gives one, attributes (bedrooms, square feet, make, odometer), body text, photos, post ID, posted and updated dates |
| Category front | newyork.craigslist.org/search/cta | The newest listings in a category |
Contact details sit behind the reply button, often as a relay email, and belong to individuals: keep them out of your dataset. Craigslist needs no account to browse, and anything behind a login is out of scope under ProxyField's acceptable use policy.
How Craigslist URLs work: categories and filters
- Category code after
/search/:sssall for sale,apaapartments for rent,ctacars and trucks,jjjjobs,ggggigs,bbbservices. - Filters as parameters:
queryfor keywords,min_priceandmax_price,postalwithsearch_distancefor a radius, and category filters such as bedrooms or model year. - Post ID: the number at the end of each listing URL. Store it as the listing's key; a post that is edited keeps its ID, and a repost gets a new one.
Is there a Craigslist API?
Craigslist publishes no public API for reading listings. Its bulk posting interface lets approved paying posters, such as job and housing advertisers, submit ads; it does not return other people's listings.
| Item | Craigslist bulk posting | Web Scraping API |
|---|---|---|
| Who can use it | Approved paying posters | ProxyField customers, through Contact sales |
| Purpose | Posting your own ads | Reading public search and listing pages |
| Other people's listings | No | Yes, as shown on the page |
| Billing | Set by Craigslist | Per 1,000 successful results |
What you send to the Web Scraping API
The API's design: a POST to https://api.proxyfield.io/v1/scrape with your API key in an Authorization: Bearer <api_key> header and a JSON body: url, render (false for plain HTTP, true for JS rendering), country and output (html, markdown, text or json). For a long city list, a batch takes up to 1,000 URLs in one call and posts each finished page to your callback; results are kept 48 hours, and 20 requests run at once per account (higher limits through sales). Parameter reference: API documentation.
# The request the Web Scraping API takes (access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"url": "https://sfbay.craigslist.org/search/apa?query=studio&max_price=2500", "render": false, "country": "us", "output": "json"}'Example response (shortened; content is the page's HTML):
{
"metadata": {"id": "req_d18a5c3e09f7b2e4", "api": "web_scrape", "status": "success", "billed": true},
"status_code": 200,
"final_url": "https://sfbay.craigslist.org/search/apa?query=studio&max_price=2500",
"content_type": "text/html; charset=utf-8",
"content": "<!DOCTYPE html><html lang=\"en\">…</html>"
}Pricing: $0.50 per 1,000 Craigslist pages, $0.20 from 10,000
Craigslist pages are light and carry their listings in the HTML, so plain HTTP is enough: $0.50 per 1,000 successful results, or $0.20 from 10,000 results in one purchase. JS rendering costs $2.00 per 1,000, or $1.00 from 10,000. You pay only for successful results:
- Billed: a page Craigslist answered with a 2xx status; a target's 404 or 410, and a sign-in page served with a 200 status, also count as results.
- Not billed: error responses, blocked and timed-out requests, and our internal retries.
- Every response says whether it was billed.
The API is paid from the same crypto balance as proxies, which never expires; there is no subscription or monthly fee. All prices: pricing. For access, contact sales through the sales team on our 24/7 live chat.
Through the sales team on our 24/7 live chat
| Rate | Entry | Volume, from |
|---|---|---|
| HTTP | $0.50 | $0.20 |
| JS rendering | $2.00 | $1.00 |
Billed on successful results only.
When Craigslist blocks a scraper
Craigslist can block access from IPs that send too many requests too fast. A low rate per IP, a new IP on every request and normal browser headers keep a scraper from hammering one address. Why blocks happen and how proxies help with them is covered on Craigslist proxies.
One Craigslist search in Python
For a single city, the same code without the loop: fetch one search through a ProxyField residential IP in that city and print the title, price and link of each listing. Craigslist builds its search page with scripts for browsers but also sends a plain list in the HTML, which is what the script reads.
import requests
from bs4 import BeautifulSoup
proxy = "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000"
url = "https://newyork.craigslist.org/search/apa?query=studio&max_price=2500"
resp = requests.get(url, proxies={"http": proxy, "https": proxy},
headers={"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US"},
timeout=30)
soup = BeautifulSoup(resp.text, "html.parser")
# Craigslist changes its markup: check these selectors on a live page first
for li in soup.select("li.cl-static-search-result"):
a = li.find("a")
price = li.select_one(".price")
print(li.get("title"), "|", price.text if price else "-", "|", a["href"] if a else "-")Access opens once the payment is confirmed; the gateway, credentials or allowlist are in your account. HTTP, HTTPS and SOCKS5 all run on gate.proxyfield.io:7000 with your username and password; with the IP allowlist, use the port you set up in the dashboard. The username format is <login>-country-us-city-new_york; other tokens: -region-<region>, -session-<id> and -ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default), as in <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600. Concurrent threads are unlimited, the same price per GB applies to every targeting, the traffic never expires, and all purchases are final. More on Python.
What teams use Craigslist data for
- Rental market research asking rents by city, neighborhood and size.
- Used car pricing prices by make, model, year and mileage.
- Resale and sourcing new listings in a category, seen early.
- Local job and gig trends which roles and services are offered where.
- Fraud research spotting repeated or copied listings in your own market.
Posting ads, sending messages or creating accounts through a scraper is not data collection; spam and fake accounts are forbidden under ProxyField's acceptable use policy.
Craigslist's terms and the law
Beyond the scraper ban and the 1,000-page line above, Craigslist's terms set further charges for collecting users' personal information, and Craigslist has gone to court against scrapers before. Stop if Craigslist tells you to, collect public listings only and keep personal data out of your dataset. The details are in Is It Legal to Scrape eBay, Walmart, Zillow and Other Marketplaces? and Is Web Scraping Legal? US, EU and UK Rules (2026).
This is not legal advice.
More scrapers
- Real estate scraper and Facebook Marketplace scraper on the same Web Scraping API.
- Job scraper: job boards and careers pages in one pipeline.
- Google SERP API: the Google results page as JSON, $1.20 per 1,000 successful results, or $0.80 from 10,000.
- All scrapers: scrapers.
Craigslist Scraper FAQ
24/7 support by live chat, including help with setup and integration.
How much does it cost to scrape Craigslist ads?
ProxyField's Web Scraping API is priced at $0.50 per 1,000 successful Craigslist pages over plain HTTP, or $0.20 from 10,000 in one purchase; it is in development, through Contact sales. Checking 50 cities in 2 categories every hour and fetching 3,000 new listings a day comes to 162,000 pages a month: $81, or $32.40 at the volume price.
How can I scrape new Craigslist listings across every city at once when each city has its own site?
Loop over the city sites: take the list from craigslist.org/about/sites, fetch the first search page of each city and category sorted newest first, keep only post IDs you have not seen and merge by post ID. 50 cities × 2 categories every hour is 72,000 pages a month ($36 at $0.50 per 1,000). Craigslist's terms forbid scrapers and charge $0.25 a page beyond 1,000 pages in 24 hours, so get its permission at that scale.
What is a Craigslist scraper?
A Craigslist scraper is a script or service that collects listings from Craigslist search and post pages: title, price, location, date, attributes and description. ProxyField's is its Web Scraping API on Craigslist URLs, billed only on successful results.
Does Craigslist have an official API?
Not for reading listings. Craigslist's bulk posting interface lets approved paying posters submit their own ads, and it returns no one else's listings, so collecting listings means reading the public pages.
Does Craigslist still have RSS feeds?
No: Craigslist removed its RSS feeds. Third-party services such as Open RSS rebuild feeds from the public pages, and Craigslist's own saved-search alerts email you new matches.
Can I get alerts for new Craigslist listings without scraping?
Yes: save a search in your Craigslist account and turn on its alert. The email shows up to 20 results, newest first, and includes renewed and edited posts that match; each saved search covers its own area.
How do I scrape Craigslist?
Build a search URL for each city site and category, fetch it a few seconds apart through rotating residential IPs and read the listing links. Then fetch the listing pages you have not seen, keyed by post ID, for price, attributes and description.
What data can I scrape from Craigslist?
Search pages give each listing's title, price, neighborhood, date and link. Listing pages add the body text, photos, attributes such as bedrooms or odometer, the map position when the poster gives one, and the posted and updated dates.
What data can I extract from Craigslist ads?
Per ad: post ID, title, price, category, city and neighborhood, attributes, description, photo links and dates. Leave out the poster's contact details: they are personal data, and they sit behind the reply button.
Do I need an account to scrape Craigslist ads?
No. Craigslist search and listing pages are public, and a scraper should never sign in. An account is needed only to post or to save searches with alerts.
Show 10 more questionsShow fewer questions
How do I build a Craigslist scraper in Python?
Use requests to fetch the search page through a proxy and BeautifulSoup to read the plain list of results Craigslist sends in the HTML, then fetch each listing page for details. Keep a set of post IDs on disk so each listing is fetched once, as in the multi-city script on this page.
Which programming languages can I use to scrape Craigslist?
Any language that sends HTTP requests and parses HTML: Python with requests and BeautifulSoup, Node.js with an HTTP client and Cheerio, Go, PHP or Ruby. A scraping API is called the same way from any of them.
How do I handle JavaScript when scraping Craigslist?
Usually you do not need to: Craigslist sends a plain list of results in the HTML alongside its script-built search page, and listing pages are static. Use JS rendering, $2.00 per 1,000 on ProxyField's Web Scraping API, only for page parts that appear after scripts run.
What's the rate limit for scraping Craigslist?
Craigslist's terms set the line at 1,000 pages in any 24-hour period, with a charge of $0.25 per page beyond it, and forbid scrapers altogether. Below that, space requests a few seconds apart per IP rather than pushing one IP harder.
Can I scrape Craigslist from a specific country?
Yes: Craigslist runs local sites in the US, Canada, the United Kingdom, Europe and other regions, each at its own address. With your own scraper, residential IPs from the site's country fetch it as a local visitor would; ProxyField covers 195+ countries.
How do I get structured JSON from Craigslist?
Parse each search result and listing page into a record, with post ID, title, price, city, attributes and dates, and write it out as JSON. ProxyField's Web Scraping API returns the page; the fields are pulled out by your parser.
Can I scrape Craigslist without writing code?
For a few pages, a browser extension that exports a table works. For many cities or hourly checks you need a script, or an automation tool with an HTTP step that calls a scraping API.
Why do people scrape Craigslist?
To research rents and used car prices, find items to resell early, follow local job and gig offers and spot copied or repeated listings. Craigslist offers no feed of listings for these uses.
Can I scrape Craigslist without paying for an API?
Yes: open-source Craigslist scrapers exist on GitHub, and you can run one on your own connection for a few pages, but at any scale you pay for the IPs or the API that fetch the pages. ProxyField's entry is the Easy Trial: 1 GB of residential traffic for $2.95, with no subscription.
How often should I scrape Craigslist for new listings?
As often as new posts matter to you: hourly for fast-moving categories such as cars or rentals in big cities, daily for research. Fetch only the first search page each time and stop at the first post ID you already have.
Related pages
Collect Craigslist pages with the Web Scraping API
Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.