ENไทย
⚡ no browser · fast · edge-ready

scrapling-js.

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.

0browsers launched — pure HTTP, no Chromium, no headless tells
JA3/JA4real-Chrome TLS + HTTP/2 fingerprint via wreq-js (Rust/BoringSSL)
Edgecore has no Node-only deps — deploys to Cloudflare Workers

When to reach for it

scrapling-js is for speed. When a site fights back with JS challenges, switch to its stealth-browser sibling.

⚡ scrapling-js — this project

Pure-HTTP fetching with TLS impersonation. Milliseconds, not seconds.

Use it for
  • JSON APIs & embedded JSON (__NEXT_DATA__)
  • Maximum throughput / large crawls
  • Cloudflare Workers & serverless edge

🥷 Ultrastealth — sibling

Headed real-Chrome automation that beats bot detection.

Use it for
  • Highly protected sites (Cloudflare, Imperva, DataDome)
  • JS-rendered SPAs with no usable API
  • Clicks, forms, multi-step flows

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.

Features

Stealth headers

Coherent Chrome/Firefox/Edge header sets — Client Hints, Sec-Fetch-*, Accept ordering — matching real browser fingerprints.

TLS impersonation

Pairs headers with wreq-js (Rust/BoringSSL) so the JA3/JA4 + HTTP/2 fingerprint matches the claimed Chrome version (chrome_145–147).

Fetcher & sessions

One-shot Fetcher and stateful FetcherSession with cookie preservation, retries, and proxy rotation.

Selector API

cheerio-backed CSS + XPath with ::text / ::attr() pseudo-elements and requests-like ergonomics.

Edge-ready

The core has no Node-only dependencies — deploy it straight to Cloudflare Workers.

Version-aligned

Header Chrome versions track the wreq-js TLS profiles so UA and fingerprint never disagree.

Quick start

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();

Hit a JSON API directly

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.