Appearance
JS Rendering & Bypass
Most of the web is JavaScript. Runo handles that for you, escalating from a plain fetch to a stealth headless browser only when needed.
The Three Modes
Set via options.render_js on /extract, /batch, and /crawl:
| Mode | What happens | When to use |
|---|---|---|
"auto" (default) | Plain HTTP fetch first; auto-escalate to headless on signs of trouble. | The right default for almost everything. |
"always" | Skip the fetch entirely; render in a stealth headless browser. | Known SPAs where the fetch will always fail. Slower. |
"never" | Plain fetch only. Fail fast on JS-gated pages. | Strict cost ceiling, content known to be in the initial HTML. |
The response body tells you which path served the request via render_mode:
render_mode | Meaning |
|---|---|
"fetch" | Plain HTTP fetch was enough. |
"headless" | Escalated to a stealth headless browser. |
"structured" | All fields filled from page metadata. |
"cache" | Result served from cache (content-type-aware TTL). |
What Triggers Escalation
Under "auto", Runo escalates from fetch → headless when any of these fire:
- A known anti-bot block signature is detected.
- The body is shorter than ~500 characters.
- Visible text is sparse despite a large HTML payload (likely a JS shell).
- JS-framework markers are present.
- The HTTP response is
402,403,406,429, or503. - Your schema asks for numbers but the page has almost no digits (weather/dashboard widgets).
Escalations are transparent. The response shape is identical, only render_mode changes.
The Bypass Ladder
Some sites push back harder than a vanilla headless browser can handle. Runo has a tiered ladder:
| Tier | Mechanism | Defeats | Available |
|---|---|---|---|
| T0 | Plain HTTP fetch | Static HTML | All plans |
| T1 | TLS-impersonation client | Cloudflare passive TLS, Akamai | All plans |
| T2 | Hardened headless browser + fingerprint bundle | CDP detection, PerimeterX, Datadome | All plans |
| T3 | Per-host cookie persistence | Progressive-trust walls | All plans |
| T4 | CAPTCHA solver | Interactive challenges | Pro / Scale only |
| T5 | Residential proxy rotation | IP reputation, geofences | Pro / Scale only |
| T6 | Archive fallback | Last resort | All plans |
Per-host memory means once Runo learns a site needs T2 or T3, future calls skip the lower tiers which saves ~8 s of latency.
TIER_REQUIRED
Free and Starter plans don't include T4 (CAPTCHA solver) or T5 (residential proxies). When a host is known to require those tiers, calls on those plans return:
json
{
"status": "error",
"error": {
"code": "TIER_REQUIRED",
"message": "This URL requires Pro or Scale tier (CAPTCHA / residential proxy bypass).",
"retryable": false
}
}HTTP 402. Upgrade or pick a different source.
Cost vs. Latency
| Path | Typical Added Latency |
|---|---|
| Plain Fetch | - |
| Headless | ~3–8 s |
| T4 (CAPTCHA Solver) | ~5–20 s |
| T5 (Residential Proxy) | ~1–3 s |
You don't pay direct fees for T4/T5, they're included in Pro/Scale. Daily kill-switches protect against abuse spikes; if those fire, calls fall back to T6 and the response carries X-Runo-Paid-Tier-Throttled: true.