For a permitted browser-agent job, start with one provider-supported stable exit, one browser context, and a response gate before extraction. Then change the component the failure actually identifies. Proxy authentication needs a configuration fix. A destination refusal needs an access decision. A challenge page needs to stay out of your RAG corpus, even when it returns HTTP 200.
That is the useful setup for a scraper, retrieval worker or browser agent facing Cloudflare failures. There is no evidence here that switching to residential or mobile proxies resolves every block.
Date check: September 14, 2026. Cloudflare’s announced change is scheduled for September 15. This article describes that announcement and a diagnostic workflow; it does not report an observed rollout or establish the cause of your current error.
What changes on September 15
Cloudflare’s July announcement separates Search, Agent and Training activity. Newly onboarding domains will default to blocking Training and Agent activity on pages displaying ads, while Search remains allowed. Separately, a crawler combining Search with Training follows the most restrictive applicable rule, including an existing Training block. The ad-page default and the mixed-purpose classification are distinct changes. Cloudflare’s original announcement
The company’s press release says the ad-page defaults cover new customers, new sites from existing customers, and existing Free customers if they have not changed their dashboard settings by September 15. “All free-plan sites” loses that qualification. Customers can change their settings. Cloudflare’s announcement of the affected customer groups
Owners can choose a whole-site block, an ad-page block or Allow for each category. The categories describe activity; the name of your browser library or RAG pipeline does not establish its classification. Cloudflare detects ad pages itself, so disabling ad downloads in your browser is not a policy override. AI bot policy reference
Identify the failed hop before changing the proxy
Keep the proxy exchange, destination navigation and any managed scraping API response separate in your retrieval record. An HTTP 402 from api.firecrawl.dev and an HTTP 402 from a publisher require different actions.
A 403 alone does not identify the September 15 policy. Cloudflare documents multiple possible sources, including origin permissions and other security rules. cf-ray helps correlate a request with the site operator’s events; it does not name the rule that refused it. Record a UTC timestamp, the relevant path and the Ray ID when available. Keep sensitive URL parameters private. 403 causes, Ray ID diagnostics
| Observation | Next action | RAG handling |
|---|---|---|
| Proxy 407, or browser authentication/connection error | Verify the configured gateway, credentials and provider account. Chromium can expose a proxy failure as a navigation exception. | Mark retrieval unavailable; preserve the reason. |
Destination cf-mitigated: challenge | Investigate the site’s allowed access path and browser requirements. Stop automatic challenge retries. | Quarantine the response, including a nominal 200. |
| Destination 403 without that challenge signal | Ask the site operator to correlate the request with access/security rules; use an agreed API, feed or allow path where available. | Unavailable; the specific policy remains unknown. |
| 429 from a known hop | Respect Retry-After when supplied; reduce work at the affected scope and cap the total retry budget. | Defer retrieval; retain its freshness status. |
| Destination 402 | Inspect the publisher’s payment/access context and documented integration. | Unavailable until a later accepted fetch. |
| Firecrawl API HTTP 402 | Check Firecrawl credits and billing configuration. | Target status remains unknown unless separately reported. |
| HTTP 200 with missing, empty or incorrect content | Check rendering, required subresources and the extraction contract. | Preserve any previous valid document; mark the failed refresh. |
The challenge header is Cloudflare’s documented response signal. A missing header does not establish usable content. HTTP 407 identifies proxy authentication; 429 leaves the counting scope to the responding service, so changing an exit does not prove the allowance reset. Challenge detection, 407 semantics, 429 semantics
For hosted Firecrawl, examine the outer API error alongside returned target metadata and job errors. Its API error catalog describes 402 as insufficient credits or missing billing configuration. Its scrape response can separately carry data.metadata.statusCode. These fields must remain separate in your logs. Firecrawl errors, scrape response contract
A proxy configuration for a complete browser job
For a stateful workflow, request a stable exit for the duration of the job and retain one browser context through its steps. The provider controls exit affinity; the context holds cookies and browser storage. Confirm the provider’s session duration, reconnect behavior and early-exit replacement policy. A fixed gateway address alone proves none of those properties. The session continuity guide explains what to verify.
An approved fixed address is a useful starting point when the site owner allows that address. A required region can justify regional egress. For another workload, compare candidate routes under the same URL set, account, session, region and concurrency. Count fresh, valid documents per attempted document and cost per accepted document, including retries and rendering traffic. A residential/mobile label is insufficient evidence to choose a winner; the proxy comparison covers that evaluation.
Put proxy settings where the page request is made:
| Stack | Configuration boundary | Detail that changes the diagnosis |
|---|---|---|
| Playwright | Pass a proxy object with server, username and password to browser.newContext, or configure browser launch. | httpCredentials is destination authentication. A separate Node/Python HTTP client needs its own configuration. Network docs |
| Puppeteer | Set context proxyServer; use page.authenticate for proxy username/password before navigation. | proxyServer is an endpoint string. Configure newly created pages too. Context options, authentication |
| Browser Use | The open-source browser accepts Browser(proxy=ProxySettings(...)). | With CDP or a managed browser, verify the remote browser’s egress contract. Local settings do not establish control over an already-running remote browser. Parameters, remote browsers |
| Hosted Firecrawl | The v2 scrape proxy field selects basic, enhanced or auto; auto is the default. | This is a managed strategy selector, not a custom proxy URL. Setting a local HTTP_PROXY does not configure the remote target fetch. Scrape API |
Keep retries under one job budget. A hosted service’s internal attempts plus the SDK’s retries plus the agent’s “try again” loop can multiply work. After a refusal, preserve the reason and choose the next action from the table before scheduling another attempt.
Run the response gate before extraction
The downloadable Playwright probe performs one navigation, classifies its main response and checks for nonempty text in an expected CSS selector. It emits a small JSON diagnostic, without the target URL, body, credentials or raw exception. It does not extract or ingest content.
Download probe.mjs, package.json, package-lock.json, test-fixture.mjs and the README into one directory. Use Node.js 22 or later, run npm ci, then npx playwright install chromium. The package pins Playwright 1.63.0.
Inject these settings through your existing configuration/secrets mechanism, then run node probe.mjs:
PROXY_SERVER: a credential-freehttp://gateway URL, without a path or query.PROXY_USERNAMEandPROXY_PASSWORD: your provider’s credentials, with any documented session setting.TARGET_URL: the page you are checking.EXPECTED_SELECTOR: a specific CSS selector such asmain article[data-document-id], whose matched element must contain text.
The probe allows 15 seconds for navigation and another 5 seconds for the content check. It creates and closes a fresh context per invocation. For a multi-step production job, retain the job’s context and apply the same checks to its relevant responses. The Playwright setup guide covers credentials and context configuration.
This classification section runs before the selector check:
if (result.cf_mitigated) return 'challenge';
if (result.status === 402) return 'payment_or_access_review';
if (result.status === 403) return 'access_review';
if (result.status === 407) return 'proxy_auth_error';
if (result.status === 429) return 'rate_limited';
if (result.status >= 500 && result.status < 600) return 'upstream_error';
if (result.status !== 200) return 'unexpected_status';
if (!/^text\/html(?:\s*;|$)/i.test(headers['content-type'] ?? '')) return 'invalid_content';
return null;The full function sets cf_mitigated only when the response header equals challenge. A null here means proceed to the content check. The eventual accepted_content outcome requires HTTP 200, HTML and nonempty expected content; it exits 0. Other outcomes exit 2.
In our 18 synthetic checks, all expected outcomes matched: four responses passed the minimal gate and fourteen were withheld. A fixture response with status 200 and cf-mitigated: challenge produced outcome: challenge and exit 2. Missing or empty expected content also failed. Wrong proxy credentials exposed a 407 and proxy_auth_error after two authentication challenges; no request was forwarded. One accepted case deliberately included a failing 403 subresource, demonstrating the main-document check’s limit. Exact fixture results
Run node test-fixture.mjs to reproduce the local suite. It used Node 26.8.1, Playwright 1.63.0 and Chromium 153.0.8010.12, with a local origin and authenticating HTTP proxy. The installation commands and fixture were also run from identical files downloaded from a local HTTP server. These checks establish this probe’s behavior on synthetic responses; they do not establish live Cloudflare access, provider exit stability or HTTPS CONNECT behavior.
Treat acceptance as permission to run deeper validation. A broad selector can match a login screen, and a required JSON subrequest can fail while the main HTML passes. Validate document identity, required fields, locale and freshness on the exact content your worker will ingest. A successful probe cannot approve a later fetch that returns something different. Preserve the last valid document when a refresh fails, with its old retrieval time visible to the consumer.
When the resolution belongs to the site’s access rules
If you operate the target site, inspect the matched security rule alongside its AI crawler policy. An AI Crawl Control setting of Allow can still be overridden by WAF rules that run earlier. A missing request in the AI crawler view is therefore a reason to check the security events too. If another team owns the site, share the request identifiers and agree on the intended access route. Cloudflare’s rule precedence
Pay Per Crawl is a separate access arrangement. Its documentation currently labels it closed beta; an unpaid chargeable request can receive HTTP 402 with crawler-price. Paid requests require the documented enrollment and signed payment-intent flow. Adding an unsigned payment header is insufficient, and WAF/Bot Management blocks can still prevent access. Resolve participation and budget deliberately rather than letting an agent interpret any 402 as authority to spend. Pay Per Crawl scope, request protocol
Your pipeline should be able to return “source unavailable” with a reason and timestamp. That gives the caller a usable decision when an authentication fix, owner-approved rule change or supported content interface is still required.
Method: AI-assisted writing by ipvolt, checked against the linked primary documentation on September 14, 2026. The downloadable test uses local synthetic responses. It does not measure live Cloudflare blocking, proxy-provider performance, HTTPS CONNECT behavior or the September 15 rollout.
ipvolt is in development. Join for one email when access opens. Nothing else.
Get notified when ipvolt access opens.
Sources
- Cloudflare: Your site, your rules — new AI traffic options
- Cloudflare: September 15 announcement and existing Free customer scope
- Cloudflare: Block AI Bots
- Cloudflare: Detect a Challenge Page response
- Cloudflare: AI Crawl Control with WAF
- Cloudflare: Error 403
- Cloudflare: Ray ID
- Cloudflare: What is Pay Per Crawl?
- Cloudflare: Pay Per Crawl request protocol
- Playwright: HTTP proxy configuration
- Puppeteer: BrowserContextOptions
- Puppeteer: Page.authenticate
- Browser Use: Browser parameters
- Browser Use: Remote browser configuration
- Firecrawl: Hosted v2 scrape API
- Firecrawl: API errors
- RFC 6585: HTTP 429
- RFC 9110: Proxy authentication required