How numeric wait-based rendering works in fastCRW cloud and self-hosted deployments.
When JS rendering is enabled, the renderer navigates to the page, waits for load completion, then applies numeric waitFor before extracting HTML.
There are two separate decisions here:
{
"url": "https://quotes.toscrape.com/js/",
"renderJs": true,
"waitFor": 2000
}
Enable JS rendering when the page content is not present in the initial HTML response. Typical examples:
Do not enable it blindly for every request. HTTP-only fetches are faster and cheaper.
waitFor is milliseconds.warning may still appear if the rendered page is an anti-bot interstitial.renderJs off for lower latency.waitFor ValueStart with the smallest value that works:
500 to 1000 for lightly hydrated pages,2000 for typical JS-heavy pages,3000 to 5000 only when you have confirmed the target hydrates slowly.Long waits are not automatically safer. They increase latency and can hide the fact that the page is blocked rather than merely slow.
crw-server setup or configure a CDP browser (LightPanda, Chrome, or Playwright) in your config.toml under [renderer]. If no JS renderer is configured, requests with renderJs: true will fall back to HTTP-only fetching and include a warning.When rendered output looks wrong, check:
metadata.renderedWith to verify a browser was actually used,metadata.elapsedMs to understand the cost of the request,warning to catch anti-bot or fallback situations.waitFor (e.g., 3000–5000). Some SPAs need extra time to hydrate.rendered_with: "http_only_fallback" in metadata: JS rendering was requested but no renderer is available. Check your deployment configuration.renderJs: true: Verify the LightPanda sidecar is running and reachable. Check /api/health for renderer status.waitFor: The issue may be anti-bot protection or authentication flow, not rendering delay.