From the library to the cloud

You already know crawl4ai. The cloud runs the same engine behind one key: no browser to install, no proxies to buy, no cookies to babysit. Each library call has one API call.

# one page → Markdown
async with AsyncWebCrawler() as crawler:
    result = await crawler.arun("https://example.com")
    print(result.markdown)

# many pages
results = await crawler.arun_many(urls, config=run_conf)

# typed JSON out of a page
config = CrawlerRunConfig(extraction_strategy=LLMExtractionStrategy(schema=..., instruction=...))
result = await crawler.arun(url, config=config)
in the library in the cloud what changes
crawler.arun(url) POST /scrape the engine is picked per domain (cache → HTTP → browser); bot walls and proxies are handled
crawler.arun_many(urls) POST /scrape/batch · /scrape/jobs results stream as they land; jobs run in the background for thousands of URLs
LLMExtractionStrategy / JsonCssExtractionStrategy POST /extract a plain-English instruction or a JSON schema; no selectors to write
PruningContentFilter → fit_markdown on by default every scrape returns clean Markdown with the boilerplate stripped
(no web search) GET /search ranked results as JSON, from our own search stack
your machine's browser, proxies, cookies ours three regions, routed to the nearest; the library stays open source, forever

Something unclear or wrong on this page? Tell us.