Quick answer: Craigslist is one of the riskiest sites to scrape. Its terms of use prohibit automated access and copying, it has no public API, and it has a documented history of suing companies that scraped it. If you want listings programmatically, start with the RSS feeds Craigslist offers on its search pages, respect the terms, and keep volumes low. This is a domain where caution is not optional, and none of this is legal advice.
Why Craigslist deserves extra care
Most "how to scrape X" questions are about fragility. Craigslist is different: the bigger issue is legal exposure. Craigslist has actively defended its site against scrapers in court, and that history matters when you decide what to build.
Directionally (and not as legal advice), the case people cite is craigslist v. 3Taps, where Craigslist pursued a company that continued to access and redistribute its listings after being told to stop and after IP blocks were put in place. The dispute touched on terms-of-use violations and computer-access law. The takeaway is not a specific legal holding to rely on; it is a signal. Craigslist is willing to litigate, and continuing to access a site after being explicitly blocked or told to stop is exactly the kind of conduct that turns a data project into a lawsuit.
So before any code, understand the posture: Craigslist's terms prohibit scraping, and Craigslist enforces.
What Craigslist actually offers: RSS
Here is the part people miss. Craigslist provides RSS feeds for its search results. On most search pages there is an RSS link, and you can request the feed form of a search. That is a supported, machine-readable output, which is a very different thing from scraping the HTML.
If your goal is to monitor new listings for a search (say, a specific category in a specific city), the RSS feed is the intended path.
import feedparser
# Craigslist exposes RSS for searches via a format parameter.
# Use the RSS link shown on the search page, and keep polling gentle.
feed_url = "https://newyork.craigslist.org/search/apa?format=rss"
feed = feedparser.parse(feed_url)
for entry in feed.entries[:5]:
print(entry.title)
print(entry.link)
Poll infrequently, cache what you have seen, and do not fan out across dozens of cities and categories in a tight loop. The feed exists so you can watch for new posts, not so you can mirror the whole site.
Compliant approaches, in order
| Approach | Compliance posture | Good for |
|---|---|---|
| RSS feeds | Supported machine-readable output | Monitoring new listings for a search |
| Manual browsing | Always fine | Occasional personal lookups |
| Direct partnership / permission | Cleanest if you need scale | A real product on Craigslist data |
| HTML scraping at volume | Against terms, litigation history | Not recommended |
If you are building something serious on Craigslist listings, the honest recommendation is to seek permission rather than assume you can take the data. That is uncomfortable advice because it is slower, but it is the path that does not end in a cease-and-desist.
Where a fetching tool fits (and where it does not)
A fetching service like link.sc is built to turn a public URL into clean markdown for public-data cases where an API does not exist. On many sites, that is a genuine gap-filler. On Craigslist specifically, the terms prohibit automated access, so the responsible use is narrow: reading a single public page a human could open, at human pace, not systematically harvesting listings.
If you do fetch a single allowed public page, the base is https://api.link.sc/v1 and the auth header is x-api-key (never Authorization: Bearer).
curl -X POST https://api.link.sc/v1/fetch \
-H "x-api-key: lsc_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.org/public-classifieds-page",
"format": "markdown"
}'
The response is { "content": "..." }. I have deliberately used a generic URL here, because I am not going to hand you a recipe for systematically harvesting a site whose terms forbid it. A tool being capable of fetching a page does not make it acceptable to point it at a site that says no.
If you want to find compliant, API-friendly classifieds or marketplace sources instead, a search that returns full page content helps you locate them:
curl -X POST https://api.link.sc/v1/search \
-H "x-api-key: lsc_your_key" \
-H "Content-Type: application/json" \
-d '{
"q": "classifieds marketplace with public API terms",
"engine": "google"
}'
The search field is q, and the response includes serpData.
Why the caution is specific to this site
Plenty of sites prohibit scraping in their terms but never do anything about it. Craigslist is not in that group. Between its explicit terms and its willingness to litigate, the risk-adjusted math here is different from, say, fetching a public government page. Even public-looking data can carry real legal risk when the site owner has both a clear prohibition and a track record of enforcing it.
That is the whole point of this post: the technical question ("can I parse the HTML") is easy and boring. The question that matters ("should I, given the terms and the history") is where you need to slow down.
Legal and ethics note
This is not legal advice, and I am not a lawyer. Whether any given access is lawful depends on the terms, whether technical access controls are bypassed or ignored, the relevant computer-access laws, and your jurisdiction. Craigslist's terms prohibit scraping, and it has enforced that stance, so treat continued access after a block or a demand to stop as a bright line you do not cross. For the broader legal landscape and how courts have treated public-data scraping, see is web scraping legal. For practical guardrails, see ethical web scraping and compliance best practices.
Bottom line
For Craigslist, the compliant answer is short: use the RSS feeds it offers, keep volume low, respect the terms, and get permission if you need scale. Reserve a fetching tool like link.sc for genuine public-data gaps on sites that allow it, and do not use it to route around a prohibition. On this site more than most, the responsible choice and the legally safe choice are the same choice.
For public-data sources that welcome programmatic access, link.sc turns any allowed URL into clean, structured content. Start free.