The fast path for scraping — a TypeScript port of Scrapling's HTTP layer for Bun and Cloudflare Workers. No browser, no headless overhead: wreq-js TLS impersonation, coherent stealth headers, and a cheerio-backed selector API.
scrapling-js is for speed. When a site fights back with JS challenges, switch to its stealth-browser sibling.
Pure-HTTP fetching with TLS impersonation. Milliseconds, not seconds.
__NEXT_DATA__)Headed real-Chrome automation that beats bot detection.
Don't want to choose? The craft-scraper skill inspects the site and emits a script using whichever fits — scrapling-js for APIs, Ultrastealth for protected pages.
Coherent Chrome/Firefox/Edge header sets — Client Hints, Sec-Fetch-*, Accept ordering — matching real browser fingerprints.
Pairs headers with wreq-js (Rust/BoringSSL) so the JA3/JA4 + HTTP/2 fingerprint matches the claimed Chrome version (chrome_145–147).
One-shot Fetcher and stateful FetcherSession with cookie preservation, retries, and proxy rotation.
cheerio-backed CSS + XPath with ::text / ::attr() pseudo-elements and requests-like ergonomics.
The core has no Node-only dependencies — deploy it straight to Cloudflare Workers.
Header Chrome versions track the wreq-js TLS profiles so UA and fingerprint never disagree.
bun add scrapling-js # or: npm i scrapling-js
import { Fetcher } from "scrapling-js";
// stealthy headers are on by default
const page = await Fetcher.get("https://example.com");
const title = page.css("title::text").get();
const links = page.css("a::attr(href)").getAll();
const r = await Fetcher.get("https://shop.example.com/api/products", {
params: { page: "1" },
headers: { accept: "application/json", referer: "https://shop.example.com/" },
stealthyHeaders: true,
});
const data = JSON.parse(r.body);
Need full Chrome TLS at the wire level for a stubborn host? Run the bundled stealth-proxy.ts (Bun + wreq-js) and fetch through localhost:3001.