Site scraper

Craigslist Scraper: Public Craigslist Listings via API

HTTP $0.50JS rendering $2.00 per 1,000 results or your own scraper from $1.95/GB

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.

Web Scraping API per 1,000 successful results
Web Scraping API prices per 1,000 successful results
FetchEntryVolume, from
HTTP$0.50$0.20
JS rendering$2.00$1.00

Billed on successful results only.

Your own scraper on residential proxies
from $1.95/GB Easy Trial: 1 GB for $2.95
gate.proxyfield.io:7000
You needProxyField
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 coverage61.2M+ residential IPs, 2,800+ cities, all 50 states; city targeting such as city-new_york
Sessionsa new IP on every request, or sticky from 30 s to 36 h (20 min by default)
Paymentone crypto balance for the API and proxies, never expires, no subscription
Data

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:

  1. 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.

  2. Build one search URL per city and category, sorted newest first: https://<city>.craigslist.org/search/cta?sort=date.

  3. Fetch the first search page of each, a few seconds apart per IP, through rotating residential IPs or the Web Scraping API.

  4. Keep only post IDs you have not seen

    The post ID is the number before .html in each listing link. Stop reading a page at the first ID you already have: everything below it is older.

  5. 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.

Python
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 monthPlain HTTP at $0.50At $0.20 (from 10,000 in one purchase)
50 cities × 2 categories, first search page, every hour72,000$36$14.40
3,000 new listing pages a day90,000$45$18
Both162,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.

RouteCities at onceOutputCost
Saved search with an email alertthe search's areaan email with up to 20 results$0, needs a Craigslist account
Your own scraper on residential proxiesevery city site you loop overyour own JSON or databasefrom $2.95 for 1 GB of traffic
Web Scraping API (in development)every city site you sendthe 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 pageExample URLWhat the public page shows
Search resultssfbay.craigslist.org/search/apa?query=studioListing title, price, neighborhood, date, link to the post
Listing (post)sfbay.craigslist.org/sfc/apa/d/<title>/<post-id>.htmlTitle, 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 frontnewyork.craigslist.org/search/ctaThe 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/: sss all for sale, apa apartments for rent, cta cars and trucks, jjj jobs, ggg gigs, bbb services.
  • Filters as parameters: query for keywords, min_price and max_price, postal with search_distance for 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.
Compare

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.

ItemCraigslist bulk postingWeb Scraping API
Who can use itApproved paying postersProxyField customers, through Contact sales
PurposePosting your own adsReading public search and listing pages
Other people's listingsNoYes, as shown on the page
BillingSet by CraigslistPer 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.

Shell
# 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):

JSON
{
  "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

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

Web Scraping API per 1,000 successful results
Web Scraping API per 1,000 successful results
RateEntryVolume, 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.

Python
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.

Use cases

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.

More scrapers

More scrapers

FAQ

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.

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.