| title | FAQ | |||||
|---|---|---|---|---|---|---|
| pcx_content_type | faq | |||||
| sidebar |
|
|||||
| head |
|
import { GlossaryTooltip, Render, DashButton, Steps } from "~/components";
Below you will find answers to our most commonly asked questions about Browser Rendering.
For pricing questions, visit the pricing FAQ. For usage limits questions, visit the limits FAQ. If you cannot find the answer you are looking for, join us on Discord.
A 422 Unprocessable Entity error usually means that Browser Rendering wasn't able to complete an action because of an issue with the site.
This can happen if:
- The website consumes too much memory during rendering.
- The page itself crashed or returned an error before the action completed.
- The request exceeded one of the timeout limits for page load, element load, or an action.
Most often, this error is caused by a timeout. You can review the different timers and their limits in the REST API timeouts reference.
If your screenshots, PDFs, or scraped content are missing elements that appear when viewing the page in a browser, the page likely has not finished loading before Browser Rendering captures the output.
JavaScript-heavy pages and Single Page Applications (SPAs) often load content dynamically after the initial HTML is parsed. By default, Browser Rendering waits for domcontentloaded, which fires before JavaScript has finished rendering the page.
To fix this, use the goToOptions.waitUntil parameter with one of these values:
| Value | Use when |
|---|---|
networkidle0 |
The page must be completely idle (no network requests for 500 ms). Best for pages that load all content upfront. |
networkidle2 |
The page can have up to 2 ongoing connections (like analytics or websockets). Best for most dynamic pages. |
REST API example:
{
"url": "https://example.com",
"goToOptions": {
"waitUntil": "networkidle2"
}
}If content is still missing:
- Use
waitForSelectorto wait for a specific element to appear before capturing. - Increase
goToOptions.timeout(up to 60 seconds) for slow-loading pages. - Check if the page requires authentication or returns different content to bots.
For a complete reference, see REST API timeouts.
Not yet. Local development currently has the following limitation(s):
- Requests larger than 1 MB are not supported.
Yes, Browser Rendering requests are always identified as bot traffic by Cloudflare. Cloudflare does not enforce bot protection by default — that is the customer's choice.
If you are attempting to scan your own zone and want Browser Rendering to access your website freely without your bot protection configuration interfering, you can create a WAF skip rule to allowlist Browser Rendering.
You must be on an Enterprise plan to allowlist Browser Rendering on your own website because WAF custom rules require access to Bot Management fields.
1. In the Cloudflare dashboard, go to the **Security rules** page of your account and domain. <DashButton url="/?to=/:account/:zone/security/security-rules" />
- To create a new empty rule, select Create rule > Custom rules.
- Enter a descriptive name for the rule in Rule name, such as
Allow Browser Rendering. - Under When incoming requests match, use the Field dropdown to choose Bot Detection ID. For Operator, select equals. For Value, enter
128292352. - Under Then take action, in the Choose action dropdown, select Skip.
- Under Place at, select the order of the rule in the Select order dropdown to be First. Setting the order as First allows this rule to be applied before subsequent rules.
- To save and deploy your rule, select Deploy.
No. Browser Rendering requests originate from Cloudflare's global network and you cannot configure per-request IP rotation. All rendering traffic comes from Cloudflare IP ranges and requests include automatic headers, such as cf-biso-request-id and cf-biso-devtools so origin servers can identify them.
There is no fixed limit on the number of requests per browser session. A single browser can handle multiple requests as long as it stays within available compute and memory limits.
Yes. If your webpage or PDF requires a font that is not pre-installed, you can load custom fonts at render time using addStyleTag. This works with both the REST API and Workers Bindings. For instructions and examples, refer to Use your own custom font.
No. Cloudflare processes content ephemerally and does not retain customer-submitted HTML or generated output (such as PDFs or screenshots) beyond what is required to perform the rendering operation. Once the response is returned, the content is immediately discarded from the rendering environment.
This applies to both the REST API and Workers Bindings (using @cloudflare/puppeteer or @cloudflare/playwright).
For the REST API, generated content is cached by default for five seconds (configurable up to one day via the cacheTTL parameter, or set to 0 to disable caching). This cache protects against repeated requests for the same URL by the same account. Customer-submitted HTML content itself is not cached.
For Workers Bindings, no caching is used. Content exists only in memory for the duration of the rendering operation and is discarded immediately after the response is returned.