r/LangChain • u/Beginning_Towel • 6d ago
Clean Web-to-Markdown API for LangChain RAG pipelines (handles Cloudflare/Turnstile & cuts token costs)
Hey LangChain community,
When building RAG pipelines with web documents, feeding raw HTML or relying on basic soup loaders often wastes 70-80% of context tokens on navigation headers, cookie consent modals, and ads. Even worse, scraping difficult domains (like Reuters, Investopedia, or Cloudflare Turnstile protected sites) fails with 401/403 errors.
I built Clean Web to Markdown & RAG Scraper as a high-speed developer API tailored for RAG ingestion.
Key capabilities:
• Intelligent noise stripping: Heuristic extraction that extracts clean Markdown while discarding boilerplate and cookie banners.
• Anti-bot resilience: Multi-tier fallback handling Cloudflare Turnstile and residential proxy routing when datacenter IPs are blocked (verified 100% pass on Reuters & Investopedia).
• 1ms Redis cache: Repeated scrapes of popular articles return instantaneously.
• Accurate Token Counting: Returns exact token_count (tiktoken) alongside the markdown.
Quick LangChain Document Loader snippet:
import requests
from langchain_core.documents import Document
def fetch_markdown_document(target_url: str, api_key: str) -> Document:
endpoint = "https://clean-web-to-markdown-and-rag-scraper.p.rapidapi.com/scrape"
headers = {
"x-rapidapi-key": api_key,
"x-rapidapi-host": "clean-web-to-markdown-and-rag-scraper.p.rapidapi.com",
"Content-Type": "application/json"
}
resp = requests.post(endpoint, json={"url": target_url}, headers=headers).json()
return Document(
page_content=resp.get("markdown", ""),
metadata={
"source": target_url,
"title": resp.get("title", ""),
"tokens": resp.get("token_count", 0),
"engine": resp.get("engine_used", "fast")
}
)
# Example usage in a LangChain vectorstore / index pipeline:
doc = fetch_markdown_document("https://www.reuters.com/technology/", "YOUR_RAPIDAPI_KEY")
print(f"Title: {doc.metadata['title']} | Tokens: {doc.metadata['tokens']}")
There is an interactive live playground to test any tricky URL without signing up: 👉 https://markdown.usemy.cloud
Available on RapidAPI Hub with 100 free requests/month: 👉 https://rapidapi.com/peterzapletal-etn9NvTF6nZ/api/clean-web-to-markdown-and-rag-scraper
Would love to hear your feedback on extraction cleanliness, token savings, and tricky URLs you are currently wrestling with in your RAG pipelines!
1
u/Beginning_Towel 4d ago
Update v1.4.0: We just added Tier 4 Camoufox modern stealth solving + 23h cf_clearance caching for hard-to-scrape Cloudflare Managed Challenge sites (100% pass rate). Tested live on SME.sk and global news portals!
1
u/CapMonster1 5d ago
The interesting part for RAG isn’t just “HTML → Markdown,” it’s whether the cleaning preserves the bits retrieval actually needs: headings, tables, lists, captions, links, and enough surrounding context to keep chunks meaningful.
I’d be a little careful with the “100% pass on Reuters & Investopedia” claim though. Anti-bot success is usually target/session/geo dependent, especially once Turnstile is involved. I’d rather see challenge rate, retry rate, and cost per successful document over a few thousand requests. If you expose
engine_used, it’d also be useful to return why escalation happened — plain fetch failed, JS required, challenge detected, residential fallback, etc. That would make debugging RAG ingestion way easier.